mirror of
				https://github.com/mermaid-js/mermaid.git
				synced 2025-10-31 19:04:16 +01:00 
			
		
		
		
	Compare commits
	
		
			2 Commits
		
	
	
		
			@mermaid-j
			...
			bug/2234_c
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 5482d0a603 | ||
|   | a22e4193c5 | 
| @@ -116,8 +116,8 @@ export const clear = function () { | ||||
|   commonClear(); | ||||
| }; | ||||
|  | ||||
| export const getClass = function (id: string): ClassNode { | ||||
|   return classes[id]; | ||||
| export const getClass = function (className: string): ClassNode { | ||||
|   return classes[className]; | ||||
| }; | ||||
|  | ||||
| export const getClasses = function (): ClassMap { | ||||
| @@ -156,6 +156,7 @@ export const addRelation = function (relation: ClassRelation) { | ||||
|  * @public | ||||
|  */ | ||||
| export const addAnnotation = function (className: string, annotation: string) { | ||||
|   addClass(className); | ||||
|   const validatedClassName = splitClassNameAndType(className).className; | ||||
|   classes[validatedClassName].annotations.push(annotation); | ||||
| }; | ||||
| @@ -199,6 +200,8 @@ export const addMembers = function (className: string, members: string[]) { | ||||
| }; | ||||
|  | ||||
| export const addNote = function (text: string, className: string) { | ||||
|   addClass(className); | ||||
|  | ||||
|   const note = { | ||||
|     id: `note${notes.length}`, | ||||
|     class: className, | ||||
| @@ -217,17 +220,19 @@ export const cleanupLabel = function (label: string) { | ||||
| /** | ||||
|  * Called by parser when assigning cssClass to a class | ||||
|  * | ||||
|  * @param ids - Comma separated list of ids | ||||
|  * @param className - Class to add | ||||
|  * @param classNames - Comma separated list of ids | ||||
|  * @param cssClass - Class to add | ||||
|  */ | ||||
| export const setCssClass = function (ids: string, className: string) { | ||||
|   ids.split(',').forEach(function (_id) { | ||||
|     let id = _id; | ||||
|     if (_id[0].match(/\d/)) { | ||||
|       id = MERMAID_DOM_ID_PREFIX + id; | ||||
| export const setCssClass = function (classNames: string, cssClass: string) { | ||||
|   classNames.split(',').forEach(function (_className) { | ||||
|     let className = _className; | ||||
|     addClass(className); | ||||
|  | ||||
|     if (_className[0].match(/\d/)) { | ||||
|       className = MERMAID_DOM_ID_PREFIX + className; | ||||
|     } | ||||
|     if (classes[id] !== undefined) { | ||||
|       classes[id].cssClasses.push(className); | ||||
|     if (classes[className] !== undefined) { | ||||
|       classes[className].cssClasses.push(cssClass); | ||||
|     } | ||||
|   }); | ||||
| }; | ||||
| @@ -235,66 +240,73 @@ export const setCssClass = function (ids: string, className: string) { | ||||
| /** | ||||
|  * Called by parser when a tooltip is found, e.g. a clickable element. | ||||
|  * | ||||
|  * @param ids - Comma separated list of ids | ||||
|  * @param classNames - Comma separated list of ids | ||||
|  * @param tooltip - Tooltip to add | ||||
|  */ | ||||
| const setTooltip = function (ids: string, tooltip?: string) { | ||||
|   ids.split(',').forEach(function (id) { | ||||
| const setTooltip = function (classNames: string, tooltip?: string) { | ||||
|   classNames.split(',').forEach(function (className) { | ||||
|     if (tooltip !== undefined) { | ||||
|       classes[id].tooltip = sanitizeText(tooltip); | ||||
|       addClass(className); | ||||
|       classes[className].tooltip = sanitizeText(tooltip); | ||||
|     } | ||||
|   }); | ||||
| }; | ||||
|  | ||||
| export const getTooltip = function (id: string, namespace?: string) { | ||||
| export const getTooltip = function (className: string, namespace?: string) { | ||||
|   if (namespace) { | ||||
|     return namespaces[namespace].classes[id].tooltip; | ||||
|     return namespaces[namespace].classes[className].tooltip; | ||||
|   } | ||||
|  | ||||
|   return classes[id].tooltip; | ||||
|   return classes[className].tooltip; | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * Called by parser when a link is found. Adds the URL to the vertex data. | ||||
|  * | ||||
|  * @param ids - Comma separated list of ids | ||||
|  * @param classNames - Comma separated list of class ids | ||||
|  * @param linkStr - URL to create a link for | ||||
|  * @param target - Target of the link, _blank by default as originally defined in the svgDraw.js file | ||||
|  */ | ||||
| export const setLink = function (ids: string, linkStr: string, target: string) { | ||||
| export const setLink = function (classNames: string, linkStr: string, target: string) { | ||||
|   const config = getConfig(); | ||||
|   ids.split(',').forEach(function (_id) { | ||||
|     let id = _id; | ||||
|     if (_id[0].match(/\d/)) { | ||||
|       id = MERMAID_DOM_ID_PREFIX + id; | ||||
|   classNames.split(',').forEach(function (_className) { | ||||
|     let className = _className; | ||||
|     if (_className[0].match(/\d/)) { | ||||
|       className = MERMAID_DOM_ID_PREFIX + className; | ||||
|     } | ||||
|     if (classes[id] !== undefined) { | ||||
|       classes[id].link = utils.formatUrl(linkStr, config); | ||||
|     addClass(className); | ||||
|     if (classes[className] !== undefined) { | ||||
|       classes[className].link = utils.formatUrl(linkStr, config); | ||||
|       if (config.securityLevel === 'sandbox') { | ||||
|         classes[id].linkTarget = '_top'; | ||||
|         classes[className].linkTarget = '_top'; | ||||
|       } else if (typeof target === 'string') { | ||||
|         classes[id].linkTarget = sanitizeText(target); | ||||
|         classes[className].linkTarget = sanitizeText(target); | ||||
|       } else { | ||||
|         classes[id].linkTarget = '_blank'; | ||||
|         classes[className].linkTarget = '_blank'; | ||||
|       } | ||||
|     } | ||||
|   }); | ||||
|   setCssClass(ids, 'clickable'); | ||||
|   setCssClass(classNames, 'clickable'); | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * Called by parser when a click definition is found. Registers an event handler. | ||||
|  * | ||||
|  * @param ids - Comma separated list of ids | ||||
|  * @param classNames - Comma separated list of class ids | ||||
|  * @param functionName - Function to be called on click | ||||
|  * @param functionArgs - Function args the function should be called with | ||||
|  */ | ||||
| export const setClickEvent = function (ids: string, functionName: string, functionArgs: string) { | ||||
|   ids.split(',').forEach(function (id) { | ||||
|     setClickFunc(id, functionName, functionArgs); | ||||
|     classes[id].haveCallback = true; | ||||
| export const setClickEvent = function ( | ||||
|   classNames: string, | ||||
|   functionName: string, | ||||
|   functionArgs: string | ||||
| ) { | ||||
|   classNames.split(',').forEach(function (className) { | ||||
|     addClass(className); | ||||
|     setClickFunc(className, functionName, functionArgs); | ||||
|     classes[className].haveCallback = true; | ||||
|   }); | ||||
|   setCssClass(ids, 'clickable'); | ||||
|   setCssClass(classNames, 'clickable'); | ||||
| }; | ||||
|  | ||||
| const setClickFunc = function (_domId: string, functionName: string, functionArgs: string) { | ||||
| @@ -308,6 +320,7 @@ const setClickFunc = function (_domId: string, functionName: string, functionArg | ||||
|   } | ||||
|  | ||||
|   const id = domId; | ||||
|   addClass(id); | ||||
|   if (classes[id] !== undefined) { | ||||
|     const elemId = lookUpDomId(id); | ||||
|     let argList: string[] = []; | ||||
| @@ -447,9 +460,8 @@ const getNamespaces = function (): NamespaceMap { | ||||
|  * @public | ||||
|  */ | ||||
| export const addClassesToNamespace = function (id: string, classNames: string[]) { | ||||
|   if (namespaces[id] === undefined) { | ||||
|     return; | ||||
|   } | ||||
|   addNamespace(id); | ||||
|  | ||||
|   for (const name of classNames) { | ||||
|     const { className } = splitClassNameAndType(name); | ||||
|     classes[className].parent = id; | ||||
| @@ -458,6 +470,7 @@ export const addClassesToNamespace = function (id: string, classNames: string[]) | ||||
| }; | ||||
|  | ||||
| export const setCssStyle = function (id: string, styles: string[]) { | ||||
|   addClass(id); | ||||
|   const thisClass = classes[id]; | ||||
|   if (!styles || !thisClass) { | ||||
|     return; | ||||
|   | ||||
| @@ -258,9 +258,30 @@ class C13["With Città foreign language"] | ||||
|       expect(classDb.getClass('C13').label).toBe('With Città foreign language'); | ||||
|     }); | ||||
|  | ||||
|     it('should handle link if class not created first', function () { | ||||
|       const str = `classDiagram | ||||
|                       link Class1 "/#anchor"`; | ||||
|       parser.parse(str); | ||||
|  | ||||
|       const actual = parser.yy.getClass('Class1'); | ||||
|       expect(actual.link).toBe('/#anchor'); | ||||
|     }); | ||||
|  | ||||
|     it('should handle "note for" without pre-defining class', function () { | ||||
|       const str = `classDiagram | ||||
|                       note for Class1 "test"`; | ||||
|       parser.parse(str); | ||||
|  | ||||
|       const actual = parser.yy.getClass('Class1'); | ||||
|  | ||||
|       expect(classDb.getNotes()[0].text).toEqual(`test`); | ||||
|     }); | ||||
|  | ||||
|     it('should handle "note for"', function () { | ||||
|       const str = 'classDiagram\n' + 'Class11 <|.. Class12\n' + 'note for Class11 "test"\n'; | ||||
|       parser.parse(str); | ||||
|  | ||||
|       expect(classDb.getNotes()[0].text).toEqual(`test`); | ||||
|     }); | ||||
|  | ||||
|     it('should handle "note"', function () { | ||||
| @@ -632,6 +653,16 @@ foo() | ||||
|       classDb.clear(); | ||||
|       parser.yy = classDb; | ||||
|     }); | ||||
|  | ||||
|     it('should handle link if class not created first', function () { | ||||
|       const str = `classDiagram | ||||
|                       link Class1 "/#anchor"`; | ||||
|       parser.parse(str); | ||||
|  | ||||
|       const actual = parser.yy.getClass('Class1'); | ||||
|       expect(actual.link).toBe('/#anchor'); | ||||
|     }); | ||||
|  | ||||
|     it('should handle href link', function () { | ||||
|       spyOn(classDb, 'setLink'); | ||||
|       const str = 'classDiagram\n' + 'class Class1 \n' + 'click Class1 href "google.com" '; | ||||
| @@ -690,6 +721,15 @@ foo() | ||||
|       expect(classDb.setClickEvent).toHaveBeenCalledWith('Class1', 'functionCall'); | ||||
|     }); | ||||
|  | ||||
|     it('should handle function call when class not created first', function () { | ||||
|       spyOn(classDb, 'setClickEvent'); | ||||
|       const str = `classDiagram | ||||
|         click Class1 call functionCall()`; | ||||
|       parser.parse(str); | ||||
|  | ||||
|       expect(classDb.setClickEvent).toHaveBeenCalledWith('Class1', 'functionCall'); | ||||
|     }); | ||||
|  | ||||
|     it('should handle function call with tooltip', function () { | ||||
|       spyOn(classDb, 'setClickEvent'); | ||||
|       spyOn(classDb, 'setTooltip'); | ||||
| @@ -744,6 +784,17 @@ foo() | ||||
|       parser.yy = classDb; | ||||
|     }); | ||||
|  | ||||
|     it('should handle annotation if class not created first', function () { | ||||
|       const str = 'classDiagram\n' + '<<interface>> Class1'; | ||||
|       parser.parse(str); | ||||
|  | ||||
|       const actual = parser.yy.getClass('Class1'); | ||||
|       expect(actual.annotations.length).toBe(1); | ||||
|       expect(actual.members.length).toBe(0); | ||||
|       expect(actual.methods.length).toBe(0); | ||||
|       expect(actual.annotations[0]).toBe('interface'); | ||||
|     }); | ||||
|  | ||||
|     it('should handle class annotations', function () { | ||||
|       const str = 'classDiagram\n' + 'class Class1\n' + '<<interface>> Class1'; | ||||
|       parser.parse(str); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user