NEW : REBASE THE ENTIRE WORKING PROJECT

This commit is contained in:
2022-02-09 19:19:09 +01:00
parent ddad60988e
commit ae93015aa8
1338 changed files with 286867 additions and 0 deletions

1
node_modules/chevrotain/diagrams/README.md generated vendored Normal file
View File

@@ -0,0 +1 @@
See [online docs](https://sap.github.io/chevrotain/docs/guide/generating_syntax_diagrams.html).

85
node_modules/chevrotain/diagrams/diagrams.css generated vendored Normal file
View File

@@ -0,0 +1,85 @@
svg.railroad-diagram path {
stroke-width: 3;
stroke: black;
fill: rgba(0, 0, 0, 0);
}
svg.railroad-diagram text {
font: bold 14px monospace;
text-anchor: middle;
}
svg.railroad-diagram text.label {
text-anchor: start;
}
svg.railroad-diagram text.comment {
font: italic 12px monospace;
}
svg.railroad-diagram g.non-terminal rect {
fill: hsl(223, 100%, 83%);
}
svg.railroad-diagram rect {
stroke-width: 3;
stroke: black;
fill: hsl(190, 100%, 83%);
}
.diagramHeader {
display: inline-block;
-webkit-touch-callout: default;
-webkit-user-select: text;
-khtml-user-select: text;
-moz-user-select: text;
-ms-user-select: text;
user-select: text;
font-weight: bold;
font-family: monospace;
font-size: 18px;
margin-bottom: -8px;
text-align: center;
}
.diagramHeaderDef {
background-color: lightgreen;
}
svg.railroad-diagram text {
-webkit-touch-callout: default;
-webkit-user-select: text;
-khtml-user-select: text;
-moz-user-select: text;
-ms-user-select: text;
user-select: text;
}
svg.railroad-diagram g.non-terminal rect.diagramRectUsage {
color: green;
fill: yellow;
stroke: 5;
}
svg.railroad-diagram g.terminal rect.diagramRectUsage {
color: green;
fill: yellow;
stroke: 5;
}
div {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
svg {
width: 100%;
}
svg.railroad-diagram g.non-terminal text {
cursor: pointer;
}

View File

@@ -0,0 +1,225 @@
;(function(root, factory) {
if (typeof define === "function" && define.amd) {
// AMD. Register as an anonymous module.
define([], factory)
} else if (typeof module === "object" && module.exports) {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory()
} else {
// Browser globals (root is window)
root.diagrams_behavior = factory()
}
})(this, function() {
/**
* @param [scrollingEnabled=true] {boolean} - Is the scrolling from a non-terminal usage to it's definition
* enabled. it is enabled by default, but this flow is not relevant in all use cases (playground) and thus
* it is parametrized.
*/
function initDiagramsBehavior(scrollingEnabled) {
if (scrollingEnabled === undefined) {
scrollingEnabled = true
}
var diagramHeaders = toArr(
document.getElementsByClassName("diagramHeader")
)
diagramHeaders.forEach(function(header) {
header.addEventListener(
"mouseover",
toggleNonTerminalUsageAndDef_fromHeader
)
header.addEventListener(
"mouseout",
toggleNonTerminalUsageAndDef_fromHeader
)
})
var noneTerminals = toArr(
document.getElementsByClassName("non-terminal")
)
var noneTerminalsText = findDomChildrenByTagName(noneTerminals, "text")
noneTerminalsText.forEach(function(nonTerminal) {
nonTerminal.addEventListener(
"mouseover",
toggleNonTerminalUsageAndDef_fromNoneTerminal
)
nonTerminal.addEventListener(
"mouseout",
toggleNonTerminalUsageAndDef_fromNoneTerminal
)
if (scrollingEnabled) {
nonTerminal.addEventListener("click", jumpToNoneTerminalDef)
}
})
var terminals = toArr(document.getElementsByClassName("terminal"))
var terminalsText = findDomChildrenByTagName(terminals, "text")
terminalsText.forEach(function(terminal) {
terminal.addEventListener("mouseover", toggleTerminalUsage)
terminal.addEventListener("mouseout", toggleTerminalUsage)
})
}
function toggleTerminalUsage(mouseEvent) {
var terminalName = mouseEvent.target.getAttribute("label")
var rects = getUsageSvgRect(terminalName, "terminal", "label")
toggleClassForNodes(rects, "diagramRectUsage")
}
function toggleNonTerminalUsageAndDef_fromNoneTerminal(mouseEvent) {
var rectsHeaderAndRuleName = getUsageRectAndDefHeader(mouseEvent.target)
toggleClassForNodes(rectsHeaderAndRuleName.rects, "diagramRectUsage")
toggleClass(rectsHeaderAndRuleName.header, "diagramHeaderDef")
}
function jumpToNoneTerminalDef(mouseEvent) {
var header = findHeader(mouseEvent.target.getAttribute("rulename"))
scrollToY(header.offsetTop, 666, "easeInOutQuint")
}
function toggleNonTerminalUsageAndDef_fromHeader(mouseEvent) {
toggleClass(mouseEvent.target, "diagramHeaderDef")
// this does not work on an svg DOM element so its ok to use innerHTML.
var definitionName = mouseEvent.target.innerHTML
var rects = getUsageSvgRect(definitionName, "non-terminal", "rulename")
toggleClassForNodes(rects, "diagramRectUsage")
}
function getUsageSvgRect(definitionName, className, attributeName) {
var classDomElements = toArr(document.getElementsByClassName(className))
var rects = findDomChildrenByTagName(classDomElements, "rect")
return rects.filter(function(currRect) {
var textNode = currRect.parentNode.getElementsByTagName("text")[0]
return textNode.getAttribute(attributeName) === definitionName
})
}
function findHeader(headerName) {
var headers = toArr(document.getElementsByClassName("diagramHeader"))
var header = headers.find(function(currHeader) {
// this works on H2 dom elements and not SVG elements so innerHTML usage is safe.
return currHeader.innerHTML === headerName
})
return header
}
function getUsageRectAndDefHeader(target) {
var headerName = target.getAttribute("rulename")
var rects = getUsageSvgRect(headerName, "non-terminal", "rulename")
var header = findHeader(headerName)
return {
rects: rects,
header: header,
ruleName: headerName
}
}
// utils
// IE 10/11 does not support this on svg elements.
// I'm uncertain I really care... :)
// https://developer.mozilla.org/en-US/docs/Web/API/Element/classList
function toggleClass(domNode, className) {
if (domNode.classList.contains(className)) {
domNode.classList.remove(className)
} else {
domNode.classList.add(className)
}
}
function toggleClassForNodes(domNodes, className) {
domNodes.forEach(function(currDomNode) {
toggleClass(currDomNode, className)
})
}
function toArr(htmlCollection) {
return Array.prototype.slice.call(htmlCollection)
}
// first add raf shim
// http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/
var requestAnimFrame = (function() {
return (
window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
function(callback) {
window.setTimeout(callback, 1000 / 60)
}
)
})()
// https://stackoverflow.com/questions/8917921/cross-browser-javascript-not-jquery-scroll-to-top-animation
function scrollToY(scrollTargetY, speed, easing) {
// scrollTargetY: the target scrollY property of the window
// speed: time in pixels per second
// easing: easing equation to use
var scrollY = window.scrollY,
scrollTargetY = scrollTargetY || 0,
speed = speed || 2000,
easing = easing || "easeOutSine",
currentTime = 0
// min time .1, max time .8 seconds
var time = Math.max(
0.1,
Math.min(Math.abs(scrollY - scrollTargetY) / speed, 0.8)
)
// easing equations from https://github.com/danro/easing-js/blob/master/easing.js
var PI_D2 = Math.PI / 2,
easingEquations = {
easeOutSine: function(pos) {
return Math.sin(pos * (Math.PI / 2))
},
easeInOutSine: function(pos) {
return -0.5 * (Math.cos(Math.PI * pos) - 1)
},
easeInOutQuint: function(pos) {
if ((pos /= 0.5) < 1) {
return 0.5 * Math.pow(pos, 5)
}
return 0.5 * (Math.pow(pos - 2, 5) + 2)
}
}
// add animation loop
function tick() {
currentTime += 1 / 60
var p = currentTime / time
var t = easingEquations[easing](p)
if (p < 1) {
requestAnimFrame(tick)
window.scrollTo(0, scrollY + (scrollTargetY - scrollY) * t)
} else {
window.scrollTo(0, scrollTargetY)
}
}
// call it once to get started
tick()
}
function findDomChildrenByTagName(domElements, tagName) {
var elemsFound = []
domElements.forEach(function(currDomNode) {
toArr(currDomNode.children).forEach(function(currChild) {
if (currChild.tagName === tagName) {
elemsFound.push(currChild)
}
})
})
return elemsFound
}
return {
initDiagramsBehavior: initDiagramsBehavior
}
})

View File

@@ -0,0 +1,211 @@
;(function(root, factory) {
if (typeof define === "function" && define.amd) {
// AMD. Register as an anonymous module.
// TODO: remove dependency to Chevrotain
define(["../vendor/railroad-diagrams"], factory)
} else if (typeof module === "object" && module.exports) {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
// TODO: remove dependency to Chevrotain
module.exports = factory(require("../vendor/railroad-diagrams"))
} else {
// Browser globals (root is window)
root.diagrams_builder = factory(root.railroad)
}
})(this, function(railroad) {
var Diagram = railroad.Diagram
var Sequence = railroad.Sequence
var Choice = railroad.Choice
var Optional = railroad.Optional
var OneOrMore = railroad.OneOrMore
var ZeroOrMore = railroad.ZeroOrMore
var Terminal = railroad.Terminal
var NonTerminal = railroad.NonTerminal
/**
* @param {chevrotain.gast.ISerializedGast} topRules
*
* @returns {string} - The htmlText that will render the diagrams
*/
function buildSyntaxDiagramsText(topRules) {
var diagramsHtml = ""
topRules.forEach(function(production) {
var currDiagramHtml = convertProductionToDiagram(
production,
production.name
)
diagramsHtml +=
'<h2 class="diagramHeader">' +
production.name +
"</h2>" +
currDiagramHtml
})
return diagramsHtml
}
function definitionsToSubDiagrams(definitions, topRuleName) {
var subDiagrams = definitions.map(function(subProd) {
return convertProductionToDiagram(subProd, topRuleName)
})
return subDiagrams
}
/**
* @param {chevrotain.gast.ISerializedTerminal} prod
* @param {string} topRuleName
* @param {string} dslRuleName
*
* @return {RailRoadDiagram.Terminal}
*/
function createTerminalFromSerializedGast(prod, topRuleName, dslRuleName) {
// PATTERN static property will not exist when using custom lexers (hand built or other lexer generators)
var toolTipTitle = undefined
// avoid trying to use a custom token pattern as the title.
if (
typeof prod.pattern === "string" ||
Object.prototype.toString.call(prod.pattern) === "[object RegExp]"
) {
toolTipTitle = prod.pattern
}
return railroad.Terminal(
prod.label,
undefined,
toolTipTitle,
prod.occurrenceInParent,
topRuleName,
dslRuleName,
prod.name
)
}
/**
* @param prod
* @param topRuleName
*
* Converts a single Chevrotain Grammar production to a RailRoad Diagram.
* This is also exported to allow custom logic in the creation of the diagrams.
* @returns {*}
*/
function convertProductionToDiagram(prod, topRuleName) {
if (prod.type === "NonTerminal") {
// must handle NonTerminal separately from the other AbstractProductions as we do not want to expand the subDefinition
// of a reference and cause infinite loops
return NonTerminal(
getNonTerminalName(prod),
undefined,
prod.occurrenceInParent,
topRuleName
)
} else if (prod.type !== "Terminal") {
var subDiagrams = definitionsToSubDiagrams(
prod.definition,
topRuleName
)
if (prod.type === "Rule") {
return Diagram.apply(this, subDiagrams)
} else if (prod.type === "Flat") {
return Sequence.apply(this, subDiagrams)
} else if (prod.type === "Option") {
if (subDiagrams.length > 1) {
return Optional(Sequence.apply(this, subDiagrams))
} else if (subDiagrams.length === 1) {
return Optional(subDiagrams[0])
} else {
throw Error("Empty Optional production, OOPS!")
}
} else if (prod.type === "Repetition") {
if (subDiagrams.length > 1) {
return ZeroOrMore(Sequence.apply(this, subDiagrams))
} else if (subDiagrams.length === 1) {
return ZeroOrMore(subDiagrams[0])
} else {
throw Error("Empty Optional production, OOPS!")
}
} else if (prod.type === "Alternation") {
// todo: what does the first argument of choice (the index 0 means?)
return Choice.apply(this, [0].concat(subDiagrams))
} else if (prod.type === "RepetitionMandatory") {
if (subDiagrams.length > 1) {
return OneOrMore(Sequence.apply(this, subDiagrams))
} else if (subDiagrams.length === 1) {
return OneOrMore(subDiagrams[0])
} else {
throw Error("Empty Optional production, OOPS!")
}
} else if (prod.type === "RepetitionWithSeparator") {
if (subDiagrams.length > 0) {
// MANY_SEP(separator, definition) === (definition (separator definition)*)?
return Optional(
Sequence.apply(
this,
subDiagrams.concat([
ZeroOrMore(
Sequence.apply(
this,
[
createTerminalFromSerializedGast(
prod.separator,
topRuleName,
"many_sep"
)
].concat(subDiagrams)
)
)
])
)
)
} else {
throw Error("Empty Optional production, OOPS!")
}
} else if (prod.type === "RepetitionMandatoryWithSeparator") {
if (subDiagrams.length > 0) {
// AT_LEAST_ONE_SEP(separator, definition) === definition (separator definition)*
return Sequence.apply(
this,
subDiagrams.concat([
ZeroOrMore(
Sequence.apply(
this,
[
createTerminalFromSerializedGast(
prod.separator,
topRuleName,
"at_least_one_sep"
)
].concat(subDiagrams)
)
)
])
)
} else {
throw Error("Empty Optional production, OOPS!")
}
}
} else if (prod.type === "Terminal") {
return createTerminalFromSerializedGast(
prod,
topRuleName,
"consume"
)
} else {
throw Error("non exhaustive match")
}
}
function getNonTerminalName(prod) {
if (prod.nonTerminalName !== undefined) {
return prod.nonTerminalName
} else {
return prod.name
}
}
return {
buildSyntaxDiagramsText: buildSyntaxDiagramsText,
convertProductionToDiagram: convertProductionToDiagram
}
})

View File

@@ -0,0 +1,20 @@
/**
* @param {string} targetFilePath - The path and file name to serialize to.
* @param {string} varName - The name of the global variable to expose the serialized contents/
* @param {chevrotain.Parser} parserInstance - A parser instance whose grammar will be serialized.
*/
function serializeGrammarToFile(targetFilePath, varName, parserInstance) {
var fs = require("fs")
var serializedGrammar = parserInstance.getSerializedGastProductions()
var serializedGrammarText = JSON.stringify(serializedGrammar, null, "\t")
// generated a JavaScript file which exports the serialized grammar on the global scope (Window)
fs.writeFileSync(
targetFilePath,
"var " + varName + " = " + serializedGrammarText
)
}
module.exports = {
serializeGrammarToFile: serializeGrammarToFile
}

38
node_modules/chevrotain/diagrams/src/main.js generated vendored Normal file
View File

@@ -0,0 +1,38 @@
;(function(root, factory) {
if (typeof define === "function" && define.amd) {
// AMD. Register as an anonymous module.
define(["./diagrams_builder", "./diagrams_behavior"], factory)
} else if (typeof module === "object" && module.exports) {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory(
require("./diagrams_builder"),
require("./diagrams_behavior")
)
} else {
// Browser globals (root is window)
root.main = factory(root.diagrams_builder, root.diagrams_behavior)
}
})(this, function(builder, behavior) {
return {
drawDiagramsFromParserInstance: function(
parserInstanceToDraw,
targetDiv
) {
var topRules = parserInstanceToDraw.getSerializedGastProductions()
targetDiv.innerHTML = builder.buildSyntaxDiagramsText(topRules)
behavior.initDiagramsBehavior()
},
drawDiagramsFromSerializedGrammar: function(
serializedGrammar,
targetDiv
) {
targetDiv.innerHTML = builder.buildSyntaxDiagramsText(
serializedGrammar
)
behavior.initDiagramsBehavior()
}
}
})

File diff suppressed because it is too large Load Diff