78 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.3 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 (/^\s*$/.test(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 textArray = toHTML({ ...node, children: newChildren });
 | |
|           file.data = {
 | |
|             ...file.data,
 | |
|             [sectionId]: textArray
 | |
|           };
 | |
|         }
 | |
|       });
 | |
|     }
 | |
|   }
 | |
|   return transformer;
 | |
| }
 | |
| 
 | |
| module.exports = textToData;
 |