Kaynağa Gözat

15.5.0 release

David Benson [draw.io] 4 yıl önce
ebeveyn
işleme
971e8d23fe
81 değiştirilmiş dosya ile 3112 ekleme ve 2528 silme
  1. 17 0
      ChangeLog
  2. 1 1
      VERSION
  3. 136 0
      etc/propgen/convert.js
  4. 127 0
      etc/propgen/package-lock.json
  5. 15 0
      etc/propgen/package.json
  6. 834 832
      src/main/webapp/js/app.min.js
  7. 1 1
      src/main/webapp/js/diagramly/Dialogs.js
  8. 4 2
      src/main/webapp/js/diagramly/Editor.js
  9. 277 190
      src/main/webapp/js/diagramly/EditorUi.js
  10. 118 107
      src/main/webapp/js/diagramly/GitLabClient.js
  11. 13 4
      src/main/webapp/js/diagramly/Menus.js
  12. 8 1
      src/main/webapp/js/diagramly/mxRuler.js
  13. 36 9
      src/main/webapp/js/diagramly/vsdx/importer.js
  14. 25 24
      src/main/webapp/js/extensions.min.js
  15. 3 1
      src/main/webapp/js/grapheditor/EditorUi.js
  16. 8 1
      src/main/webapp/js/grapheditor/Format.js
  17. 5 0
      src/main/webapp/js/grapheditor/Graph.js
  18. 673 672
      src/main/webapp/js/viewer-static.min.js
  19. 673 672
      src/main/webapp/js/viewer.min.js
  20. 8 8
      src/main/webapp/mxgraph/mxClient.js
  21. 12 1
      src/main/webapp/plugins/number.js
  22. 2 0
      src/main/webapp/resources/dia.txt
  23. 2 0
      src/main/webapp/resources/dia_am.txt
  24. 2 0
      src/main/webapp/resources/dia_ar.txt
  25. 2 0
      src/main/webapp/resources/dia_bg.txt
  26. 2 0
      src/main/webapp/resources/dia_bn.txt
  27. 2 0
      src/main/webapp/resources/dia_bs.txt
  28. 2 0
      src/main/webapp/resources/dia_ca.txt
  29. 2 0
      src/main/webapp/resources/dia_cs.txt
  30. 2 0
      src/main/webapp/resources/dia_da.txt
  31. 2 0
      src/main/webapp/resources/dia_de.txt
  32. 2 0
      src/main/webapp/resources/dia_el.txt
  33. 2 0
      src/main/webapp/resources/dia_eo.txt
  34. 2 0
      src/main/webapp/resources/dia_es.txt
  35. 2 0
      src/main/webapp/resources/dia_et.txt
  36. 2 0
      src/main/webapp/resources/dia_eu.txt
  37. 2 0
      src/main/webapp/resources/dia_fa.txt
  38. 2 0
      src/main/webapp/resources/dia_fi.txt
  39. 2 0
      src/main/webapp/resources/dia_fil.txt
  40. 2 0
      src/main/webapp/resources/dia_fr.txt
  41. 2 0
      src/main/webapp/resources/dia_gl.txt
  42. 2 0
      src/main/webapp/resources/dia_gu.txt
  43. 2 0
      src/main/webapp/resources/dia_he.txt
  44. 2 0
      src/main/webapp/resources/dia_hi.txt
  45. 2 0
      src/main/webapp/resources/dia_hr.txt
  46. 2 0
      src/main/webapp/resources/dia_hu.txt
  47. 2 0
      src/main/webapp/resources/dia_i18n.txt
  48. 2 0
      src/main/webapp/resources/dia_id.txt
  49. 2 0
      src/main/webapp/resources/dia_it.txt
  50. 2 0
      src/main/webapp/resources/dia_ja.txt
  51. 2 0
      src/main/webapp/resources/dia_kn.txt
  52. 2 0
      src/main/webapp/resources/dia_ko.txt
  53. 2 0
      src/main/webapp/resources/dia_lt.txt
  54. 2 0
      src/main/webapp/resources/dia_lv.txt
  55. 2 0
      src/main/webapp/resources/dia_ml.txt
  56. 2 0
      src/main/webapp/resources/dia_mr.txt
  57. 2 0
      src/main/webapp/resources/dia_ms.txt
  58. 2 0
      src/main/webapp/resources/dia_my.txt
  59. 2 0
      src/main/webapp/resources/dia_nl.txt
  60. 2 0
      src/main/webapp/resources/dia_no.txt
  61. 2 0
      src/main/webapp/resources/dia_pl.txt
  62. 2 0
      src/main/webapp/resources/dia_pt-br.txt
  63. 2 0
      src/main/webapp/resources/dia_pt.txt
  64. 2 0
      src/main/webapp/resources/dia_ro.txt
  65. 2 0
      src/main/webapp/resources/dia_ru.txt
  66. 2 0
      src/main/webapp/resources/dia_si.txt
  67. 2 0
      src/main/webapp/resources/dia_sk.txt
  68. 2 0
      src/main/webapp/resources/dia_sl.txt
  69. 2 0
      src/main/webapp/resources/dia_sr.txt
  70. 2 0
      src/main/webapp/resources/dia_sv.txt
  71. 2 0
      src/main/webapp/resources/dia_sw.txt
  72. 2 0
      src/main/webapp/resources/dia_ta.txt
  73. 2 0
      src/main/webapp/resources/dia_te.txt
  74. 2 0
      src/main/webapp/resources/dia_th.txt
  75. 2 0
      src/main/webapp/resources/dia_tr.txt
  76. 2 0
      src/main/webapp/resources/dia_uk.txt
  77. 2 0
      src/main/webapp/resources/dia_vi.txt
  78. 2 0
      src/main/webapp/resources/dia_zh-tw.txt
  79. 2 0
      src/main/webapp/resources/dia_zh.txt
  80. 1 1
      src/main/webapp/service-worker.js
  81. 1 1
      src/main/webapp/service-worker.js.map

+ 17 - 0
ChangeLog

@@ -1,3 +1,20 @@
+08-OCT-2021: 15.5.0
+
+- Adds inches and meters as units
+- Fixes date formatted labels on vsdx import
+- Fixes possible NPE in Gitlab client
+- Fires CELLS_ADDED for duplicating cells https://github.com/jgraph/drawio/issues/2298
+- Adds embed fonts option in SVG export
+- Fixes fonts for embedded SVG files with callback
+- Ports resource generation to JS (Node)
+- Fixes clipping for longer button labels
+- Fixes possible clipping in download PDF dialog
+- FIxes pointer events with no fill color in sketch
+- Adds numbered property, fixed for sketch theme
+- Fixes math output in JSON protocol export
+- i18n update Lambda function
+- Adds i18n resources as a submodule in internal repo
+
 05-OCT-2021: 15.4.3
 
 - Tides NPEs from logging

+ 1 - 1
VERSION

@@ -1 +1 @@
-15.4.3
+15.5.0

+ 136 - 0
etc/propgen/convert.js

@@ -0,0 +1,136 @@
+const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args));
+const bidiFactory = require('bidi-js');
+const bidi = bidiFactory();
+const fs = require('fs');
+
+const fileExtension = 'txt';
+
+async function main() 
+{
+    try 
+    {
+        let tsvRes = await fetch('https://docs.google.com/spreadsheets/d/1FoYdyEraEQuWofzbYCDPKN7EdKgS_2ZrsDrOA8scgwQ/export?format=tsv');
+        let tsv = await tsvRes.text();
+
+        let lines = tsv.split('\n');
+        // First line contains full language names
+        // Second line contains file extensions
+        let codes = lines[1].split('\t');
+
+        if (codes[0] == '')
+        {
+            codes[0] = 'i18n';
+        }
+
+        let outputFiles = [];
+
+        for (let j = 2; j < lines.length; j++)
+        {
+            let entries = lines[j].split('\t');
+
+            if (entries.length > 1)
+            {
+                let key = entries[0];
+
+                if (key)
+                {
+                    for (let i = 0; i < codes.length; i++)
+                    {
+                        if (codes[i].trim())
+                        {
+                            if (outputFiles[i] == null)
+                            {
+                                outputFiles[i] = '# *DO NOT DIRECTLY EDIT THIS FILE, IT IS AUTOMATICALLY GENERATED AND IT IS BASED ON:*\n' +
+                                                 '# https://docs.google.com/spreadsheet/ccc?key=0AmQEO36liL4FdDJLWVNMaVV2UmRKSnpXU09MYkdGbEE\n';
+                            }
+                            
+                            if (codes[i] == 'i18n')
+                            {
+                                outputFiles[i] += key + '=' + key + '\n';
+                            }
+                            else
+                            {
+                                let value = (entries.length > i) ? entries[i] : '';
+
+                                // Empty entries will be translated to English
+                                if (value == '')
+                                {
+                                    value = entries[1];
+                                }
+
+                                //TODO Add encoding support
+                                /*if (PropGen.encodeValues)
+                                {
+                                    value = encodeString(value);
+                                }*/
+
+                                let lang = codes[i].toLowerCase();
+                                let rtl = false;
+                                
+                                if (lang == 'ar' || lang == 'fa' || lang == 'he')
+                                {
+                                    let embeddingLevels = bidi.getEmbeddingLevels(value);
+                                    
+                                    function isMixed(levels)
+                                    {
+                                        for (let i = 0; i < levels.length; i++)
+                                        {
+                                            if (levels[i] == 1) return true;
+                                        }
+
+                                        return false;
+                                    };
+
+                                    if (embeddingLevels.paragraphs[0].level == 1 || isMixed(embeddingLevels.levels))
+                                    {
+                                        console.log(value);
+                                        rtl = true;
+                                    }
+                                }
+                                
+                                if (rtl)
+                                {
+                                    outputFiles[i] += key + '=' + '\u202B' + value + '\u202C' + '\n';
+                                }
+                                else
+                                {
+                                    // Checks for HTML entities in output
+                                    if (value.includes('<') || value.includes('>'))
+                                    {
+                                        console.log('**** WARNING: HTML Entities in ' + lang + '/' + key + '=' + value);
+                                    }
+
+                                    outputFiles[i] += key + '=' + value + '\n';
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        let outDir = './resources';
+
+        if (!fs.existsSync(outDir))
+        {
+            fs.mkdirSync(outDir);
+        }
+
+        for (let i = 0; i < codes.length; i++)
+        {
+            if (codes[i].trim())
+            {
+                let ext = (codes[i] == 'en') ? '' : '_' + codes[i].toLowerCase();
+                let filename = outDir + '/dia' + ext + '.' + fileExtension;
+                fs.writeFileSync(filename, outputFiles[i], 'utf8');
+                console.log(filename + ' created');
+            }
+        }
+    }
+    catch (e)
+    {
+        console.log(e);
+    }
+}
+
+main();

+ 127 - 0
etc/propgen/package-lock.json

@@ -0,0 +1,127 @@
+{
+  "name": "propgen",
+  "version": "1.0.0",
+  "lockfileVersion": 2,
+  "requires": true,
+  "packages": {
+    "": {
+      "version": "1.0.0",
+      "license": "ISC",
+      "dependencies": {
+        "bidi-js": "^1.0.2",
+        "node-fetch": "^3.0.0"
+      }
+    },
+    "node_modules/bidi-js": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.2.tgz",
+      "integrity": "sha512-rzSy/k7WdX5zOyeHHCOixGXbCHkyogkxPKL2r8QtzHmVQDiWCXUWa18bLdMWT9CYMLOYTjWpTHawuev2ouYJVw==",
+      "dependencies": {
+        "require-from-string": "^2.0.2"
+      }
+    },
+    "node_modules/data-uri-to-buffer": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz",
+      "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/fetch-blob": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.2.tgz",
+      "integrity": "sha512-hunJbvy/6OLjCD0uuhLdp0mMPzP/yd2ssd1t2FCJsaA7wkWhpbp9xfuNVpv7Ll4jFhzp6T4LAupSiV9uOeg0VQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/jimmywarting"
+        },
+        {
+          "type": "paypal",
+          "url": "https://paypal.me/jimmywarting"
+        }
+      ],
+      "dependencies": {
+        "web-streams-polyfill": "^3.0.3"
+      },
+      "engines": {
+        "node": "^12.20 || >= 14.13"
+      }
+    },
+    "node_modules/node-fetch": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.0.0.tgz",
+      "integrity": "sha512-bKMI+C7/T/SPU1lKnbQbwxptpCrG9ashG+VkytmXCPZyuM9jB6VU+hY0oi4lC8LxTtAeWdckNCTa3nrGsAdA3Q==",
+      "dependencies": {
+        "data-uri-to-buffer": "^3.0.1",
+        "fetch-blob": "^3.1.2"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/node-fetch"
+      }
+    },
+    "node_modules/require-from-string": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/web-streams-polyfill": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.1.1.tgz",
+      "integrity": "sha512-Czi3fG883e96T4DLEPRvufrF2ydhOOW1+1a6c3gNjH2aIh50DNFBdfwh2AKoOf1rXvpvavAoA11Qdq9+BKjE0Q==",
+      "engines": {
+        "node": ">= 8"
+      }
+    }
+  },
+  "dependencies": {
+    "bidi-js": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.2.tgz",
+      "integrity": "sha512-rzSy/k7WdX5zOyeHHCOixGXbCHkyogkxPKL2r8QtzHmVQDiWCXUWa18bLdMWT9CYMLOYTjWpTHawuev2ouYJVw==",
+      "requires": {
+        "require-from-string": "^2.0.2"
+      }
+    },
+    "data-uri-to-buffer": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz",
+      "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og=="
+    },
+    "fetch-blob": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.2.tgz",
+      "integrity": "sha512-hunJbvy/6OLjCD0uuhLdp0mMPzP/yd2ssd1t2FCJsaA7wkWhpbp9xfuNVpv7Ll4jFhzp6T4LAupSiV9uOeg0VQ==",
+      "requires": {
+        "web-streams-polyfill": "^3.0.3"
+      }
+    },
+    "node-fetch": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.0.0.tgz",
+      "integrity": "sha512-bKMI+C7/T/SPU1lKnbQbwxptpCrG9ashG+VkytmXCPZyuM9jB6VU+hY0oi4lC8LxTtAeWdckNCTa3nrGsAdA3Q==",
+      "requires": {
+        "data-uri-to-buffer": "^3.0.1",
+        "fetch-blob": "^3.1.2"
+      }
+    },
+    "require-from-string": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
+    },
+    "web-streams-polyfill": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.1.1.tgz",
+      "integrity": "sha512-Czi3fG883e96T4DLEPRvufrF2ydhOOW1+1a6c3gNjH2aIh50DNFBdfwh2AKoOf1rXvpvavAoA11Qdq9+BKjE0Q=="
+    }
+  }
+}

+ 15 - 0
etc/propgen/package.json

@@ -0,0 +1,15 @@
+{
+  "name": "propgen",
+  "version": "1.0.0",
+  "description": "Converts from .tsv files (downloaded from  eg. Google Spreadsheet) to .txt resource files.",
+  "main": "convert.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "bidi-js": "^1.0.2",
+    "node-fetch": "^3.0.0"
+  }
+}

Dosya farkı çok büyük olduğundan ihmal edildi
+ 834 - 832
src/main/webapp/js/app.min.js


+ 1 - 1
src/main/webapp/js/diagramly/Dialogs.js

@@ -12068,7 +12068,7 @@ var FilePropertiesDialog = function(editorUi)
 	
 	var file = editorUi.getCurrentFile();
 	var filename = (file != null && file.getTitle() != null) ?
-		file.getTitle() : this.editorUi.defaultFilename;
+		file.getTitle() : editorUi.defaultFilename;
 	var isPng = /(\.png)$/i.test(filename);
 	var apply = null;
 

+ 4 - 2
src/main/webapp/js/diagramly/Editor.js

@@ -3236,7 +3236,8 @@
 			if (defs.length == 0)
 			{
 				defsElt = (svgDoc.createElementNS != null) ?
-					svgDoc.createElementNS(mxConstants.NS_SVG, 'defs') : svgDoc.createElement('defs');
+					svgDoc.createElementNS(mxConstants.NS_SVG, 'defs') :
+					svgDoc.createElement('defs');
 				
 				if (svgRoot.firstChild != null)
 				{
@@ -3253,7 +3254,8 @@
 			}
 
 			var style = (svgDoc.createElementNS != null) ?
-				svgDoc.createElementNS(mxConstants.NS_SVG, 'style') : svgDoc.createElement('style');
+				svgDoc.createElementNS(mxConstants.NS_SVG, 'style') :
+				svgDoc.createElement('style');
 			style.setAttribute('type', 'text/css');
 			mxUtils.setTextContent(style, fontCss);
 			defsElt.appendChild(style);

+ 277 - 190
src/main/webapp/js/diagramly/EditorUi.js

@@ -4610,7 +4610,7 @@
 		}), mxResources.get('saveAs'), mxResources.get('download'), false, allowBrowser, allowTab,
 			null, count > 1, rowLimit, data, mimeType, base64Encoded);
 		var height = (this.isServices(count)) ? ((count > rowLimit) ? 390 : 270) : 160;
-		this.showDialog(dlg.container, 400, height, true, true);
+		this.showDialog(dlg.container, 420, height, true, true);
 		dlg.init();
 	};
 	
@@ -5022,7 +5022,7 @@
 			null, count > 1, rowLimit, data, mimeType, base64Encoded);
 		
 		var height = (this.isServices(count)) ? ((count > 4) ? 390 : 270) : 160;
-		this.showDialog(dlg.container, 380, height, true, true);
+		this.showDialog(dlg.container, 420, height, true, true);
 		dlg.init();
 	};
 
@@ -5063,7 +5063,8 @@
 	 *
 	 */
 	EditorUi.prototype.exportSvg = function(scale, transparentBackground, ignoreSelection, addShadow,
-		editable, embedImages, border, noCrop, currentPage, linkTarget, keepTheme, exportType)
+		editable, embedImages, border, noCrop, currentPage, linkTarget, keepTheme, exportType,
+		embedFonts, saveFn)
 	{
 		if (this.spinner.spin(document.body, mxResources.get('export')))
 		{
@@ -5097,20 +5098,9 @@
 				}
 				
 				var filename = this.getBaseFilename() + ((editable) ? '.drawio' : '') + '.svg';
-	
-				var doSave = mxUtils.bind(this, function(svgRoot)
+
+				saveFn = (saveFn != null) ? saveFn : mxUtils.bind(this, function(svg)
 				{
-					this.spinner.stop();
-					
-					if (editable)
-					{
-						svgRoot.setAttribute('content', this.getFileData(true, null, null, null, ignoreSelection,
-							currentPage, null, null, null, false));
-					}
-					
-					var svg = Graph.xmlDeclaration + '\n' + ((editable) ? Graph.svgFileComment + '\n' : '') +
-						Graph.svgDoctype + '\n' + mxUtils.getXml(svgRoot);
-				
 		    		if (this.isLocalFileSave() || svg.length <= MAX_REQUEST_SIZE)
 		    		{
 		    			this.saveData(filename, 'svg', svg, 'image/svg+xml');
@@ -5123,28 +5113,53 @@
 		    			}));
 		    		}
 				});
+	
+				var doSave = mxUtils.bind(this, function(svgRoot)
+				{
+					this.spinner.stop();
+					
+					if (editable)
+					{
+						svgRoot.setAttribute('content', this.getFileData(true, null, null, null, ignoreSelection,
+							currentPage, null, null, null, false));
+					}
+
+					saveFn(Graph.xmlDeclaration + '\n' + ((editable) ? Graph.svgFileComment + '\n' : '') +
+						Graph.svgDoctype + '\n' + mxUtils.getXml(svgRoot));
+				});
 
 				// Adds CSS
-				this.editor.addFontCss(svgRoot);
-				
 				if (this.editor.graph.mathEnabled)
 				{
 					this.editor.addMathCss(svgRoot);
 				}
-				
-				if (embedImages)
+
+				var done = mxUtils.bind(this, function(svgRoot)
 				{
-					// Caches images
-					if (this.thumbImageCache == null)
+					if (embedImages)
 					{
-						this.thumbImageCache = new Object();
+						// Caches images
+						if (this.thumbImageCache == null)
+						{
+							this.thumbImageCache = new Object();
+						}
+						
+						this.editor.convertImages(svgRoot, doSave, this.thumbImageCache);
 					}
-					
-					this.editor.convertImages(svgRoot, doSave, this.thumbImageCache);
+					else
+					{
+						doSave(svgRoot);
+					}
+				});
+
+				if (embedFonts)
+				{
+					this.embedFonts(svgRoot, done);
 				}
 				else
 				{
-					doSave(svgRoot);
+					this.editor.addFontCss(svgRoot);
+					done(svgRoot);
 				}
 			}
 			catch (e)
@@ -5154,10 +5169,13 @@
 		}
 	};
 	
+	/**
+	 * 
+	 */
 	EditorUi.prototype.addRadiobox = function(div, radioGroupName, label, checked, disabled, disableNewline, visible)
 	{
 		return this.addCheckbox(div, label, checked, disabled, disableNewline, visible, true, radioGroupName);
-	}
+	};
 	
 	/**
 	 * 
@@ -6092,6 +6110,11 @@
 		cb5.style.marginRight = '8px';
 		cb5.setAttribute('type', 'checkbox');
 		
+		var cb6 = document.createElement('input');
+		cb6.style.marginTop = '16px';
+		cb6.style.marginRight = '8px';
+		cb6.setAttribute('type', 'checkbox');
+		
 		if (this.isOffline() || !this.canvasSupported)
 		{
 			cb5.setAttribute('disabled', 'disabled');
@@ -6102,8 +6125,12 @@
 			div.appendChild(cb5);
 			mxUtils.write(div, mxResources.get('embedImages'));
 			mxUtils.br(div);
+
+			div.appendChild(cb6);
+			mxUtils.write(div, mxResources.get('embedFonts'));
+			mxUtils.br(div);
 			
-			height += 30;
+			height += 60;
 		}
 		
 		var grid = null;
@@ -6155,7 +6182,7 @@
 			callback(zoomInput.value, transparent.checked, !selection.checked, shadow.checked,
 				include.checked, cb5.checked, borderInput.value, cb6.checked, false,
 				linkSelect.value, (grid != null) ? grid.checked : null, (keepTheme != null) ?
-				keepTheme.checked : null, exportSelect.value);
+				keepTheme.checked : null, exportSelect.value, cb6.checked);
 		}), null, btnLabel, helpLink);
 		this.showDialog(dlg.container, 340, height, true, true, null, null, null, null, true);
 		zoomInput.focus();
@@ -6743,8 +6770,24 @@
 //			svgRoot.setAttribute('onclick', 'window.location.href=\'' + redirect + '\';'); 
 //		}
 
-		var result = ((!noHeader) ? Graph.xmlDeclaration + '\n' + Graph.svgFileComment +
-			'\n' + Graph.svgDoctype + '\n' : '') + mxUtils.getXml(svgRoot);
+		var done = mxUtils.bind(this, function(svgRoot)
+		{
+			var result = ((!noHeader) ? Graph.xmlDeclaration + '\n' + Graph.svgFileComment +
+				'\n' + Graph.svgDoctype + '\n' : '') + mxUtils.getXml(svgRoot);
+
+			if (callback != null)
+			{
+				callback(result);
+			}
+
+			return result;
+		});
+
+		// Adds CSS
+		if (graph.mathEnabled)
+		{
+			this.editor.addMathCss(svgRoot);
+		}
 
 		if (callback != null)
 		{
@@ -6754,18 +6797,18 @@
 				{
 					this.editor.convertImages(svgRoot, mxUtils.bind(this, function(svgRoot)
 					{
-						callback(result);
+						done(svgRoot);
 					}));
 				}
 				else
 				{
-					callback(result);
+					done(svgRoot);
 				}
 			}));
 		}
 		else
 		{
-			return result;
+			return done(svgRoot);
 		}
 	};
 	
@@ -9214,23 +9257,28 @@
 			}
 		}));
 
-		// Restores background page references in output data
+		// Restores background page reference in output data or
+		// replaces dark mode page image with normal mode image
 		var graphGetBackgroundImageObject = graph.getBackgroundImageObject;
 		
 		graph.getBackgroundImageObject = function(obj, resolveReferences)
 		{
 			var result = graphGetBackgroundImageObject.apply(this, arguments);
 
-			if (result != null && result.originalSrc != null && !resolveReferences)
-			{
-				result = {src: result.originalSrc};
-			}
-			else if (resolveReferences && this.themes != null && this.defaultThemeName == 'darkTheme')
+			if (result != null && result.originalSrc != null)
 			{
-				var temp = this.stylesheet;
-				this.stylesheet = this.getDefaultStylesheet();
-				result = ui.createImageForPageLink(result.originalSrc);
-				this.stylesheet = temp;
+				if (!resolveReferences)
+				{
+					result = {src: result.originalSrc};
+				}
+				else if (resolveReferences && this.themes != null &&
+					this.defaultThemeName == 'darkTheme')
+				{
+					var temp = this.stylesheet;
+					this.stylesheet = this.getDefaultStylesheet();
+					result = ui.createImageForPageLink(result.originalSrc);
+					this.stylesheet = temp;
+				}
 			}
 
 			return result;
@@ -11932,81 +11980,100 @@
 								
 								if (this.isExportToCanvas())
 								{
-									// Uses optional XML from incoming message
-									if (data.xml != null && data.xml.length > 0)
-									{
-										ignoreChange = true;
-										this.setFileData(xml);
-										ignoreChange = false;
-									}
-
-									// Exports PNG for first/specific page while other page is visible by creating a graph
-									// LATER: Add caching for the graph or SVG while not on first page
-									if (this.pages != null && this.currentPage.getId() != pageId)
+									var graphReady = mxUtils.bind(this, function()
 									{
-										var graphGetGlobalVariable = graph.getGlobalVariable;
-										graph = this.createTemporaryGraph(graph.getStylesheet());
-										var page;
-										
-										for (var i = 0; i < this.pages.length; i++)
+										// Exports PNG for first/specific page while other page is visible by creating a graph
+										// LATER: Add caching for the graph or SVG while not on first page
+										if (this.pages != null && this.currentPage.getId() != pageId)
 										{
-											if (this.pages[i].getId() == pageId)
+											var graphGetGlobalVariable = graph.getGlobalVariable;
+											graph = this.createTemporaryGraph(graph.getStylesheet());
+											var page;
+											
+											for (var i = 0; i < this.pages.length; i++)
 											{
-												page = this.updatePageRoot(this.pages[i]);
-												break;
+												if (this.pages[i].getId() == pageId)
+												{
+													page = this.updatePageRoot(this.pages[i]);
+													break;
+												}
 											}
+											
+											//If pageId info is incorrect
+											if (page == null)
+											{
+												page = this.currentPage; 
+											}
+									
+											graph.getGlobalVariable = function(name)
+											{
+												if (name == 'page')
+												{
+													return page.getName();
+												}
+												else if (name == 'pagenumber')
+												{
+													return 1;
+												}
+												
+												return graphGetGlobalVariable.apply(this, arguments);
+											};
+									
+											document.body.appendChild(graph.container);
+											graph.model.setRoot(page.root);
 										}
-										
-										//If pageId info is incorrect
-										if (page == null)
-										{
-											page = this.currentPage; 
-										}
-								
-										graph.getGlobalVariable = function(name)
+		
+										// Set visible layers based on message setting
+										if (data.layerIds != null)
 										{
-											if (name == 'page')
+											var graphModel = graph.model;
+											var layers = graphModel.getChildCells(graphModel.getRoot());
+											var layerIdsMap = {};
+											
+											for (var i = 0; i < data.layerIds.length; i++)
 											{
-												return page.getName();
+												layerIdsMap[data.layerIds[i]] = true;
 											}
-											else if (name == 'pagenumber')
+		
+											for (var i = 0; i < layers.length; i++)
 											{
-												return 1;
+												graphModel.setVisible(layers[i], layerIdsMap[layers[i].id] || false);
 											}
-											
-											return graphGetGlobalVariable.apply(this, arguments);
-										};
-								
-										document.body.appendChild(graph.container);
-										graph.model.setRoot(page.root);
-									}
-	
-									// Set visible layers based on message setting
-									if (data.layerIds != null)
+										}
+
+										this.editor.exportToCanvas(mxUtils.bind(this, function(canvas)
+										{
+											processUri(canvas.toDataURL('image/png'));
+										}), data.width, null, data.background, mxUtils.bind(this, function()
+										{
+											processUri(null);
+										}), null, null, data.scale, data.transparent, data.shadow, null,
+											graph, data.border, null, data.grid, data.keepTheme);
+									});
+
+									// Uses optional XML from incoming message
+									if (data.xml != null && data.xml.length > 0)
 									{
-										var graphModel = graph.model;
-										var layers = graphModel.getChildCells(graphModel.getRoot());
-										var layerIdsMap = {};
-										
-										for (var i = 0; i < data.layerIds.length; i++)
+										ignoreChange = true;
+										this.setFileData(xml);
+										ignoreChange = false;
+
+										if (this.editor.graph.mathEnabled)
 										{
-											layerIdsMap[data.layerIds[i]] = true;
+											window.setTimeout(function()
+											{
+												window.MathJax.Hub.Queue(graphReady);
+											}, 0);
 										}
-	
-										for (var i = 0; i < layers.length; i++)
+										else
 										{
-											graphModel.setVisible(layers[i], layerIdsMap[layers[i].id] || false);
+											graphReady();
 										}
 									}
-
-									this.editor.exportToCanvas(mxUtils.bind(this, function(canvas)
-								   	{
-										processUri(canvas.toDataURL('image/png'));
-								   	}), data.width, null, data.background, mxUtils.bind(this, function()
+									else
 									{
-								   		processUri(null);
-									}), null, null, data.scale, data.transparent, data.shadow, null,
-										graph, data.border, null, data.grid, data.keepTheme);
+										graphReady();
+									}
 								}
 								else
 								{
@@ -12015,7 +12082,8 @@
 							       	var req = new mxXmlRequest(EXPORT_URL, 'format=png&embedXml=' +
 							       		((data.format == 'xmlpng') ? '1' : '0') + 
 							       		(pageId != null? '&pageId=' + pageId : '') +
-							       		(data.layerIds != null && data.layerIds.length > 0? '&extras=' + encodeURIComponent(JSON.stringify({layerIds: data.layerIds})) : '') +
+							       		(data.layerIds != null && data.layerIds.length > 0?
+										'&extras=' + encodeURIComponent(JSON.stringify({layerIds: data.layerIds})) : '') +
 							       		(data.scale != null? '&scale=' + data.scale : '') +'&base64=1&xml=' +
 							       		encodeURIComponent(xml));
 	
@@ -12040,107 +12108,126 @@
 						}
 						else
 						{
-							// SVG is generated from graph so parse optional XML
-							if (data.xml != null && data.xml.length > 0)
+							var graphReady = mxUtils.bind(this, function()
 							{
-								ignoreChange = true;
-								this.setFileData(data.xml);
-								ignoreChange = false;
-							}
-							
-							var msg = this.createLoadMessage('export');
-							
-							// Attaches incoming message
-							msg.message = data;
-							
-							// Forces new HTML format if pages exists
-							if (data.format == 'html2' || (data.format == 'html' && (urlParams['pages'] != '0' ||
-								(this.pages != null && this.pages.length > 1))))
-							{
-								var node = this.getXmlFileData();
-								msg.xml = mxUtils.getXml(node);
-								msg.data = this.getFileData(null, null, true, null, null, null, node);
-								msg.format = data.format;
-							}
-							else if (data.format == 'html')
-							{
-								var xml = this.editor.getGraphXml();
-								msg.data = this.getHtml(xml, this.editor.graph);
-								msg.xml = mxUtils.getXml(xml);
-								msg.format = data.format;
-							}
-							else
-							{
-								// Creates a preview with no alt text for unsupported browsers
-					        	mxSvgCanvas2D.prototype.foAltText = null;
-					        	
-					        	var bg = (data.background != null) ? data.background : this.editor.graph.background;
-					        	
-					        	if (bg == mxConstants.NONE)
-					        	{
-					        		bg = null;
-					        	}
-	
-								msg.xml = this.getFileData(true, null, null, null, null,
-									null, null, null, null, false);
-								msg.format = 'svg';
+								var msg = this.createLoadMessage('export');
 								
-								var postResult = mxUtils.bind(this, function(svg)
-								{
-									this.editor.graph.setEnabled(true);
-									this.spinner.stop();
+								// Attaches incoming message
+								msg.message = data;
 								
-									msg.data = Editor.createSvgDataUri(svg);
-									parent.postMessage(JSON.stringify(msg), '*');
-								});
-								
-								if (data.format == 'xmlsvg')
+								// Forces new HTML format if pages exists
+								if (data.format == 'html2' || (data.format == 'html' && (urlParams['pages'] != '0' ||
+									(this.pages != null && this.pages.length > 1))))
 								{
-									if ((data.spin == null && data.spinKey == null) || this.spinner.spin(document.body,
-										(data.spinKey != null) ? mxResources.get(data.spinKey) : data.spin))
-									{
-										this.getEmbeddedSvg(msg.xml, this.editor.graph, null, true, postResult, null, null,
-											data.embedImages, bg, data.scale, data.border, data.shadow, data.keepTheme);
-									}
+									var node = this.getXmlFileData();
+									msg.xml = mxUtils.getXml(node);
+									msg.data = this.getFileData(null, null, true, null, null, null, node);
+									msg.format = data.format;
+								}
+								else if (data.format == 'html')
+								{
+									var xml = this.editor.getGraphXml();
+									msg.data = this.getHtml(xml, this.editor.graph);
+									msg.xml = mxUtils.getXml(xml);
+									msg.format = data.format;
 								}
 								else
-					        	{
-									if ((data.spin == null && data.spinKey == null) || this.spinner.spin(document.body,
-										(data.spinKey != null) ? mxResources.get(data.spinKey) : data.spin))
+								{
+									// Creates a preview with no alt text for unsupported browsers
+									mxSvgCanvas2D.prototype.foAltText = null;
+									
+									var bg = (data.background != null) ? data.background : this.editor.graph.background;
+									
+									if (bg == mxConstants.NONE)
 									{
-										this.editor.graph.setEnabled(false);
-										var svgRoot = this.editor.graph.getSvg(bg, data.scale, data.border, null, null,
-											null, null, null, null, this.editor.graph.shadowVisible || data.shadow,
-											null, data.keepTheme);
-										
-										if (this.editor.graph.shadowVisible || data.shadow)
+										bg = null;
+									}
+		
+									msg.xml = this.getFileData(true, null, null, null, null,
+										null, null, null, null, false);
+									msg.format = 'svg';
+									
+									var postResult = mxUtils.bind(this, function(svg)
+									{
+										this.editor.graph.setEnabled(true);
+										this.spinner.stop();
+									
+										msg.data = Editor.createSvgDataUri(svg);
+										parent.postMessage(JSON.stringify(msg), '*');
+									});
+									
+									if (data.format == 'xmlsvg')
+									{
+										if ((data.spin == null && data.spinKey == null) || this.spinner.spin(document.body,
+											(data.spinKey != null) ? mxResources.get(data.spinKey) : data.spin))
 										{
-											this.editor.graph.addSvgShadow(svgRoot);
+											this.getEmbeddedSvg(msg.xml, this.editor.graph, null, true, postResult, null, null,
+												data.embedImages, bg, data.scale, data.border, data.shadow, data.keepTheme);
 										}
-
-					        			this.embedFonts(svgRoot, mxUtils.bind(this, function(svgRoot)
+									}
+									else
+									{
+										if ((data.spin == null && data.spinKey == null) || this.spinner.spin(document.body,
+											(data.spinKey != null) ? mxResources.get(data.spinKey) : data.spin))
 										{
-					        				if (data.embedImages || data.embedImages == null)
-					        				{
-												this.editor.convertImages(svgRoot, mxUtils.bind(this, function(svgRoot)
-							        			{
+											this.editor.graph.setEnabled(false);
+											var svgRoot = this.editor.graph.getSvg(bg, data.scale, data.border, null, null,
+												null, null, null, null, this.editor.graph.shadowVisible || data.shadow,
+												null, data.keepTheme);
+											
+											if (this.editor.graph.shadowVisible || data.shadow)
+											{
+												this.editor.graph.addSvgShadow(svgRoot);
+											}
+
+											this.embedFonts(svgRoot, mxUtils.bind(this, function(svgRoot)
+											{
+												if (data.embedImages || data.embedImages == null)
+												{
+													this.editor.convertImages(svgRoot, mxUtils.bind(this, function(svgRoot)
+													{
+														postResult(mxUtils.getXml(svgRoot));
+													}));
+												}
+												else
+												{
 													postResult(mxUtils.getXml(svgRoot));
-							        			}));
-					        				}
-					        				else
-					        				{
-					        					postResult(mxUtils.getXml(svgRoot));
-					        				}
-										}));
+												}
+											}));
+										}
 									}
-					        	}
-								
-								return;
+									
+									return;
+								}
+		
+								parent.postMessage(JSON.stringify(msg), '*');
+							});
+
+							// SVG is generated from graph so parse optional XML
+							if (data.xml != null && data.xml.length > 0)
+							{
+								ignoreChange = true;
+								this.setFileData(data.xml);
+								ignoreChange = false;
+
+								if (this.editor.graph.mathEnabled)
+								{
+									window.setTimeout(function()
+									{
+										window.MathJax.Hub.Queue(graphReady);
+									}, 0);
+								}
+								else
+								{
+									graphReady();
+								}
+							}
+							else
+							{
+								graphReady();
 							}
-	
-							parent.postMessage(JSON.stringify(msg), '*');
 						}
-						
+
 						return;
 					}
 					else if (data.action == 'load')

+ 118 - 107
src/main/webapp/js/diagramly/GitLabClient.js

@@ -1226,145 +1226,153 @@ GitLabClient.prototype.showGitLabDialog = function(showFiles, fn)
 		
 		listGroups(mxUtils.bind(this, function(groups)
 		{
-			spinnerRequestStarted();
-			var req = new mxXmlRequest(this.baseUrl + '/users/' + this.user.id + '/projects?per_page=' +
-				pageSize + '&page=' + page, null, 'GET');
-			
-			this.executeRequest(req, mxUtils.bind(this, function(req)
+			if (this.user == null)
 			{
-				var repos = JSON.parse(req.getText());
-
-				if ((repos == null || repos.length == 0) && (groups == null || groups.length == 0))
-				{
-					mxUtils.write(div, mxResources.get('noFiles'));
-				}
-				else
+				mxUtils.write(div, mxResources.get('loggedOut'));
+			}
+			else
+			{
+				spinnerRequestStarted();
+				var req = new mxXmlRequest(this.baseUrl + '/users/' + this.user.id + '/projects?per_page=' +
+					pageSize + '&page=' + page, null, 'GET');
+				
+				this.executeRequest(req, mxUtils.bind(this, function(req)
 				{
-					if (page == 1)
+					var repos = JSON.parse(req.getText());
+
+					if ((repos == null || repos.length == 0) && (groups == null || groups.length == 0))
 					{
-						div.appendChild(createLink(mxResources.get('enterValue') + '...', mxUtils.bind(this, function()
+						spinnerRequestFinished();
+						mxUtils.write(div, mxResources.get('noFiles'));
+					}
+					else
+					{
+						if (page == 1)
 						{
-							if (inFlightRequests === 0)
+							div.appendChild(createLink(mxResources.get('enterValue') + '...', mxUtils.bind(this, function()
 							{
-								var dlg = new FilenameDialog(this.ui, 'org/repo/ref', mxResources.get('ok'), mxUtils.bind(this, function(value)
+								if (inFlightRequests === 0)
 								{
-									if (value != null)
+									var dlg = new FilenameDialog(this.ui, 'org/repo/ref', mxResources.get('ok'), mxUtils.bind(this, function(value)
 									{
-										var tokens = value.split('/');
-										
-										if (tokens.length > 1)
+										if (value != null)
 										{
-											org = tokens[0];
-											repo = tokens[1];
-											path = null;
-											ref = null;
+											var tokens = value.split('/');
 											
-											if (tokens.length > 2)
+											if (tokens.length > 1)
 											{
-												ref = encodeURIComponent(tokens.slice(2, tokens.length).join('/'));
-												selectFile();
+												org = tokens[0];
+												repo = tokens[1];
+												path = null;
+												ref = null;
+												
+												if (tokens.length > 2)
+												{
+													ref = encodeURIComponent(tokens.slice(2, tokens.length).join('/'));
+													selectFile();
+												}
+												else
+												{
+													selectRef(null, true);
+												}
 											}
 											else
 											{
-												selectRef(null, true);
+												this.ui.spinner.stop();
+												this.ui.handleError({message: mxResources.get('invalidName')});
 											}
 										}
-										else
-										{
-											this.ui.spinner.stop();
-											this.ui.handleError({message: mxResources.get('invalidName')});
-										}
-									}
-								}), mxResources.get('enterValue'));
-								this.ui.showDialog(dlg.container, 300, 80, true, false);
-								dlg.init();
-							}
-						})));
-						
-						mxUtils.br(div);
-						mxUtils.br(div);
-					}
-					
-					var gray = true;
-					
-					for (var i = 0; i < repos.length; i++)
-					{
-						(mxUtils.bind(this, function(repository)
-						{
-							var temp = listItem.cloneNode();
-							temp.style.backgroundColor = (gray) ?
-								((Editor.isDarkMode()) ? '#000000' : '#eeeeee') : '';
-							gray = !gray;
-							
-							temp.appendChild(createLink(repository.name_with_namespace, mxUtils.bind(this, function()
-							{
-								if (inFlightRequests === 0)
-								{
-									org = repository.owner.username;
-									repo = repository.path;
-									path = '';
-									
-									selectRef(null, true);
+									}), mxResources.get('enterValue'));
+									this.ui.showDialog(dlg.container, 300, 80, true, false);
+									dlg.init();
 								}
 							})));
 							
-							div.appendChild(temp);
-						}))(repos[i]);
-					}
-
-					for (var i = 0; i < groups.length; i++)
-					{
-						spinnerRequestStarted();
+							mxUtils.br(div);
+							mxUtils.br(div);
+						}
 						
-						listProjects(groups[i], (mxUtils.bind(this, function(group, projects)
+						var gray = true;
+						
+						for (var i = 0; i < repos.length; i++)
 						{
-							spinnerRequestFinished();
-							
-							for (var j = 0; j < projects.length; j++)
+							(mxUtils.bind(this, function(repository)
 							{
 								var temp = listItem.cloneNode();
 								temp.style.backgroundColor = (gray) ?
-									((uiTheme == 'dark') ? '#000000' : '#eeeeee') : '';
+									((Editor.isDarkMode()) ? '#000000' : '#eeeeee') : '';
 								gray = !gray;
 								
-								(mxUtils.bind(this, function(project)
+								temp.appendChild(createLink(repository.name_with_namespace, mxUtils.bind(this, function()
 								{
-									temp.appendChild(createLink(project.name_with_namespace, mxUtils.bind(this, function()
+									if (inFlightRequests === 0)
 									{
-										if (inFlightRequests === 0)
+										org = repository.owner.username;
+										repo = repository.path;
+										path = '';
+										
+										selectRef(null, true);
+									}
+								})));
+								
+								div.appendChild(temp);
+							}))(repos[i]);
+						}
+
+						for (var i = 0; i < groups.length; i++)
+						{
+							spinnerRequestStarted();
+							
+							listProjects(groups[i], (mxUtils.bind(this, function(group, projects)
+							{
+								spinnerRequestFinished();
+								
+								for (var j = 0; j < projects.length; j++)
+								{
+									var temp = listItem.cloneNode();
+									temp.style.backgroundColor = (gray) ?
+										((uiTheme == 'dark') ? '#000000' : '#eeeeee') : '';
+									gray = !gray;
+									
+									(mxUtils.bind(this, function(project)
+									{
+										temp.appendChild(createLink(project.name_with_namespace, mxUtils.bind(this, function()
 										{
-											org = group.full_path;
-											repo = project.path;
-											path = '';
+											if (inFlightRequests === 0)
+											{
+												org = group.full_path;
+												repo = project.path;
+												path = '';
+			
+												selectRef(null, true);
+											}
+										})));
 		
-											selectRef(null, true);
-										}
-									})));
-	
-									div.appendChild(temp);
-								}))(projects[j]);
-							}
-						})));
+										div.appendChild(temp);
+									}))(projects[j]);
+								}
+							})));
+						}
+						
+						spinnerRequestFinished();
 					}
-					
-					spinnerRequestFinished();
-				}
 
-				if (repos.length == pageSize)
-				{
-					div.appendChild(nextPageDiv);
-					
-					scrollFn = function()
+					if (repos.length == pageSize)
 					{
-						if (div.scrollTop >= div.scrollHeight - div.offsetHeight)
+						div.appendChild(nextPageDiv);
+						
+						scrollFn = function()
 						{
-							nextPage();
-						}
-					};
-					
-					mxEvent.addListener(div, 'scroll', scrollFn);
-				}
-			}), error);
+							if (div.scrollTop >= div.scrollHeight - div.offsetHeight)
+							{
+								nextPage();
+							}
+						};
+						
+						mxEvent.addListener(div, 'scroll', scrollFn);
+					}
+				}), error);
+			}
 		}));
 	});
 
@@ -1372,7 +1380,10 @@ GitLabClient.prototype.showGitLabDialog = function(showFiles, fn)
 	{
 		this.authenticate(mxUtils.bind(this, function()
 		{
-			this.updateUser(function() { selectRepo(); }, error, true);
+			this.updateUser(function()
+			{
+				selectRepo();
+			}, error, true);
 		}), error);
 	}
 	else if (!this.user)

+ 13 - 4
src/main/webapp/js/diagramly/Menus.js

@@ -219,9 +219,17 @@
 		mmAction.setToggleAction(true);
 		mmAction.setSelectedCallback(function() { return editorUi.editor.graph.view.unit == mxConstants.MILLIMETERS; });
 
+		var meterAction = editorUi.actions.addAction('meters', function()
+		{
+			editorUi.editor.graph.view.setUnit(mxConstants.METERS);
+		});
+		
+		meterAction.setToggleAction(true);
+		meterAction.setSelectedCallback(function() { return editorUi.editor.graph.view.unit == mxConstants.METERS; });
+
 		this.put('units', new Menu(mxUtils.bind(this, function(menu, parent)
 		{
-			this.addMenuItems(menu, ['points', /*'inches',*/ 'millimeters'], parent);
+			this.addMenuItems(menu, ['points', 'inches', 'millimeters', 'meters'], parent);
 		})));
 		
 		var rulerAction = editorUi.actions.addAction('ruler', function()
@@ -746,8 +754,9 @@
 		{
 			editorUi.showExportDialog(mxResources.get('formatSvg'), true, mxResources.get('export'),
 				'https://www.diagrams.net/doc/faq/export-diagram',
-				mxUtils.bind(this, function(scale, transparentBackground, ignoreSelection, addShadow, editable,
-					embedImages, border, cropImage, currentPage, linkTarget, grid, keepTheme, exportType)
+				mxUtils.bind(this, function(scale, transparentBackground, ignoreSelection,
+					addShadow, editable, embedImages, border, cropImage, currentPage,
+					linkTarget, grid, keepTheme, exportType, embedFonts)
 				{
 					var val = parseInt(scale);
 					
@@ -755,7 +764,7 @@
 					{
 						editorUi.exportSvg(val / 100, transparentBackground, ignoreSelection,
 							addShadow, editable, embedImages, border, !cropImage, false,
-							linkTarget, keepTheme, exportType);
+							linkTarget, keepTheme, exportType, embedFonts);
 					}
 				}), true, null, 'svg', true);
 		}));

+ 8 - 1
src/main/webapp/js/diagramly/mxRuler.js

@@ -188,6 +188,11 @@ function mxRuler(editorUi, unit, isVertical, isSecondery)
                 len = 10;
                 tickStep = mxConstants.PIXELS_PER_MM;
                 tickSize = [5,3,3,3,3,6,3,3,3,3];
+                break;
+			case mxConstants.METERS:
+                len = 20;
+                tickStep = mxConstants.PIXELS_PER_MM;
+                tickSize = [5,3,3,3,3,6,3,3,3,3,10,3,3,3,3,6,3,3,3,3];
                 break;
             case mxConstants.INCHES:
             	if (scale <=0.5 || scale >=4)
@@ -538,6 +543,8 @@ mxRuler.prototype.formatText = function(pixels)
             return Math.round(pixels);
         case mxConstants.MILLIMETERS:
             return (pixels / mxConstants.PIXELS_PER_MM).toFixed(1);
+        case mxConstants.METERS:
+            return (pixels / (mxConstants.PIXELS_PER_MM * 1000)).toFixed(4);
         case mxConstants.INCHES:
             return (pixels / mxConstants.PIXELS_PER_INCH).toFixed(2);
     }
@@ -600,7 +607,7 @@ function mxDualRuler(editorUi, unit)
 				{
 					var menu = new mxPopupMenu(mxUtils.bind(this, function(menu, parent)
 					{
-						editorUi.menus.addMenuItems(menu, ['points', /*'inches',*/ 'millimeters'], parent);
+						editorUi.menus.addMenuItems(menu, ['points', 'inches', 'millimeters', 'meters'], parent);
 					}));
 					
 					menu.div.className += ' geMenubarMenu';

+ 36 - 9
src/main/webapp/js/diagramly/vsdx/importer.js

@@ -9204,16 +9204,43 @@ var com;
                                         }
                                         if (!(value.length === 0)) {
                                             try {
-                                                if ((function (str, searchString, position) {
-                                                    if (position === void 0) { position = 0; }
-                                                    return str.substr(position, searchString.length) === searchString;
-                                                })(format, "{{")) {
+                                            	//Date can be in string date format or a number
+                                            	var date = isNaN(value)? new Date(value) : new Date(Shape.VSDX_START_TIME + Math.floor((parseFloat(value) * 24 * 60 * 60 * 1000)));
+
+												if (format == 'c')
+												{
+													if (date.getHours() + date.getMinutes() + date.getSeconds() + date.getMilliseconds() == 0)
+													{
+														format = 'm/d/yyyy';
+													}
+													else
+													{
+														format = 'm/d/yyyy h:MM:ss tt';															
+													}
+												}
+												else if (format == 'ddddd')
+												{
+													format = 'm/d/yyyy';
+												}
+												else if (format == 'dddddd')
+												{
+													format = 'dddd, mmmm dd, yyyy';
+												}
+												else if (format == 'C')
+												{
+													format = 'dddd, mmmm dd, yyyy h:MM:ss tt';
+												}
+												else if (format == 'T')
+												{
+													format = 'h:MM:ss tt';
+												}
+												else
+												{
                                                 	//Our date format function swaps M/m meaning
-                                                	format = format.replace(/m/g, '@').replace(/M/g, 'm').replace(/@/g, 'M');
-                                                	//Date can be in string date format or a number
-                                                	var date = isNaN(value)? new Date(value) : new Date(Shape.VSDX_START_TIME + Math.floor((parseFloat(value) * 24 * 60 * 60 * 1000)));
-                                                	value = Graph.prototype.formatDate(date, /* replaceAll */ format.replace(new RegExp("\\{|\\}", 'g'), ""));
+                                                	format = format.replace(/am\/pm/g, 'tt').replace(/m/g, '@').replace(/M/g, 'm').replace(/@/g, 'M');
                                                 }
+
+                                               	value = Graph.prototype.formatDate(date, /* replaceAll */ 'UTC:' + format.replace(new RegExp("\\{|\\}", 'g'), ""));
                                             }
                                             catch (e) {
                                             }
@@ -9704,7 +9731,7 @@ var com;
                     };
                     return Shape;
                 }(com.mxgraph.io.vsdx.Style));
-                Shape.VSDX_START_TIME = -2209168800000;
+                Shape.VSDX_START_TIME = new Date('1899-12-30T00:00:00Z').getTime();
                 vsdx.Shape = Shape;
                 Shape["__class"] = "com.mxgraph.io.vsdx.Shape";
             })(vsdx = io.vsdx || (io.vsdx = {}));

Dosya farkı çok büyük olduğundan ihmal edildi
+ 25 - 24
src/main/webapp/js/extensions.min.js


+ 3 - 1
src/main/webapp/js/grapheditor/EditorUi.js

@@ -939,7 +939,9 @@ EditorUi = function(editor, container, lightbox)
 			var cells = evt.getProperty('cells');
 			var parent = evt.getProperty('parent');
 			
-			if (graph.getModel().isLayer(parent) && !graph.isCellVisible(parent) && cells != null && cells.length > 0)
+			if (parent != null && graph.getModel().isLayer(parent) &&
+				!graph.isCellVisible(parent) && cells != null &&
+				cells.length > 0)
 			{
 				graph.getModel().setVisible(parent, true);
 			}

+ 8 - 1
src/main/webapp/js/grapheditor/Format.js

@@ -2037,8 +2037,9 @@ ArrangePanel.prototype.addGroupOps = function(div)
 				var dlg = new EmbedDialog(ui, JSON.stringify(result, null, 2), null, null, function()
 				{
 					console.log(result);
+					ui.alert('Written to Console (Dev Tools)');
 				}, mxResources.get('copyData'), null, 'Console', 'data.json');
-				ui.showDialog(dlg.container, 440, 240, true, true);
+				ui.showDialog(dlg.container, 450, 240, true, true);
 				dlg.init();
 			}
 			else
@@ -2371,6 +2372,8 @@ BaseFormatPanel.prototype.getUnit = function()
 			return '"';
 		case mxConstants.MILLIMETERS:
 			return 'mm';
+		case mxConstants.METERS:
+			return 'm';
 	}
 };
 
@@ -2391,6 +2394,8 @@ BaseFormatPanel.prototype.fromUnit = function(value)
 			return value * mxConstants.PIXELS_PER_INCH;
 		case mxConstants.MILLIMETERS:
 			return value * mxConstants.PIXELS_PER_MM;
+		case mxConstants.METERS:
+			return value * mxConstants.PIXELS_PER_MM * 1000;
 	}
 };
 
@@ -2411,6 +2416,8 @@ BaseFormatPanel.prototype.getUnitStep = function()
 			return 0.1;
 		case mxConstants.MILLIMETERS:
 			return 0.5;
+		case mxConstants.METERS:
+			return 0.001;
 	}
 };
 

+ 5 - 0
src/main/webapp/js/grapheditor/Graph.js

@@ -164,6 +164,7 @@ if (!Uint8Array.from) {
 mxConstants.POINTS = 1;
 mxConstants.MILLIMETERS = 2;
 mxConstants.INCHES = 3;
+mxConstants.METERS = 4;
 /**
  * This ratio is with page scale 1
  */
@@ -6200,6 +6201,7 @@ TableLayout.prototype.layoutRow = function(row, positions, height, tw, lastCells
 			last.colspan--;
 		}
 
+		// Handles rowspan
 		var upper = lastCells[i];
 
 		if (upper != null && upper.geo != null &&
@@ -9262,6 +9264,7 @@ if (typeof mxVertexHandler != 'undefined')
 
 				// Updates custom links after inserting into the model for cells to have new IDs
 				this.updateCustomLinks(this.createCellMapping(cloneMap, lookup), clones, this);
+				this.fireEvent(new mxEventObject(mxEvent.CELLS_ADDED, 'cells', clones));
 			}
 			finally
 			{
@@ -11502,6 +11505,8 @@ if (typeof mxVertexHandler != 'undefined')
 		            return pixels;
 		        case mxConstants.MILLIMETERS:
 		            return (pixels / mxConstants.PIXELS_PER_MM).toFixed(1);
+				case mxConstants.METERS:
+            		return (pixels / (mxConstants.PIXELS_PER_MM * 1000)).toFixed(4);
 		        case mxConstants.INCHES:
 		            return (pixels / mxConstants.PIXELS_PER_INCH).toFixed(2);
 		    }

Dosya farkı çok büyük olduğundan ihmal edildi
+ 673 - 672
src/main/webapp/js/viewer-static.min.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 673 - 672
src/main/webapp/js/viewer.min.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 8 - 8
src/main/webapp/mxgraph/mxClient.js


+ 12 - 1
src/main/webapp/plugins/number.js

@@ -3,6 +3,17 @@
  */
 Draw.loadPlugin(function(ui) {
 
+	// Adds numbered toggle property
+	Editor.commonVertexProperties.push({name: 'numbered', dispName: 'Numbered', type: 'bool', defVal: true, isVisible: function(state, format)
+	{
+		var graph = format.editorUi.editor.graph;
+
+		return graph.view.redrawNumberShape != null;
+	}, onChange: function(graph, newValue)
+	{
+		graph.refresh();
+	}});
+
 	var graph = ui.editor.graph;
 	var enabled = true;
 	var counter = 0;
@@ -101,7 +112,7 @@ Draw.loadPlugin(function(ui) {
     action.setToggleAction(true);
 	action.setSelectedCallback(function() { return enabled; });
     
-	var menu = ui.menus.get('view');
+	var menu = ui.menus.get((urlParams['sketch'] == '1') ? 'extras' : 'view');
 	var oldFunct = menu.funct;
 	
 	menu.funct = function(menu, parent)

+ 2 - 0
src/main/webapp/resources/dia.txt

@@ -236,6 +236,7 @@ googleImages=Google Images
 imageSearch=Image Search
 eip=EIP
 embed=Embed
+embedFonts=Embed Fonts
 embedImages=Embed Images
 mainEmbedNotice=Paste this into the page
 electrical=Electrical
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_am.txt

@@ -236,6 +236,7 @@ googleImages=Google Images
 imageSearch=Image Search
 eip=EIP
 embed=Embed
+embedFonts=Embed Fonts
 embedImages=Embed Images
 mainEmbedNotice=Paste this into the page
 electrical=Electrical
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_ar.txt

@@ -236,6 +236,7 @@ googleImages=‫صور Google‬
 imageSearch=‫بحث Google‬
 eip=EIP
 embed=‫تضمين‬
+embedFonts=Embed Fonts
 embedImages=Embed Images
 mainEmbedNotice=‫أضف هذا داخل الصفحة‬
 electrical=Electrical
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_bg.txt

@@ -236,6 +236,7 @@ googleImages=Google изображения
 imageSearch=Търсене на изображение
 eip=EIP
 embed=Вграждане
+embedFonts=Embed Fonts
 embedImages=Вграждане на изображения
 mainEmbedNotice=Поставете това на страницата
 electrical=Електрически
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_bn.txt

@@ -236,6 +236,7 @@ googleImages=Google Images
 imageSearch=Image Search
 eip=EIP
 embed=Embed
+embedFonts=Embed Fonts
 embedImages=Embed Images
 mainEmbedNotice=Paste this into the page
 electrical=Electrical
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_bs.txt

@@ -236,6 +236,7 @@ googleImages=Google slike
 imageSearch=Pretraga slike
 eip=EIP
 embed=Ugradi
+embedFonts=Embed Fonts
 embedImages=Ugradi sliku
 mainEmbedNotice=Zalijepi ovo na stranicu
 electrical=Električno
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_ca.txt

@@ -236,6 +236,7 @@ googleImages=Google Imatges
 imageSearch=Cerca d'imatges
 eip=EIP
 embed=Incrusta
+embedFonts=Embed Fonts
 embedImages=Incrusta imatges
 mainEmbedNotice=Enganxa-ho a la pàgina
 electrical=Elèctric
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_cs.txt

@@ -236,6 +236,7 @@ googleImages=Google Obrázky
 imageSearch=Vyhledávání obrázku
 eip=EIP
 embed=Vložit
+embedFonts=Embed Fonts
 embedImages=Vložit obrázky
 mainEmbedNotice=Vložit toto na stránku
 electrical=Elektrotechnika
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_da.txt

@@ -236,6 +236,7 @@ googleImages=Google Billeder
 imageSearch=Billedsøgning
 eip=EIP
 embed=Integrer
+embedFonts=Embed Fonts
 embedImages=Indsæt billeder
 mainEmbedNotice=Indsæt dette på siden
 electrical=Elektrisk
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_de.txt

@@ -236,6 +236,7 @@ googleImages=Google Bilder
 imageSearch=Bildersuche
 eip=EIP
 embed=Einbetten
+embedFonts=Schriftarten einbetten
 embedImages=Bilder einbetten
 mainEmbedNotice=Fügen Sie dies in die Seite ein
 electrical=Electrical
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meter

+ 2 - 0
src/main/webapp/resources/dia_el.txt

@@ -236,6 +236,7 @@ googleImages=Εικόνες Google
 imageSearch=Αναζήτηση Εικόνας
 eip=EIP
 embed=Ενσωμάτωση
+embedFonts=Embed Fonts
 embedImages=Ενσωματωμένες Εικόνες
 mainEmbedNotice=Επικολλήστε αυτό στη σελίδα
 electrical=Ηλεκτρολογικά
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_eo.txt

@@ -236,6 +236,7 @@ googleImages=Google Images
 imageSearch=Image Search
 eip=EIP
 embed=Embed
+embedFonts=Embed Fonts
 embedImages=Embed Images
 mainEmbedNotice=Paste this into the page
 electrical=Electrical
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_es.txt

@@ -236,6 +236,7 @@ googleImages=Imágenes de Google
 imageSearch=Búsqueda de imágenes
 eip=EIP
 embed=Insertar
+embedFonts=Embed Fonts
 embedImages=Insertar imágenes
 mainEmbedNotice=Pegar esto en la página
 electrical=Eléctrico
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_et.txt

@@ -236,6 +236,7 @@ googleImages=Google Pildid
 imageSearch=Pildiotsing
 eip=EIP
 embed=Lisa
+embedFonts=Embed Fonts
 embedImages=Lisa kujutisi
 mainEmbedNotice=Kleebi sellele lehele
 electrical=Elektriline
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_eu.txt

@@ -236,6 +236,7 @@ googleImages=Google Irudiak
 imageSearch=Irudi bilaketa
 eip=EIP
 embed=Txertatu
+embedFonts=Embed Fonts
 embedImages=Txertatu irudiak
 mainEmbedNotice=Itsatsi hau orrian
 electrical=Elektrikoa
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_fa.txt

@@ -236,6 +236,7 @@ googleImages=Google Images
 imageSearch=‫جستحوی تصویر‬
 eip=EIP
 embed=‫متصل کردن‬
+embedFonts=Embed Fonts
 embedImages=‫متصل کردن تصاویر‬
 mainEmbedNotice=‫paste کردن در این صفحه‬
 electrical=‫الکتریکی‬
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_fi.txt

@@ -236,6 +236,7 @@ googleImages=Google Kuvat
 imageSearch=Kuvahaku
 eip=EIP
 embed=Upota
+embedFonts=Embed Fonts
 embedImages=Upota kuvia
 mainEmbedNotice=Liitä tämä sivulle
 electrical=Sähköpiirros
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_fil.txt

@@ -236,6 +236,7 @@ googleImages=Google Images
 imageSearch=Paghanap ng Imahe
 eip=EIP
 embed=Ilangkap
+embedFonts=Embed Fonts
 embedImages=Ilangkap ang mga imahe
 mainEmbedNotice=Idikit ito sa loob ng pahina
 electrical=Elektrikal
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_fr.txt

@@ -236,6 +236,7 @@ googleImages=Google Images
 imageSearch=Recherche d'image
 eip=EIP
 embed=Intégrer
+embedFonts=Embed Fonts
 embedImages=Intégrer les images
 mainEmbedNotice=Coller cet élément dans la page
 electrical=Électricité
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_gl.txt

@@ -236,6 +236,7 @@ googleImages=Imaxes de Google
 imageSearch=Procurar imaxes
 eip=EIP
 embed=Integrar
+embedFonts=Embed Fonts
 embedImages=Integrar imaxes
 mainEmbedNotice=Pegar isto na páxina
 electrical=Eléctrico
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_gu.txt

@@ -236,6 +236,7 @@ googleImages=Google Images
 imageSearch=Image Search
 eip=EIP
 embed=Embed
+embedFonts=Embed Fonts
 embedImages=Embed Images
 mainEmbedNotice=Paste this into the page
 electrical=Electrical
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_he.txt

@@ -236,6 +236,7 @@ googleImages=‫גוגל תמונות‬
 imageSearch=‫חיפוש תמונה‬
 eip=EIP
 embed=‫שבץ‬
+embedFonts=Embed Fonts
 embedImages=‫שבץ תמונות‬
 mainEmbedNotice=‫הדבק בתוך העמוד‬
 electrical=‫חשמלי‬
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_hi.txt

@@ -236,6 +236,7 @@ googleImages=Google Images
 imageSearch=Image Search
 eip=EIP
 embed=Embed
+embedFonts=Embed Fonts
 embedImages=Embed Images
 mainEmbedNotice=Paste this into the page
 electrical=Electrical
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_hr.txt

@@ -236,6 +236,7 @@ googleImages=Google Images
 imageSearch=Image Search
 eip=EIP
 embed=Embed
+embedFonts=Embed Fonts
 embedImages=Embed Images
 mainEmbedNotice=Paste this into the page
 electrical=Electrical
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_hu.txt

@@ -236,6 +236,7 @@ googleImages=Google képek
 imageSearch=Képet keres
 eip=EIP
 embed=Beágyaz
+embedFonts=Embed Fonts
 embedImages=Képeket beágyaz
 mainEmbedNotice=Ezt hozzáadja a laphoz
 electrical=Elektromos
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_i18n.txt

@@ -236,6 +236,7 @@ googleImages=googleImages
 imageSearch=imageSearch
 eip=eip
 embed=embed
+embedFonts=embedFonts
 embedImages=embedImages
 mainEmbedNotice=mainEmbedNotice
 electrical=electrical
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=confDraftTooBigErr
 owner=owner
 repository=repository
 branch=branch
+meters=meters

+ 2 - 0
src/main/webapp/resources/dia_id.txt

@@ -236,6 +236,7 @@ googleImages=Gambar Google
 imageSearch=Pencarian Gambar
 eip=EIP
 embed=Tanamkan
+embedFonts=Embed Fonts
 embedImages=Tanamkan Gambar
 mainEmbedNotice=Tempelkan pada halaman ini
 electrical=Elektrik
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_it.txt

@@ -236,6 +236,7 @@ googleImages=Google Immagini
 imageSearch=Ricerca immagine
 eip=EIP
 embed=Integra
+embedFonts=Embed Fonts
 embedImages=Integra immagini
 mainEmbedNotice=Incolla nella pagina
 electrical=Elettrico
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_ja.txt

@@ -236,6 +236,7 @@ googleImages=Google画像検索
 imageSearch=画像検索
 eip=EIP
 embed=埋め込み
+embedFonts=Embed Fonts
 embedImages=画像を埋め込む
 mainEmbedNotice=ページにペーストする
 electrical=電気
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_kn.txt

@@ -236,6 +236,7 @@ googleImages=Google Images
 imageSearch=Image Search
 eip=EIP
 embed=Embed
+embedFonts=Embed Fonts
 embedImages=Embed Images
 mainEmbedNotice=Paste this into the page
 electrical=Electrical
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_ko.txt

@@ -236,6 +236,7 @@ googleImages=구글 이미지
 imageSearch=이미지 검색
 eip=EIP
 embed=끼워넣기
+embedFonts=Embed Fonts
 embedImages=이미지 끼워넣기
 mainEmbedNotice=아래 내용을 해당 페이지에 붙여넣기 하십시오
 electrical=전기적
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_lt.txt

@@ -236,6 +236,7 @@ googleImages=Google paveikslėliai
 imageSearch=Paveikslėlių paieška
 eip=EIP
 embed=Įterpti
+embedFonts=Embed Fonts
 embedImages=Įterpti paveikslėlius
 mainEmbedNotice=Įklijuokite tai į puslapį
 electrical=Elektros
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_lv.txt

@@ -236,6 +236,7 @@ googleImages=Google Images
 imageSearch=Image Search
 eip=EIP
 embed=Embed
+embedFonts=Embed Fonts
 embedImages=Embed Images
 mainEmbedNotice=Paste this into the page
 electrical=Electrical
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_ml.txt

@@ -236,6 +236,7 @@ googleImages=Google Images
 imageSearch=Image Search
 eip=EIP
 embed=Embed
+embedFonts=Embed Fonts
 embedImages=Embed Images
 mainEmbedNotice=Paste this into the page
 electrical=Electrical
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_mr.txt

@@ -236,6 +236,7 @@ googleImages=Google Images
 imageSearch=Image Search
 eip=EIP
 embed=Embed
+embedFonts=Embed Fonts
 embedImages=Embed Images
 mainEmbedNotice=Paste this into the page
 electrical=Electrical
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_ms.txt

@@ -236,6 +236,7 @@ googleImages=Imej-imej Google
 imageSearch=Carian Imej
 eip=EIP
 embed=Terbenam
+embedFonts=Embed Fonts
 embedImages=Imej Benam
 mainEmbedNotice=Tampal ini pada halaman
 electrical=Elektrik
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_my.txt

@@ -236,6 +236,7 @@ googleImages=Google Images
 imageSearch=Image Search
 eip=EIP
 embed=Embed
+embedFonts=Embed Fonts
 embedImages=Embed Images
 mainEmbedNotice=Paste this into the page
 electrical=Electrical
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_nl.txt

@@ -236,6 +236,7 @@ googleImages=Google Afbeeldingen
 imageSearch=Afbeelding zoeken
 eip=EIP
 embed=Insluiten
+embedFonts=Embed Fonts
 embedImages=Afbeeldingen Insluiten
 mainEmbedNotice=Dit op de pagina plakken
 electrical=Elektrisch
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_no.txt

@@ -236,6 +236,7 @@ googleImages=Google Bilder
 imageSearch=Bildesøk
 eip=EIP
 embed=Integrer
+embedFonts=Embed Fonts
 embedImages=Legge til bilder
 mainEmbedNotice=Lim dette inn på siden
 electrical=Elektrisk
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_pl.txt

@@ -236,6 +236,7 @@ googleImages=Obrazy Google
 imageSearch=Wyszukiwanie obrazów
 eip=EIP
 embed=Osadź
+embedFonts=Embed Fonts
 embedImages=Obrazy osadzone
 mainEmbedNotice=Wklej na stronie
 electrical=Elektryczne
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_pt-br.txt

@@ -236,6 +236,7 @@ googleImages=Google Imagens
 imageSearch=Procurar imagem
 eip=EIP
 embed=Incorporar
+embedFonts=Embed Fonts
 embedImages=Incorporar imagens
 mainEmbedNotice=Colar esse conteúdo na página
 electrical=Elétrico
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_pt.txt

@@ -236,6 +236,7 @@ googleImages=Google Imagens
 imageSearch=Procurar imagem
 eip=EIP
 embed=Inserir
+embedFonts=Embed Fonts
 embedImages=Inserir imagens
 mainEmbedNotice=Colá-lo na página
 electrical=Eléctrico
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_ro.txt

@@ -236,6 +236,7 @@ googleImages=Google Imagini
 imageSearch=Căutare imagini
 eip=EIP
 embed=Încorporează
+embedFonts=Embed Fonts
 embedImages=Incorporează imagini
 mainEmbedNotice=Lipeşte aceasta pe pagină
 electrical=Electric
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_ru.txt

@@ -236,6 +236,7 @@ googleImages=Google Images
 imageSearch=Поиск изображения
 eip=EIP
 embed=Встроить
+embedFonts=Embed Fonts
 embedImages=Встроить изображения
 mainEmbedNotice=Вставьте это на страницу
 electrical=Электрические схемы
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_si.txt

@@ -236,6 +236,7 @@ googleImages=Google Images
 imageSearch=Image Search
 eip=EIP
 embed=Embed
+embedFonts=Embed Fonts
 embedImages=Embed Images
 mainEmbedNotice=Paste this into the page
 electrical=Electrical
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_sk.txt

@@ -236,6 +236,7 @@ googleImages=Google Images
 imageSearch=Image Search
 eip=EIP
 embed=Embed
+embedFonts=Embed Fonts
 embedImages=Embed Images
 mainEmbedNotice=Paste this into the page
 electrical=Electrical
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_sl.txt

@@ -236,6 +236,7 @@ googleImages=Google Images
 imageSearch=Image Search
 eip=EIP
 embed=Embed
+embedFonts=Embed Fonts
 embedImages=Embed Images
 mainEmbedNotice=Paste this into the page
 electrical=Electrical
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_sr.txt

@@ -236,6 +236,7 @@ googleImages=Google slike
 imageSearch=Pretraživač slika
 eip=EIP
 embed=Ugradi
+embedFonts=Embed Fonts
 embedImages=Ugradi slike
 mainEmbedNotice=Zalepi ovo na stranicu
 electrical=Electrical
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_sv.txt

@@ -236,6 +236,7 @@ googleImages=Google Bilder
 imageSearch=Bildsökning
 eip=EIP
 embed=Bädda in
+embedFonts=Embed Fonts
 embedImages=Bädda in bilder
 mainEmbedNotice=Klistra in detta på sidan
 electrical=Elektrisk 
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_sw.txt

@@ -236,6 +236,7 @@ googleImages=Google Images
 imageSearch=Image Search
 eip=EIP
 embed=Embed
+embedFonts=Embed Fonts
 embedImages=Embed Images
 mainEmbedNotice=Paste this into the page
 electrical=Electrical
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_ta.txt

@@ -236,6 +236,7 @@ googleImages=Google Images
 imageSearch=Image Search
 eip=EIP
 embed=Embed
+embedFonts=Embed Fonts
 embedImages=Embed Images
 mainEmbedNotice=Paste this into the page
 electrical=Electrical
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_te.txt

@@ -236,6 +236,7 @@ googleImages=Google Images
 imageSearch=Image Search
 eip=EIP
 embed=Embed
+embedFonts=Embed Fonts
 embedImages=Embed Images
 mainEmbedNotice=Paste this into the page
 electrical=Electrical
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_th.txt

@@ -236,6 +236,7 @@ googleImages=รูปภาพจาก Google
 imageSearch=ค้นหารูปภาพ
 eip=EIP
 embed=ฝังตัว
+embedFonts=Embed Fonts
 embedImages=ฝังรูปภาพ
 mainEmbedNotice=วางสิ่งนี้ลงในหน้ากระดาษ
 electrical=ไฟฟ้า
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_tr.txt

@@ -236,6 +236,7 @@ googleImages=Google Görselleri
 imageSearch=Resim Arama
 eip=EIP
 embed=Dahil et
+embedFonts=Embed Fonts
 embedImages=Görselleri dahil et
 mainEmbedNotice=Bunu sayfaya yapıştırın
 electrical=Elektriksel
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_uk.txt

@@ -236,6 +236,7 @@ googleImages=Малюнки Google
 imageSearch=Пошук зображення
 eip=EIP
 embed=Вбудувати
+embedFonts=Embed Fonts
 embedImages=Вбудовані зображення
 mainEmbedNotice=Вставте це на сторінку
 electrical=Електричні схеми
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_vi.txt

@@ -236,6 +236,7 @@ googleImages=Google Hình ảnh
 imageSearch=Tìm kiếm hình ảnh
 eip=EIP
 embed=Nhúng
+embedFonts=Embed Fonts
 embedImages=Hình ảnh nhúng
 mainEmbedNotice=Dán cái này vào trong trang
 electrical=Điện
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_zh-tw.txt

@@ -236,6 +236,7 @@ googleImages=Google圖片
 imageSearch=圖片搜尋
 eip=EIP
 embed=嵌入
+embedFonts=Embed Fonts
 embedImages=嵌入圖片
 mainEmbedNotice=將此貼入頁面
 electrical=電路
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

+ 2 - 0
src/main/webapp/resources/dia_zh.txt

@@ -236,6 +236,7 @@ googleImages=Google 图片
 imageSearch=图片搜索
 eip=EIP
 embed=嵌入
+embedFonts=Embed Fonts
 embedImages=嵌入图片
 mainEmbedNotice=将此粘贴至页面上
 electrical=电路
@@ -1160,3 +1161,4 @@ confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size
 owner=Owner
 repository=Repository
 branch=Branch
+meters=Meters

Dosya farkı çok büyük olduğundan ihmal edildi
+ 1 - 1
src/main/webapp/service-worker.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 1 - 1
src/main/webapp/service-worker.js.map