mirror of
				https://github.com/mermaid-js/mermaid.git
				synced 2025-11-04 04:44:08 +01:00 
			
		
		
		
	Merge pull request #4758 from tomperr/feat/4746_add_er_alias
feat(er): add entity name alias
This commit is contained in:
		@@ -305,4 +305,21 @@ ORDER ||--|{ LINE-ITEM : contains
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render entities with entity name aliases', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
    erDiagram
 | 
			
		||||
      p[Person] {
 | 
			
		||||
        varchar(64) firstName
 | 
			
		||||
        varchar(64) lastName
 | 
			
		||||
      }
 | 
			
		||||
      c["Customer Account"] {
 | 
			
		||||
        varchar(128) email
 | 
			
		||||
      }
 | 
			
		||||
      p ||--o| c : has
 | 
			
		||||
      `,
 | 
			
		||||
      { logLevel: 1 }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -110,6 +110,20 @@
 | 
			
		||||
        }
 | 
			
		||||
        MANUFACTURER only one to zero or more CAR : makes
 | 
			
		||||
    </pre>
 | 
			
		||||
    <hr />
 | 
			
		||||
 | 
			
		||||
    <pre class="mermaid">
 | 
			
		||||
    erDiagram
 | 
			
		||||
      p[Person] {
 | 
			
		||||
          string firstName
 | 
			
		||||
          string lastName
 | 
			
		||||
      }
 | 
			
		||||
      a["Customer Account"] {
 | 
			
		||||
          string email
 | 
			
		||||
      }
 | 
			
		||||
      p ||--o| a : has
 | 
			
		||||
    </pre>
 | 
			
		||||
    <hr />
 | 
			
		||||
 | 
			
		||||
    <script type="module">
 | 
			
		||||
      import mermaid from './mermaid.esm.mjs';
 | 
			
		||||
 
 | 
			
		||||
@@ -198,6 +198,34 @@ erDiagram
 | 
			
		||||
 | 
			
		||||
The `type` values must begin with an alphabetic character and may contain digits, hyphens, underscores, parentheses and square brackets. The `name` values follow a similar format to `type`, but may start with an asterisk as another option to indicate an attribute is a primary key. Other than that, there are no restrictions, and there is no implicit set of valid data types.
 | 
			
		||||
 | 
			
		||||
### Entity Name Aliases (v\<MERMAID_RELEASE_VERSION>+)
 | 
			
		||||
 | 
			
		||||
An alias can be added to an entity using square brackets. If provided, the alias will be showed in the diagram instead of the entity name.
 | 
			
		||||
 | 
			
		||||
```mermaid-example
 | 
			
		||||
erDiagram
 | 
			
		||||
    p[Person] {
 | 
			
		||||
        string firstName
 | 
			
		||||
        string lastName
 | 
			
		||||
    }
 | 
			
		||||
    a["Customer Account"] {
 | 
			
		||||
        string email
 | 
			
		||||
    }
 | 
			
		||||
    p ||--o| a : has
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```mermaid
 | 
			
		||||
erDiagram
 | 
			
		||||
    p[Person] {
 | 
			
		||||
        string firstName
 | 
			
		||||
        string lastName
 | 
			
		||||
    }
 | 
			
		||||
    a["Customer Account"] {
 | 
			
		||||
        string email
 | 
			
		||||
    }
 | 
			
		||||
    p ||--o| a : has
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Attribute Keys and Comments
 | 
			
		||||
 | 
			
		||||
Attributes may also have a `key` or comment defined. Keys can be `PK`, `FK` or `UK`, for Primary Key, Foreign Key or Unique Key. To specify multiple key constraints on a single attribute, separate them with a comma (e.g., `PK, FK`).. A `comment` is defined by double quotes at the end of an attribute. Comments themselves cannot have double-quote characters in them.
 | 
			
		||||
 
 | 
			
		||||
@@ -32,10 +32,13 @@ export const parseDirective = function (statement, context, type) {
 | 
			
		||||
  mermaidAPI.parseDirective(this, statement, context, type);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const addEntity = function (name) {
 | 
			
		||||
const addEntity = function (name, alias = undefined) {
 | 
			
		||||
  if (entities[name] === undefined) {
 | 
			
		||||
    entities[name] = { attributes: [] };
 | 
			
		||||
    entities[name] = { attributes: [], alias: alias };
 | 
			
		||||
    log.info('Added new entity :', name);
 | 
			
		||||
  } else if (entities[name] && !entities[name].alias && alias) {
 | 
			
		||||
    entities[name].alias = alias;
 | 
			
		||||
    log.info(`Add alias '${alias}' to entity '${name}'`);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return entities[name];
 | 
			
		||||
 
 | 
			
		||||
@@ -326,7 +326,7 @@ const drawEntities = function (svgNode, entities, graph) {
 | 
			
		||||
      .style('text-anchor', 'middle')
 | 
			
		||||
      .style('font-family', getConfig().fontFamily)
 | 
			
		||||
      .style('font-size', conf.fontSize + 'px')
 | 
			
		||||
      .text(entityName);
 | 
			
		||||
      .text(entities[entityName].alias ?? entityName);
 | 
			
		||||
 | 
			
		||||
    const { width: entityWidth, height: entityHeight } = drawAttributes(
 | 
			
		||||
      groupNode,
 | 
			
		||||
 
 | 
			
		||||
@@ -35,6 +35,8 @@ accDescr\s*"{"\s*                                { this.begin("acc_descr_multili
 | 
			
		||||
<block>[\n]+                    /* nothing */
 | 
			
		||||
<block>"}"                      { this.popState(); return 'BLOCK_STOP'; }
 | 
			
		||||
<block>.                        return yytext[0];
 | 
			
		||||
"["                             return 'SQS';
 | 
			
		||||
"]"                             return 'SQE';
 | 
			
		||||
 | 
			
		||||
"one or zero"                   return 'ZERO_OR_ONE';
 | 
			
		||||
"one or more"                   return 'ONE_OR_MORE';
 | 
			
		||||
@@ -102,17 +104,21 @@ statement
 | 
			
		||||
          yy.addEntity($1);
 | 
			
		||||
          yy.addEntity($3);
 | 
			
		||||
          yy.addRelationship($1, $5, $3, $2);
 | 
			
		||||
          /*console.log($1 + $2 + $3 + ':' + $5);*/
 | 
			
		||||
      }
 | 
			
		||||
    | entityName BLOCK_START attributes BLOCK_STOP
 | 
			
		||||
      {
 | 
			
		||||
          /* console.log('detected block'); */
 | 
			
		||||
          yy.addEntity($1);
 | 
			
		||||
          yy.addAttributes($1, $3);
 | 
			
		||||
          /* console.log('handled block'); */
 | 
			
		||||
      }
 | 
			
		||||
    | entityName BLOCK_START BLOCK_STOP { yy.addEntity($1); }
 | 
			
		||||
    | entityName { yy.addEntity($1); }
 | 
			
		||||
    | entityName SQS entityName SQE BLOCK_START attributes BLOCK_STOP
 | 
			
		||||
      {
 | 
			
		||||
          yy.addEntity($1, $3);
 | 
			
		||||
          yy.addAttributes($1, $6);
 | 
			
		||||
      }
 | 
			
		||||
    | entityName SQS entityName SQE BLOCK_START BLOCK_STOP { yy.addEntity($1, $3); }
 | 
			
		||||
    | entityName SQS entityName SQE { yy.addEntity($1, $3); }
 | 
			
		||||
    | title title_value  { $$=$2.trim();yy.setAccTitle($$); }
 | 
			
		||||
    | acc_title acc_title_value  { $$=$2.trim();yy.setAccTitle($$); }
 | 
			
		||||
    | acc_descr acc_descr_value  { $$=$2.trim();yy.setAccDescription($$); }
 | 
			
		||||
 
 | 
			
		||||
@@ -133,6 +133,43 @@ describe('when parsing ER diagram it...', function () {
 | 
			
		||||
      const entities = erDb.getEntities();
 | 
			
		||||
      expect(entities.hasOwnProperty(hyphensUnderscore)).toBe(true);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('can have an alias', function () {
 | 
			
		||||
      const entity = 'foo';
 | 
			
		||||
      const alias = 'bar';
 | 
			
		||||
      erDiagram.parser.parse(`erDiagram\n${entity}["${alias}"]\n`);
 | 
			
		||||
      const entities = erDb.getEntities();
 | 
			
		||||
      expect(entities.hasOwnProperty(entity)).toBe(true);
 | 
			
		||||
      expect(entities[entity].alias).toBe(alias);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('can have an alias even if the relationship is defined before class', function () {
 | 
			
		||||
      const firstEntity = 'foo';
 | 
			
		||||
      const secondEntity = 'bar';
 | 
			
		||||
      const alias = 'batman';
 | 
			
		||||
      erDiagram.parser.parse(
 | 
			
		||||
        `erDiagram\n${firstEntity} ||--o| ${secondEntity} : rel\nclass ${firstEntity}["${alias}"]\n`
 | 
			
		||||
      );
 | 
			
		||||
      const entities = erDb.getEntities();
 | 
			
		||||
      expect(entities.hasOwnProperty(firstEntity)).toBe(true);
 | 
			
		||||
      expect(entities.hasOwnProperty(secondEntity)).toBe(true);
 | 
			
		||||
      expect(entities[firstEntity].alias).toBe(alias);
 | 
			
		||||
      expect(entities[secondEntity].alias).toBeUndefined();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('can have an alias even if the relationship is defined after class', function () {
 | 
			
		||||
      const firstEntity = 'foo';
 | 
			
		||||
      const secondEntity = 'bar';
 | 
			
		||||
      const alias = 'batman';
 | 
			
		||||
      erDiagram.parser.parse(
 | 
			
		||||
        `erDiagram\nclass ${firstEntity}["${alias}"]\n${firstEntity} ||--o| ${secondEntity} : rel\n`
 | 
			
		||||
      );
 | 
			
		||||
      const entities = erDb.getEntities();
 | 
			
		||||
      expect(entities.hasOwnProperty(firstEntity)).toBe(true);
 | 
			
		||||
      expect(entities.hasOwnProperty(secondEntity)).toBe(true);
 | 
			
		||||
      expect(entities[firstEntity].alias).toBe(alias);
 | 
			
		||||
      expect(entities[secondEntity].alias).toBeUndefined();
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  describe('attribute name', () => {
 | 
			
		||||
 
 | 
			
		||||
@@ -144,6 +144,22 @@ erDiagram
 | 
			
		||||
 | 
			
		||||
The `type` values must begin with an alphabetic character and may contain digits, hyphens, underscores, parentheses and square brackets. The `name` values follow a similar format to `type`, but may start with an asterisk as another option to indicate an attribute is a primary key. Other than that, there are no restrictions, and there is no implicit set of valid data types.
 | 
			
		||||
 | 
			
		||||
### Entity Name Aliases (v<MERMAID_RELEASE_VERSION>+)
 | 
			
		||||
 | 
			
		||||
An alias can be added to an entity using square brackets. If provided, the alias will be showed in the diagram instead of the entity name.
 | 
			
		||||
 | 
			
		||||
```mermaid-example
 | 
			
		||||
erDiagram
 | 
			
		||||
    p[Person] {
 | 
			
		||||
        string firstName
 | 
			
		||||
        string lastName
 | 
			
		||||
    }
 | 
			
		||||
    a["Customer Account"] {
 | 
			
		||||
        string email
 | 
			
		||||
    }
 | 
			
		||||
    p ||--o| a : has
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Attribute Keys and Comments
 | 
			
		||||
 | 
			
		||||
Attributes may also have a `key` or comment defined. Keys can be `PK`, `FK` or `UK`, for Primary Key, Foreign Key or Unique Key. To specify multiple key constraints on a single attribute, separate them with a comma (e.g., `PK, FK`).. A `comment` is defined by double quotes at the end of an attribute. Comments themselves cannot have double-quote characters in them.
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user