/** * @dgService * @description * Parse the text from a cheatsheetItem tag into a cheatsheet item object * The text must contain a syntax block followed by zero or more bold matchers and finally a description * The syntax block and bold matchers must be wrapped in backticks and be separated by pipes. * For example * * ``` * `
* * * *
`|`[ng-switch]`|`[ng-switch-when]`|`ng-switch-when`|`ng-switch-default` * Conditionally swaps the contents of the div by selecting one of the embedded templates based on the current value of conditionExpression. * ``` * * will be parsed into * * ``` * { * syntax: '
\n'+ * ' \n'+ * ' \n'+ * ' \n'+ * '
', * bold: ['[ng-switch]', '[ng-switch-when]', 'ng-switch-when', 'ng-switch-default'], * description: 'Conditionally swaps the contents of the div by selecting one of the embedded templates based on the current value of conditionExpression.' * } * ``` */ module.exports = function cheatsheetItemParser() { return function(text) { var index = 0; var item = { syntax: '', bold: [], description: '' }; var STATES = { inSyntax: function() { if (text.charAt(index) !== '`') throw new Error('item syntax must start with a backtick'); index += 1; var syntaxStart = index; while(index < text.length && text.charAt(index) !== '`') index++; if (index === text.length) throw new Error('item syntax must end with a backtick'); item.syntax = text.substring(syntaxStart, index); state = STATES.pipe; index++; }, pipe: function() { if (text.charAt(index) === '|') { index++; while(index < text.length && /\s/.test(text.charAt(index))) index++; state = STATES.bold; } else { state = STATES.description; } }, bold: function() { if (text.charAt(index) !== '`') throw new Error('bold matcher must start with a backtick'); index += 1; var boldStart = index; while(index < text.length && text.charAt(index) !== '`') index++; if (index === text.length) throw new Error('bold matcher must end with a backtick'); item.bold.push(text.substring(boldStart, index)); state = STATES.pipe; index++; }, description: function() { item.description = text.substring(index); state = null; } }; var state = STATES.inSyntax; while(state) { state(); } return item; }; }