83 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const visit = require('unist-util-visit');
 | 
						|
const toHTML = require('hast-util-to-html');
 | 
						|
 | 
						|
const { sectionFilter } = require('./utils');
 | 
						|
 | 
						|
function createPNode() {
 | 
						|
  return {
 | 
						|
    type: 'element',
 | 
						|
    tagName: 'p',
 | 
						|
    children: [],
 | 
						|
    properties: {}
 | 
						|
  };
 | 
						|
}
 | 
						|
function createBlankLineNode() {
 | 
						|
  return {
 | 
						|
    type: 'text',
 | 
						|
    value: '\n'
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
function textToData(sectionIds) {
 | 
						|
  if (!sectionIds || !Array.isArray(sectionIds) || sectionIds.length <= 0) {
 | 
						|
    throw new Error("textToData must have an array of section id's supplied");
 | 
						|
  }
 | 
						|
  function transformer(tree, file) {
 | 
						|
    visit(tree, 'element', visitor);
 | 
						|
    function visitor(node) {
 | 
						|
      sectionIds.forEach(sectionId => {
 | 
						|
        if (sectionFilter(node, sectionId)) {
 | 
						|
          const newChildren = [];
 | 
						|
          let currentParagraph = null;
 | 
						|
          node.children.forEach(child => {
 | 
						|
            if (child.type !== 'text') {
 | 
						|
              if (child.type === 'element' && child.tagName === 'p') {
 | 
						|
                newChildren.push(child);
 | 
						|
                currentParagraph = null;
 | 
						|
              } else {
 | 
						|
                if (!currentParagraph) {
 | 
						|
                  currentParagraph = createPNode();
 | 
						|
                  newChildren.push(currentParagraph);
 | 
						|
                }
 | 
						|
                currentParagraph.children.push(child);
 | 
						|
              }
 | 
						|
            } else {
 | 
						|
              const lines = child.value.split('\n');
 | 
						|
              if (lines.filter(Boolean).length > 0) {
 | 
						|
                lines.forEach((line, index) => {
 | 
						|
                  if (line === '') {
 | 
						|
                    currentParagraph = null;
 | 
						|
                  } else {
 | 
						|
                    if (!currentParagraph || index > 0) {
 | 
						|
                      newChildren.push(createBlankLineNode());
 | 
						|
                      currentParagraph = createPNode();
 | 
						|
                      newChildren.push(currentParagraph);
 | 
						|
                    }
 | 
						|
                    currentParagraph.children.push({ ...child, value: line });
 | 
						|
                  }
 | 
						|
                });
 | 
						|
              } else {
 | 
						|
                currentParagraph = null;
 | 
						|
                newChildren.push(createBlankLineNode());
 | 
						|
              }
 | 
						|
            }
 | 
						|
          });
 | 
						|
          const hasData = newChildren.some(
 | 
						|
            node => node.type !== 'text' || !/^\s*$/.test(node.value)
 | 
						|
          );
 | 
						|
          const textArray = hasData
 | 
						|
            ? toHTML({ ...node, children: newChildren })
 | 
						|
            : '';
 | 
						|
          file.data = {
 | 
						|
            ...file.data,
 | 
						|
            [sectionId]: textArray
 | 
						|
          };
 | 
						|
        }
 | 
						|
      });
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return transformer;
 | 
						|
}
 | 
						|
 | 
						|
module.exports = textToData;
 |