markdownview — u_pbt_markdownview #
← Riferimento dei componenti · Sommario della guida
markdownview mostra un documento Markdown in sola lettura, con i colori del tema: titoli, elenchi, tabelle, elenchi di attività, codice colorato, immagini. Si imposta il testo in
is_markdown, o il percorso di un file inis_source; un link non naviga mai, sollevaue_link_clickede decide l'applicazione. L'HTML grezzo di un documento non viene mai eseguito.
▶ Vederlo dal vivo — Applicazione dimostrativa, tessera Markdown viewer, con il codice e questa pagina fianco a fianco.
In breve #
| Userobject | u_pbt_markdownview |
| Ingresso | Un testo Markdown (is_markdown), o un file della postazione o un URL https:// (is_source) |
| Sintassi | CommonMark, più le tabelle, gli elenchi di attività, il barrato, i link e gli indirizzi e-mail nudi, gli avvisi (> [!NOTE]) e le emoji (:+1:) di GitHub |
| Ritorno | ue_link_clicked per un link, con la sua natura (decide l'applicazione), ue_loaded / ue_load_failed per un documento, ue_search_result per la ricerca, ue_task_toggled per una casella spuntata |
| Sicurezza | L'HTML grezzo è mostrato come testo; un link javascript:, vbscript: o data: non è cliccabile; un'immagine http:// è rifiutata, come un'immagine su una condivisione di rete; un documento del Web non mostra alcun file della postazione |
Avvio rapido #
// Show a Markdown file : its pictures and relative links are read against its folder
uo_md.is_source = "C:\Acme\Help\guide.md"
// ... or any text the application has
uo_md.is_markdown = "# Release notes~n~n- [x] Orders~n- [ ] Invoices"
// ue_link_clicked : the viewer never navigates, the application decides where to open as_url
Proprietà #
| Proprietà | Tipo | Predefinito | Descrizione |
|---|---|---|---|
is_markdown | string | "" | Il testo Markdown da mostrare. Impostarlo sostituisce il documento (is_source si rilegge allora vuoto); vuoto svuota la vista. Un nuovo testo dello STESSO documento — la ricetta di modifica — mantiene la posizione di lettura. L'HTML grezzo che contiene è mostrato come testo, mai eseguito (vedere ib_allow_html). Si rilegge così come è stato impostato |
is_source | string | "" | Un file Markdown da mostrare: un percorso della postazione (.md, .markdown, .txt…), un indirizzo file:/// o un URL https:// — letto dal client HTTPS nativo della libreria (il proxy e l'identità Windows della postazione, nessun muro CORS). Le sue immagini e i suoi link relativi si leggono rispetto alla sua cartella. http:// è rifiutato (REASON_INSECURE), come ogni file che non è testo (REASON_UNSUPPORTED); oltre 16 MB, file o URL, REASON_TOO_LARGE. Il file si legge in background: leggete l'indice o spostatevi al suo interno una volta ricevuto ue_loaded (durante la lettura, of_toc restituisce 0 e of_scroll_to attende il file). Impostarlo sostituisce il documento (is_markdown si rilegge allora vuoto) |
is_base_path | string | "" | La cartella (o l'indirizzo https://) rispetto a cui si leggono le immagini e i link relativi di un TESTO impostato da is_markdown — una guida conservata in un database accanto alle sue immagini. Vuoto: la cartella corrente dell'applicazione. Un file mostrato da is_source usa sempre la propria cartella. Letta in diretta |
ib_allow_html | boolean | false | true disegna un elenco BREVE e chiuso di tag HTML inerti del documento — b, i, u, s, kbd, sub, sup, mark, small, br, img (src, alt, width, height: le regole di un'immagine Markdown), a (href: le regole di un link Markdown) e details / summary. Ogni altro tag, uno script, uno stile, un gestore di eventi restano testo. false: tutto l'HTML è mostrato come scritto |
ib_network_pictures | boolean | false | false: un'immagine del documento posta in RETE (una condivisione di un server) non è caricata — aprire una condivisione consegna l'identità Windows dell'utente a quel server —, a meno che non si trovi sulla condivisione da cui è stato letto il documento stesso. true: per l'applicazione che mostra i PROPRI documenti da una condivisione. Un documento letto dal Web non mostra mai un file della postazione |
ib_remote_pictures | boolean | true | true carica le immagini https:// di un documento; false non ne carica nessuna — nulla lascia la postazione solo perché un documento è mostrato (un pixel di tracciamento resta un segnaposto) |
ib_tasks_editable | boolean | false | true lascia all'utente spuntare le caselle di un elenco di attività (un clic, o Spazio su una casella): ue_task_toggled dà la RIGA del sorgente e il nuovo stato; il TESTO spetta all'applicazione, che lo riscrive. false: le caselle sono in sola lettura |
ib_track_heading | boolean | false | true solleva ue_heading_visible ogni volta che un altro titolo raggiunge la cima della vista mentre il lettore scorre — un indice che segue la lettura |
ii_zoom | integer | 100 | La dimensione di lettura, da 50 a 300 % (100: la dimensione del tema). Ctrl+rotellina nel documento la cambia a passi di 10; letta in diretta |
is_position | string | "" | La posizione di lettura, un testo come 12:35 (il primo blocco visibile e di quanto inizia sopra la cima). Leggetela prima di chiudere un documento lungo, reimpostatela per riaprirlo dove il lettore l'aveva lasciato. Letta in diretta; vuota quando nulla è mostrato. Un file in lettura la prende una volta sullo schermo |
ib_search_enabled | boolean | true | Ctrl+F nel documento apre una casella di ricerca — la stessa ricerca di of_search: digitare evidenzia, Invio o F3 successivo, Maiusc+Invio o Maiusc+F3 precedente, Esc chiude. false lascia la scorciatoia a un'applicazione che cerca dalla propria casella |
ib_find_match_case | boolean | false | Opzione di ricerca: trova solo il testo con le stesse maiuscole. L'interruttore Aa della casella di ricerca è lo stesso. Riletta in diretta; of_reset la rimette a false |
ib_find_whole_word | boolean | false | Opzione di ricerca: trova il testo solo come parola intera (pen non è trovato dentro pencil). L'interruttore ab della casella di ricerca è lo stesso. Riletta in diretta; of_reset la rimette a false |
is_theme_style | string | "" | Stile visivo del componente (costanti THEME_STYLE_*); vuoto = quello dell'applicazione, seguito a ogni cambio |
is_theme_mode | string | "" | Variante chiara o scura (costanti THEME_MODE_*); vuoto = quella dell'applicazione, seguita a ogni cambio |
il_theme_accent | long | -1 | Colore d'accento di questo componente (-1 = accento dell'applicazione, o quello del tema) |
is_tooltip | string | "" | Tooltip semplice mostrato al passaggio del mouse sul componente |
is_super_tooltip_title | string | "" | Titolo del tooltip avanzato (prevale su is_tooltip) |
is_super_tooltip_text | string | "" | Testo del tooltip avanzato (markup avanzato accettato) |
is_super_tooltip_image | string | "" | Immagine del tooltip avanzato |
Metodi #
| Metodo | Descrizione |
|---|---|
of_clear ( ) → long | Svuota la vista: is_markdown e is_source si rileggono vuoti; ib_search_enabled e le opzioni di ricerca mantengono il loro valore (è of_reset che rimette ogni proprietà). Una ricerca aperta lo segnala: ue_search_result(0, 0). Restituisce 0, -2 se il componente non è creato |
of_clear_search ( ) → long | Cancella la ricerca: niente più evidenziazione né occorrenza corrente (of_match_count restituisce 0), la casella di ricerca si chiude. Restituisce 0, -2 se il componente non è creato |
of_copy ( ) → long | Copia negli appunti il testo selezionato dall'utente — ciò che fanno Ctrl+C e Ctrl+Ins nel documento. Restituisce 0, -5 se nulla è selezionato, -2 se il componente non è creato |
of_match_count ( ) → long | Restituisce il numero di occorrenze della ricerca corrente, letto IN DIRETTA — il 12 di una barra di stato 3 / 12; al massimo 50.000 sono contate. 0 senza ricerca |
of_match_index ( ) → long | Restituisce la posizione (a partire da 1) dell'occorrenza corrente, letta IN DIRETTA — il 3 di una barra di stato 3 / 12. 0 senza occorrenza |
of_refresh ( ) → long | Rilegge is_source (dal disco o dalla rete): il modo per mostrare un file riscritto allo stesso percorso; la posizione di lettura è mantenuta; segue ue_loaded o ue_load_failed. Restituisce 0, -5 se nessun documento è mostrato, -2 se il componente non è creato |
of_scroll_to ( string as_anchor ) → long | Porta il titolo as_anchor in cima alla vista: la sua ancora come la dà of_toc, con o senza #, o il suo testo; un titolo dentro un details chiuso lo apre. Mentre un file impostato da is_source è in lettura, l'ancora attende il file e la chiamata restituisce 0. Restituisce 0, -5 se nessun titolo corrisponde, -2 se il componente non è creato |
of_search ( string as_query ) → long | Evidenzia ogni occorrenza (senza maiuscole per impostazione predefinita — vedere ib_find_match_case —, come parola intera con ib_find_whole_word) e salta alla prima; un'occorrenza può attraversare un grassetto, un link o un a capo del sorgente, mai un'interruzione forzata. ue_search_result dice quante (al massimo 50.000). Una ricerca vuota è of_clear_search. Mentre un file è in lettura, la ricerca lo riguarda quando arriva. La casella di ricerca si apre con la ricerca dentro; con ib_search_enabled a false, il documento evidenzia soltanto. Restituisce 0, -2 se il componente non è creato |
of_search_next ( ) → long | Passa all'occorrenza SUCCESSIVA (torna alla prima dopo l'ultima); ue_search_result dà la nuova posizione. Restituisce 0, -2 se il componente non è creato |
of_search_prev ( ) → long | Passa all'occorrenza PRECEDENTE (torna all'ultima prima della prima); ue_search_result dà la nuova posizione. Restituisce 0, -2 se il componente non è creato |
of_selected_text ( ) → string | Restituisce il testo selezionato dall'utente nel documento, letto IN DIRETTA — vuoto quando nulla è selezionato |
of_toc ( ref string as_titles[], ref long al_levels[], ref string as_anchors[] ) → long | L'indice, letto IN DIRETTA: una voce per titolo, in ordine — il suo testo, il suo livello (da 1 a 6) e la sua ancora (ciò che prendono of_scroll_to e un link #ancora, alla maniera di GitHub: «Release checklist» dà release-checklist). Gli array sono svuotati prima. Restituisce il numero di titoli, 0 per un documento senza titoli — e mentre un file impostato da is_source è in lettura: chiedetelo in ue_loaded |
Eventi #
| Evento | Quando |
|---|---|
ue_heading_visible (string as_anchor) | Con ib_track_heading: un altro titolo ha raggiunto la cima della vista. as_anchor è la sua ancora come la dà of_toc, vuota sopra il primo titolo |
ue_link_clicked (string as_url, string as_kind) | L'utente ha seguito un link (un clic, o Invio su un link che ha il focus). Il componente NON naviga: aprite as_url dove volete. as_kind dice che cos'è — LINK_WEB, LINK_MAIL, LINK_DOCUMENT (un file Markdown o di testo che questo componente mostra), LINK_FILE (ogni altro file: non avviatelo mai senza chiedere), LINK_OTHER. Un link relativo di un file mostrato da is_source arriva risolto rispetto alla sua cartella; un link #titolo scorre da solo e non è sollevato; un link javascript: o data: non è nemmeno cliccabile |
ue_loaded (string as_source) | Il documento è sullo schermo: as_source è is_source come lo avete scritto, o una stringa vuota per un testo impostato da is_markdown |
ue_load_failed (string as_source, string as_reason) | Il documento non ha potuto essere mostrato: as_reason è una delle costanti REASON_* — REASON_NOT_FOUND (nessun file), REASON_TOO_LARGE (oltre 16 MB), REASON_INSECURE (http://), REASON_UNSUPPORTED (non un file di testo, o un altro protocollo), REASON_FAILED (un errore di lettura o di rete, o un testo illeggibile). as_source è vuoto per un testo impostato da is_markdown; il documento precedente resta mostrato. ue_loaded non è sollevato |
ue_search_result (long al_count, long al_index) | Una ricerca è partita o è avanzata: al_count occorrenze in tutto (al massimo 50.000), la corrente è al_index (a partire da 1, 0 se nessuna) — quanto basta per «3 / 12» |
ue_task_toggled (long al_line, boolean ab_checked) | Con ib_tasks_editable: l'utente ha spuntato (ab_checked a true) o tolto la spunta a una casella di un elenco di attività. al_line è la riga del sorgente Markdown (a partire da 1). Il componente non riscrive il testo: l'applicazione cambia [ ] / [x] su quella riga e reimposta il testo (vedere l'esempio) |
Esempio #
Una guida in linea che apre i suoi link #
Un documento arriva spesso da fuori: si smista in base alla natura del link, mai al suo testo. Una pagina Web o una mail si aprono nel loro programma, un altro documento si mostra nello stesso componente, e un file — un .exe, un .bat — non viene mai avviato senza chiedere.
// ue_link_clicked of uo_md : the viewer never navigates, the application decides by the kind
choose case as_kind
case u_pbt_markdownview.LINK_WEB, u_pbt_markdownview.LINK_MAIL
// A web page, a mail : their program
ShellExecuteW(0, "open", as_url, "", "", 1)
case u_pbt_markdownview.LINK_DOCUMENT
// Another page of the help : in this viewer
uo_md.is_source = as_url
case else
// A file of the disk or of the network : never run without asking
MessageBox("Link", "This link leads to a file : " + as_url)
end choose
Modificare Markdown: un codeeditor e un markdownview #
Il visualizzatore mantiene la posizione di lettura quando il testo cambia: si modifica la fine di un documento lungo senza che l'anteprima torni in cima.
// Local variables
string ls_notes
// The notes of the customer, in Markdown
ls_notes = "# Notes~n~n- [ ] Call back on Monday"
// The editor colours Markdown ; the viewer shows the page
uo_editor.is_syntax = u_pbt_codeeditor.SYNTAX_MARKDOWN
uo_editor.is_text = ls_notes
uo_md.is_markdown = ls_notes
// ue_changed of uo_editor : the whole recipe
uo_md.is_markdown = uo_editor.is_text
Un indice in un elenco #
Per un file impostato da is_source, riempite l'elenco in ue_loaded: prima, il file è ancora in lettura.
// Local variables
string ls_titles[], ls_anchors[]
long ll_levels[], ll_i
// ue_loaded of uo_md : one line per heading, indented by its level
lb_toc.Reset()
for ll_i = 1 to uo_md.of_toc(/*titles*/ ls_titles, /*levels*/ ll_levels, /*anchors*/ ls_anchors)
lb_toc.AddItem(Fill(" ", (ll_levels[ll_i] - 1) * 3) + ls_titles[ll_i])
next
// Local variables
string ls_titles[], ls_anchors[]
long ll_levels[]
// SelectionChanged of lb_toc : bring that heading to the top
uo_md.of_toc(/*titles*/ ls_titles, /*levels*/ ll_levels, /*anchors*/ ls_anchors)
uo_md.of_scroll_to(/*anchor*/ ls_anchors[index])
Una lista di controllo che l'utente spunta #
// Local variables
string ls_text
long ll_at, ll_n
// The user may tick the boxes of the text
uo_md.ib_tasks_editable = true
// ue_task_toggled of uo_md : the start of line al_line of the text
ls_text = uo_md.is_markdown
ll_at = 1
for ll_n = 2 to al_line
ll_at = Pos(ls_text, "~n", ll_at) + 1
next
// Its box, the first "[" of the line, becomes [x] or [ ]
ll_at = Pos(ls_text, "[", ll_at)
if ab_checked then
ls_text = Replace(ls_text, ll_at, 3, "[x]")
else
ls_text = Replace(ls_text, ll_at, 3, "[ ]")
end if
// The text set back : the view keeps its place
uo_md.is_markdown = ls_text
Il componente non riscrive mai il testo da sé: l'applicazione mantiene il controllo su ciò che salva.
Riaprire un documento dove il lettore l'ha lasciato #
// Before closing the window : remember the place in the guide
SetProfileString("acme.ini", "help", "position", uo_md.is_position)
// When the guide is shown again : the place is taken once the file is on screen
uo_md.is_source = "C:\Acme\Help\guide.md"
uo_md.is_position = ProfileString("acme.ini", "help", "position", "")
Buone pratiche #
- È un lettore, non un editor: per scrivere Markdown, mettete accanto un
codeeditorinSYNTAX_MARKDOWN, collegato da una riga nel suo ue_changed (vedere l'esempio); il visualizzatore mantiene la posizione quando il testo cambia. - I link sono vostri: niente si apre da solo;
ue_link_clickeddà l'indirizzo, già risolto rispetto alla cartella del file, e la sua natura (as_kind) — smistate in base a essa, mai al testo dell'indirizzo, e non avviate mai unLINK_FILEsenza chiedere. - Un documento non esegue nulla: l'HTML grezzo è mostrato come scritto (o, con
ib_allow_html, solo un breve elenco di tag inerti), un linkjavascript:resta testo, un'immaginehttp://è rifiutata, come un'immagine su una condivisione di rete (ib_network_pictures) — un documento venuto da fuori si mostra senza rischi. - Le immagini: un percorso relativo si legge rispetto alla cartella del file (o
is_base_pathper un testo); per un'immagine del Web, preferitehttps://, o scaricatela prima (restclient.of_download) e date il suo percorso.ib_remote_picturesafalsenon ne carica nessuna. - Un file si legge in background: dopo
is_source, attendeteue_loadedper leggere l'indice; un'ancora e una ricerca chieste nel frattempo attendono il file. - Un documento grande resta fluido: i primi blocchi compaiono subito, il resto negli istanti seguenti; la ricerca (al massimo 50.000 occorrenze),
of_scroll_toe la stampa aspettano che sia completo. - Da destra a sinistra: il documento segue il verso dell'applicazione (elenchi, citazioni e tabelle si capovolgono), un blocco di codice resta da sinistra a destra, e una colonna allineata dall'autore (
:--,--:) mantiene il suo lato.
Ereditato dalla base comune #
Questi membri esistono su tutti i componenti visivi — non sono propri di questo. Sono descritti una sola volta, nei capitoli trasversali; questa tabella dice solo dove leggerli.
| Membri | Ruolo | Descritto in |
|---|---|---|
of_reset | Riportare il componente a zero | 3.6 Riportare un componente a zero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Scorciatoie da tastiera del componente | 3.5 Le scorciatoie da tastiera |
of_is_created · of_is_ready · of_get_last_error | Se è nato, se è pronto, cosa è fallito | 3.7 Diagnostica |
of_save_as_png · of_save_as_jpg | Esportare il rendering in immagine | 3.8 Esportare il rendering come immagine |
of_set_redraw | Raggruppare le modifiche in un solo ridisegno | 3.10 Buone pratiche |
of_preload_icons | Icone mostrate senza ritardo | Visualizzazione istantanea: of_icon |
of_set_translation | Tradurre una dicitura del componente | 5.2 Adattare un'etichetta: of_set_translation |
of_focus_webview | Dare il focus al componente | 6.4 Tastiera e focus |
of_print · of_print_to_pdf | Stampare, o scrivere un PDF | 6.9 Stampare |
of_set_property · of_get_property · of_component_name | Pilotare una proprietà per nome | 3.1 Il motore delle proprietà |
is_accessible_name · is_accessible_description | Il nome e la descrizione che dice un lettore di schermo | 3.4 Proprietà ed event opzionali |