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.
// 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
Der anzuzeigende Markdown-Text. Ihn zu setzen ersetzt das Dokument (is_source liest sich dann leer); leer leert die Ansicht. Enthaltenes rohes HTML wird als Text angezeigt, nie ausgeführt. 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. 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 REASON_TOO_LARGE. Sie zu setzen ersetzt das Dokument (is_markdown liest sich dann leer); ue_loaded oder ue_load_failed folgt
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)
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). Liefert 0, -2, wenn die Komponente nicht erstellt ist
of_refresh ( ) → long
Liest is_source erneut (von der Platte oder aus dem Netz): so wird eine am selben Pfad neu geschriebene Datei gezeigt; ue_loaded oder ue_load_failed folgt. Liefert 0, -5, wenn kein Dokument gezeigt wird, -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 oder einen Link reichen. ue_search_result sagt, wie viele. Eine leere Suche ist of_clear_search. 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_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_match_count ( ) → long
Liefert die Anzahl der Vorkommen der aktuellen Suche, LIVE gelesen — die 12 einer Statuszeile 3 / 12. 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_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
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. Liefert 0, -5, wenn keine Überschrift passt, -2, wenn die Komponente nicht erstellt ist
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. 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
is_source 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). 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, das aktuelle ist al_index (ab 1, 0 wenn keines) — genug für „3 / 12“
// ue_link_clicked of uo_md : the viewer never navigates, the application decides
if Lower(Right(as_url, 3)) = ".md" and FileExists(as_url) then
uo_md.is_source = as_url // another page of the help
else
ShellExecuteW(0, "open", as_url, "", "", 1) // a web page, a mail
end if
Markdown bearbeiten: ein codeeditor und ein markdownview #
// 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
// Local variables
string ls_titles[], ls_anchors[]
long ll_levels[], ll_i
// One line per heading, indented by its level
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
// SelectionChanged of lb_toc : bring that heading to the top
uo_md.of_scroll_to(/*anchor*/ ls_anchors[index])
Ein Leser, kein Editor: Um Markdown zu schreiben, daneben ein codeeditor in SYNTAX_MARKDOWN, verbunden durch eine Zeile in seinem ue_changed (siehe Beispiel).
Die Links gehören Ihnen: Nichts öffnet sich von selbst; ue_link_clicked liefert die Adresse, bereits gegen den Ordner der Datei aufgelöst, und Sie wählen — den Browser, ein anderes Dokument in derselben Komponente, eine Maske der Anwendung.
Ein Dokument führt nichts aus: rohes HTML wird so angezeigt, wie es geschrieben ist, ein javascript:-Link bleibt Text, ein http://-Bild wird abgelehnt — ein Dokument von anderswo wird gefahrlos gezeigt.
Bilder: ein relativer Pfad wird gegen den Ordner der Datei gelesen; für ein Bild aus dem Web lieber https://, oder es zuerst herunterladen (restclient.of_download) und seinen Pfad angeben.
Ein großes Dokument bleibt flüssig: die ersten Blöcke erscheinen sofort, der Rest in den folgenden Augenblicken; die Suche, of_scroll_to und 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.
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.