From 959a732999177d85bfa5a48abdc0bd8f58fc8ed1 Mon Sep 17 00:00:00 2001 From: Paulo Gustavo Veiga Date: Thu, 30 Dec 2021 12:32:32 -0800 Subject: [PATCH] Move images to inline. Remove toolkit init --- packages/mindplot/src/components/ImageIcon.js | 6 ++-- packages/mindplot/src/components/Workspace.js | 4 +-- .../src/components/export/SVGExporter.ts | 9 +++-- .../src/components/widget/IconPanel.js | 2 +- .../unit/export/SVGExporterTestSuite.test.ts | 25 ++++++++----- .../test/unit/export/samples/welcome.svg | 2 +- packages/mindplot/webpack.common.js | 5 ++- packages/web2d/src/index.js | 2 -- packages/web2d/test/playground/arrow.js | 14 ++++---- packages/web2d/test/playground/curvedLine.js | 14 ++++---- packages/web2d/test/playground/events.js | 3 +- packages/web2d/test/playground/font.js | 14 ++++---- packages/web2d/test/playground/group.js | 2 -- packages/web2d/test/playground/image.html | 33 ++++++++++++++++++ packages/web2d/test/playground/image.js | 28 +++++++++++++++ packages/web2d/test/playground/index.html | 2 ++ packages/web2d/test/playground/line.js | 3 +- packages/web2d/test/playground/polyLine.js | 3 +- packages/web2d/test/playground/prototype.js | 20 +++++------ packages/web2d/test/playground/rect.js | 3 +- .../test/playground/resources/logo-icon.png | Bin 0 -> 34875 bytes .../test/playground/resources/logo-icon.svg | 15 ++++++++ packages/web2d/test/playground/shapes.js | 4 +-- packages/web2d/test/playground/text.js | 3 +- packages/web2d/test/playground/workspace.js | 4 +-- packages/web2d/webpack.playground.js | 12 +++++++ 26 files changed, 155 insertions(+), 77 deletions(-) create mode 100644 packages/web2d/test/playground/image.html create mode 100644 packages/web2d/test/playground/image.js create mode 100644 packages/web2d/test/playground/resources/logo-icon.png create mode 100644 packages/web2d/test/playground/resources/logo-icon.svg diff --git a/packages/mindplot/src/components/ImageIcon.js b/packages/mindplot/src/components/ImageIcon.js index 0de0c5ae..fa73ccc8 100644 --- a/packages/mindplot/src/components/ImageIcon.js +++ b/packages/mindplot/src/components/ImageIcon.js @@ -38,7 +38,7 @@ class ImageIcon extends Icon { // Build graph image representation ... const iconType = iconModel.getIconType(); - const imgUrl = ImageIcon._getImageUrl(iconType); + const imgUrl = ImageIcon.getImageUrl(iconType); super(imgUrl); this._topicId = topic.getId(); @@ -53,13 +53,13 @@ class ImageIcon extends Icon { const newIconType = ImageIcon._getNextFamilyIconId(iconTypeClick); iconModel.setIconType(newIconType); - me._image.setHref(ImageIcon._getImageUrl(newIconType)); + me._image.setHref(ImageIcon.getImageUrl(newIconType)); }); this._image.setCursor('pointer'); } } - static _getImageUrl(iconId) { + static getImageUrl(iconId) { let result = images[`${iconId}.svg`]; if (!result) { result = images[`${iconId}.png`]; diff --git a/packages/mindplot/src/components/Workspace.js b/packages/mindplot/src/components/Workspace.js index 8ab2b716..d4490dcf 100644 --- a/packages/mindplot/src/components/Workspace.js +++ b/packages/mindplot/src/components/Workspace.js @@ -16,7 +16,7 @@ * limitations under the License. */ import { $assert, $defined } from '@wisemapping/core-js'; -import { Workspace as Workspace2D, Toolkit } from '@wisemapping/web2d'; +import { Workspace as Workspace2D } from '@wisemapping/web2d'; class Workspace { constructor(screenManager, zoom, isReadOnly) { @@ -64,7 +64,7 @@ class Workspace { fillColor: 'transparent', strokeWidth: 0, }; - Toolkit.init(); + return new Workspace2D(workspaceProfile); } diff --git a/packages/mindplot/src/components/export/SVGExporter.ts b/packages/mindplot/src/components/export/SVGExporter.ts index d67da42e..c3daf1ae 100644 --- a/packages/mindplot/src/components/export/SVGExporter.ts +++ b/packages/mindplot/src/components/export/SVGExporter.ts @@ -1,5 +1,6 @@ import { Mindmap } from "../.."; +import ImageIcon from "../ImageIcon"; import Exporter from "./Exporter"; class SVGExporter implements Exporter { @@ -10,11 +11,13 @@ class SVGExporter implements Exporter { export(): string { // Replace all images for in-line images ... - const imagesElements:HTMLCollection = this.svgElement.children + const imagesElements: HTMLCollection = this.svgElement.getElementsByTagName('image'); console.log(imagesElements.length); - Array.from(imagesElements).forEach((image) => { - console.log(image); + const image = ImageIcon.getImageUrl('face_smile'); + Array.from(imagesElements).forEach((image) => { + const imgValue = image.attributes['xlink:href'].value; + console.log(image.attributes); }); return ""; diff --git a/packages/mindplot/src/components/widget/IconPanel.js b/packages/mindplot/src/components/widget/IconPanel.js index 98e832ba..73f9dc01 100644 --- a/packages/mindplot/src/components/widget/IconPanel.js +++ b/packages/mindplot/src/components/widget/IconPanel.js @@ -43,7 +43,7 @@ class IconPanel extends ToolbarPaneItem { const iconId = familyIcons[j]; const img = $('') .attr('id', iconId) - .attr('src', ImageIcon._getImageUrl(iconId)) + .attr('src', ImageIcon.getImageUrl(iconId)) .attr('class', 'panelIcon'); familyContent.append(img); diff --git a/packages/mindplot/test/unit/export/SVGExporterTestSuite.test.ts b/packages/mindplot/test/unit/export/SVGExporterTestSuite.test.ts index 8db9d781..c2937b04 100644 --- a/packages/mindplot/test/unit/export/SVGExporterTestSuite.test.ts +++ b/packages/mindplot/test/unit/export/SVGExporterTestSuite.test.ts @@ -5,22 +5,31 @@ import XMLSerializerFactory from '../../../src/components/persistence/XMLSeriali import SVGExporter from '../../../src/components/export/SVGExporter'; test('mindplot generation of simple maps', () => { - const parser = new DOMParser(); - - // Load DOM ... - const mapStream = fs.readFileSync(path.resolve(__dirname, './samples/welcome.xml'), { encoding: 'utf-8' }); - const mapDocument = parser.parseFromString(mapStream.toString(), 'text/xml') + // Load mindmap DOM ... + const mindmapPath = path.resolve(__dirname, './samples/welcome.xml'); + const mapDocument = parseXMLFile(mindmapPath, 'text/xml'); // Convert to mindmap ... const serializer = XMLSerializerFactory.getSerializerFromDocument(mapDocument); const mindmap: Mindmap = serializer.loadFromDom(mapDocument, 'welcome'); // Load SVG ... - const svgStream = fs.readFileSync(path.resolve(__dirname, './samples/welcome.svg'), { encoding: 'utf-8' }); - const svgDocument = parser.parseFromString(svgStream.toString(), 'application/xml') - console.log(svgDocument); + const svgPath = path.resolve(__dirname, './samples/welcome.svg'); + const svgDocument = parseXMLFile(svgPath, 'image/svg+xml'); // Inspect ... const exporter = new SVGExporter(mindmap, svgDocument.documentElement); console.log(exporter.export()); + + function parseXMLFile(filePath: fs.PathOrFileDescriptor, mimeType: DOMParserSupportedType) { + const parser = new DOMParser(); + const stream = fs.readFileSync(filePath, { encoding: 'utf-8' }); + const xmlDoc = parser.parseFromString(stream.toString(), mimeType); + + // Is there any parsing error ?. + if (xmlDoc.getElementsByTagName("parsererror").length > 0) { + throw new Error(`Unexpected error parsing: ${filePath}. Error: ${new XMLSerializer().serializeToString(xmlDoc)}`); + } + return xmlDoc; + } }); diff --git a/packages/mindplot/test/unit/export/samples/welcome.svg b/packages/mindplot/test/unit/export/samples/welcome.svg index 95409e1c..46e95f1d 100644 --- a/packages/mindplot/test/unit/export/samples/welcome.svg +++ b/packages/mindplot/test/unit/export/samples/welcome.svg @@ -1,4 +1,4 @@ - + diff --git a/packages/mindplot/webpack.common.js b/packages/mindplot/webpack.common.js index 188df7a0..f654a0b1 100644 --- a/packages/mindplot/webpack.common.js +++ b/packages/mindplot/webpack.common.js @@ -5,7 +5,6 @@ module.exports = { output: { path: path.resolve(__dirname, 'dist'), filename: '[name].js', - publicPath: '', library: { type: 'umd', }, @@ -35,8 +34,8 @@ module.exports = { exclude: '/node_modules/', }, { - test: /\.(png|svg|jpg|jpeg|gif)$/i, - type: 'asset/resource', + test: /\.(png|svg)$/i, + type: 'asset/inline', }, ], }, diff --git a/packages/web2d/src/index.js b/packages/web2d/src/index.js index a0bf3975..73aada6b 100644 --- a/packages/web2d/src/index.js +++ b/packages/web2d/src/index.js @@ -17,7 +17,6 @@ */ import Workspace from './components/Workspace'; -import Toolkit from './components/Toolkit'; import Elipse from './components/Elipse'; import Line from './components/Line'; import PolyLine from './components/PolyLine'; @@ -42,6 +41,5 @@ export { PolyLine, Rect, Text, - Toolkit, Workspace, }; diff --git a/packages/web2d/test/playground/arrow.js b/packages/web2d/test/playground/arrow.js index 8d8aadcc..a1eb9e29 100644 --- a/packages/web2d/test/playground/arrow.js +++ b/packages/web2d/test/playground/arrow.js @@ -1,22 +1,20 @@ import $ from 'jquery'; import { - Toolkit, Workspace, Arrow, Point, + Workspace, Arrow, Point, } from '../../src'; -Toolkit.init(); - -const overflowWorkspace = new Workspace({ fillColor: 'green' }); -overflowWorkspace.setSize('200px', '200px'); +const workspace = new Workspace({ fillColor: 'green' }); +workspace.setSize('200px', '200px'); const arrow = new Arrow(); arrow.setFrom(50, 50); arrow.setControlPoint(new Point(-50, 0)); -overflowWorkspace.append(arrow); +workspace.append(arrow); const arrow2 = new Arrow(); arrow2.setFrom(100, 50); arrow2.setControlPoint(new Point(50, 50)); -overflowWorkspace.append(arrow2); +workspace.append(arrow2); -overflowWorkspace.addItAsChildTo($('#overflowExample').first()); +workspace.addItAsChildTo($('#overflowExample').first()); diff --git a/packages/web2d/test/playground/curvedLine.js b/packages/web2d/test/playground/curvedLine.js index 265a84c6..8ffd34bd 100644 --- a/packages/web2d/test/playground/curvedLine.js +++ b/packages/web2d/test/playground/curvedLine.js @@ -1,19 +1,17 @@ import $ from 'jquery'; import { - Toolkit, Workspace, CurvedLine, Point, + Workspace, CurvedLine, Point, } from '../../src'; -Toolkit.init(); - -const overflowWorkspace = new Workspace({ fillColor: 'green' }); -overflowWorkspace.setSize('400px', '400px'); +const workspace = new Workspace({ fillColor: 'green' }); +workspace.setSize('400px', '400px'); const line1 = new CurvedLine(); line1.setStyle(CurvedLine.SIMPLE_LINE); line1.setFrom(200, 200); line1.setTo(100, 100); line1.setSrcControlPoint(new Point(-100, 0)); line1.setDestControlPoint(new Point(100, 0)); -overflowWorkspace.append(line1); +workspace.append(line1); const line2 = new CurvedLine(); line2.setStyle(CurvedLine.NICE_LINE); @@ -21,6 +19,6 @@ line2.setFrom(0, 0); line2.setTo(150, 90); line2.setSrcControlPoint(new Point(100, 0)); line2.setDestControlPoint(new Point(-100, 0)); -overflowWorkspace.append(line2); +workspace.append(line2); -overflowWorkspace.addItAsChildTo($('#overflowExample').first()); \ No newline at end of file +workspace.addItAsChildTo($('#overflowExample').first()); \ No newline at end of file diff --git a/packages/web2d/test/playground/events.js b/packages/web2d/test/playground/events.js index c338b49b..f272a5a1 100644 --- a/packages/web2d/test/playground/events.js +++ b/packages/web2d/test/playground/events.js @@ -1,7 +1,7 @@ /* eslint-disable no-alert */ import $ from 'jquery'; import { - Toolkit, Workspace, Elipse, + Workspace, Elipse, } from '../../src'; global.$ = $; @@ -55,7 +55,6 @@ MultipleEventHandler.prototype.unRegisterOneListener = function unRegisterOneLis } }; -Toolkit.init(); // Workspace with CoordOrigin(100,100); const workspace = new Workspace(); diff --git a/packages/web2d/test/playground/font.js b/packages/web2d/test/playground/font.js index 041105b1..442acb00 100644 --- a/packages/web2d/test/playground/font.js +++ b/packages/web2d/test/playground/font.js @@ -25,14 +25,14 @@ function multiline(text, family, elemId) { } function alignments(text, family, elemId) { - const overflowWorkspace = new Workspace(); - overflowWorkspace.setSize('260px', '240px'); - overflowWorkspace.setCoordSize('260', '240'); - overflowWorkspace.setCoordOrigin(0, 0); + const workspace = new Workspace(); + workspace.setSize('260px', '240px'); + workspace.setCoordSize('260', '240'); + workspace.setCoordOrigin(0, 0); ['center', 'left', 'right'].forEach((align, i) => { const wText = new Text(); - overflowWorkspace.append(wText); + workspace.append(wText); wText.setText(text); wText.setFont(family, 8, 'bold'); @@ -41,11 +41,9 @@ function alignments(text, family, elemId) { wText.setTextAlignment(align); }); - overflowWorkspace.addItAsChildTo($(`#${elemId}`)); + workspace.addItAsChildTo($(`#${elemId}`)); } -Toolkit.init(); - // Multine tests ... ['Arial', 'Tahoma', 'Verdana', 'Times'].forEach((family, i) => { multiline('This multine text.\nLine 1 :)\nLine2', family, `multi${i}`); diff --git a/packages/web2d/test/playground/group.js b/packages/web2d/test/playground/group.js index 7440dd64..5c57d09c 100644 --- a/packages/web2d/test/playground/group.js +++ b/packages/web2d/test/playground/group.js @@ -6,8 +6,6 @@ import { global.$ = $; -Toolkit.init(); - const basicTest = () => { const workspace = new Workspace(); workspace.setSize('150px', '150px'); diff --git a/packages/web2d/test/playground/image.html b/packages/web2d/test/playground/image.html new file mode 100644 index 00000000..150360b3 --- /dev/null +++ b/packages/web2d/test/playground/image.html @@ -0,0 +1,33 @@ + + + + + + + + + +

Image Tests

+ + + + + + + + + + + +
+ Load URL Images in PNG and SVG + +
+
+ Load Inline PNG and SVG + +
+
+ + + \ No newline at end of file diff --git a/packages/web2d/test/playground/image.js b/packages/web2d/test/playground/image.js new file mode 100644 index 00000000..235a6499 --- /dev/null +++ b/packages/web2d/test/playground/image.js @@ -0,0 +1,28 @@ +import $ from 'jquery'; +import svgResource from './resources/logo-icon.svg'; +import pngResource from './resources/logo-icon.png'; + +import { + Workspace, Image, +} from '../../src'; + +// URL Based image test ... +const workspace = new Workspace({ fillColor: 'light-gray' }); +workspace.setSize('200px', '100px'); + +// Add SVG Image ... +const svgImage = new Image(); +svgImage.setHref(svgResource); +svgImage.setSize(80, 120); +workspace.append(svgImage); + +// Add PNG Image ... +const pngImage = new Image(); +pngImage.setHref(pngResource); +pngImage.setSize(60, 120); +pngImage.setPosition(80, 0); +workspace.append(pngImage); + +workspace.addItAsChildTo($('#urlImage').first()); + +// Embedded image test ... diff --git a/packages/web2d/test/playground/index.html b/packages/web2d/test/playground/index.html index 161e95c8..f9207e23 100644 --- a/packages/web2d/test/playground/index.html +++ b/packages/web2d/test/playground/index.html @@ -24,6 +24,8 @@
  • Shapes
  • Text
  • Workspace
  • +
  • Image
  • + diff --git a/packages/web2d/test/playground/line.js b/packages/web2d/test/playground/line.js index 60cebd4e..7a144863 100644 --- a/packages/web2d/test/playground/line.js +++ b/packages/web2d/test/playground/line.js @@ -1,11 +1,10 @@ import $ from 'jquery'; import { - Toolkit, Workspace, Line, Rect, + Workspace, Line, Rect, } from '../../src'; global.$ = $; -Toolkit.init(); const workspaceAttributes = { width: '700px', height: '100px', coordSize: '350 50', fillColor: '#ffffcc', }; diff --git a/packages/web2d/test/playground/polyLine.js b/packages/web2d/test/playground/polyLine.js index 7df1eabe..9773ce7b 100644 --- a/packages/web2d/test/playground/polyLine.js +++ b/packages/web2d/test/playground/polyLine.js @@ -1,10 +1,9 @@ import $ from 'jquery'; import { - Toolkit, Workspace, PolyLine, + Workspace, PolyLine, } from '../../src'; global.$ = $; -Toolkit.init(); let overflowWorkspace = new Workspace({ fillColor: 'green' }); overflowWorkspace.setSize('100px', '100px'); diff --git a/packages/web2d/test/playground/prototype.js b/packages/web2d/test/playground/prototype.js index a9396a10..dd5ab886 100644 --- a/packages/web2d/test/playground/prototype.js +++ b/packages/web2d/test/playground/prototype.js @@ -1,7 +1,5 @@ import $ from 'jquery'; -import { - Toolkit, Workspace, Rect, Group, -} from '../../src'; +import * as src from '../../src'; global.$ = $; @@ -9,16 +7,14 @@ let xScale = 1000; let yScale = 600; let shapeOrigX = 0; -Toolkit.init(); - -const workspace = new Workspace(); +const workspace = new src.Workspace(); workspace.setSize(`${xScale}px`, `${yScale}px`); workspace.setCoordSize(xScale, yScale); workspace.setCoordOrigin(0, 0); workspace.setFill('#f0f0f0'); // Center Topic Rect ... -const centralRect = new Rect(0.3); +const centralRect = new src.Rect(0.3); centralRect.setSize(200, 60); centralRect.setPosition(300, 300); centralRect.setFill('#99ccff'); @@ -41,13 +37,13 @@ global.zoomOut = function zoomOut() { global.createShape = function createShape() { // Secondary Idea... - const nodeGroup = new Group(); + const nodeGroup = new src.Group(); nodeGroup.setSize(200, 60); nodeGroup.setCoordSize(200, 60); nodeGroup.setPosition(700, shapeOrigX); shapeOrigX += 50; - const outerRect = new Rect(); + const outerRect = new src.Rect(); outerRect.setSize(200, 100); outerRect.setVisibility(false); outerRect.setPosition(0, 0); @@ -55,7 +51,7 @@ global.createShape = function createShape() { outerRect.setStroke(1, 'solid', '#878b8f'); nodeGroup.append(outerRect); - const inerRect = new Rect(0.3); + const inerRect = new src.Rect(0.3); inerRect.setSize(190, 85); inerRect.setPosition(5, 10); inerRect.setFill('white'); @@ -76,14 +72,14 @@ global.createShape = function createShape() { }); nodeGroup.addEvent('mousedown', function addEvent(e) { - const shadowGroup = new Group(); + const shadowGroup = new src.Group(); shadowGroup.setSize(200, 60); shadowGroup.setCoordSize(200, 60); const position = nodeGroup.getPosition(); shadowGroup.setPosition(position.x, position.y); - const shadowRect = new Rect(0.3); + const shadowRect = new src.Rect(0.3); shadowRect.setSize(190, 85); shadowRect.setPosition(5, 10); shadowRect.setFill('white', 0.3); diff --git a/packages/web2d/test/playground/rect.js b/packages/web2d/test/playground/rect.js index 22d5681b..1d6691b0 100644 --- a/packages/web2d/test/playground/rect.js +++ b/packages/web2d/test/playground/rect.js @@ -1,11 +1,10 @@ import $ from 'jquery'; import { - Toolkit, Workspace, Rect, + Workspace, Rect, } from '../../src'; global.$ = $; -Toolkit.init(); const rectExampleTest = () => { const workspace = new Workspace(); diff --git a/packages/web2d/test/playground/resources/logo-icon.png b/packages/web2d/test/playground/resources/logo-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bb62808d994add45030bb41a6891c31eda51e96a GIT binary patch literal 34875 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⋙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 MG&LyDyZZ3|1Le=gy#N3J literal 0 HcmV?d00001 diff --git a/packages/web2d/test/playground/resources/logo-icon.svg b/packages/web2d/test/playground/resources/logo-icon.svg new file mode 100644 index 00000000..11f96dd4 --- /dev/null +++ b/packages/web2d/test/playground/resources/logo-icon.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/web2d/test/playground/shapes.js b/packages/web2d/test/playground/shapes.js index 9bb4684a..5b086e3c 100644 --- a/packages/web2d/test/playground/shapes.js +++ b/packages/web2d/test/playground/shapes.js @@ -1,12 +1,10 @@ import $ from 'jquery'; import { - Toolkit, Workspace, Rect, + Workspace, Rect, } from '../../src'; global.$ = $; -Toolkit.init(); - const strokeStyleTest = () => { function builder(parent, scale, strokeWidth) { const rectSize = scale * 80; diff --git a/packages/web2d/test/playground/text.js b/packages/web2d/test/playground/text.js index 4cce4a7d..4f249b2f 100644 --- a/packages/web2d/test/playground/text.js +++ b/packages/web2d/test/playground/text.js @@ -1,6 +1,6 @@ import $ from 'jquery'; import { - Toolkit, Workspace, Text, + Workspace, Text, } from '../../src'; import TransformUtils from '../../src/components/peer/utils/TransformUtils'; @@ -44,7 +44,6 @@ const textTestHelper = function textTestHelper(coordSize, textval, font, fontSiz workspaces[iesimo] = workspace; }; -Toolkit.init(); textTestHelper(200, 'Test Text 1', 'Arial', 10, 'normal', 'normal', 'red', 'text0', 0); textTestHelper(100, 'Test Text 2', 'Arial', 10, 'normal', 'normal', 'blue', 'text1', 1); textTestHelper(50, 'Test Text 3', 'Arial', 10, 'normal', 'normal', 'blue', 'text2', 2); diff --git a/packages/web2d/test/playground/workspace.js b/packages/web2d/test/playground/workspace.js index 719aa53d..1b82b8fa 100644 --- a/packages/web2d/test/playground/workspace.js +++ b/packages/web2d/test/playground/workspace.js @@ -1,13 +1,11 @@ import $ from 'jquery'; import { - Toolkit, Workspace, Elipse, + Workspace, Elipse, } from '../../src'; import Grid from './Grid'; global.$ = $; -Toolkit.init(); - const overflowWorkspace = new Workspace(); overflowWorkspace.setSize('100px', '100px'); const elipse1 = new Elipse(); diff --git a/packages/web2d/webpack.playground.js b/packages/web2d/webpack.playground.js index d51f75a1..b309a20e 100644 --- a/packages/web2d/webpack.playground.js +++ b/packages/web2d/webpack.playground.js @@ -17,6 +17,7 @@ module.exports = { group: './test/playground/group.js', prototype: './test/playground/prototype.js', text: './test/playground/text.js', + image: './test/playground/image.js', }, output: { path: path.resolve(__dirname, 'dist', 'tests'), @@ -39,6 +40,10 @@ module.exports = { /node_modules/, ], }, + { + test: /\.(png|svg)$/i, + type: 'asset/inline', + }, ], }, resolve: { @@ -145,5 +150,12 @@ module.exports = { template: 'test/playground/text.html', }, ), + new HtmlWebpackPlugin( + { + chunks: ['image'], + filename: 'image.html', + template: 'test/playground/image.html', + }, + ), ], };