markdownview muestra un documento Markdown de solo lectura, con los colores del tema: títulos, listas, tablas, listas de tareas, código coloreado, imágenes. Fija el texto en is_markdown, o la ruta de un archivo en is_source; un enlace nunca navega, lanza ue_link_clicked y decide la aplicación. El HTML en bruto de un documento nunca se ejecuta.
▶ Verlo en vivo — Aplicación de demostración, mosaico Markdown viewer, con el código y esta página lado a lado.
// 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
El texto Markdown que mostrar. Fijarlo reemplaza el documento (is_source se relee entonces vacío); vacío vacía la vista. El HTML en bruto que contiene se muestra como texto, nunca se ejecuta. Se relee tal como se fijó
is_source
string
""
Un archivo Markdown que mostrar: una ruta del equipo (.md, .markdown, .txt…), una dirección file:/// o una URL https://. Sus imágenes y enlaces relativos se leen respecto a su carpeta. http:// se rechaza (REASON_INSECURE), igual que todo archivo que no sea texto (REASON_UNSUPPORTED); por encima de 16 MB, REASON_TOO_LARGE. Fijarlo reemplaza el documento (is_markdown se relee entonces vacío); sigue ue_loaded o ue_load_failed
ib_search_enabled
boolean
true
Ctrl+F en el documento abre un cuadro de búsqueda — la misma búsqueda que of_search: escribir resalta, Intro o F3 siguiente, Mayús+Intro o Mayús+F3 anterior, Esc cierra. false deja el atajo a una aplicación que busca desde su propio cuadro
ib_find_match_case
boolean
false
Opción de búsqueda: solo encuentra el texto con las mismas mayúsculas. El conmutador Aa del cuadro de búsqueda es el mismo interruptor. Leída en directo; of_reset la devuelve a false
ib_find_whole_word
boolean
false
Opción de búsqueda: solo encuentra el texto como palabra completa (pen no se encuentra dentro de pencil). El conmutador ab del cuadro de búsqueda es el mismo interruptor. Leída en directo; of_reset la devuelve a false
is_theme_style
string
""
Estilo visual del componente (constantes THEME_STYLE_*); vacío = el de la aplicación, seguido en cada cambio
is_theme_mode
string
""
Variante clara u oscura (constantes THEME_MODE_*); vacío = la de la aplicación, seguida en cada cambio
il_theme_accent
long
-1
Color de acento de este componente (-1 = acento de la aplicación, o el del tema)
is_tooltip
string
""
Tooltip simple mostrado al pasar el ratón por el componente
is_super_tooltip_title
string
""
Título del tooltip enriquecido (prevalece sobre is_tooltip)
is_super_tooltip_text
string
""
Texto del tooltip enriquecido (se acepta el marcado enriquecido)
Vacía la vista: is_markdown e is_source se releen vacíos; ib_search_enabled y las opciones de búsqueda conservan su valor (es of_reset quien devuelve cada propiedad). Devuelve 0, -2 si el componente no está creado
of_refresh ( ) → long
Vuelve a leer is_source (del disco o de la red): la manera de mostrar un archivo reescrito en la misma ruta; sigue ue_loaded o ue_load_failed. Devuelve 0, -5 si no se muestra ningún documento, -2 si el componente no está creado
of_search ( string as_query ) → long
Resalta cada aparición (sin mayúsculas por defecto — ver ib_find_match_case —, como palabra completa con ib_find_whole_word) y salta a la primera; una aparición puede atravesar una negrita o un enlace. ue_search_result dice cuántas. Una búsqueda vacía es of_clear_search. El cuadro de búsqueda se abre con la búsqueda dentro; con ib_search_enabled a false, el documento solo resalta. Devuelve 0, -2 si el componente no está creado
of_search_next ( ) → long
Pasa a la aparición SIGUIENTE (vuelve a la primera tras la última); ue_search_result da la nueva posición. Devuelve 0, -2 si el componente no está creado
of_search_prev ( ) → long
Pasa a la aparición ANTERIOR (vuelve a la última antes de la primera); ue_search_result da la nueva posición. Devuelve 0, -2 si el componente no está creado
of_clear_search ( ) → long
Borra la búsqueda: ni resaltado ni aparición actual (of_match_count devuelve 0), el cuadro de búsqueda se cierra. Devuelve 0, -2 si el componente no está creado
of_match_count ( ) → long
Devuelve el número de apariciones de la búsqueda actual, leído EN DIRECTO — el 12 de una barra de estado 3 / 12. 0 sin búsqueda
of_match_index ( ) → long
Devuelve la posición (desde 1) de la aparición actual, leída EN DIRECTO — el 3 de una barra de estado 3 / 12. 0 sin aparición
of_toc ( ref string as_titles[], ref long al_levels[], ref string as_anchors[] ) → long
La tabla de contenidos, leída EN DIRECTO: una entrada por título, en orden — su texto, su nivel (de 1 a 6) y su ancla (lo que toman of_scroll_to y un enlace #ancla, al estilo de GitHub: «Release checklist» da release-checklist). Las matrices se vacían primero. Devuelve el número de títulos, 0 para un documento sin títulos
of_scroll_to ( string as_anchor ) → long
Lleva el título as_anchor a lo alto de la vista: su ancla tal como la da of_toc, con o sin #, o su texto. Devuelve 0, -5 si ningún título coincide, -2 si el componente no está creado
El usuario ha seguido un enlace (un clic, o Intro en un enlace con el foco). El componente NO navega: abra as_url donde quiera. Un enlace relativo de un archivo mostrado por is_source llega resuelto respecto a su carpeta; un enlace #título se desplaza solo y no se lanza; un enlace javascript: o data: ni siquiera es clicable
ue_loaded (string as_source)
El documento está en pantalla: as_source es is_source tal como lo escribió, o una cadena vacía para un texto fijado por is_markdown
is_source no se pudo mostrar: as_reason es una de las constantes REASON_* — REASON_NOT_FOUND (no existe el archivo), REASON_TOO_LARGE (más de 16 MB), REASON_INSECURE (http://), REASON_UNSUPPORTED (no es un archivo de texto, u otro protocolo), REASON_FAILED (un error de lectura o de red). ue_loaded no se lanza
ue_search_result (long al_count, long al_index)
Una búsqueda ha empezado o avanzado: al_count apariciones en total, la actual es al_index (desde 1, 0 si ninguna) — lo necesario para «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
Editar Markdown: un codeeditor y un 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])
Es un lector, no un editor: para escribir Markdown, ponga al lado un codeeditor en SYNTAX_MARKDOWN, unido por una línea en su ue_changed (ver el ejemplo).
Los enlaces son suyos: nada se abre solo; ue_link_clicked da la dirección, ya resuelta respecto a la carpeta del archivo, y usted elige — el navegador, otro documento en el mismo componente, una pantalla de la aplicación.
Un documento no ejecuta nada: el HTML en bruto se muestra tal como está escrito, un enlace javascript: sigue siendo texto, una imagen http:// se rechaza — un documento venido de fuera se muestra sin riesgo.
Las imágenes: una ruta relativa se lee respecto a la carpeta del archivo; para una imagen de la Web, prefiera https://, o descárguela antes (restclient.of_download) y dé su ruta.
Un documento grande sigue fluido: los primeros bloques aparecen enseguida, el resto en los instantes siguientes; la búsqueda, of_scroll_to y la impresión esperan a que esté completo.
De derecha a izquierda: el documento sigue el sentido de la aplicación (listas, citas y tablas se invierten), un bloque de código sigue de izquierda a derecha.
Estos miembros existen en todos los componentes visuales — no son propios de este. Se detallan una sola vez, en los capítulos transversales; esta tabla solo dice dónde leerlos.