Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
parse(element) {
if (this._isSkippable(element)) {
return [];
}
this.sections = [];
this.state = {};
this._updateStateFromElement(element);
let finished = false;
// top-level text nodes will be run through parseNode later so avoid running
// the node through parserPlugins twice
if (!isTextNode(element)) {
finished = this.runPlugins(element);
}
if (!finished) {
let childNodes = isTextNode(element) ? [element] : element.childNodes;
forEach(childNodes, el => {
this.parseNode(el);
});
}
this._closeCurrentSection();
return this.sections;
}
parseNode(node) {
if (!this.state.section) {
this._updateStateFromElement(node);
}
let nodeFinished = this.runPlugins(node);
if (nodeFinished) {
return;
}
// handle closing the current section and starting a new one if we hit a
// new-section-creating element.
if (this.state.section && !isTextNode(node) && node.tagName) {
let tagName = normalizeTagName(node.tagName);
let isListSection = contains(VALID_LIST_SECTION_TAGNAMES, tagName);
let isListItem = contains(VALID_LIST_ITEM_TAGNAMES, tagName);
let isMarkupSection = contains(VALID_MARKUP_SECTION_TAGNAMES, tagName);
let isNestedListSection = isListSection && this.state.section.isListItem;
let lastSection = this.sections[this.sections.length - 1];
// we can hit a list item after parsing a nested list, when that happens
// and the lists are of different types we need to make sure we switch
// the list type back
if (isListItem && lastSection && lastSection.isListSection) {
let parentElement = node.parentElement;
let parentElementTagName = normalizeTagName(parentElement.tagName);
if (parentElementTagName !== lastSection.tagName) {
this._closeCurrentSection();
this._updateStateFromElement(parentElement);
}
this.sections = [];
this.state = {};
this._updateStateFromElement(element);
let finished = false;
// top-level text nodes will be run through parseNode later so avoid running
// the node through parserPlugins twice
if (!isTextNode(element)) {
finished = this.runPlugins(element);
}
if (!finished) {
let childNodes = isTextNode(element) ? [element] : element.childNodes;
forEach(childNodes, el => {
this.parseNode(el);
});
}
this._closeCurrentSection();
return this.sections;
}
_getSectionDetails(element) {
let sectionType,
tagName,
inferredTagName = false;
if (isTextNode(element)) {
tagName = DEFAULT_TAG_NAME;
sectionType = MARKUP_SECTION_TYPE;
inferredTagName = true;
} else {
tagName = normalizeTagName(element.tagName);
if (contains(VALID_LIST_SECTION_TAGNAMES, tagName)) {
sectionType = LIST_SECTION_TYPE;
} else if (contains(VALID_LIST_ITEM_TAGNAMES, tagName)) {
sectionType = LIST_ITEM_TYPE;
} else if (contains(VALID_MARKUP_SECTION_TAGNAMES, tagName)) {
sectionType = MARKUP_SECTION_TYPE;
} else {
sectionType = MARKUP_SECTION_TYPE;
tagName = DEFAULT_TAG_NAME;
inferredTagName = true;
_markupsFromElement(element) {
let { builder } = this;
let markups = [];
if (isTextNode(element)) {
return markups;
}
const tagName = normalizeTagName(element.tagName);
if (this._isValidMarkupForElement(tagName, element)) {
markups.push(builder.createMarkup(tagName, getAttributes(element)));
}
this._markupsFromElementStyle(element).forEach(
markup => markups.push(markup)
);
return markups;
}
_markupsFromElement(element) {
let { builder } = this;
let markups = [];
if (isTextNode(element)) {
return markups;
}
const tagName = normalizeTagName(element.tagName);
if (this._isValidMarkupForElement(tagName, element)) {
markups.push(builder.createMarkup(tagName, getAttributes(element)));
}
this._markupsFromElementStyle(element).forEach(
markup => markups.push(markup)
);
return markups;
}
function findOffsetInNode(node, coords) {
let closest, dyClosest = 1e8, coordsClosest, offset = 0;
for (let child = node.firstChild; child; child = child.nextSibling) {
let rects;
if (isElementNode(child)) {
rects = child.getClientRects();
} else if (isTextNode(child)) {
rects = textNodeRects(child);
} else {
continue;
}
for (let i = 0; i < rects.length; i++) {
let rect = rects[i];
if (rect.left <= coords.left && rect.right >= coords.left) {
let dy = rect.top > coords.top ? rect.top - coords.top
: rect.bottom < coords.top ? coords.top - rect.bottom : 0;
if (dy < dyClosest) {
closest = child;
dyClosest = dy;
coordsClosest = dy ? {left: coords.left, top: rect.top} : coords;
if (isElementNode(child) && !child.firstChild) {
offset = i + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0);
_getSectionDetails(element) {
let sectionType,
tagName,
inferredTagName = false;
if (isTextNode(element)) {
tagName = DEFAULT_TAG_NAME;
sectionType = MARKUP_SECTION_TYPE;
inferredTagName = true;
} else {
tagName = normalizeTagName(element.tagName);
if (contains(VALID_LIST_SECTION_TAGNAMES, tagName)) {
sectionType = LIST_SECTION_TYPE;
} else if (contains(VALID_LIST_ITEM_TAGNAMES, tagName)) {
sectionType = LIST_ITEM_TYPE;
} else if (contains(VALID_MARKUP_SECTION_TAGNAMES, tagName)) {
sectionType = MARKUP_SECTION_TYPE;
} else {
sectionType = MARKUP_SECTION_TYPE;
tagName = DEFAULT_TAG_NAME;
inferredTagName = true;