UNPKG

silegismg-editor-articulacao

Version:
89 lines (77 loc) 3.18 kB
/* Copyright 2017 Assembleia Legislativa de Minas Gerais * * This file is part of Editor-Articulacao. * * Editor-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. * * Editor-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 Editor-Articulacao. If not, see <http://www.gnu.org/licenses/>. */ /** * Obtém o dispositivo anterior, de determinado tipo. * * @param {Element} dispositivo * @param {String[]} pontosParada Tipos de dispositivos desejados. * @param {String[]} pontosInterrupcao Tipos de dispositivos que, se encontrados, interromperá a obtenção, retornando nulo. * @returns {Element} Dispositivo, se encontrado, ou nulo. */ function encontrarDispositivoAnteriorDoTipo(dispositivo, pontosParada, pontosInterrupcao) { while (!dispositivo.hasAttribute('data-tipo')) { dispositivo = dispositivo.parentNode; } let setParada = new Set(pontosParada); let setInterrupcao = new Set(pontosInterrupcao); for (let prev = dispositivo.previousElementSibling; prev; prev = prev.previousElementSibling) { let tipoAnterior = prev.getAttribute('data-tipo'); if (setParada.has(tipoAnterior)) { return prev; } else if (setInterrupcao.has(tipoAnterior)) { return null; } } return null; } /** * Obtém o dispositivo posterior, de determinado tipo. * * @param {Element} dispositivo * @param {String[]} pontosParada Tipos de dispositivos desejados. * @param {String[]} pontosInterrupcao Tipos de dispositivos que, se encontrados, interromperá a obtenção, retornando nulo. * @returns {Element} Dispositivo, se encontrado, ou nulo. */ function encontrarDispositivoPosteriorDoTipo(elemento, pontosParada, pontosInterrupcao) { while (!elemento.hasAttribute('data-tipo')) { elemento = elemento.parentNode; } let setParada = new Set(pontosParada); let setInterrupcao = new Set(pontosInterrupcao); for (let proximo = elemento.nextElementSibling; proximo; proximo = proximo.nextElementSibling) { let tipoProximo = proximo.getAttribute('data-tipo'); if (setParada.has(tipoProximo)) { return proximo; } else if (setInterrupcao.has(tipoProximo)) { return null; } } return null; } /** * Obtém os tipos de dispositivos em níveis superiores. * * @param {String} tipo Tipo cujos tipos superiores serão obtidos. */ function getTiposSuperiores(tipo) { return { inciso: ['artigo', 'paragrafo'], alinea: ['artigo', 'paragrafo', 'inciso'], item: ['artigo', 'paragrafo', 'inciso', 'alinea'] }[tipo] || []; } export { encontrarDispositivoAnteriorDoTipo, encontrarDispositivoPosteriorDoTipo, getTiposSuperiores };