markdownview — u_pbt_markdownview #
← Komponentenreferenz · Inhalt des Handbuchs
markdownview zeigt ein Markdown-Dokument schreibgeschützt in den Farben des Themas: Überschriften, Listen, Tabellen, Aufgabenlisten, farbiger Code, Bilder. Sie setzen den Text in
is_markdownoder den Pfad einer Datei inis_source; ein Link navigiert nie, er löstue_link_clickedaus und die Anwendung entscheidet. Rohes HTML eines Dokuments wird nie ausgeführt.
▶ Live sehen — Demoanwendung, Kachel Markdown viewer, mit dem Code und dieser Seite nebeneinander.
Auf einen Blick #
| Userobject | u_pbt_markdownview |
| Eingabe | Ein Markdown-Text (is_markdown) oder eine Datei des Arbeitsplatzes bzw. eine https://-URL (is_source) |
| Syntax | CommonMark, dazu die Tabellen, Aufgabenlisten, Durchstreichungen, nackten Links und E-Mail-Adressen, Hinweise (> [!NOTE]) und Emojis (:+1:) von GitHub |
| Rückmeldung | ue_link_clicked für einen Link, mit seiner Art (die Anwendung entscheidet), ue_loaded / ue_load_failed für ein Dokument, ue_search_result für die Suche, ue_task_toggled für ein angehaktes Kästchen |
| Sicherheit | Rohes HTML wird als Text gezeigt; ein javascript:-, vbscript:- oder data:-Link ist nicht anklickbar; ein http://-Bild wird abgelehnt, ebenso ein Bild auf einer Netzwerkfreigabe; ein Dokument aus dem Web zeigt keine Datei des Arbeitsplatzes |
Schnellstart #
// 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
Eigenschaften #
| Eigenschaft | Typ | Standard | Beschreibung |
|---|---|---|---|
is_markdown | string | "" | Der anzuzeigende Markdown-Text. Ihn zu setzen ersetzt das Dokument (is_source liest sich dann leer); leer leert die Ansicht. Ein neuer Text DESSELBEN Dokuments — das Bearbeitungsrezept — behält die Leseposition. Enthaltenes rohes HTML wird als Text angezeigt, nie ausgeführt (siehe ib_allow_html). Liest sich genau so zurück, wie er gesetzt wurde |
is_source | string | "" | Eine anzuzeigende Markdown-Datei: ein Pfad des Arbeitsplatzes (.md, .markdown, .txt…), eine file:///-Adresse oder eine https://-URL — gelesen vom nativen HTTPS-Client der Bibliothek (Proxy und Windows-Identität des Arbeitsplatzes, keine CORS-Sperre). Ihre relativen Bilder und Links werden gegen ihren Ordner gelesen. http:// wird abgelehnt (REASON_INSECURE), ebenso jede Datei, die kein Text ist (REASON_UNSUPPORTED); über 16 MB, Datei oder URL, REASON_TOO_LARGE. Die Datei wird im Hintergrund gelesen: Inhaltsverzeichnis lesen oder darin springen, sobald ue_loaded eingetroffen ist (während des Lesens liefert of_toc 0 und of_scroll_to wartet auf die Datei). Sie zu setzen ersetzt das Dokument (is_markdown liest sich dann leer) |
is_base_path | string | "" | Der Ordner (oder die https://-Adresse), gegen den die relativen Bilder und Links eines mit is_markdown gesetzten TEXTES gelesen werden — eine Hilfe, die in einer Datenbank neben ihren Bildern liegt. Leer: der aktuelle Ordner der Anwendung. Eine mit is_source gezeigte Datei nimmt immer ihren eigenen Ordner. Live gelesen |
ib_allow_html | boolean | false | true zeichnet eine KURZE, geschlossene Liste harmloser HTML-Tags des Dokuments — b, i, u, s, kbd, sub, sup, mark, small, br, img (src, alt, width, height: die Regeln eines Markdown-Bildes), a (href: die Regeln eines Markdown-Links) und details / summary. Jedes andere Tag, ein Skript, ein Stil, ein Ereignishandler bleiben Text. false: das ganze HTML wird so gezeigt, wie es geschrieben ist |
ib_network_pictures | boolean | false | false: ein Bild des Dokuments im NETZWERK (eine Freigabe eines Servers) wird nicht geladen — eine Freigabe zu öffnen übergibt diesem Server die Windows-Identität des Benutzers —, es sei denn, es liegt auf der Freigabe, von der das Dokument selbst gelesen wurde. true: für eine Anwendung, die IHRE Dokumente von einer Freigabe zeigt. Ein aus dem Web gelesenes Dokument zeigt nie eine Datei des Arbeitsplatzes |
ib_remote_pictures | boolean | true | true lädt die https://-Bilder eines Dokuments; false lädt keines — nichts verlässt den Arbeitsplatz, nur weil ein Dokument angezeigt wird (ein Tracking-Pixel bleibt ein Platzhalter) |
ib_tasks_editable | boolean | false | true lässt den Benutzer die Kästchen einer Aufgabenliste ankreuzen (ein Klick oder Leertaste auf einem Kästchen): ue_task_toggled liefert die ZEILE der Quelle und den neuen Zustand; den TEXT schreibt die Anwendung um. false: die Kästchen sind schreibgeschützt |
ib_track_heading | boolean | false | true löst ue_heading_visible jedes Mal aus, wenn beim Scrollen eine andere Überschrift den oberen Rand der Ansicht erreicht — ein Inhaltsverzeichnis, das dem Lesen folgt |
ii_zoom | integer | 100 | Die Lesegröße, 50 bis 300 % (100: die Größe des Themas). Strg+Mausrad im Dokument ändert sie in Schritten von 10; live gelesen |
is_position | string | "" | Die Leseposition, ein Text wie 12:35 (der erste sichtbare Block und wie weit er über dem oberen Rand beginnt). Lesen Sie sie, bevor Sie ein langes Dokument schließen, setzen Sie sie zurück, um es dort zu öffnen, wo der Leser aufgehört hat. Live gelesen; leer, wenn nichts angezeigt wird. Eine gerade gelesene Datei übernimmt sie, sobald sie angezeigt wird |
ib_search_enabled | boolean | true | Strg+F im Dokument öffnet ein Suchfeld — dieselbe Suche wie of_search: Tippen markiert, Eingabe oder F3 weiter, Umschalt+Eingabe oder Umschalt+F3 zurück, Esc schließt. false überlässt die Tastenkombination einer Anwendung, die aus ihrem eigenen Feld sucht |
ib_find_match_case | boolean | false | Suchoption: findet nur Text mit derselben Groß-/Kleinschreibung. Der Schalter Aa des Suchfelds ist derselbe Schalter. Live gelesen; of_reset setzt sie auf false zurück |
ib_find_whole_word | boolean | false | Suchoption: findet den Text nur als ganzes Wort (pen wird in pencil nicht gefunden). Der Schalter ab des Suchfelds ist derselbe Schalter. Live gelesen; of_reset setzt sie auf false zurück |
is_theme_style | string | "" | Visueller Stil der Komponente (Konstanten THEME_STYLE_*); leer = der der Anwendung, bei jeder Änderung übernommen |
is_theme_mode | string | "" | Helle oder dunkle Variante (Konstanten THEME_MODE_*); leer = die der Anwendung, bei jeder Änderung übernommen |
il_theme_accent | long | -1 | Akzentfarbe dieser Komponente (-1 = Akzent der Anwendung, sonst der des Designs) |
is_tooltip | string | "" | Einfacher Tooltip beim Überfahren der Komponente |
is_super_tooltip_title | string | "" | Titel des erweiterten Tooltips (hat Vorrang vor is_tooltip) |
is_super_tooltip_text | string | "" | Text des erweiterten Tooltips (Rich-Markup zulässig) |
is_super_tooltip_image | string | "" | Bild des erweiterten Tooltips |
Methoden #
| Methode | Beschreibung |
|---|---|
of_clear ( ) → long | Leert die Ansicht: is_markdown und is_source lesen sich leer; ib_search_enabled und die Suchoptionen behalten ihren Wert (erst of_reset setzt jede Eigenschaft zurück). Eine offene Suche meldet es: ue_search_result(0, 0). Liefert 0, -2, wenn die Komponente nicht erstellt ist |
of_clear_search ( ) → long | Hebt die Suche auf: keine Markierung und kein aktuelles Vorkommen mehr (of_match_count liefert 0), das Suchfeld schließt sich. Liefert 0, -2, wenn die Komponente nicht erstellt ist |
of_copy ( ) → long | Kopiert den vom Benutzer markierten Text in die Zwischenablage — was Strg+C und Strg+Einfg im Dokument tun. Liefert 0, -5, wenn nichts markiert ist, -2, wenn die Komponente nicht erstellt ist |
of_match_count ( ) → long | Liefert die Anzahl der Vorkommen der aktuellen Suche, LIVE gelesen — die 12 einer Statuszeile 3 / 12; höchstens 50.000 werden gezählt. 0 ohne Suche |
of_match_index ( ) → long | Liefert die Position (ab 1) des aktuellen Vorkommens, LIVE gelesen — die 3 einer Statuszeile 3 / 12. 0 ohne Vorkommen |
of_refresh ( ) → long | Liest is_source erneut (von der Platte oder aus dem Netz): so wird eine am selben Pfad neu geschriebene Datei gezeigt; die Leseposition bleibt; ue_loaded oder ue_load_failed folgt. Liefert 0, -5, wenn kein Dokument gezeigt wird, -2, wenn die Komponente nicht erstellt ist |
of_scroll_to ( string as_anchor ) → long | Bringt die Überschrift as_anchor an den oberen Rand der Ansicht: ihr Anker, wie of_toc ihn liefert, mit oder ohne #, oder ihr Text; eine Überschrift in einem geschlossenen details öffnet es. Während eine mit is_source gesetzte Datei gelesen wird, wartet der Anker auf sie und der Aufruf liefert 0. Liefert 0, -5, wenn keine Überschrift passt, -2, wenn die Komponente nicht erstellt ist |
of_search ( string as_query ) → long | Markiert jedes Vorkommen (standardmäßig ohne Groß-/Kleinschreibung — siehe ib_find_match_case —, als ganzes Wort mit ib_find_whole_word) und springt zum ersten; ein Vorkommen darf über Fettdruck, einen Link oder einen Zeilenumbruch der Quelle reichen, nie über einen erzwungenen Umbruch. ue_search_result sagt, wie viele (höchstens 50.000). Eine leere Suche ist of_clear_search. Während eine Datei gelesen wird, gilt die Suche ihr, sobald sie da ist. Das Suchfeld öffnet sich mit der Suche darin; mit ib_search_enabled auf false markiert das Dokument nur. Liefert 0, -2, wenn die Komponente nicht erstellt ist |
of_search_next ( ) → long | Geht zum NÄCHSTEN Vorkommen (nach dem letzten wieder zum ersten); ue_search_result nennt die neue Position. Liefert 0, -2, wenn die Komponente nicht erstellt ist |
of_search_prev ( ) → long | Geht zum VORHERIGEN Vorkommen (vor dem ersten wieder zum letzten); ue_search_result nennt die neue Position. Liefert 0, -2, wenn die Komponente nicht erstellt ist |
of_selected_text ( ) → string | Liefert den vom Benutzer im Dokument markierten Text, LIVE gelesen — leer, wenn nichts markiert ist |
of_toc ( ref string as_titles[], ref long al_levels[], ref string as_anchors[] ) → long | Das Inhaltsverzeichnis, LIVE gelesen: ein Eintrag je Überschrift, in Reihenfolge — ihr Text, ihre Ebene (1 bis 6) und ihr Anker (was of_scroll_to und ein #anker-Link nehmen, nach GitHub-Art: „Release checklist“ ergibt release-checklist). Die Arrays werden zuerst geleert. Liefert die Anzahl der Überschriften, 0 für ein Dokument ohne — und während eine mit is_source gesetzte Datei gelesen wird: in ue_loaded abfragen |
Ereignisse #
| Ereignis | Wann |
|---|---|
ue_heading_visible (string as_anchor) | Mit ib_track_heading: eine andere Überschrift hat den oberen Rand der Ansicht erreicht. as_anchor ist ihr Anker, wie of_toc ihn liefert, leer über der ersten Überschrift |
ue_link_clicked (string as_url, string as_kind) | Der Benutzer ist einem Link gefolgt (ein Klick, oder Eingabe auf einem fokussierten Link). Die Komponente navigiert NICHT: öffnen Sie as_url, wo Sie wollen. as_kind sagt, was es ist — LINK_WEB, LINK_MAIL, LINK_DOCUMENT (eine Markdown- oder Textdatei, die diese Komponente zeigt), LINK_FILE (jede andere Datei: nie ohne Rückfrage starten), LINK_OTHER. Ein relativer Link einer mit is_source gezeigten Datei kommt gegen ihren Ordner aufgelöst an; ein #überschrift-Link scrollt selbst und wird nicht ausgelöst; ein javascript:- oder data:-Link ist nicht einmal anklickbar |
ue_loaded (string as_source) | Das Dokument ist auf dem Bildschirm: as_source ist is_source, wie Sie es geschrieben haben, oder eine leere Zeichenkette für einen mit is_markdown gesetzten Text |
ue_load_failed (string as_source, string as_reason) | Das Dokument konnte nicht gezeigt werden: as_reason ist eine der Konstanten REASON_* — REASON_NOT_FOUND (keine Datei), REASON_TOO_LARGE (über 16 MB), REASON_INSECURE (http://), REASON_UNSUPPORTED (keine Textdatei oder ein anderes Protokoll), REASON_FAILED (ein Lese- oder Netzwerkfehler, oder ein unlesbarer Text). as_source ist leer für einen mit is_markdown gesetzten Text; das vorherige Dokument bleibt angezeigt. ue_loaded wird nicht ausgelöst |
ue_search_result (long al_count, long al_index) | Eine Suche ist gestartet oder vorgerückt: al_count Vorkommen insgesamt (höchstens 50.000), das aktuelle ist al_index (ab 1, 0 wenn keines) — genug für „3 / 12“ |
ue_task_toggled (long al_line, boolean ab_checked) | Mit ib_tasks_editable: der Benutzer hat ein Kästchen einer Aufgabenliste angekreuzt (ab_checked true) oder geleert. al_line ist die Zeile der Markdown-Quelle (ab 1). Die Komponente schreibt den Text nicht um: die Anwendung ändert [ ] / [x] in dieser Zeile und setzt den Text zurück (siehe Beispiel) |
Beispiel #
Eine Online-Hilfe, die ihre Links öffnet #
Ein Dokument kommt oft von woanders: Sortieren Sie nach der Art des Links, nie nach seinem Text. Eine Webseite oder eine E-Mail öffnet sich in ihrem Programm, ein anderes Dokument erscheint in derselben Komponente, und eine Datei — eine .exe, eine .bat — wird nie ohne Rückfrage gestartet.
// 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
Markdown bearbeiten: ein codeeditor und ein markdownview #
Der Viewer behält seine Leseposition, wenn sich der Text ändert: Sie bearbeiten das Ende eines langen Dokuments, ohne dass die Vorschau nach oben springt.
// 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
Ein Inhaltsverzeichnis in einer Liste #
Bei einer mit is_source gesetzten Datei füllen Sie die Liste in ue_loaded: vorher wird die Datei noch gelesen.
// 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])
Eine Checkliste, die der Benutzer abhakt #
// 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
Die Komponente schreibt den Text nie selbst um: die Anwendung behält die Kontrolle über das, was sie speichert.
Ein Dokument dort wieder öffnen, wo der Leser aufgehört hat #
// 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", "")
Bewährte Praxis #
- Ein Leser, kein Editor: Um Markdown zu schreiben, daneben ein
codeeditorinSYNTAX_MARKDOWN, verbunden durch eine Zeile in seinem ue_changed (siehe Beispiel); der Viewer behält seine Position, wenn sich der Text ändert. - Die Links gehören Ihnen: Nichts öffnet sich von selbst;
ue_link_clickedliefert die Adresse, bereits gegen den Ordner der Datei aufgelöst, und ihre Art (as_kind) — sortieren Sie danach, nie nach dem Text der Adresse, und starten Sie einenLINK_FILEnie ohne Rückfrage. - Ein Dokument führt nichts aus: rohes HTML wird so angezeigt, wie es geschrieben ist (oder, mit
ib_allow_html, nur eine kurze Liste harmloser Tags), einjavascript:-Link bleibt Text, einhttp://-Bild wird abgelehnt, ebenso ein Bild auf einer Netzwerkfreigabe (ib_network_pictures) — ein Dokument von anderswo wird gefahrlos gezeigt. - Bilder: ein relativer Pfad wird gegen den Ordner der Datei gelesen (oder
is_base_pathfür einen Text); für ein Bild aus dem Web lieberhttps://, oder es zuerst herunterladen (restclient.of_download) und seinen Pfad angeben.ib_remote_picturesauffalselädt keines. - Eine Datei wird im Hintergrund gelesen: nach
is_sourceaufue_loadedwarten, um das Inhaltsverzeichnis zu lesen; ein Anker und eine Suche, die inzwischen verlangt werden, warten auf die Datei. - Ein großes Dokument bleibt flüssig: die ersten Blöcke erscheinen sofort, der Rest in den folgenden Augenblicken; die Suche (höchstens 50.000 Vorkommen),
of_scroll_tound der Druck warten, bis es vollständig ist. - Von rechts nach links: das Dokument folgt der Richtung der Anwendung (Listen, Zitate und Tabellen drehen sich um), ein Codeblock bleibt von links nach rechts, und eine vom Autor ausgerichtete Spalte (
:--,--:) behält ihre Seite.
Vom gemeinsamen Sockel geerbt #
Diese Mitglieder gibt es bei jeder visuellen Komponente — sie sind nicht dieser eigen. Sie werden einmal in den übergreifenden Kapiteln beschrieben; diese Tabelle sagt nur, wo man sie liest.
| Mitglieder | Rolle | Beschrieben in |
|---|---|---|
of_reset | Die Komponente zurücksetzen | 3.6 Eine Komponente zurücksetzen: of_reset() |
of_register_shortcut · of_clear_shortcuts | Tastenkürzel der Komponente | 3.5 Tastenkombinationen |
of_is_created · of_is_ready · of_get_last_error | Ob sie entstanden ist, ob sie bereit ist, was fehlschlug | 3.7 Diagnose |
of_save_as_png · of_save_as_jpg | Die Darstellung als Bild exportieren | 3.8 Die Darstellung als Bild exportieren |
of_set_redraw | Änderungen zu einem einzigen Neuzeichnen bündeln | 3.10 Best Practices |
of_preload_icons | Symbole ohne Verzögerung | Sofortige Anzeige: of_icon |
of_set_translation | Eine Beschriftung der Komponente übersetzen | 5.2 Eine Beschriftung anpassen: of_set_translation |
of_focus_webview | Der Komponente den Fokus geben | 6.4 Tastatur und Fokus |
of_print · of_print_to_pdf | Drucken oder ein PDF schreiben | 6.9 Drucken |
of_set_property · of_get_property · of_component_name | Eine Eigenschaft über ihren Namen steuern | 3.1 Die Eigenschaften-Engine |
is_accessible_name · is_accessible_description | Name und Beschreibung, die ein Bildschirmleser sagt | 3.4 Optionale Eigenschaften und Events |