Tarefa 4 - Formato de texto rico

Prazo de entrega recomendado:

Implemente um novo formato para representar arquivos de texto com formatação.


Enquanto os arquivos de texto são muito úteis e amplamente utilizados, eles servem apenas para representar uma sequência de caracteres. Isso é suficiente para muitas pessoas, mas muitas vezes a forma com que escrevemos ou que desenhamos os caracteres pode carregar um significado. Por exemplo, se escrevermos algumas palavras em negrito, o texto dessas palavras vai chamar mais atenção e vamos desviar o olhar para elas quase que instantaneamente. Se usarmos duas cores contrastantes, podemos separar facilmente o diálogo de dois personagens.

Se os arquivos de texto só podem guardar sequências de caracteres, como podemos armazenar texto com informações adicionais? Para resolver esse problema, podemos definir um conjunto de convenções na maneira com que devemos interpretar esses caracteres. Um exemplo é o RTF, ou diversos outros formatos ad-hoc utilizados por editores de texto online.

Nesta tarefas, iremos definir nosso próprio formato de arquivo de texto rico e implementar uma biblioteca para manipular esse formato. A primeira versão suporta apenas negrito. O formato é composto de uma lista de trechos, cada trecho pode estar ou não em negrito. Por exemplo, um usuário pode digitar:

O Papa eh Pop
O Pop não poupa ninguém

Esse texto é representado como um único trecho. O arquivo correspondente é:

NORMAL 'O Papa eh Pop
O Pop não poupa ninguém'

Um usuário pode querer destacar a palavra ‘Papa’, no intervalo de índices $[2,6)$.

O Papa eh Pop
O Pop não poupa ninguém

O arquivo modificado seria:

NORMAL 'O '

NEGRITO 'Papa'

NORMAL ' eh Pop
O Pop não poupa ninguém'

Se logo depois, o usuário destacar também o trecho ’ eh pop’, teríamos:

NORMAL 'O '

NEGRITO 'Papa'

NEGRITO ' eh Pop'

NORMAL '
O Pop não poupa ninguém'

Mas repare que há dois trechos destacados adjacentes. Para manter nossa representação compacta, sempre que isso acontecer, iremos combinar os trechos:

NORMAL 'O '

NEGRITO 'Papa eh Pop'

NORMAL '
O Pop não poupa ninguém'

Escreva um programa editor que receba uma sequência de comandos do usuário e mostre o arquivo resultante no formato definido, na sua forma mais compacta. Suponha que o arquivo começa vazio.

Entrada

A entrada contém uma sequência de comandos. Cada comando é uma string, possivelmente seguida de parâmetros.

INSERIR 0 'O Papa eh Pop
O Pop nao poupa ninguem'

DESTACAR 2 6

DESTACAR 6 13

MOSTRAR

Saída

O conteúdo de arquivo de formato rico na sua forma mais compacta.

NORMAL 'O '

NEGRITO 'Papa eh Pop'

NORMAL '
O Pop nao poupa ninguem'

Dicas

Você pode presumir que não existe o caractere de aspas simples nos arquivos. Nessa situação, é fácil ler uma string entre aspas simples:

scanf(" '%[^']'", buffer);

Isso irá ignorar espaços em branco, ler uma aspa simples, uma sequência arbitrária de caracteres diferentes de aspa simples e outra aspa simples. Você pode supor também que o texto digitado em cada comando tem no máximo 128 caracteres, mas pode ser que um trecho resultante de vários comandos seja muito maior.

Entre outras coisas, seu algoritmo precisará acessar o trecho correspondente ao índice de um caractere dado. Projete uma estrutura de dados em que realizar essa operação seja conveniente. Lembre-se de que o segundo índice da operação DESTACAR não está incluído no intervalo. Tenha isso em mente ao escrever seu algoritmo.

Critérios

É obrigatório representar o arquivo internamente utilizando uma lista ligada. Você pode usar uma variante de lista ligada que achar mais conveniente. Além disso, após cada comando executado pelo usuário, a lista deve representar sempre o arquivo na versão compacta.

Correção

Esta tarefa será corrigida automaticamente sempre que você realizar um git push. Depois de terminada a tarefa, deve-se utilizar o botão na interface de notas para solicitar a correção de um monitor.