PBToolboxAI v5 ← Site

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_markdown oder den Pfad einer Datei in is_source; ein Link navigiert nie, er löst ue_link_clicked aus 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 #

Userobjectu_pbt_markdownview
EingabeEin Markdown-Text (is_markdown) oder eine Datei des Arbeitsplatzes bzw. eine https://-URL (is_source)
SyntaxCommonMark, dazu die Tabellen, Aufgabenlisten, Durchstreichungen, nackten Links und E-Mail-Adressen, Hinweise (> [!NOTE]) und Emojis (:+1:) von GitHub
Rückmeldungue_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
SicherheitRohes 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 #

EigenschaftTypStandardBeschreibung
is_markdownstring""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_sourcestring""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_pathstring""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_htmlbooleanfalsetrue 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_picturesbooleanfalsefalse: 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_picturesbooleantruetrue 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_editablebooleanfalsetrue 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_headingbooleanfalsetrue 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_zoominteger100Die Lesegröße, 50 bis 300 % (100: die Größe des Themas). Strg+Mausrad im Dokument ändert sie in Schritten von 10; live gelesen
is_positionstring""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_enabledbooleantrueStrg+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_casebooleanfalseSuchoption: 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_wordbooleanfalseSuchoption: 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_stylestring""Visueller Stil der Komponente (Konstanten THEME_STYLE_*); leer = der der Anwendung, bei jeder Änderung übernommen
is_theme_modestring""Helle oder dunkle Variante (Konstanten THEME_MODE_*); leer = die der Anwendung, bei jeder Änderung übernommen
il_theme_accentlong-1Akzentfarbe dieser Komponente (-1 = Akzent der Anwendung, sonst der des Designs)
is_tooltipstring""Einfacher Tooltip beim Überfahren der Komponente
is_super_tooltip_titlestring""Titel des erweiterten Tooltips (hat Vorrang vor is_tooltip)
is_super_tooltip_textstring""Text des erweiterten Tooltips (Rich-Markup zulässig)
is_super_tooltip_imagestring""Bild des erweiterten Tooltips

Methoden #

MethodeBeschreibung
of_clear ( ) → longLeert 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 ( ) → longHebt 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 ( ) → longKopiert 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 ( ) → longLiefert 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 ( ) → longLiefert die Position (ab 1) des aktuellen Vorkommens, LIVE gelesen — die 3 einer Statuszeile 3 / 12. 0 ohne Vorkommen
of_refresh ( ) → longLiest 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 ) → longBringt 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 ) → longMarkiert 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 ( ) → longGeht 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 ( ) → longGeht 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 ( ) → stringLiefert 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[] ) → longDas 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 #

EreignisWann
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 #

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 #


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.

MitgliederRolleBeschrieben in
of_resetDie Komponente zurücksetzen3.6 Eine Komponente zurücksetzen: of_reset()
of_register_shortcut · of_clear_shortcutsTastenkürzel der Komponente3.5 Tastenkombinationen
of_is_created · of_is_ready · of_get_last_errorOb sie entstanden ist, ob sie bereit ist, was fehlschlug3.7 Diagnose
of_save_as_png · of_save_as_jpgDie Darstellung als Bild exportieren3.8 Die Darstellung als Bild exportieren
of_set_redrawÄnderungen zu einem einzigen Neuzeichnen bündeln3.10 Best Practices
of_preload_iconsSymbole ohne VerzögerungSofortige Anzeige: of_icon
of_set_translationEine Beschriftung der Komponente übersetzen5.2 Eine Beschriftung anpassen: of_set_translation
of_focus_webviewDer Komponente den Fokus geben6.4 Tastatur und Fokus
of_print · of_print_to_pdfDrucken oder ein PDF schreiben6.9 Drucken
of_set_property · of_get_property · of_component_nameEine Eigenschaft über ihren Namen steuern3.1 Die Eigenschaften-Engine
is_accessible_name · is_accessible_descriptionName und Beschreibung, die ein Bildschirmleser sagt3.4 Optionale Eigenschaften und Events

← Komponentenreferenz · Inhalt des Handbuchs