85 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			85 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @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
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * ```
							 | 
						||
| 
								 | 
							
								 * `<div [ng-switch]="conditionExpression">
							 | 
						||
| 
								 | 
							
								 *   <template [ng-switch-when]="case1Exp">...</template>
							 | 
						||
| 
								 | 
							
								 *   <template ng-switch-when="case2LiteralString">...</template>
							 | 
						||
| 
								 | 
							
								 *   <template ng-switch-default>...</template>
							 | 
						||
| 
								 | 
							
								 * </div>`|`[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: '<div [ng-switch]="conditionExpression">\n'+
							 | 
						||
| 
								 | 
							
								 *           '  <template [ng-switch-when]="case1Exp">...</template>\n'+
							 | 
						||
| 
								 | 
							
								 *           '  <template ng-switch-when="case2LiteralString">...</template>\n'+
							 | 
						||
| 
								 | 
							
								 *           '  <template ng-switch-default>...</template>\n'+
							 | 
						||
| 
								 | 
							
								 *           '</div>',
							 | 
						||
| 
								 | 
							
								 *   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;
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 |