markdownview — u_pbt_markdownview #
← Referencia de componentes · Índice de la guía
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 enis_source; un enlace nunca navega, lanzaue_link_clickedy 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.
De un vistazo #
| Userobject | u_pbt_markdownview |
| Entrada | Un texto Markdown (is_markdown), o un archivo del equipo o una URL https:// (is_source) |
| Sintaxis | CommonMark, más las tablas, las listas de tareas, el tachado, los enlaces y direcciones de correo sueltos, las alertas (> [!NOTE]) y los emojis (:+1:) de GitHub |
| Retorno | ue_link_clicked para un enlace, con su naturaleza (decide la aplicación), ue_loaded / ue_load_failed para un documento, ue_search_result para la búsqueda, ue_task_toggled para una casilla marcada |
| Seguridad | El HTML en bruto se muestra como texto; un enlace javascript:, vbscript: o data: no es clicable; una imagen http:// se rechaza, igual que una imagen de un recurso compartido de red; un documento de la Web no muestra ningún archivo del equipo |
Inicio rápido #
// 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
Propiedades #
| Propiedad | Tipo | Predeterminado | Descripción |
|---|---|---|---|
is_markdown | string | "" | El texto Markdown que mostrar. Fijarlo reemplaza el documento (is_source se relee entonces vacío); vacío vacía la vista. Un texto nuevo del MISMO documento — la receta de edición — conserva la posición de lectura. El HTML en bruto que contiene se muestra como texto, nunca se ejecuta (ver ib_allow_html). 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:// — leída por el cliente HTTPS nativo de la biblioteca (el proxy y la identidad Windows del equipo, sin muro CORS). 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, archivo o URL, REASON_TOO_LARGE. El archivo se lee en segundo plano: lea la tabla de contenidos o desplácese en ella una vez recibido ue_loaded (durante la lectura, of_toc devuelve 0 y of_scroll_to espera al archivo). Fijarlo reemplaza el documento (is_markdown se relee entonces vacío) |
is_base_path | string | "" | La carpeta (o la dirección https://) respecto a la que se leen las imágenes y enlaces relativos de un TEXTO fijado por is_markdown — una ayuda guardada en una base de datos junto a sus imágenes. Vacío: la carpeta actual de la aplicación. Un archivo mostrado por is_source usa siempre su propia carpeta. Leída en directo |
ib_allow_html | boolean | false | true dibuja una lista CORTA y cerrada de etiquetas HTML inertes del documento — b, i, u, s, kbd, sub, sup, mark, small, br, img (src, alt, width, height: las reglas de una imagen Markdown), a (href: las reglas de un enlace Markdown) y details / summary. Cualquier otra etiqueta, un script, un estilo, un manejador de eventos siguen siendo texto. false: todo el HTML se muestra tal como está escrito |
ib_network_pictures | boolean | false | false: una imagen del documento situada en la RED (un recurso compartido de un servidor) no se carga — abrir un recurso compartido entrega la identidad Windows del usuario a ese servidor —, salvo si está en el recurso compartido desde el que se leyó el propio documento. true: para la aplicación que muestra SUS documentos desde un recurso compartido. Un documento leído de la Web nunca muestra un archivo del equipo |
ib_remote_pictures | boolean | true | true carga las imágenes https:// de un documento; false no carga ninguna — nada sale del equipo solo porque se muestre un documento (un píxel de seguimiento queda como marcador) |
ib_tasks_editable | boolean | false | true deja al usuario marcar las casillas de una lista de tareas (un clic, o Espacio en una casilla): ue_task_toggled da la LÍNEA de la fuente y el nuevo estado; el TEXTO es de la aplicación, que lo reescribe. false: las casillas son de solo lectura |
ib_track_heading | boolean | false | true lanza ue_heading_visible cada vez que otro título llega a lo alto de la vista mientras el lector se desplaza — una tabla de contenidos que sigue la lectura |
ii_zoom | integer | 100 | El tamaño de lectura, de 50 a 300 % (100: el tamaño del tema). Ctrl+rueda en el documento lo cambia de 10 en 10; leído en directo |
is_position | string | "" | La posición de lectura, un texto como 12:35 (el primer bloque visible y cuánto empieza por encima del borde superior). Léala antes de cerrar un documento largo, vuelva a fijarla para reabrirlo donde el lector lo dejó. Leída en directo; vacía cuando no se muestra nada. Un archivo en lectura la toma una vez en pantalla |
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) |
is_super_tooltip_image | string | "" | Imagen del tooltip enriquecido |
Métodos #
| Método | Descripción |
|---|---|
of_clear ( ) → long | 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). Una búsqueda abierta lo indica: ue_search_result(0, 0). 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_copy ( ) → long | Copia al portapapeles el texto que el usuario ha seleccionado — lo que hacen Ctrl+C y Ctrl+Insert en el documento. Devuelve 0, -5 si no hay nada seleccionado, -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; como máximo se cuentan 50.000. 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_refresh ( ) → long | Vuelve a leer is_source (del disco o de la red): la manera de mostrar un archivo reescrito en la misma ruta; la posición de lectura se conserva; 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_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; un título dentro de un details cerrado lo abre. Mientras se lee un archivo fijado por is_source, el ancla espera al archivo y la llamada devuelve 0. Devuelve 0, -5 si ningún título coincide, -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, un enlace o un salto de línea de la fuente, nunca un salto forzado. ue_search_result dice cuántas (50.000 como máximo). Una búsqueda vacía es of_clear_search. Mientras se lee un archivo, la búsqueda se aplica a él cuando llega. 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_selected_text ( ) → string | Devuelve el texto que el usuario ha seleccionado en el documento, leído EN DIRECTO — vacío cuando no hay nada seleccionado |
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 — y mientras se lee un archivo fijado por is_source: pídala en ue_loaded |
Eventos #
| Evento | Cuándo |
|---|---|
ue_heading_visible (string as_anchor) | Con ib_track_heading: otro título ha llegado a lo alto de la vista. as_anchor es su ancla tal como la da of_toc, vacía por encima del primer título |
ue_link_clicked (string as_url, string as_kind) | 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. as_kind dice lo que es — LINK_WEB, LINK_MAIL, LINK_DOCUMENT (un archivo Markdown o de texto que este componente muestra), LINK_FILE (cualquier otro archivo: nunca lo ejecute sin preguntar), LINK_OTHER. 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 |
ue_load_failed (string as_source, string as_reason) | El documento 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, o un texto ilegible). as_source está vacío para un texto fijado por is_markdown; el documento anterior sigue mostrado. 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 (50.000 como máximo), la actual es al_index (desde 1, 0 si ninguna) — lo necesario para «3 / 12» |
ue_task_toggled (long al_line, boolean ab_checked) | Con ib_tasks_editable: el usuario ha marcado (ab_checked a true) o desmarcado una casilla de una lista de tareas. al_line es la línea de la fuente Markdown (desde 1). El componente no reescribe el texto: la aplicación cambia [ ] / [x] en esa línea y vuelve a fijar el texto (ver el ejemplo) |
Ejemplo #
Una ayuda en línea que abre sus enlaces #
Un documento a menudo viene de fuera: se clasifica por la naturaleza del enlace, nunca por su texto. Una página Web o un correo se abren en su programa, otro documento se muestra en el mismo componente, y un archivo — un .exe, un .bat — nunca se ejecuta sin preguntar.
// 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
Editar Markdown: un codeeditor y un markdownview #
El visor conserva su posición de lectura cuando el texto cambia: se edita el final de un documento largo sin que la vista previa salte arriba.
// 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
Una tabla de contenidos en una lista #
Para un archivo fijado por is_source, rellene la lista en ue_loaded: antes, el archivo aún se está leyendo.
// 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 de control que el usuario marca #
// 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
El componente nunca reescribe el texto por sí mismo: la aplicación conserva el control de lo que guarda.
Reabrir un documento donde el lector lo dejó #
// 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", "")
Buenas prácticas #
- Es un lector, no un editor: para escribir Markdown, ponga al lado un
codeeditorenSYNTAX_MARKDOWN, unido por una línea en su ue_changed (ver el ejemplo); el visor conserva su lugar cuando el texto cambia. - Los enlaces son suyos: nada se abre solo;
ue_link_clickedda la dirección, ya resuelta respecto a la carpeta del archivo, y su naturaleza (as_kind) — clasifique por ella, nunca por el texto de la dirección, y nunca ejecute unLINK_FILEsin preguntar. - Un documento no ejecuta nada: el HTML en bruto se muestra tal como está escrito (o, con
ib_allow_html, solo una lista corta de etiquetas inertes), un enlacejavascript:sigue siendo texto, una imagenhttp://se rechaza, igual que una imagen de un recurso compartido de red (ib_network_pictures) — un documento venido de fuera se muestra sin riesgo. - Las imágenes: una ruta relativa se lee respecto a la carpeta del archivo (o
is_base_pathpara un texto); para una imagen de la Web, prefierahttps://, o descárguela antes (restclient.of_download) y dé su ruta.ib_remote_picturesafalseno carga ninguna. - Un archivo se lee en segundo plano: tras
is_source, espereue_loadedpara leer la tabla de contenidos; un ancla y una búsqueda pedidas entretanto esperan al archivo. - Un documento grande sigue fluido: los primeros bloques aparecen enseguida, el resto en los instantes siguientes; la búsqueda (50.000 apariciones como máximo),
of_scroll_toy 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, y una columna que el autor alineó (
:--,--:) conserva su lado.
Heredado de la base común #
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.
| Miembros | Función | Detallado en |
|---|---|---|
of_reset | Poner el componente a cero | 3.6 Poner un componente a cero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Atajos de teclado del componente | 3.5 Los atajos de teclado |
of_is_created · of_is_ready · of_get_last_error | Si ha nacido, si está listo, qué ha fallado | 3.7 Diagnóstico |
of_save_as_png · of_save_as_jpg | Exportar el render como imagen | 3.8 Exportar la representación como imagen |
of_set_redraw | Agrupar los cambios en un solo repintado | 3.10 Buenas prácticas |
of_preload_icons | Iconos mostrados sin retardo | Visualización instantánea: of_icon |
of_set_translation | Traducir una etiqueta del componente | 5.2 Adaptar una etiqueta: of_set_translation |
of_focus_webview | Dar el foco al componente | 6.4 Teclado y foco |
of_print · of_print_to_pdf | Imprimir, o escribir un PDF | 6.9 Imprimir |
of_set_property · of_get_property · of_component_name | Controlar una propiedad por su nombre | 3.1 El motor de propiedades |
is_accessible_name · is_accessible_description | El nombre y la descripción que dice un lector de pantalla | 3.4 Propiedades y eventos opcionales |