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 em is_source; uma ligação nunca navega, levanta ue_link_clicked e é 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.
// 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
O texto Markdown a mostrar. Defini-lo substitui o documento (is_source relê-se então vazio); vazio limpa a vista. O HTML em bruto que contém é mostrado como texto, nunca executado. 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://. 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, REASON_TOO_LARGE. Defini-lo substitui o documento (is_markdown relê-se então vazio); segue-se ue_loaded ou ue_load_failed
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)
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). Devolve 0, -2 se o componente não estiver criado
of_refresh ( ) → long
Volta a ler is_source (do disco ou da rede): a forma de mostrar um ficheiro reescrito no mesmo caminho; 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_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 ou uma ligação. ue_search_result diz quantas. Uma pesquisa vazia é of_clear_search. 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_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_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. 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_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
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. Devolve 0, -5 se nenhum título corresponder, -2 se o componente não estiver criado
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. 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
is_source 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). 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, a atual é al_index (a partir de 1, 0 se nenhuma) — o necessário 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: um codeeditor e um 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])
É um leitor, não um editor: para escrever Markdown, coloque ao lado um codeeditor em SYNTAX_MARKDOWN, ligado por uma linha no seu ue_changed (ver o exemplo).
As ligações são suas: nada se abre sozinho; ue_link_clicked dá o endereço, já resolvido em relação à pasta do ficheiro, e é você que escolhe — o navegador, outro documento no mesmo componente, um ecrã da aplicação.
Um documento não executa nada: o HTML em bruto é mostrado tal como está escrito, uma ligação javascript: continua a ser texto, uma imagem http:// é recusada — um documento vindo de fora mostra-se sem risco.
As imagens: um caminho relativo lê-se em relação à pasta do ficheiro; para uma imagem da Web, prefira https://, ou descarregue-a primeiro (restclient.of_download) e indique o seu caminho.
Um documento grande continua fluido: os primeiros blocos aparecem logo, o resto nos instantes seguintes; a pesquisa, of_scroll_to e 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.
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.