| 
									
										
										
										
											2018-09-27 16:00:11 +05:30
										 |  |  | const visit = require('unist-util-visit'); | 
					
						
							|  |  |  | const toHTML = require('hast-util-to-html'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-30 20:34:01 +01:00
										 |  |  | const { sectionFilter } = require('./utils'); | 
					
						
							| 
									
										
										
										
											2018-09-27 16:00:11 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-27 13:47:46 +03:00
										 |  |  | function createPNode() { | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     type: 'element', | 
					
						
							|  |  |  |     tagName: 'p', | 
					
						
							|  |  |  |     children: [], | 
					
						
							|  |  |  |     properties: {} | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | function createBlankLineNode() { | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     type: 'text', | 
					
						
							|  |  |  |     value: '\n' | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-27 16:00:11 +05:30
										 |  |  | 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)) { | 
					
						
							| 
									
										
										
										
											2018-12-27 13:47:46 +03:00
										 |  |  |           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) => { | 
					
						
							| 
									
										
										
										
											2019-02-19 01:59:12 +03:00
										 |  |  |                   if (/^\s*$/.test(line)) { | 
					
						
							| 
									
										
										
										
											2018-12-27 13:47:46 +03:00
										 |  |  |                     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()); | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           }); | 
					
						
							| 
									
										
										
										
											2019-02-18 12:43:09 +03:00
										 |  |  |           const hasData = newChildren.some( | 
					
						
							|  |  |  |             node => node.type !== 'text' || !/^\s*$/.test(node.value) | 
					
						
							|  |  |  |           ); | 
					
						
							|  |  |  |           const textArray = hasData | 
					
						
							|  |  |  |             ? toHTML({ ...node, children: newChildren }) | 
					
						
							|  |  |  |             : ''; | 
					
						
							| 
									
										
										
										
											2018-09-27 16:00:11 +05:30
										 |  |  |           file.data = { | 
					
						
							|  |  |  |             ...file.data, | 
					
						
							|  |  |  |             [sectionId]: textArray | 
					
						
							|  |  |  |           }; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return transformer; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = textToData; |