markdownview — u_pbt_markdownview #
← Referência dos componentes · Índice do guia
markdownview mostra um documento Markdown só de leitura, com as cores do tema: títulos, listas, tabelas, listas de tarefas, código colorido, imagens. Define o texto em
is_markdown, ou o caminho de um ficheiro emis_source; uma ligação nunca navega, levantaue_link_clickede é a aplicação que decide. O HTML em bruto de um documento nunca é executado.
▶ Ver ao vivo — Aplicação de demonstração, mosaico Markdown viewer, com o código e esta página lado a lado.
Em resumo #
| Userobject | u_pbt_markdownview |
| Entrada | Um texto Markdown (is_markdown), ou um ficheiro do posto ou um URL https:// (is_source) |
| Sintaxe | CommonMark, mais as tabelas, as listas de tarefas, o riscado, as ligações e endereços de e-mail soltos, os alertas (> [!NOTE]) e os emojis (:+1:) do GitHub |
| Retorno | ue_link_clicked para uma ligação, com a sua natureza (a aplicação decide), ue_loaded / ue_load_failed para um documento, ue_search_result para a pesquisa, ue_task_toggled para uma caixa assinalada |
| Segurança | O HTML em bruto é mostrado como texto; uma ligação javascript:, vbscript: ou data: não é clicável; uma imagem http:// é recusada, tal como uma imagem numa partilha de rede; um documento da Web não mostra nenhum ficheiro do posto |
Início 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
Propriedades #
| Propriedade | Tipo | Predefinido | Descrição |
|---|---|---|---|
is_markdown | string | "" | O texto Markdown a mostrar. Defini-lo substitui o documento (is_source relê-se então vazio); vazio limpa a vista. Um novo texto do MESMO documento — a receita de edição — mantém a posição de leitura. O HTML em bruto que contém é mostrado como texto, nunca executado (ver ib_allow_html). Relê-se tal como foi definido |
is_source | string | "" | Um ficheiro Markdown a mostrar: um caminho do posto (.md, .markdown, .txt…), um endereço file:/// ou um URL https:// — lido pelo cliente HTTPS nativo da biblioteca (o proxy e a identidade Windows do posto, sem muro CORS). As suas imagens e ligações relativas leem-se em relação à sua pasta. http:// é recusado (REASON_INSECURE), tal como qualquer ficheiro que não seja texto (REASON_UNSUPPORTED); acima de 16 MB, ficheiro ou URL, REASON_TOO_LARGE. O ficheiro lê-se em segundo plano: leia o índice ou desloque-se nele depois de receber ue_loaded (durante a leitura, of_toc devolve 0 e of_scroll_to espera pelo ficheiro). Defini-lo substitui o documento (is_markdown relê-se então vazio) |
is_base_path | string | "" | A pasta (ou o endereço https://) em relação à qual se leem as imagens e ligações relativas de um TEXTO definido por is_markdown — uma ajuda guardada numa base de dados ao lado das suas imagens. Vazio: a pasta atual da aplicação. Um ficheiro mostrado por is_source usa sempre a sua própria pasta. Lida em direto |
ib_allow_html | boolean | false | true desenha uma lista CURTA e fechada de etiquetas HTML inertes do documento — b, i, u, s, kbd, sub, sup, mark, small, br, img (src, alt, width, height: as regras de uma imagem Markdown), a (href: as regras de uma ligação Markdown) e details / summary. Qualquer outra etiqueta, um script, um estilo, um tratador de eventos continuam a ser texto. false: todo o HTML é mostrado tal como está escrito |
ib_network_pictures | boolean | false | false: uma imagem do documento situada na REDE (uma partilha de um servidor) não é carregada — abrir uma partilha entrega a identidade Windows do utilizador a esse servidor —, exceto se estiver na partilha de onde o próprio documento foi lido. true: para a aplicação que mostra os SEUS documentos a partir de uma partilha. Um documento lido da Web nunca mostra um ficheiro do posto |
ib_remote_pictures | boolean | true | true carrega as imagens https:// de um documento; false não carrega nenhuma — nada sai do posto só porque um documento é mostrado (um píxel de rastreio fica como marcador) |
ib_tasks_editable | boolean | false | true deixa o utilizador assinalar as caixas de uma lista de tarefas (um clique, ou Espaço numa caixa): ue_task_toggled dá a LINHA da fonte e o novo estado; o TEXTO é da aplicação, que o reescreve. false: as caixas são só de leitura |
ib_track_heading | boolean | false | true levanta ue_heading_visible sempre que outro título chega ao topo da vista enquanto o leitor percorre — um índice que segue a leitura |
ii_zoom | integer | 100 | O tamanho de leitura, de 50 a 300 % (100: o tamanho do tema). Ctrl+roda no documento altera-o de 10 em 10; lido em direto |
is_position | string | "" | A posição de leitura, um texto como 12:35 (o primeiro bloco visível e quanto começa acima do topo). Leia-a antes de fechar um documento longo, volte a defini-la para o reabrir onde o leitor o deixou. Lida em direto; vazia quando nada é mostrado. Um ficheiro em leitura toma-a uma vez no ecrã |
ib_search_enabled | boolean | true | Ctrl+F no documento abre uma caixa de pesquisa — a mesma pesquisa que of_search: escrever realça, Enter ou F3 seguinte, Shift+Enter ou Shift+F3 anterior, Esc fecha. false deixa o atalho a uma aplicação que pesquisa a partir da sua própria caixa |
ib_find_match_case | boolean | false | Opção de pesquisa: só encontra o texto com as mesmas maiúsculas. O comutador Aa da caixa de pesquisa é o mesmo interruptor. Lida em direto; of_reset repõe-na a false |
ib_find_whole_word | boolean | false | Opção de pesquisa: só encontra o texto como palavra inteira (pen não é encontrado dentro de pencil). O comutador ab da caixa de pesquisa é o mesmo interruptor. Lida em direto; of_reset repõe-na a false |
is_theme_style | string | "" | Estilo visual do componente (constantes THEME_STYLE_*); vazio = o da aplicação, seguido a cada mudança |
is_theme_mode | string | "" | Variante clara ou escura (constantes THEME_MODE_*); vazio = a da aplicação, seguida a cada mudança |
il_theme_accent | long | -1 | Cor de destaque deste componente (-1 = destaque da aplicação, ou o do tema) |
is_tooltip | string | "" | Tooltip simples apresentado ao passar sobre o componente |
is_super_tooltip_title | string | "" | Título do tooltip enriquecido (prevalece sobre is_tooltip) |
is_super_tooltip_text | string | "" | Texto do tooltip enriquecido (aceita marcação enriquecida) |
is_super_tooltip_image | string | "" | Imagem do tooltip enriquecido |
Métodos #
| Método | Descrição |
|---|---|
of_clear ( ) → long | Limpa a vista: is_markdown e is_source relêem-se vazios; ib_search_enabled e as opções de pesquisa mantêm o seu valor (é of_reset que repõe cada propriedade). Uma pesquisa aberta assinala-o: ue_search_result(0, 0). Devolve 0, -2 se o componente não estiver criado |
of_clear_search ( ) → long | Apaga a pesquisa: nem realce nem ocorrência atual (of_match_count devolve 0), a caixa de pesquisa fecha-se. Devolve 0, -2 se o componente não estiver criado |
of_copy ( ) → long | Copia para a área de transferência o texto que o utilizador selecionou — o que Ctrl+C e Ctrl+Insert fazem no documento. Devolve 0, -5 se nada estiver selecionado, -2 se o componente não estiver criado |
of_match_count ( ) → long | Devolve o número de ocorrências da pesquisa atual, lido EM DIRETO — o 12 de uma barra de estado 3 / 12; no máximo são contadas 50 000. 0 sem pesquisa |
of_match_index ( ) → long | Devolve a posição (a partir de 1) da ocorrência atual, lida EM DIRETO — o 3 de uma barra de estado 3 / 12. 0 sem ocorrência |
of_refresh ( ) → long | Volta a ler is_source (do disco ou da rede): a forma de mostrar um ficheiro reescrito no mesmo caminho; a posição de leitura é mantida; segue-se ue_loaded ou ue_load_failed. Devolve 0, -5 se nenhum documento for mostrado, -2 se o componente não estiver criado |
of_scroll_to ( string as_anchor ) → long | Leva o título as_anchor ao topo da vista: a sua âncora tal como of_toc a dá, com ou sem #, ou o seu texto; um título dentro de um details fechado abre-o. Enquanto um ficheiro definido por is_source está a ser lido, a âncora espera pelo ficheiro e a chamada devolve 0. Devolve 0, -5 se nenhum título corresponder, -2 se o componente não estiver criado |
of_search ( string as_query ) → long | Realça cada ocorrência (sem maiúsculas por omissão — ver ib_find_match_case —, como palavra inteira com ib_find_whole_word) e salta para a primeira; uma ocorrência pode atravessar um negrito, uma ligação ou uma quebra de linha da fonte, nunca uma quebra forçada. ue_search_result diz quantas (no máximo 50 000). Uma pesquisa vazia é of_clear_search. Enquanto um ficheiro está a ser lido, a pesquisa aplica-se a ele quando chega. A caixa de pesquisa abre-se com a pesquisa lá dentro; com ib_search_enabled a false, o documento apenas realça. Devolve 0, -2 se o componente não estiver criado |
of_search_next ( ) → long | Passa à ocorrência SEGUINTE (volta à primeira depois da última); ue_search_result dá a nova posição. Devolve 0, -2 se o componente não estiver criado |
of_search_prev ( ) → long | Passa à ocorrência ANTERIOR (volta à última antes da primeira); ue_search_result dá a nova posição. Devolve 0, -2 se o componente não estiver criado |
of_selected_text ( ) → string | Devolve o texto que o utilizador selecionou no documento, lido EM DIRETO — vazio quando nada está selecionado |
of_toc ( ref string as_titles[], ref long al_levels[], ref string as_anchors[] ) → long | O índice, lido EM DIRETO: uma entrada por título, por ordem — o seu texto, o seu nível (1 a 6) e a sua âncora (o que of_scroll_to e uma ligação #âncora recebem, à maneira do GitHub: «Release checklist» dá release-checklist). As matrizes são esvaziadas primeiro. Devolve o número de títulos, 0 para um documento sem títulos — e enquanto um ficheiro definido por is_source está a ser lido: peça-o em ue_loaded |
Eventos #
| Evento | Quando |
|---|---|
ue_heading_visible (string as_anchor) | Com ib_track_heading: outro título chegou ao topo da vista. as_anchor é a sua âncora tal como of_toc a dá, vazia acima do primeiro título |
ue_link_clicked (string as_url, string as_kind) | O utilizador seguiu uma ligação (um clique, ou Enter numa ligação com o foco). O componente NÃO navega: abra as_url onde quiser. as_kind diz o que é — LINK_WEB, LINK_MAIL, LINK_DOCUMENT (um ficheiro Markdown ou de texto que este componente mostra), LINK_FILE (qualquer outro ficheiro: nunca o execute sem perguntar), LINK_OTHER. Uma ligação relativa de um ficheiro mostrado por is_source chega resolvida em relação à sua pasta; uma ligação #título desloca-se sozinha e não é levantada; uma ligação javascript: ou data: nem sequer é clicável |
ue_loaded (string as_source) | O documento está no ecrã: as_source é is_source tal como o escreveu, ou uma cadeia vazia para um texto definido por is_markdown |
ue_load_failed (string as_source, string as_reason) | O documento não pôde ser mostrado: as_reason é uma das constantes REASON_* — REASON_NOT_FOUND (não existe o ficheiro), REASON_TOO_LARGE (mais de 16 MB), REASON_INSECURE (http://), REASON_UNSUPPORTED (não é um ficheiro de texto, ou outro protocolo), REASON_FAILED (um erro de leitura ou de rede, ou um texto ilegível). as_source está vazio para um texto definido por is_markdown; o documento anterior continua mostrado. ue_loaded não é levantado |
ue_search_result (long al_count, long al_index) | Uma pesquisa começou ou avançou: al_count ocorrências no total (no máximo 50 000), a atual é al_index (a partir de 1, 0 se nenhuma) — o necessário para «3 / 12» |
ue_task_toggled (long al_line, boolean ab_checked) | Com ib_tasks_editable: o utilizador assinalou (ab_checked a true) ou desassinalou uma caixa de uma lista de tarefas. al_line é a linha da fonte Markdown (a partir de 1). O componente não reescreve o texto: a aplicação muda [ ] / [x] nessa linha e volta a definir o texto (ver o exemplo) |
Exemplo #
Uma ajuda em linha que abre as suas ligações #
Um documento vem muitas vezes de fora: a triagem faz-se pela natureza da ligação, nunca pelo seu texto. Uma página Web ou um e-mail abrem-se no seu programa, outro documento mostra-se no mesmo componente, e um ficheiro — um .exe, um .bat — nunca é executado sem perguntar.
// 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: um codeeditor e um markdownview #
O visualizador mantém a posição de leitura quando o texto muda: edita-se o fim de um documento longo sem que a pré-visualização salte para o topo.
// 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
Um índice numa lista #
Para um ficheiro definido por is_source, preencha a lista em ue_loaded: antes, o ficheiro ainda está a ser lido.
// 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])
Uma lista de verificação que o utilizador assinala #
// 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
O componente nunca reescreve o texto por si: a aplicação mantém o controlo sobre o que guarda.
Reabrir um documento onde o leitor o deixou #
// 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", "")
Boas práticas #
- É um leitor, não um editor: para escrever Markdown, coloque ao lado um
codeeditoremSYNTAX_MARKDOWN, ligado por uma linha no seu ue_changed (ver o exemplo); o visualizador mantém o seu lugar quando o texto muda. - As ligações são suas: nada se abre sozinho;
ue_link_clickeddá o endereço, já resolvido em relação à pasta do ficheiro, e a sua natureza (as_kind) — faça a triagem por ela, nunca pelo texto do endereço, e nunca execute umLINK_FILEsem perguntar. - Um documento não executa nada: o HTML em bruto é mostrado tal como está escrito (ou, com
ib_allow_html, apenas uma lista curta de etiquetas inertes), uma ligaçãojavascript:continua a ser texto, uma imagemhttp://é recusada, tal como uma imagem numa partilha de rede (ib_network_pictures) — um documento vindo de fora mostra-se sem risco. - As imagens: um caminho relativo lê-se em relação à pasta do ficheiro (ou
is_base_pathpara um texto); para uma imagem da Web, prefirahttps://, ou descarregue-a primeiro (restclient.of_download) e indique o seu caminho.ib_remote_picturesafalsenão carrega nenhuma. - Um ficheiro lê-se em segundo plano: depois de
is_source, espere porue_loadedpara ler o índice; uma âncora e uma pesquisa pedidas entretanto esperam pelo ficheiro. - Um documento grande continua fluido: os primeiros blocos aparecem logo, o resto nos instantes seguintes; a pesquisa (no máximo 50 000 ocorrências),
of_scroll_toe a impressão esperam que esteja completo. - Da direita para a esquerda: o documento segue o sentido da aplicação (listas, citações e tabelas viram-se), um bloco de código continua da esquerda para a direita, e uma coluna que o autor alinhou (
:--,--:) mantém o seu lado.
Herdado da base comum #
Estes membros existem em todos os componentes visuais — não são próprios deste. São detalhados uma só vez, nos capítulos transversais; esta tabela apenas diz onde os ler.
| Membros | Função | Detalhado em |
|---|---|---|
of_reset | Repor o componente a zero | 3.6 Repor um componente a zero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Atalhos de teclado do componente | 3.5 Os atalhos de teclado |
of_is_created · of_is_ready · of_get_last_error | Se nasceu, se está pronto, o que falhou | 3.7 Diagnóstico |
of_save_as_png · of_save_as_jpg | Exportar a renderização como imagem | 3.8 Exportar a representação como imagem |
of_set_redraw | Agrupar as alterações num único repinte | 3.10 Boas práticas |
of_preload_icons | Ícones mostrados sem atraso | Apresentação instantânea: of_icon |
of_set_translation | Traduzir uma legenda do componente | 5.2 Adaptar uma etiqueta: of_set_translation |
of_focus_webview | Dar o foco ao componente | 6.4 Teclado e focus |
of_print · of_print_to_pdf | Imprimir, ou escrever um PDF | 6.9 Imprimir |
of_set_property · of_get_property · of_component_name | Controlar uma propriedade pelo nome | 3.1 O motor de propriedades |
is_accessible_name · is_accessible_description | O nome e a descrição que um leitor de ecrã diz | 3.4 Propriedades e eventos opcionais |