Skip to content

Commit

Permalink
Corrige importação de LexML com citação.
Browse files Browse the repository at this point in the history
Elementos P subsequentes dentro do caput não devem ser considerados como outros artigos, mas como continuação do caput.
  • Loading branch information
juliomelo committed Jul 6, 2018
1 parent 5b67a82 commit 7097c58
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 6 deletions.
23 changes: 19 additions & 4 deletions src/lexml/importarDeLexML.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ function importarDeLexML(elemento, resultado) {
break;

case 'ARTIGO':
clonar(elemento, 'Caput > p', 'artigo', resultado);
clonar(elemento, 'Caput > p', idx => idx === 0 ? 'artigo' : 'continuacao', resultado);

if (/\d+º?-[A-Z]/.test(elemento.querySelector('Rotulo').textContent)) {
resultado.lastElementChild.classList.add('emenda');
Expand Down Expand Up @@ -129,21 +129,36 @@ function obterP(elemento) {
*
* @param {Element} elemento Elemento que será clonado ou que contém os elementos a serem clonados, se a query for especificada.
* @param {String} query Query a ser executada para filtrar os elementos filhos.
* @param {String} tipoFinal Tipo final do elemento clonado.
* @param {String|function} tipoFinal Tipo final do elemento clonado (string) ou uma função que recebe (índice, elemento) e retorna o tipo em string.
* @param {DocumentFragment} resultado
*/
function clonar(elemento, query, tipoFinal, resultado) {
let fnTipo;

switch (typeof tipoFinal) {
case 'string':
fnTipo = () => tipoFinal;
break;

case 'function':
fnTipo = tipoFinal;
break;

default:
throw new Error('Tipo final não é literal nem função.');
}

if (query) {
var itens = elemento.querySelectorAll(query);

for (let i = 0; i < itens.length; i++) {
let novoItem = itens[i].cloneNode(true);
novoItem.setAttribute('data-tipo', tipoFinal);
novoItem.setAttribute('data-tipo', fnTipo(i, novoItem));
resultado.appendChild(novoItem);
}
} else {
let novoItem = elemento.cloneNode(true);
novoItem.setAttribute('data-tipo', tipoFinal);
novoItem.setAttribute('data-tipo', fnTipo(0, novoItem));
resultado.appendChild(novoItem);
}

Expand Down
34 changes: 32 additions & 2 deletions test/karma/importacaoDeLexML.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@
* along with Editor-Articulacao. If not, see <http://www.gnu.org/licenses/>.
*/

describe('Importação do LexML', function() {
describe('Importação do LexML', function () {
'use strict';

var importarDeLexML = window.importarDeLexML;

it('Deve importar os artigos 1 a 3 da constituição federal', function() {
it('Deve importar os artigos 1 a 3 da constituição federal', function () {
var articulacao = `<Articulacao>
<Titulo id="tit1">
<Rotulo>Título I</Rotulo>
Expand Down Expand Up @@ -91,4 +91,34 @@ describe('Importação do LexML', function() {

expect(container.innerHTML).toBe('<p data-tipo="titulo">Dos Princípios Fundamentais</p><p data-tipo="artigo">A República Federativa do Brasil, formada pela união indissolúvel dos Estados e Municípios e do Distrito Federal, constitui-se em Estado democrático de direito e tem como fundamentos:</p><p data-tipo="inciso">a soberania;</p><p data-tipo="inciso">a cidadania;</p><p data-tipo="inciso">a dignidade da pessoa humana;</p><p data-tipo="inciso">os valores sociais do trabalho e da livre iniciativa;</p><p data-tipo="inciso">o pluralismo político.</p><p data-tipo="paragrafo" class="unico">Todo o poder emana do povo, que o exerce por meio de representantes eleitos ou diretamente, nos termos desta Constituição.</p><p data-tipo="artigo">São Poderes da União, independentes e harmônicos entre si, o Legislativo, o Executivo e o Judiciário.</p><p data-tipo="artigo">Constituem objetivos fundamentais da República Federativa do Brasil:</p><p data-tipo="inciso">construir uma sociedade livre, justa e solidária;</p><p data-tipo="inciso">garantir o desenvolvimento nacional;</p><p data-tipo="inciso">erradicar a pobreza e a marginalização e reduzir as desigualdades sociais e regionais;</p><p data-tipo="inciso">promover o bem de todos, sem preconceitos de origem, raça, sexo, cor, idade e quaisquer outras formas de discriminação.</p>');
});

it('Deve importar citações dentro de artigo', function () {
var articulacao = `<Articulacao xmlns="http://www.lexml.gov.br/1.0">
<Artigo id="art1">
<Rotulo>Art. 1º –</Rotulo>
<Caput id="art1_cpt">
<p>Ficam acrescidos ao art. 2º da Lei nº 1.234, de 31 de fevereiro de 2018, os incisos III e IV:</p>
<p>"Art. 2º - (...)</p>
<p>III - testar a importação;</p>
<p>IV - outro teste.".</p>
</Caput>
</Artigo>
<Artigo id="art2">
<Rotulo>Art. 2º –</Rotulo>
<Caput id="art2_cpt">
<p>Esta lei entra em vigor na data de sua publicação.</p>
</Caput>
</Artigo>
</Articulacao>`;

var fragmento = importarDeLexML(articulacao);
var container = document.createElement('div');
container.appendChild(fragmento);

expect(container.innerHTML).toBe('<p data-tipo="artigo">Ficam acrescidos ao art. 2º da Lei nº 1.234, de 31 de fevereiro de 2018, os incisos III e IV:</p>' +
'<p data-tipo="continuacao">"Art. 2º - (...)</p>' +
'<p data-tipo="continuacao">III - testar a importação;</p>' +
'<p data-tipo="continuacao">IV - outro teste.".</p>' +
'<p data-tipo="artigo">Esta lei entra em vigor na data de sua publicação.</p>');
});
});

0 comments on commit 7097c58

Please sign in to comment.