mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-01-28 07:03:17 +08:00
feat: integrate pir
parser into mermaid
package
This commit is contained in:
parent
49c5f3bb9c
commit
1c8e13b9c1
@ -1,106 +0,0 @@
|
|||||||
/** mermaid
|
|
||||||
* https://knsv.github.io/mermaid
|
|
||||||
* (c) 2015 Knut Sveidqvist
|
|
||||||
* MIT license.
|
|
||||||
*/
|
|
||||||
%lex
|
|
||||||
%options case-insensitive
|
|
||||||
|
|
||||||
%x string
|
|
||||||
%x title
|
|
||||||
%x open_directive
|
|
||||||
%x type_directive
|
|
||||||
%x arg_directive
|
|
||||||
%x close_directive
|
|
||||||
%x acc_title
|
|
||||||
%x acc_descr
|
|
||||||
%x acc_descr_multiline
|
|
||||||
%%
|
|
||||||
\%\%\{ { this.begin('open_directive'); return 'open_directive'; }
|
|
||||||
<open_directive>((?:(?!\}\%\%)[^:.])*) { this.begin('type_directive'); return 'type_directive'; }
|
|
||||||
<type_directive>":" { this.popState(); this.begin('arg_directive'); return ':'; }
|
|
||||||
<type_directive,arg_directive>\}\%\% { this.popState(); this.popState(); return 'close_directive'; }
|
|
||||||
<arg_directive>((?:(?!\}\%\%).|\n)*) return 'arg_directive';
|
|
||||||
\%\%(?!\{)[^\n]* /* skip comments */
|
|
||||||
[^\}]\%\%[^\n]* /* skip comments */{ /*console.log('');*/ }
|
|
||||||
[\n\r]+ return 'NEWLINE';
|
|
||||||
\%\%[^\n]* /* do nothing */
|
|
||||||
[\s]+ /* ignore */
|
|
||||||
title { this.begin("title");return 'title'; }
|
|
||||||
<title>(?!\n|;|#)*[^\n]* { this.popState(); return "title_value"; }
|
|
||||||
|
|
||||||
accTitle\s*":"\s* { this.begin("acc_title");return 'acc_title'; }
|
|
||||||
<acc_title>(?!\n|;|#)*[^\n]* { this.popState(); return "acc_title_value"; }
|
|
||||||
accDescr\s*":"\s* { this.begin("acc_descr");return 'acc_descr'; }
|
|
||||||
<acc_descr>(?!\n|;|#)*[^\n]* { this.popState(); return "acc_descr_value"; }
|
|
||||||
accDescr\s*"{"\s* { this.begin("acc_descr_multiline");}
|
|
||||||
<acc_descr_multiline>[\}] { this.popState(); }
|
|
||||||
<acc_descr_multiline>[^\}]* return "acc_descr_multiline_value";
|
|
||||||
["] { this.begin("string"); }
|
|
||||||
<string>["] { this.popState(); }
|
|
||||||
<string>[^"]* { return "txt"; }
|
|
||||||
"pie" return 'PIE';
|
|
||||||
"showData" return 'showData';
|
|
||||||
":"[\s]*[\d]+(?:\.[\d]+)? return "value";
|
|
||||||
<<EOF>> return 'EOF';
|
|
||||||
|
|
||||||
/lex
|
|
||||||
|
|
||||||
%start start
|
|
||||||
|
|
||||||
%% /* language grammar */
|
|
||||||
|
|
||||||
start
|
|
||||||
: eol start
|
|
||||||
| directive start
|
|
||||||
| PIE document
|
|
||||||
| PIE showData document {yy.setShowData(true);}
|
|
||||||
;
|
|
||||||
|
|
||||||
document
|
|
||||||
: /* empty */
|
|
||||||
| document line
|
|
||||||
;
|
|
||||||
|
|
||||||
line
|
|
||||||
: statement eol { $$ = $1 }
|
|
||||||
;
|
|
||||||
|
|
||||||
statement
|
|
||||||
:
|
|
||||||
| txt value { yy.addSection($1,yy.cleanupValue($2)); }
|
|
||||||
| title title_value { $$=$2.trim();yy.setDiagramTitle($$); }
|
|
||||||
| acc_title acc_title_value { $$=$2.trim();yy.setAccTitle($$); }
|
|
||||||
| acc_descr acc_descr_value { $$=$2.trim();yy.setAccDescription($$); }
|
|
||||||
| acc_descr_multiline_value { $$=$1.trim();yy.setAccDescription($$); } | section {yy.addSection($1.substr(8));$$=$1.substr(8);}
|
|
||||||
| directive
|
|
||||||
;
|
|
||||||
|
|
||||||
directive
|
|
||||||
: openDirective typeDirective closeDirective
|
|
||||||
| openDirective typeDirective ':' argDirective closeDirective
|
|
||||||
;
|
|
||||||
|
|
||||||
eol
|
|
||||||
: NEWLINE
|
|
||||||
| ';'
|
|
||||||
| EOF
|
|
||||||
;
|
|
||||||
|
|
||||||
openDirective
|
|
||||||
: open_directive { yy.parseDirective('%%{', 'open_directive'); }
|
|
||||||
;
|
|
||||||
|
|
||||||
typeDirective
|
|
||||||
: type_directive { yy.parseDirective($1, 'type_directive'); }
|
|
||||||
;
|
|
||||||
|
|
||||||
argDirective
|
|
||||||
: arg_directive { $1 = $1.trim().replace(/'/g, '"'); yy.parseDirective($1, 'arg_directive'); }
|
|
||||||
;
|
|
||||||
|
|
||||||
closeDirective
|
|
||||||
: close_directive { yy.parseDirective('}%%', 'close_directive', 'pie'); }
|
|
||||||
;
|
|
||||||
|
|
||||||
%%
|
|
@ -1,5 +1,4 @@
|
|||||||
// @ts-ignore: JISON doesn't support types
|
import { parser } from './pieParser.js';
|
||||||
import { parser } from './parser/pie.jison';
|
|
||||||
import { DEFAULT_PIE_DB, db } from './pieDb.js';
|
import { DEFAULT_PIE_DB, db } from './pieDb.js';
|
||||||
import { setConfig } from '../../config.js';
|
import { setConfig } from '../../config.js';
|
||||||
|
|
||||||
@ -8,13 +7,7 @@ setConfig({
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe('pie', () => {
|
describe('pie', () => {
|
||||||
beforeAll(() => {
|
beforeEach(() => db.clear());
|
||||||
parser.yy = db;
|
|
||||||
});
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
parser.yy.clear();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('parse', () => {
|
describe('parse', () => {
|
||||||
it('should handle very simple pie', () => {
|
it('should handle very simple pie', () => {
|
||||||
|
@ -51,13 +51,6 @@ const addSection = (label: string, value: number): void => {
|
|||||||
|
|
||||||
const getSections = (): Sections => sections;
|
const getSections = (): Sections => sections;
|
||||||
|
|
||||||
const cleanupValue = (value: string): number => {
|
|
||||||
if (value.substring(0, 1) === ':') {
|
|
||||||
value = value.substring(1).trim();
|
|
||||||
}
|
|
||||||
return Number(value.trim());
|
|
||||||
};
|
|
||||||
|
|
||||||
const setShowData = (toggle: boolean): void => {
|
const setShowData = (toggle: boolean): void => {
|
||||||
showData = toggle;
|
showData = toggle;
|
||||||
};
|
};
|
||||||
@ -78,7 +71,6 @@ export const db: PieDB = {
|
|||||||
|
|
||||||
addSection,
|
addSection,
|
||||||
getSections,
|
getSections,
|
||||||
cleanupValue,
|
|
||||||
setShowData,
|
setShowData,
|
||||||
getShowData,
|
getShowData,
|
||||||
};
|
};
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
import type { DiagramDefinition } from '../../diagram-api/types.js';
|
import type { DiagramDefinition } from '../../diagram-api/types.js';
|
||||||
// @ts-ignore: JISON doesn't support types
|
import { parser } from './pieParser.js';
|
||||||
import parser from './parser/pie.jison';
|
|
||||||
import { db } from './pieDb.js';
|
import { db } from './pieDb.js';
|
||||||
import styles from './pieStyles.js';
|
import styles from './pieStyles.js';
|
||||||
import { renderer } from './pieRenderer.js';
|
import { renderer } from './pieRenderer.js';
|
||||||
|
25
packages/mermaid/src/diagrams/pie/pieParser.ts
Normal file
25
packages/mermaid/src/diagrams/pie/pieParser.ts
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import type { Pie } from 'mermaid-parser';
|
||||||
|
import { parse } from 'mermaid-parser';
|
||||||
|
|
||||||
|
import { log } from '../../logger.js';
|
||||||
|
import type { ParserDefinition } from '../../diagram-api/types.js';
|
||||||
|
import { populateCommonDb } from '../common/populateCommonDb.js';
|
||||||
|
import type { PieDB } from './pieTypes.js';
|
||||||
|
import { db } from './pieDb.js';
|
||||||
|
import { PieSection } from 'mermaid-parser/src/index.js';
|
||||||
|
|
||||||
|
function populateDb(ast: Pie, db: PieDB) {
|
||||||
|
populateCommonDb(ast, db);
|
||||||
|
db.setShowData(ast.showData);
|
||||||
|
ast.sections.map((section: PieSection) => {
|
||||||
|
db.addSection(section.label, section.value);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export const parser: ParserDefinition = {
|
||||||
|
parse: (input: string): void => {
|
||||||
|
const ast: Pie = parse('pie', input);
|
||||||
|
log.debug(ast);
|
||||||
|
populateDb(ast, db);
|
||||||
|
},
|
||||||
|
};
|
@ -58,7 +58,6 @@ export interface PieDB extends DiagramDB {
|
|||||||
// diagram db
|
// diagram db
|
||||||
addSection: (label: string, value: number) => void;
|
addSection: (label: string, value: number) => void;
|
||||||
getSections: () => Sections;
|
getSections: () => Sections;
|
||||||
cleanupValue: (value: string) => number;
|
|
||||||
setShowData: (toggle: boolean) => void;
|
setShowData: (toggle: boolean) => void;
|
||||||
getShowData: () => boolean;
|
getShowData: () => boolean;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user