PBToolboxAI v5 ← Site

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 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.


De un vistazo #

Userobjectu_pbt_markdownview
EntradaUn texto Markdown (is_markdown), o un archivo del equipo o una URL https:// (is_source)
SintaxisCommonMark, 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
Retornoue_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
SeguridadEl 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 #

PropiedadTipoPredeterminadoDescripción
is_markdownstring""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_sourcestring""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_pathstring""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_htmlbooleanfalsetrue 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_picturesbooleanfalsefalse: 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_picturesbooleantruetrue 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_editablebooleanfalsetrue 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_headingbooleanfalsetrue 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_zoominteger100El 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_positionstring""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_enabledbooleantrueCtrl+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_casebooleanfalseOpció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_wordbooleanfalseOpció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_stylestring""Estilo visual del componente (constantes THEME_STYLE_*); vacío = el de la aplicación, seguido en cada cambio
is_theme_modestring""Variante clara u oscura (constantes THEME_MODE_*); vacío = la de la aplicación, seguida en cada cambio
il_theme_accentlong-1Color de acento de este componente (-1 = acento de la aplicación, o el del tema)
is_tooltipstring""Tooltip simple mostrado al pasar el ratón por el componente
is_super_tooltip_titlestring""Título del tooltip enriquecido (prevalece sobre is_tooltip)
is_super_tooltip_textstring""Texto del tooltip enriquecido (se acepta el marcado enriquecido)
is_super_tooltip_imagestring""Imagen del tooltip enriquecido

Métodos #

MétodoDescripción
of_clear ( ) → longVací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 ( ) → longBorra 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 ( ) → longCopia 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 ( ) → longDevuelve 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 ( ) → longDevuelve 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 ( ) → longVuelve 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 ) → longLleva 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 ) → longResalta 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 ( ) → longPasa 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 ( ) → longPasa 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 ( ) → stringDevuelve 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[] ) → longLa 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 #

EventoCuá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 #


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.

MiembrosFunciónDetallado en
of_resetPoner el componente a cero3.6 Poner un componente a cero: of_reset()
of_register_shortcut · of_clear_shortcutsAtajos de teclado del componente3.5 Los atajos de teclado
of_is_created · of_is_ready · of_get_last_errorSi ha nacido, si está listo, qué ha fallado3.7 Diagnóstico
of_save_as_png · of_save_as_jpgExportar el render como imagen3.8 Exportar la representación como imagen
of_set_redrawAgrupar los cambios en un solo repintado3.10 Buenas prácticas
of_preload_iconsIconos mostrados sin retardoVisualización instantánea: of_icon
of_set_translationTraducir una etiqueta del componente5.2 Adaptar una etiqueta: of_set_translation
of_focus_webviewDar el foco al componente6.4 Teclado y foco
of_print · of_print_to_pdfImprimir, o escribir un PDF6.9 Imprimir
of_set_property · of_get_property · of_component_nameControlar una propiedad por su nombre3.1 El motor de propiedades
is_accessible_name · is_accessible_descriptionEl nombre y la descripción que dice un lector de pantalla3.4 Propiedades y eventos opcionales

← Referencia de componentes · Índice de la guía