From ded774de9c9d55930b67561a44757277c82f76b1 Mon Sep 17 00:00:00 2001 From: milad Date: Tue, 22 May 2018 16:02:29 -0700 Subject: [PATCH] multiple fixes for repeated type defs --- tools/jsdoc/gravPrep.js | 505 +++++++++++++++++++++------------------- 1 file changed, 260 insertions(+), 245 deletions(-) diff --git a/tools/jsdoc/gravPrep.js b/tools/jsdoc/gravPrep.js index be40bc5fb5..f48f08762e 100644 --- a/tools/jsdoc/gravPrep.js +++ b/tools/jsdoc/gravPrep.js @@ -1,216 +1,218 @@ // Dependencies - const htmlclean = require('htmlclean'); - const fs = require('fs'); - const path = require('path'); - const pretty = require('pretty'); - const cheerio = require('cheerio'); - const rimraf = require('rimraf'); - const dedent = require('dedent-js'); +const htmlclean = require('htmlclean'); +const fs = require('fs'); +const path = require('path'); +const pretty = require('pretty'); +const cheerio = require('cheerio'); +const rimraf = require('rimraf'); +const dedent = require('dedent-js'); // Arg Vars - const copyLocal = process.argv[2]; - console.log("copyLocal:", copyLocal); - let targetTemplateDirectory = ''; - let targetMDDirectory = ''; - if (copyLocal){ - targetTemplateDirectory = process.argv[3]; - targetMDDirectory = process.argv[4];; - } +const copyLocal = process.argv[2]; +console.log("copyLocal:", copyLocal); +let targetTemplateDirectory = ''; +let targetMDDirectory = ''; +if (copyLocal) { + targetTemplateDirectory = process.argv[3]; + targetMDDirectory = process.argv[4];; +} // Required directories - let dir_out = path.join(__dirname, 'out'); +let dir_out = path.join(__dirname, 'out'); - let dir_grav = path.join(dir_out, 'grav'); - let dir_css = path.join(dir_grav, 'css'); - let dir_js = path.join(dir_grav, 'js'); - let dir_template = path.join(dir_grav, 'templates'); +let dir_grav = path.join(dir_out, 'grav'); +let dir_css = path.join(dir_grav, 'css'); +let dir_js = path.join(dir_grav, 'js'); +let dir_template = path.join(dir_grav, 'templates'); + +let dir_md = path.join(dir_grav, '06.api-reference'); +let dir_md_objects = path.join(dir_md, '02.Objects'); +let dir_md_namespaces = path.join(dir_md, '01.Namespaces'); +let dir_md_globals = path.join(dir_md, '03.Globals'); - let dir_md = path.join(dir_grav, '06.api-reference'); - let dir_md_objects = path.join(dir_md, '02.Objects'); - let dir_md_namespaces = path.join(dir_md, '01.Namespaces'); - let dir_md_globals = path.join(dir_md, '03.Globals'); - // Array to itterate over and create if doesn't exist - let dirArray = [dir_grav, dir_css, dir_js, dir_template, dir_md, dir_md_objects, dir_md_namespaces, dir_md_globals]; +let dirArray = [dir_grav, dir_css, dir_js, dir_template, dir_md, dir_md_objects, dir_md_namespaces, dir_md_globals]; // Base Grouping Directories for MD files - let baseMDDirectories = ["API-Reference", "Globals", "Namespaces", "Objects"]; +let baseMDDirectories = ["API-Reference", "Globals", "Namespaces", "Objects"]; // Maps for directory names - let map_dir_md = { - "API-Reference": dir_md, - "Globals": dir_md_globals, - "Objects": dir_md_objects, - "Namespaces": dir_md_namespaces, - "Class": dir_md_objects, - "Namespace": dir_md_namespaces, - "Global": dir_md_globals - } +let map_dir_md = { + "API-Reference": dir_md, + "Globals": dir_md_globals, + "Objects": dir_md_objects, + "Namespaces": dir_md_namespaces, + "Class": dir_md_objects, + "Namespace": dir_md_namespaces, + "Global": dir_md_globals +} // Map for Links - let map_links = { - "Global": "globals", - "Namespace": "namespaces", - "Class": "objects" - } +let map_links = { + "Global": "globals", + "Namespace": "namespaces", + "Class": "objects" +} // Mapping for GroupNames and Members - let groupNameMemberMap = { - "Objects": [], - "Namespaces": [], - "Globals": [] - } - +let groupNameMemberMap = { + "Objects": [], + "Namespaces": [], + "Globals": [] +} + // Html variables to be handle regex replacements - const html_reg_static = /\(static\)<\/span>/g - const html_reg_title = /\.+?\<\/h1\>/g; - const html_reg_htmlExt = /\.html/g; - const html_reg_objectHeader = /
[\s\S]+?<\/header>/; - const html_reg_objectSpanNew = /
<\/h5>/; - const html_reg_propertiesHeaderEdit = '

Properties:

'; - const html_reg_propertiesHeaderEdit_Replace = '

Properties

'; - const html_reg_typeEdit = /(
Returns[\s\S]*?Type)(<\/dt[\s\S]*?type">)(.*?)(<\/span><\/dd>[\s\S]*?<\/dl>)/g; - const html_reg_typeEdit_replace = '$1: $3' - const html_reg_methodSize = /()/g; - const html_reg_methodSize_replace = ''; - const html_reg_findByName = '
` - const html_reg_signalTitle = `

Signals

`; - const html_reg_typeDefinitonsTitle = /

Type Definitions<\/h3>/; - const html_reg_typeDefinitonsTitle_replace = `

Type Definitions

` - const html_reg_classDefinitonsTitle = /

Classes<\/h3>/; - const html_reg_classDefinitonsTitle_replace = `

Classes

` - const html_reg_firstDivClose = ``; - const html_reg_allNonHTML = /()/g; - const html_reg_pretty = /(
)([\s\S]*?)(<\/pre>)/g;
-    const html_reg_pretty_replace = "
$2<\/pre>";
-    const html_reg_availableIn = /([\s\S]+?Available in:[\s\S]+?<\/table>)/g;
-    const html_reg_findControllerCuratedList = /
Functions<\/h5>[\s\S]*?

Input Recordings[\s\S]*?<\/ul>/g - const html_reg_findEntityMethods = /

Entity Methods:[\s\S]+?<\/ul>/g; - const html_reg_EntityMethodsHeader = '
Entity Methods:
'; - const html_reg_EntityMethodsHeader_replace = '
Entity Methods
'; - const html_reg_dlClassDetails = /
<\/dl>/g - const html_reg_typeDefType = /(
)(Type:)(<\/h5>[\s\S]*?)([\s\S]*?<\/ul>)/g; - const html_reg_typeDefType_replace = `
$2 $4
`; +const html_reg_static = /\(static\)<\/span>/g +const html_reg_title = /\.+?\<\/h1\>/g; +const html_reg_htmlExt = /\.html/g; +const html_reg_objectHeader = /
[\s\S]+?<\/header>/; +const html_reg_objectSpanNew = /
<\/h5>/; +const html_reg_propertiesHeaderEdit = '

Properties:

'; +const html_reg_propertiesHeaderEdit_Replace = '

Properties

'; +const html_reg_typeEdit = /(
Returns[\s\S]*?Type)(<\/dt[\s\S]*?type">)(.*?)(<\/span><\/dd>[\s\S]*?<\/dl>)/g; +const html_reg_typeEdit_replace = '$1: $3
' +const html_reg_methodSize = /()/g; +const html_reg_methodSize_replace = ''; +const html_reg_findByName = '
` +const html_reg_signalTitle = `

Signals

`; +const html_reg_typeDefinitonsTitle = /

Type Definitions<\/h3>/; +const html_reg_typeDefinitonsTitle_replace = `

Type Definitions

` +const html_reg_classDefinitonsTitle = /

Classes<\/h3>/; +const html_reg_classDefinitonsTitle_replace = `

Classes

` +const html_reg_firstDivClose = ``; +const html_reg_allNonHTML = /()/g; +const html_reg_pretty = /(
)([\s\S]*?)(<\/pre>)/g;
+const html_reg_pretty_replace = "
$2<\/pre>";
+const html_reg_availableIn = /(
[\s\S]+?Available in:[\s\S]+?<\/table>)/g; +const html_reg_findControllerCuratedList = /
Functions<\/h5>[\s\S]*?

Input Recordings[\s\S]*?<\/ul>/g +const html_reg_findEntityMethods = /

Entity Methods:[\s\S]+?<\/ul>/g; +const html_reg_EntityMethodsHeader = '
Entity Methods:
'; +const html_reg_EntityMethodsHeader_replace = '
Entity Methods
'; +const html_reg_dlClassDetails = /
<\/dl>/g +const html_reg_typeDefType = /(
)(Type:)(<\/h5>[\s\S]*?)([\s\S]*?<\/ul>)/g; +const html_reg_typeDefType_replace = `
$2 $4
`; +const html_reg_returnSize = /
Returns:<\/h5>/g; +const html_reg_returnSize_replace = '
Returns:<\/h6>'; // Procedural functions - // Turn links to lower case that aren't part of IDs - function allLinksToLowerCase(match, p1, p2, p3){ - // split on id # and make sure only the preceding is lower case - if (p2.indexOf("#") > -1){ - p2 = p2.split("#"); - p2 = [p2[0].toLowerCase(), "#", p2[1]].join(""); +// Turn links to lower case that aren't part of IDs +function allLinksToLowerCase(match, p1, p2, p3) { + // split on id # and make sure only the preceding is lower case + if (p2.indexOf("#") > -1) { + p2 = p2.split("#"); + p2 = [p2[0].toLowerCase(), "#", p2[1]].join(""); + } else { + p2 = p2.toLowerCase(); + } + return [p1, p2, p3].join(""); +} + +// Return the right group for where the method or type came from +function fixLinkGrouping(match, p1, p2, p3) { + if (p2.indexOf("#") > -1) { + let split = p2.split("#"); + if (split[0] === "global") { + return [p1, "/api-reference/", "globals", "#", split[1], p3].join(""); + } + return [p1, "/api-reference/", returnRightGroup(split[0]), "/", p2, p3].join(""); + } else { + if (p2.indexOf(".") > -1) { + let split = p2.split("."); + return [p1, "/api-reference/", returnRightGroup(split[1]), "/", split[1], p3].join(""); + } + return [p1, "/api-reference/", returnRightGroup(p2), "/", p2, p3].join(""); + } + +} + +function returnRightGroup(methodToCheck) { + for (var key in groupNameMemberMap) { + for (i = 0; i < groupNameMemberMap[key].length; i++) { + if (methodToCheck.toLowerCase() === groupNameMemberMap[key][i].toLowerCase()) { + return key.toLowerCase(); } else { - p2 = p2.toLowerCase(); - } - return [p1,p2,p3].join(""); - } - - // Return the right group for where the method or type came from - function fixLinkGrouping(match, p1, p2, p3){ - if (p2.indexOf("#") > -1){ - let split = p2.split("#"); - if (split[0] === "global"){ - return [p1,"/api-reference/", "globals", "#", split[1], p3].join(""); - } - return [p1,"/api-reference/", returnRightGroup(split[0]), "/", p2, p3].join(""); - } else { - if (p2.indexOf(".") > -1){ - let split = p2.split("."); - return [p1,"/api-reference/", returnRightGroup(split[1]), "/", split[1], p3].join(""); - } - return [p1,"/api-reference/", returnRightGroup(p2), "/", p2, p3].join(""); - } - - } - - function returnRightGroup(methodToCheck){ - for ( var key in groupNameMemberMap ){ - for (i = 0; i < groupNameMemberMap[key].length; i++ ){ - if (methodToCheck.toLowerCase() === groupNameMemberMap[key][i].toLowerCase()){ - return key.toLowerCase(); - } else { - console.log("Couldn't find group: ", methodToCheck); - } + // console.log("Couldn't find group: ", methodToCheck); } } } +} - // Create the actual MD file - function createMD(title, directory, needsDir, isGlobal){ - let mdSource = makeMdSource(title); - - if (needsDir){ - if (!fs.existsSync(directory)) { - fs.mkdirSync(directory); +// Create the actual MD file +function createMD(title, directory, needsDir, isGlobal) { + let mdSource = makeMdSource(title); + + if (needsDir) { + if (!fs.existsSync(directory)) { + fs.mkdirSync(directory); + } + } + + let destinationMDFile = path.join(directory, `API_${title}.md`); + fs.writeFileSync(destinationMDFile, mdSource); +} + +// Create the actual Template file +function createTemplate(title, content) { + let twigBasePartial = makeTwigFile(content); + let destinationFile = path.join(dir_template, `API_${title}.html.twig`); + fs.writeFileSync(destinationFile, twigBasePartial); +} + +// Copy file from source to target - used for recurssive call +function copyFileSync(source, target) { + let targetFile = target; + + // If target is a directory a new file with the same name will be created + if (fs.existsSync(target)) { + if (fs.lstatSync(target).isDirectory()) { + targetFile = path.join(target, path.basename(source)); + } + } + + fs.writeFileSync(targetFile, fs.readFileSync(source)); +} + +// Copy file from source to target +function copyFolderRecursiveSync(source, target) { + var files = []; + + // Check if folder needs to be created or integrated + var targetFolder = path.join(target, path.basename(source)); + if (!fs.existsSync(targetFolder)) { + fs.mkdirSync(targetFolder); + } + + // Copy + if (fs.lstatSync(source).isDirectory()) { + files = fs.readdirSync(source); + files.forEach(function(file) { + var curSource = path.join(source, file); + if (fs.lstatSync(curSource).isDirectory()) { + copyFolderRecursiveSync(curSource, targetFolder); + } else { + copyFileSync(curSource, targetFolder); } - } - - let destinationMDFile = path.join(directory, `API_${title}.md`); - fs.writeFileSync(destinationMDFile, mdSource); + }); } +} - // Create the actual Template file - function createTemplate(title,content){ - let twigBasePartial = makeTwigFile(content); - let destinationFile = path.join(dir_template, `API_${title}.html.twig`); - fs.writeFileSync(destinationFile, twigBasePartial); - } +// Clean up the Html +function prepareHtml(source) { + let htmlBefore = fs.readFileSync(source, { encoding: 'utf8' }); + let htmlAfter = htmlclean(htmlBefore); + let htmlAfterPretty = pretty(htmlAfter); + return cheerio.load(htmlAfterPretty); +} - // Copy file from source to target - used for recurssive call - function copyFileSync( source, target ) { - let targetFile = target; - - // If target is a directory a new file with the same name will be created - if ( fs.existsSync( target ) ) { - if ( fs.lstatSync( target ).isDirectory() ) { - targetFile = path.join( target, path.basename( source ) ); - } - } - - fs.writeFileSync(targetFile, fs.readFileSync(source)); - } - - // Copy file from source to target - function copyFolderRecursiveSync( source, target ) { - var files = []; - - // Check if folder needs to be created or integrated - var targetFolder = path.join( target, path.basename( source ) ); - if ( !fs.existsSync( targetFolder ) ) { - fs.mkdirSync( targetFolder ); - } - - // Copy - if ( fs.lstatSync( source ).isDirectory() ) { - files = fs.readdirSync( source ); - files.forEach( function ( file ) { - var curSource = path.join( source, file ); - if ( fs.lstatSync( curSource ).isDirectory() ) { - copyFolderRecursiveSync( curSource, targetFolder ); - } else { - copyFileSync( curSource, targetFolder ); - } - }); - } - } - - // Clean up the Html - function prepareHtml(source){ - let htmlBefore = fs.readFileSync(source, {encoding: 'utf8'}); - let htmlAfter = htmlclean(htmlBefore); - let htmlAfterPretty = pretty(htmlAfter); - return cheerio.load(htmlAfterPretty); - } - - // Base file for MD's - function makeMdSource(title){ - return dedent( - ` +// Base file for MD's +function makeMdSource(title) { + return dedent( + ` --- title: ${title} taxonomy: @@ -221,13 +223,13 @@ enabled: false --- ` - ) - } + ) +} - // Base file for Templates - function makeTwigFile(contentHtml){ - return dedent( - ` +// Base file for Templates +function makeTwigFile(contentHtml) { + return dedent( + ` {% extends 'partials/base_noGit.html.twig' %} {% set tags = page.taxonomy.tag %} {% if tags %} @@ -257,43 +259,43 @@ {% endblock %} ` - ) + ) +} + +// Handle NameSpace Group +function handleNamespace(title, content) { + let destinationDirectory = path.join(map_dir_md["Namespace"], title); + createMD(title, destinationDirectory, true); + createTemplate(title, content); +} + +// Handle Class Group +function handleClass(title, content) { + let destinationDirectory = path.join(map_dir_md["Class"], title); + createMD(title, destinationDirectory, true) + + let formatedHtml = content + .replace(html_reg_objectSpanNew, "") + createTemplate(title, formatedHtml); +} + +// Handle Global Group +function handleGlobal(title, content) { + createMD("Globals", map_dir_md["Global"], false, true); + createTemplate("Globals", content); +} + +// Handle Group TOCs +function makeGroupTOC(group) { + let mappedGroup; + if (!Array.isArray(group)) { + mappedGroup = groupNameMemberMap[group]; + } else { + mappedGroup = group; } - - // Handle NameSpace Group - function handleNamespace(title, content){ - let destinationDirectory = path.join(map_dir_md["Namespace"], title); - createMD(title, destinationDirectory, true); - createTemplate(title, content); - } - - // Handle Class Group - function handleClass(title, content){ - let destinationDirectory = path.join(map_dir_md["Class"], title); - createMD(title, destinationDirectory, true) - - let formatedHtml = content - .replace(html_reg_objectSpanNew,"") - createTemplate(title, formatedHtml); - } - - // Handle Global Group - function handleGlobal(title, content){ - createMD("Globals", map_dir_md["Global"], false, true); - createTemplate("Globals", content); - } - - // Handle Group TOCs - function makeGroupTOC(group){ - let mappedGroup; - if (!Array.isArray(group)){ - mappedGroup = groupNameMemberMap[group]; - } else { - mappedGroup = group; - } - let htmlGroup = mappedGroup.map( item => { - return dedent( - ` + let htmlGroup = mappedGroup.map(item => { + return dedent( + `
curEndSplitTermIndex){ + break; + } // push from the cur index to the next found || the end term - foundArray.push(content.slice(curIndex, nextIndex)) + let contentSlice = content.slice(curIndex, nextIndex); + if (contentSlice.indexOf(`id="${title}"`) === -1){ + foundArray.push(contentSlice); + } + // remove that content - content = content.replace(foundArray[curfoundArrayIndex], ""); - curfoundArrayIndex++; + content = content.replace(contentSlice, ""); curEndSplitTermIndex = content.indexOf(endSplitTerm); nextIndex = content.indexOf(searchTerm,afterCurSearchIndex); // handle if nextIndex goes beyond endSplitTerm if (nextIndex > curEndSplitTermIndex) { curIndex = content.indexOf(searchTerm); - foundArray.push(content.slice(curIndex, curEndSplitTermIndex)) - content = content.replace(foundArray[curfoundArrayIndex], ""); + contentSlice = content.slice(curIndex, curEndSplitTermIndex); + if (contentSlice.indexOf(`id="${title}"`) === -1){ + foundArray.push(contentSlice); + } + content = content.replace(contentSlice, ""); break; } } while (curIndex > -1) @@ -470,7 +485,8 @@ } }) files.forEach(function (file, index){ - // if (index !== 3) return; + // For testing individual files + if (index !== 6) return; let curSource = path.join(dir_out, file); if (path.extname(curSource) == ".html" && path.basename(curSource, '.html') !== "index") { // Clean up the html source @@ -512,20 +528,23 @@ console.log("Found Type Definitions"); endTerm = `

Type Definitions

`; // Split HTML by Each named entry - let contentSplitArray = splitBy(currentContent, html_reg_findByName, endTerm); + let contentSplitArray = splitBy(currentContent, html_reg_findByName, endTerm, htmlTitle); foundSignalsAndMethods = contentSplitArray[1]; + console.log("foundSignalsAndMethods", foundSignalsAndMethods) // Create a reference to the current content after split and the split functions currentContent = contentSplitArray[0] .replace(html_reg_typeDefType, html_reg_typeDefType_replace) // Edit how the typedef type looks .replace(html_reg_typeDefinitonsTitle, ""); // Remove Type Definitions Title to be remade later; endTerm = html_reg_findByArticleClose; // Grab split Type Definitions - let contentSplitArrayForTypeDefs = splitBy(currentContent, html_reg_findByName, endTerm); + let contentSplitArrayForTypeDefs = splitBy(currentContent, html_reg_findByName, endTerm, htmlTitle); currentContent = contentSplitArrayForTypeDefs[0]; foundTypeDefinitions = contentSplitArrayForTypeDefs[1]; + console.log("foundTypeDefinitions", foundTypeDefinitions) + } else { endTerm = html_reg_findByArticleClose; - let contentSplitArray = splitBy(currentContent, html_reg_findByName, endTerm); + let contentSplitArray = splitBy(currentContent, html_reg_findByName, endTerm, htmlTitle); foundSignalsAndMethods = contentSplitArray[1]; currentContent = contentSplitArray[0]; } @@ -536,12 +555,9 @@ let splitSignals = processedMethodsSignalsAndTypeDefs[1]; let splitTypeDefinitionIDS; // let splitDescription = processedMethodsSignalsAndTypeDefs[3]; - // console.log("getting split Methods") let splitMethodIDS = extractIDs(splitMethods); - // console.log("getting split Signals") let splitSignalIDS = extractIDs(splitSignals); if (foundTypeDefinitions){ - // console.log("getting split typeDefs") splitTypeDefinitionIDS = extractIDs(foundTypeDefinitions); } let arrayToPassToClassToc = []; @@ -644,8 +660,7 @@ const html_reg_typeReturnSize = /
Type:\<\/h5>/g; const html_reg_typeReturnSize_replace = '
Type:
'; const html_reg_containerOverview = `