@isicily/epidoc-viewer-core
Version:
exports a javascript function for converting epidoc to Leiden
96 lines (73 loc) • 4.36 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
require("./addCSS.js");
var _rules = _interopRequireDefault(require("./rules.js"));
var _diplomaticRules = _interopRequireDefault(require("./diplomaticRules.js"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var parser = new DOMParser();
function normalizeText(text) {
return text.normalize('NFD').replace(/[\u0300-\u036f]/g, "");
}
function isBreak(node) {
return node.nodeType === Node.ELEMENT_NODE && ['lb', 'ab', 'cb', 'div'].includes(node.nodeName);
}
var convert = function convert(tei, openPopup, showInterpreted, overridingRules) {
// openPopup takes two args: title, body
var fixedTEI = tei.replace(/[\r\n\t]/g, "");
var showDiplomatic = !showInterpreted;
if (showDiplomatic) {
fixedTEI = normalizeText(fixedTEI);
}
var parent = document.createElement('div');
parser.parseFromString(fixedTEI, "application/xml").querySelectorAll('div[type="edition"]').forEach(function (node) {
return parent.appendChild(node);
}); // parser.preserveWhitespace=true;
var tw = document.createTreeWalker(parent); // choose interpreted or diplomatic rules
var rulesToApply = _objectSpread(_objectSpread({}, showInterpreted ? _rules["default"] : _diplomaticRules["default"]), overridingRules);
while (tw.nextNode()) {
if (tw.currentNode.nodeType === Node.TEXT_NODE && showDiplomatic && !['note', 'desc', 'gap'].includes(tw.currentNode.parentNode.nodeName)) {
tw.currentNode.nodeValue = tw.currentNode.nodeValue.toUpperCase();
}
var rule = rulesToApply[tw.currentNode.nodeName];
if (rule) rule(tw.currentNode, tw, openPopup);
} // second pass to remove adjacent brackets that should be elided
// start by setting treewalker back to root
tw.currentNode = parent;
var nextBracketToMatch = null;
var nodeWithLastBracketMatched = null;
while (tw.nextNode()) {
if (tw.currentNode.nodeType === Node.TEXT_NODE && tw.currentNode.nodeValue.trim()) {
if (nextBracketToMatch) {
if (tw.currentNode.nodeValue.trim().startsWith(nextBracketToMatch)) {
// found two adjacent brackets , e.g., ][ or )( or ><
// so remove both brackets
nodeWithLastBracketMatched.nodeValue = nodeWithLastBracketMatched.nodeValue.trim().slice(0, -1);
tw.currentNode.nodeValue = tw.currentNode.nodeValue.trim().slice(1);
} else {
// something else was in the text node besides the bracket we were looking for so
// clear our matches
nextBracketToMatch = null;
nodeWithLastBracketMatched = null;
}
} else if (tw.currentNode.nodeValue.trim().endsWith(']')) {
nextBracketToMatch = '[';
nodeWithLastBracketMatched = tw.currentNode;
} else if (tw.currentNode.nodeValue.trim().endsWith(')')) {
nextBracketToMatch = '(';
nodeWithLastBracketMatched = tw.currentNode;
} else if (tw.currentNode.nodeValue.trim().endsWith('>')) {
nextBracketToMatch = '<';
nodeWithLastBracketMatched = tw.currentNode;
}
}
}
return parent;
};
var _default = convert;
exports["default"] = _default;