silegismg-interpretador-articulacao
Version:
Interpretador de Articulação
101 lines (100 loc) • 5.04 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
/* Copyright 2017 Assembleia Legislativa de Minas Gerais
*
* This file is part of Interpretador-Articulacao.
*
* Interpretador-Articulacao is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* Interpretador-Articulacao is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Interpretador-Articulacao. If not, see <http://www.gnu.org/licenses/>.
*/
const agrupadores_1 = require("../dispositivos/agrupadores");
const Escapamento_1 = __importDefault(require("./escapamento/Escapamento"));
const EscapeAspas_1 = require("./escapamento/impl/EscapeAspas");
const Contexto_1 = __importDefault(require("./parsers/Contexto"));
const ParserAlinea_1 = __importDefault(require("./parsers/ParserAlinea"));
const ParserArtigo_1 = __importDefault(require("./parsers/ParserArtigo"));
const ParserCapitulo_1 = __importDefault(require("./parsers/ParserCapitulo"));
const ParserContinuacaoDivisao_1 = __importDefault(require("./parsers/ParserContinuacaoDivisao"));
const ParserInciso_1 = __importDefault(require("./parsers/ParserInciso"));
const ParserItem_1 = __importDefault(require("./parsers/ParserItem"));
const ParserParagrafo_1 = __importDefault(require("./parsers/ParserParagrafo"));
const ParserSecao_1 = __importDefault(require("./parsers/ParserSecao"));
const ParserSubsecao_1 = __importDefault(require("./parsers/ParserSubsecao"));
const ParserTitulo_1 = __importDefault(require("./parsers/ParserTitulo"));
/**
* Interpreta conteúdo de articulação.
*
* @param {String} textoOriginal Texto a ser interpretado.
* @returns {IArticulacaoInterpretada} Resultado da interpretação.
*/
function interpretarArticulacao(textoOriginal, opcoes = {}) {
var _a, _b;
const contexto = new Contexto_1.default();
const regexpLinhas = [
...((_a = opcoes.parsersExtras) !== null && _a !== void 0 ? _a : []),
new ParserContinuacaoDivisao_1.default(),
new ParserArtigo_1.default(),
new ParserParagrafo_1.default(),
new ParserInciso_1.default(),
new ParserAlinea_1.default(),
new ParserItem_1.default(),
new ParserTitulo_1.default(),
new ParserCapitulo_1.default(),
new ParserSecao_1.default(),
new ParserSubsecao_1.default()
];
/* Para cada citação, isto é, texto entre aspas, substitui-se o seu conteúdo
* por \0 e o conteúdo substituído é inserido na pilha de aspas, para evitar
* que o conteúdo seja também interpretado.
*/
const escapamento = new Escapamento_1.default(textoOriginal.replace(/\s*\n+\s*/g, '\n'), new EscapeAspas_1.EscapeAspas(), ...((_b = opcoes.escapesExtras) !== null && _b !== void 0 ? _b : []));
for (const linhaSemEscapes of escapamento.processar()) {
if (regexpLinhas.find((regexp) => regexp.processar(contexto, linhaSemEscapes))) {
const item = contexto.ultimoItem;
// Desfaz os escapes.
item.descricao = escapamento.desfazerEscapes(item.descricao);
}
else {
const linha = escapamento.desfazerEscapes();
if (contexto.ultimoItem) {
// Como não foi possível processar, inclui a linha inteira no dispositivo atual.
if (/[.:;!?$][)]?$/.test(contexto.ultimoItem.descricao) || linha.startsWith('(')) {
contexto.ultimoItem.descricao += '\n' + linha;
}
else {
contexto.ultimoItem.descricao += ' ' + linha;
}
}
else if (contexto.articulacao.length > 0
&& contexto.articulacao[contexto.articulacao.length - 1] instanceof agrupadores_1.Divisao) {
// TODO: Rever! Isto aqui ainda é alcansável? Se for, explicar!
contexto.articulacao[contexto.articulacao.length - 1].descricao += '\n' + linha;
}
else if (contexto.textoAnterior.length === 0) {
// Como não foi possível processar, registramos como texto anterior à articulação.
contexto.textoAnterior = linha;
}
else {
// Como não foi possível processar, acrescentamos no texto anterior à articulação.
contexto.textoAnterior += '\n' + linha;
}
}
}
return {
textoAnterior: contexto.textoAnterior,
articulacao: contexto.articulacao
};
}
exports.default = interpretarArticulacao;