Esta página foi criada em 09/05/2026 às 16:46 horas. A última modificação nesta página foi feita em 14/06/2026.

Projeto Litera

Apresentação

Está cansado de pesquisar por SSGs e encontrar apenas soluções parecidas? Está cansado de entulhar seu computador com dependências de linguagens “modernas” para instalar um SSG pedante e complexo, com funcionalidades que você nunca usará? Está cansado de recorrer a exaustivas documentações de SSG para realizar tarefas simples?

O litera (do latim, letra) é um pequeno e compreensível SSG (Static Site Generator) livre que visa gerir arquivos de conteúdo textual respeitando os princípios do sistema UNIX, o princípio KISS e as convenções do projeto Prensa. Criado sob a licença GPLv3 e sem auxílio de IAs generativas, o litera foi desenvolvido do zero puramente em C89 para garantir maior leveza, eficiência, simplicidade e portabilidade do código, características raras em SSGs “modernos”. Novamente, por valorizar a simplicidade, assim como o DokuWiki, uma das suas inspirações, o litera não exige banco de dados para salvar configurações e metadados dos arquivos de conteúdo, mas utiliza apenas um diretório e, dentro dele, um arquivo de texto puro para detectar modificações e salvar definições dos arquivos indicados, similarmente ao git — só que sem utilizar arquivos binários. Esse arquivo é chamado “de índice” e lista todos os arquivos que devem ser monitorados pelo litera.

História

Inicialmente, o litera foi desenvolvido por mim para simplificar a geração e manutenção das páginas do meu blog. Isso porque, antes do litera, o mecanismo utilizado pelo antigo blog envolvia diversos scripts e um Makefile para guardar ou gerar as informações de configuração de cada página, gerando alta dependência entre os programas, ocasionais inconsistências e o pior detalhe: complexidade. Logo, esse enigma precisava ser resolvido. A partir desse ponto, analisei quase todos os meus possíveis casos de uso e de alguns escritores de blogs, dentre eles Artyom Bologov, para um futuro SSG ser esboçado, priorizando os valores já citados.

Como a especificação inicial do projeto permitia ambiguidades, dúvidas e a previsão da complexidade do problema superava suas expectativas iniciais, eu decidi, antes de implementar o litera, redesenhar o modelo de organização de site utilizado por ele e pela maioria dos escritores para solucionar questões de portabilidade e de futuras inconsistências no algoritmo, porque o clássico mvc deixa algumas pontas soltas. Assim, foi instaurado o Projeto Prensa, um modelo de organização de site inspirado no tradicional mvc, porém, que dispensaria a necessidade de subdiretórios no site final e manteria uma maior consistência na ligação e no agrupamento entre as páginas e os conteúdos não textuais do site, facilitando o desenvolvimento do litera e sua utilização posterior. Com um padrão básico construído e mais alinhado aos seus objetivos, o litera pôde ser continuado.

Devido à supervalorização de eficiência logo no início do desenvolvimento, o algoritmo do projeto perdeu considerável legibilidade e manutenabilidade. Eu deveria ter atendido mais ao conselho de Donald Knuth sobre otimizações prematuras… Por isso, excluí e reescrevi o código obscuro com maior modularidade e legibilidade, mantendo o código adequado e desconsiderando otimizações imediatas, mas permitindo meios para sua implementação no futuro. Depois da implementação das suas operações básicas, status, exclude, include e generate, e de uma bateria exaustiva de testes, a versão 0.0.1 do litera estava pronta.

Agradecimentos

Gostaria de agradecer ao João Lucas Comar do Nascimento, colega de classe na UFPR, por sugerir-me importantes mudanças na arquitetura do litera, e ao “hrcerq”, por indicar-me inconsistências na documentação do projeto.

Como funciona?

Basicamente, o litera atua apenas como um intermediador entre o usuário, o programa conversor de texto plano para HTML, os arquivos de texto e o de índice.

Quando o litera é invocado pelo usuário, o programa primeiramente verifica a existência do arquivo de índice e, se ele existir, abre-o e o percorre para realizar a operação solicitada, senão, estará incapacitado de prosseguir sem o arquivo de índice e devolverá um aviso ao usuário, encerrando-se.

Ao ler uma linha do arquivo de índice, o litera a interpreta. Se o arquivo de texto nela registrado necessitar de uma intervenção durante a operação solicitada pelo usuário, o litera chamará o conversor de formatação desejado para gerar, a partir do conteúdo daquele arquivo registrado, um novo arquivo em outro formato e em outro endereço que atenda à convenção Prensa. A saber, esse arquivo recém gerado ainda não é o mesmo que será visto no website final, mas servirá ao litera como um arquivo intermediário e temporário.

Depois do novo arquivo préformatado estar gerado e salvo, o litera verifica se, na linha de registro do arquivo de conteúdo original, há arquivos de regras a serem aplicados no documento recém gerado. Se houver regras, litera aplica uma a uma, na ordem em que foram escritas na linha de registro do índice, utilizando o programa configurado para ler e executar os scripts de regras.

Após o arquivo intermediário receber os ajustes especificados nos arquivos de regras, ele é renomeado com um nome similar ao seu respectivo arquivo de conteúdo. Porém, ele estará em outro diretório dedicado a conteúdos de hipertexto e não será guardado em subdiretório. Em vez disso, cada barra – ou contrabarra – é substituída por um caractere separador. Por padrão, o caractere separador de (pseudo)diretórios nos nomes das páginas finais é o caractere ponto ‘.’.

Uso

Via de regra, o litera deve ser invocado do seguinte modo:

$ litera [OPERAÇÃO] [ARQUIVO] [REGRA_1 REGRA_2 ... REGRA_N]

onde OPERAÇÃO é o tipo de trabalho que o litera realizará com o ARQUIVO de texto e com os arquivos de REGRA fornecidos. Enquanto o arquivo de texto consiste de conteúdos verbais variáveis produzidos pelo autor do site e utilizador do litera, os arquivos de regra são scripts de pós-edição/pós-processamento aplicados sobre o arquivo gerado a partir de seu original de texto puro. Ou seja, o litera em uma operação de geração, por exemplo, analisa os arquivos do índice: se foram modificados ou se seu respectivo arquivo HTML ainda não existe, ele chama o programa conversor da sintaxe utilizada no arquivo inicial de texto para convertê-lo em um HTML equivalente no diretório adequado; depois do novo HTML gerado, o litera invoca o pós-processador para ler as regras indicadas no mesmo registro do arquivo de texto e as aplica sobre o novo HTML gerado, similarmente ao funcionamento do Troff e dos seus processadores do sistema Unix. Tanto o programa conversor quanto o pós-processador poderão ser configurados futuramente via arquivo de configuração, mas, por ora, ambos só podem ser alterados via alteração e recompilação código-fonte.

Basicamente, o litera suporta quatro operações e todas se orientam pelo arquivo de índice. E, a seguir, estão respectivamente seus nomes e seus caracteres reconhecidos pelo programa como parâmetro:

  1. Status (?)
  2. Exclude (-)
  3. Include (+)
  4. Generate ( )

Operação status

A operação status, intuitivamente, retorna o estado de TODOS os arquivos de conteúdo textual inclusos no índice – considere o arquivo de índice como a “staging area” do git, pois as modificações dos arquivos nele registrados são as que entram em vigor. Se o arquivo estiver modificado depois de sua última inclusão, ou conversão para outro formato, o litera indicará na saída a situação, senão não retornará mensagem alguma, sinalizando normalidade.

Operação exclude

A operação exclude remove do arquivo de índice ou um registro inteiro de arquivo ou apenas algumas de suas configurações. Se esta operação receber apenas um arquivo de conteúdo textual como parâmetro, ela removerá o registro que o contiver. Se receber, além de um arquivo de texto, uma ou mais regras como parâmetro, ela removerá apenas as regras do registro do arquivo.

Operação include

A operação include permite acrescentar ao índice arquivos de conteúdo e suas regras. Se receber apenas um arquivo como parâmetro e ele ainda não estiver no índice, ele será incluído. Se receber, além de um arquivo de texto, regras como parâmetro, o litera acrescentará o arquivo, se ainda não existir no índice, ou somente as regras, se elas ainda não existirem no registro.

Operação generate

A operação generate pode receber no máximo um parâmetro: o arquivo a ser lido na geração de nova página. Porém, ela também pode ser invocada sem parâmetros, indicando ao litera que todos os arquivos do índice devem ser (re)gerados. Nessa etapa, o litera invoca o conversor de conteúdo textual – que, por padrão, é o lowdown – para criar uma nova página em outro formato – normalmente em HTML – e esta, posteriormente, é alterada pelo pós-processador de regras – que é o ped, uma versão minimamente modificada do GNU ed.

Exemplo de uso

Como o litera depende do Padrão Prensa e do arquivo de índice para funcionar, o litera primeiro analisa o diretório no qual está sendo executado e verifica se ele atende ao Prensa e possui um arquivo de índice. Caso o usuário não tenha lido sobre o Prensa e execute o programa pela primeira vez em um novo diretório, o litera detectará a não conformidade do diretório ao Padrão, a ausência de um diretório dedicado ao litera, do arquivo de índice e, por isso, emitirá alertas com instruções para o usuário adequar o ambiente ao Padrão:

$ litera  # primeira execução
WARNING: the needed .litera directory was not found here. 
Please, make a new .litera folder here to allow litera execution.

$ mkdir .litera # usuário *nix cria um diretório oculto para o litera
$ litera  # segunda tentativa de execução
WARNING: the file .litera/index.txt was not found.
WARNING: creating .litera/index.txt file...
ERROR: prensa_test: the needed "text" directory was not found here. 
Please, make a new "text" folder here to allow litera execution. 
ERROR: prensa_test: the needed "hypertext" directory was not found here. 
Please, make a new "hypertext" folder here to allow litera execution. 
ERROR: prensa_test: the needed "media" directory was not found here. 
Please, make a new "media" folder here to allow litera execution. 
ERROR: prensa_test: the needed "style" directory was not found here. 
Please, make a new "style" folder here to allow litera execution. 
ERROR: prensa_test: the needed "other" directory was not found here. 
Please, make a new "other" folder here to allow litera execution. 
ERROR: prensa_test: the needed "rules" directory was not found here. 
Please, make a new "rules" folder here to allow litera execution.

O litera delega a tarefa de criação de diretórios ao usuário porque enfrentá-la implicaria em uma perda desnecessária de portabilidade, visto que, para criar um diretório ou listar seus arquivos, os comandos podem variar de sistema para sistema — e criar um diretório indicado pelo programa não é uma tarefa difícil a quem decide usar o litera.

Depois do ambiente estar adequado ao Prensa, e existir nele um arquivo de índice dentro do diretório oculto do litera (.litera/), o programa continua sua execução e verifica qual operação foi digitada pelo usuário para decidir o que fazer:

$ # criando os diretórios do Prensa em um sistema *nix
$ mkdir text hypertext media style other rules
$
$ litera
$ # sem erros

Embora o diretório atual tenha os diretórios exigidos anteriormente, não existe ainda nenhum artigo ou arquivo de texto a ser rastreado pelo litera, nem arquivos de regra. Então, o litera pode ser executado à essa altura como quiser, mas não encontrará registro algum no índice para processar e, dependendo da operação, apenas retornará um erro.

Assumindo que o usuário possui um texto pessoal armazenado no arquivo blablabla.txt e deseja publicá-lo, ele deve armazenar esse arquivo no subdiretório text/. Para adicioná-lo ao índice do litera e torná-lo a partir de agora um alvo a ser rastreado, basta usar nele a operação include (+):

$ litera + text/blablabla.txt # adiciona arquivo ao índice
$

Como blablabla.txt foi acrescentado ao índice, o litera o rastreará enquanto permanecer registrado. Além disso, do conteúdo de blablabla.txt o litera gerará — por padrão — uma página html equivalente no subdiretório hypertext, se blablabla.txt for modificado ou se ainda não existir uma versão em html dele.

Para conferir se a inclusão de um arquivo ao índice funcionou, o usuário pode invocar o litera no modo status (?):

$ litera ?
        not generated: text/blablabla.txt
$

Assim, o usuário pode solicitar ao litera uma percorrida no índice e todas as gerações — ou atualizações — necessárias das páginas html, bastando para isso invocar o litera sem argumentos, isto é, no modo generate:

$ litera
Generating content from text/blablabla.txt... done.

Ao percorrer o índice — o localizado por padrão em .litera/index.txt —, o litera encontrou o blablabla.txt e procurou sua página equivalente no subdiretório hypertext. Como não a encontrou, ele a construiu em hypertext pela primeira vez a partir do blablabla.txt, gerando a página hypertext/blablabla.html. Se o usuário não alterar as váriaveis do litera, nem seu código-fonte, pode-se afirmar certamente que o programa invocado para converter a formato do documento text/blablabla.txt em hypertext/blablabla.html foi o lowdown.

Para fins de comparação, a seguir está o conteúdo do arquivo text/blablabla.txt e do hypertext/blablabla.txt, respectivamente.

(arquivo text/blablabla.txt)
# Um Interessante Lero Lero

lnmh xngg osyr uxbw ngve lcws nlou sput kifm gfqd pcof lfgr tamy tjxt zovf lfhq
spzr epye grps qjmu wvxr vzsu odlt pywz tdhi cfhb vkix vqok tpsj axys cmdb lqyn
awaw gvgz jvii fdie iqrb zmdm xxyw vunb ifmq ybmd htpv ufte xvkp xhyl ymvi nltd
yuaj gjff bssf aonj uoxc bodk lxvg ybfz equf xxxw chat gpth ggrc uplq ufxv dcba
ocmk clau deai gkcf xosn yolo mvos uote domi cmhn puzk xxiq qzii pwle msqi lulq
robe xtda qpoa jpkr xsnv yxel rcjf kyrg bite wmxq sixr pixk zjsj shit edlz edjj
ssmi dxeb yuwy tflb auso cqgh gomt bdpk eqrd zjzj kqrd qrmw knqa afzt ssxe hnoa
uysj eaex acus ruhp uzuv lqlt esuy rdnj bqai ncab rrdu pyli pxar rqtc zhge khxa
hdib zfcn fdck utqd hyzx xwtb zqps xddg rpii oqow vmiu sbzm pocl ltsu mmhy mvyy
qixl aoxm qcxi pzcf pqtf nvom ssbc sddx ffcl freb wsij rexp xagc trap ranv wbax
kmww kugf giee xazo chnj gola fhik liho xhqq algo ritm osyv gene rati vosj cvtq
rtgx fylv xyxv says fhkp xdiw qnuz nogl vyza yuwh nvtz tarl bzab horc nncd rmcp
nlkd hxwe wsgx ubsw rkfv uxpu bzdv tfad uqhq nygw ceyo bipq wjmm hlrm smsv rkyo
xnih iqwj ztgj axrb yozv izrm vvfg zyqj ysdi xhff jyid igxa anja oaxe nqdv pchl
kbmv atcn tjpb zhxm nojj ddzh bdqx jjkb ejsf ammg tulz yhjg bcox nqsk flno ptum
trfe alft mzoo nzpn aknu tahr lbpt gogv uavz kaha yxpo hrxn gbwj igdu zfsp sodf
pwxb zrij xoqv vvno ubcx xdms inrc wocg rdlg fuhq gjoa thje prsy kdzg rjci qeow
imep gcgw inte lige ncia arti fici aljm oogj gilq joum ddrt jtiu axad znwf qkak
mlhs vois fvyl klky pcha zjof yqcg kpzb aksj kmch naoq depe ndav dele sbkh pnfw
ksny oqnu adof rrli lwtt ibbe jmoo pnzw gkcq oqbe mfin lhvq ijfs ejwx nika geks
vgma mesw opfs awmv qdbb fmwo uszn zyaw xgcf zizz ocov myag addl fdig ievn ivps
wcmm vqle jpjs gylw mxtz gant ecin cgxs zyla dbuh gtmp sdee xkoi rxwf tccj utjp
dvbh pmsn xevb vvwi fyov sujj btpe hbgg uvhq qwvz rhui rgir waqh rvva qjik zyrf
bjdm rovi uxrw vyvh pkos kgqv zktq vzwp lygn kqxu eewt fmty nvtp dfka xnhh mojo
exaa fafh vrtj casp ssvh zcuv osfw wumz apon nztt okik tbid mgzl lwjk ixac fane


(arquivo hypertext/blablabla.html)
<h1 id="um-interessante-lero-lero">Um Interessante Lero Lero</h1>
<p>lnmh xngg osyr uxbw ngve lcws nlou sput kifm gfqd pcof lfgr tamy tjxt zovf lfhq
spzr epye grps qjmu wvxr vzsu odlt pywz tdhi cfhb vkix vqok tpsj axys cmdb lqyn
awaw gvgz jvii fdie iqrb zmdm xxyw vunb ifmq ybmd htpv ufte xvkp xhyl ymvi nltd
yuaj gjff bssf aonj uoxc bodk lxvg ybfz equf xxxw chat gpth ggrc uplq ufxv dcba
ocmk clau deai gkcf xosn yolo mvos uote domi cmhn puzk xxiq qzii pwle msqi lulq
robe xtda qpoa jpkr xsnv yxel rcjf kyrg bite wmxq sixr pixk zjsj shit edlz edjj
ssmi dxeb yuwy tflb auso cqgh gomt bdpk eqrd zjzj kqrd qrmw knqa afzt ssxe hnoa
uysj eaex acus ruhp uzuv lqlt esuy rdnj bqai ncab rrdu pyli pxar rqtc zhge khxa
hdib zfcn fdck utqd hyzx xwtb zqps xddg rpii oqow vmiu sbzm pocl ltsu mmhy mvyy
qixl aoxm qcxi pzcf pqtf nvom ssbc sddx ffcl freb wsij rexp xagc trap ranv wbax
kmww kugf giee xazo chnj gola fhik liho xhqq algo ritm osyv gene rati vosj cvtq
rtgx fylv xyxv says fhkp xdiw qnuz nogl vyza yuwh nvtz tarl bzab horc nncd rmcp
nlkd hxwe wsgx ubsw rkfv uxpu bzdv tfad uqhq nygw ceyo bipq wjmm hlrm smsv rkyo
xnih iqwj ztgj axrb yozv izrm vvfg zyqj ysdi xhff jyid igxa anja oaxe nqdv pchl
kbmv atcn tjpb zhxm nojj ddzh bdqx jjkb ejsf ammg tulz yhjg bcox nqsk flno ptum
trfe alft mzoo nzpn aknu tahr lbpt gogv uavz kaha yxpo hrxn gbwj igdu zfsp sodf
pwxb zrij xoqv vvno ubcx xdms inrc wocg rdlg fuhq gjoa thje prsy kdzg rjci qeow
imep gcgw inte lige ncia arti fici aljm oogj gilq joum ddrt jtiu axad znwf qkak
mlhs vois fvyl klky pcha zjof yqcg kpzb aksj kmch naoq depe ndav dele sbkh pnfw
ksny oqnu adof rrli lwtt ibbe jmoo pnzw gkcq oqbe mfin lhvq ijfs ejwx nika geks
vgma mesw opfs awmv qdbb fmwo uszn zyaw xgcf zizz ocov myag addl fdig ievn ivps
wcmm vqle jpjs gylw mxtz gant ecin cgxs zyla dbuh gtmp sdee xkoi rxwf tccj utjp
dvbh pmsn xevb vvwi fyov sujj btpe hbgg uvhq qwvz rhui rgir waqh rvva qjik zyrf
bjdm rovi uxrw vyvh pkos kgqv zktq vzwp lygn kqxu eewt fmty nvtp dfka xnhh mojo
exaa fafh vrtj casp ssvh zcuv osfw wumz apon nztt okik tbid mgzl lwjk ixac fane</p>

Como se pode ver, o lowdown, com a configuração padrão do litera, somente converteu a sintaxe do primeiro arquivo para a do segundo, mas, no final, não gerou uma página html completa. Para os pedaços faltantes do html padrão serem acrescentados, há duas opções: ou pode ser utilizado um conceito próprio do padrão prensa chamado “arquivo de regra”, ou a parte do código do litera que invoca o lowdown deve ser alterada e recompilada. Como o autor do litera não é preguiçoso, ele não limita a extensibilidade do software à recompilação. Por isso, recomenda-se utilizar o primeiro método, os arquivos de regra, os quais são explicados adiante.

Os arquivos de regras são scripts de pós-edição criados para permitir ao usuário a modificação livre e programada das páginas html logo após serem geradas. Na versão 0.0.1 do litera, os scripts de pós-edição são por padrão interpretados pelo editor de texto ped, um fork do GNU ed orientado a linhas e com suporte a edições programadas via scripts. Desse modo, as páginas html, depois de construídas, podem ser polidas automaticamente por esses scripts já programados.

Por exemplo, para completar a estrutura do arquivo hypertext/blablabla.html, pode-se criar no diretório rules (do inglês, regras) um arquivo de regra chamado completar-html e, nele, programar os comandos de edição necessários para conformar à estrutura HTML do W3C os arquivos a serem editados:

$ # cria com utilitário *nix o arquivo de regra
$ # completar-html no diretório rules
$ touch rules/completar-html

Conteúdo do script rules/completar-html:

# Este script *ed adiciona estrutura html faltante
# em páginas criadas automaticamente pelo lowdown.
#
#
# Na primeira linha do arquivo recebido, inserir
# uma tag html, um header básico e a abertura da
# tag body.
1i
<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="utf-8" >
  </head>
  <body>
.
#
#
# Na última linha do arquivo recebido, acrescentar
# tags de fechamento da estrutura html correta
#
$a
  </body>
</html>
.
#
# escreve modificações e sai
wq

Para um arquivo de texto ter sua respectiva página html automaticamente alterada por um arquivo de regra, ele deverá ser registrado no índice com esse arquivo de regra, por meio da operação include. Do mesmo modo, para aplicarmos as edições do arquivo de regra completar-html nas páginas html a serem geradas a partir de blablabla.txt, devemos acrescentar completar-htmlao registro de blablabla.txt no índice:

$ litera + text/blablabla.txt rules/completar-html

Depois dessa etapa, todas as páginas html geradas a partir de text/blablabla.txt sofrerão as alterações de completar-html. A seguir está uma demonstração do processo:

# remove página html para 
# forçar uma nova geração dela
$ rm hypertext/blablabla.html
$ litera # invoca litera novamente e gera página com regra
2068
2205
Generating content from text/blablabla.txt... done.

E abaixo está o conteúdo da nova página hypertext/blablabla.html gerada com arquivo de regra e com sua estrutura html — quase — completa:

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="utf-8" >
  </head>
  <body>
    <h1 id="um-interessante-lero-lero">Um Interessante Lero Lero</h1>
    <p>lnmh xngg osyr uxbw ngve lcws nlou sput kifm gfqd pcof lfgr tamy tjxt zovf lfhq
    spzr epye grps qjmu wvxr vzsu odlt pywz tdhi cfhb vkix vqok tpsj axys cmdb lqyn
    awaw gvgz jvii fdie iqrb zmdm xxyw vunb ifmq ybmd htpv ufte xvkp xhyl ymvi nltd
    yuaj gjff bssf aonj uoxc bodk lxvg ybfz equf xxxw chat gpth ggrc uplq ufxv
    ocmk clau deai gkcf xosn yolo mvos uote domi cmhn puzk xxiq qzii pwle msqi lulq
    robe xtda qpoa jpkr xsnv yxel rcjf kyrg bite wmxq sixr pixk zjsj shit edlz edjj
    ssmi dxeb yuwy tflb auso cqgh gomt bdpk eqrd zjzj kqrd qrmw knqa afzt ssxe hnoa
    uysj eaex acus ruhp uzuv lqlt esuy rdnj bqai ncab rrdu pyli pxar rqtc zhge khxa
    hdib zfcn fdck utqd hyzx xwtb zqps xddg rpii oqow vmiu sbzm pocl ltsu mmhy mvyy
    qixl aoxm qcxi pzcf pqtf nvom ssbc sddx ffcl freb wsij rexp xagc trap ranv wbax
    kmww kugf giee xazo chnj gola fhik liho xhqq algo ritm osyv gene rati vosj cvtq
    rtgx fylv xyxv says fhkp xdiw qnuz nogl vyza yuwh nvtz tarl bzab horc nncd rmcp
    nlkd hxwe wsgx ubsw rkfv uxpu bzdv tfad uqhq nygw ceyo bipq wjmm hlrm smsv rkyo
    xnih iqwj ztgj axrb yozv izrm vvfg zyqj ysdi xhff jyid igxa anja oaxe nqdv pchl
    kbmv atcn tjpb zhxm nojj ddzh bdqx jjkb ejsf ammg tulz yhjg bcox nqsk flno ptum
    trfe alft mzoo nzpn aknu tahr lbpt gogv uavz kaha yxpo hrxn gbwj igdu zfsp sodf
    pwxb zrij xoqv vvno ubcx xdms inrc wocg rdlg fuhq gjoa thje prsy kdzg rjci qeow
    imep gcgw inte lige ncia arti fici aljm oogj gilq joum ddrt jtiu axad znwf qkak
    mlhs vois fvyl klky pcha zjof yqcg kpzb aksj kmch naoq depe ndav dele sbkh pnfw
    ksny oqnu adof rrli lwtt ibbe jmoo pnzw gkcq oqbe mfin lhvq ijfs ejwx nika geks
    vgma mesw opfs awmv qdbb fmwo uszn zyaw xgcf zizz ocov myag addl fdig ievn ivps
    wcmm vqle jpjs gylw mxtz gant ecin cgxs zyla dbuh gtmp sdee xkoi rxwf tccj utjp
    dvbh pmsn xevb vvwi fyov sujj btpe hbgg uvhq qwvz rhui rgir waqh rvva qjik zyrf
    bjdm rovi uxrw vyvh pkos kgqv zktq vzwp lygn kqxu eewt fmty nvtp dfka xnhh mojo
    exaa fafh vrtj casp ssvh zcuv osfw wumz apon nztt okik tbid mgzl lwjk ixac fane</p>
  </body>
</html>

Essa foi apenas uma aplicação superficial de um arquivo de regra e dos comandos *ed, mas pode ser utilizada para inclusões, exclusões e adaptações de páginas html via edições programadas. Para obter mais informações acerca dos comandos suportados, acesse esta especificação formal do editor ed: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/ed.html.

Encerramento

É esperado que este texto apresente o litera, esclareça seu uso e destaque suas qualidades. Embora a página pareça longa e o projeto ainda esteja no início, os conceitos e o modo de uso do litera deverão ser os mesmos em versões futuras, pois, ele foi desenhado considerando a retrocompatibilidade. Porém, ele já é um utilitário absurdamente simples e funcional para quem valoriza os princípios enfatizados na introdução deste texto. Aliás, todo este blog é gerado automaticamente pelo litera, cabendo a mim apenas escrever o conteúdo textual dele em arquivos “txt”, sem me preocupar com mais detalhes.

Se você aprecia projetos desse teor, por favor, sinta-se à vontade para manifestar sua opinião pelo meu email: gproenca42 arroba gmail ponto com. Ademais, tanto o litera, quanto os demais projetos meus estão de portas abertas para colaboradores, pois são de código aberto e promovem a ideia de software livre, sem fins lucrativos.

Notas