Parcourir la source

Merge branch 'release/0.8.2'

sschmid il y a 5 ans
Parent
commit
80f787a3b6
4 fichiers modifiés avec 80 ajouts et 68 suppressions
  1. 8 0
      CHANGELOG.md
  2. 57 2
      demo/index.js
  3. 3 3
      package.json
  4. 12 63
      src/OpenSheetMusicDisplay/OpenSheetMusicDisplay.ts

+ 8 - 0
CHANGELOG.md

@@ -1,3 +1,11 @@
+## [0.8.2](https://github.com/opensheetmusicdisplay/opensheetmusicdisplay/compare/0.8.1...0.8.2) (2020-06-13)
+
+
+### Features
+
+* **PDF:** Remove createPDF from OSMD object (move to demo), reducing bundle size. Fix FileReader pollution ([64c8ccf](https://github.com/opensheetmusicdisplay/opensheetmusicdisplay/commit/64c8ccff943bbbedbfb85306f516d16ad7dfa0b8))
+
+
 ## [0.8.1](https://github.com/opensheetmusicdisplay/opensheetmusicdisplay/compare/0.8.0...0.8.1) (2020-06-10)
 
 ### Bug Fixes

+ 57 - 2
demo/index.js

@@ -1,4 +1,6 @@
-import { OpenSheetMusicDisplay } from '../src/OpenSheetMusicDisplay/OpenSheetMusicDisplay';
+import { OpenSheetMusicDisplay, BackendType } from '../src/OpenSheetMusicDisplay';
+import * as jsPDF  from '../node_modules/jspdf-yworks/dist/jspdf.min'
+import * as svg2pdf from '../node_modules/svg2pdf.js/dist/svg2pdf.min';
 
 /*jslint browser:true */
 (function () {
@@ -354,7 +356,7 @@ import { OpenSheetMusicDisplay } from '../src/OpenSheetMusicDisplay/OpenSheetMus
         for (const printPdfBtn of printPdfBtns) {
             if (printPdfBtn) {
                 printPdfBtn.onclick = function () {
-                    openSheetMusicDisplay.createPdf();
+                    createPdf();
                 }
             }
         }
@@ -769,6 +771,59 @@ import { OpenSheetMusicDisplay } from '../src/OpenSheetMusicDisplay/OpenSheetMus
         }
     }
 
+    /**
+     * Creates a Pdf of the currently rendered MusicXML
+     * @param pdfName if no name is given, the composer and title of the piece will be used
+     */
+    function createPdf(pdfName) {
+        if (openSheetMusicDisplay.backendType !== BackendType.SVG) {
+            console.log("[OSMD] createPdf(): Warning: createPDF is only supported for SVG background for now, not for Canvas." +
+                " Please use osmd.setOptions({backendType: SVG}).");
+            return;
+        }
+
+        if (pdfName === undefined) {
+            pdfName = openSheetMusicDisplay.sheet.FullNameString + ".pdf";
+        }
+
+        const backends = openSheetMusicDisplay.drawer.Backends;
+        let svgElement = backends[0].getSvgElement();
+
+        let pageWidth = 210;
+        let pageHeight = 297;
+        const engravingRulesPageFormat = openSheetMusicDisplay.rules.PageFormat;
+        if (engravingRulesPageFormat && !engravingRulesPageFormat.IsUndefined) {
+            pageWidth = engravingRulesPageFormat.width;
+            pageHeight = engravingRulesPageFormat.height;
+        } else {
+            pageHeight = pageWidth * svgElement.clientHeight / svgElement.clientWidth;
+        }
+
+        const orientation = pageHeight > pageWidth ? "p" : "l";
+        // create a new jsPDF instance
+        const pdf = new jsPDF(orientation, "mm", [pageWidth, pageHeight]);
+        const scale = pageWidth / svgElement.clientWidth;
+        for (let idx = 0, len = backends.length; idx < len; ++idx) {
+            if (idx > 0) {
+                pdf.addPage();
+            }
+            svgElement = backends[idx].getSvgElement();
+
+            // render the svg element
+            svg2pdf(svgElement, pdf, {
+                scale: scale,
+                xOffset: 0,
+                yOffset: 0
+            });
+        }
+
+        // simply save the created pdf
+        pdf.save(pdfName);
+
+        // note that using jspdf with svg2pdf creates unnecessary console warnings "AcroForm-Classes are not populated into global-namespace..."
+        // this will hopefully be fixed with a new jspdf release, see https://github.com/yWorks/jsPDF/pull/32
+    }
+
     // Register events: load, drag&drop
     window.addEventListener("load", function () {
         init();

+ 3 - 3
package.json

@@ -1,6 +1,6 @@
 {
   "name": "opensheetmusicdisplay",
-  "version": "0.8.1",
+  "version": "0.8.2",
   "description": "An open source JavaScript engine for displaying MusicXML based on VexFlow.",
   "main": "build/opensheetmusicdisplay.min.js",
   "typings": "build/dist/src/",
@@ -61,10 +61,8 @@
   "homepage": "http://opensheetmusicdisplay.org",
   "dependencies": {
     "@types/vexflow": "^1.2.33",
-    "jspdf-yworks": "^2.1.1",
     "jszip": "3.4.0",
     "loglevel": "^1.6.8",
-    "svg2pdf.js": "^1.5.0",
     "typescript-collections": "^1.3.3",
     "vexflow": "1.2.93"
   },
@@ -87,6 +85,7 @@
     "html-webpack-plugin": "^4.3.0",
     "jquery": "^3.4.1",
     "jsdom": "^16.2.2",
+    "jspdf-yworks": "^2.1.1",
     "karma": "^5.0.8",
     "karma-base64-to-js-preprocessor": "^0.0.1",
     "karma-chai": "^0.1.0",
@@ -102,6 +101,7 @@
     "ts-loader": "^4.1.0",
     "tslint": "^5.14.0",
     "tslint-loader": "^3.5.4",
+    "svg2pdf.js": "^1.5.0",
     "typedoc": "^0.17.3",
     "typescript": "^3.7.4",
     "webpack": "^4.43.0",

+ 12 - 63
src/OpenSheetMusicDisplay/OpenSheetMusicDisplay.ts

@@ -19,8 +19,6 @@ import { AbstractExpression } from "../MusicalScore/VoiceData/Expressions/Abstra
 import { Dictionary } from "typescript-collections";
 import { NoteEnum } from "..";
 import { AutoColorSet, GraphicalMusicPage } from "../MusicalScore";
-import jspdf = require("jspdf-yworks/dist/jspdf.min");
-import svg2pdf = require("svg2pdf.js/dist/svg2pdf.min");
 import { MusicPartManagerIterator } from "../MusicalScore/MusicParts";
 import { ITransposeCalculator } from "../MusicalScore/Interfaces";
 /**
@@ -29,7 +27,7 @@ import { ITransposeCalculator } from "../MusicalScore/Interfaces";
  * After the constructor, use load() and render() to load and render a MusicXML file.
  */
 export class OpenSheetMusicDisplay {
-    private version: string = "0.8.1-release"; // getter: this.Version
+    private version: string = "0.8.2-release"; // getter: this.Version
     // at release, bump version and change to -release, afterwards to -dev again
 
     /**
@@ -112,21 +110,25 @@ export class OpenSheetMusicDisplay {
                 // UTF with BOM detected, truncate first three bytes and pass along
                 return self.load(str.substr(3));
             }
-            if (str.substr(0, 6).includes("<?xml")) { // first character is sometimes null, making first five characters '<?xm'.
-                log.debug("[OSMD] Finally parsing XML content, length: " + str.length);
+            let trimmedStr: string = str;
+            if (/^\s/.test(trimmedStr)) { // only trim if we need to. (end of string is irrelevant)
+                trimmedStr = trimmedStr.trim(); // trim away empty lines at beginning etc
+            }
+            if (trimmedStr.substr(0, 6).includes("<?xml")) { // first character is sometimes null, making first five characters '<?xm'.
+                log.debug("[OSMD] Finally parsing XML content, length: " + trimmedStr.length);
                 // Parse the string representing an xml file
                 const parser: DOMParser = new DOMParser();
-                content = parser.parseFromString(str, "application/xml");
-            } else if (str.length < 2083) { // TODO do proper URL format check
-                log.debug("[OSMD] Retrieve the file at the given URL: " + str);
+                content = parser.parseFromString(trimmedStr, "application/xml");
+            } else if (trimmedStr.length < 2083) { // TODO do proper URL format check
+                log.debug("[OSMD] Retrieve the file at the given URL: " + trimmedStr);
                 // Assume now "str" is a URL
                 // Retrieve the file at the given URL
-                return AJAX.ajax(str).then(
+                return AJAX.ajax(trimmedStr).then(
                     (s: string) => { return self.load(s); },
                     (exc: Error) => { throw exc; }
                 );
             } else {
-                console.error("[OSMD] osmd.load(string): Could not process string. Missing else branch?");
+                console.error("[OSMD] osmd.load(string): Could not process string. Did not find <?xml at beginning.");
             }
         }
 
@@ -779,59 +781,6 @@ export class OpenSheetMusicDisplay {
         }
     }
 
-    /**
-     * Creates a Pdf of the currently rendered MusicXML
-     * @param pdfName if no name is given, the composer and title of the piece will be used
-     */
-    public createPdf(pdfName: string = undefined): void {
-        if (this.backendType !== BackendType.SVG) {
-            console.log("[OSMD] osmd.createPdf(): Warning: createPDF is only supported for SVG background for now, not for Canvas." +
-                " Please use osmd.setOptions({backendType: SVG}).");
-            return;
-        }
-
-        if (pdfName === undefined) {
-            pdfName = this.sheet.FullNameString + ".pdf";
-        }
-
-        const backends: VexFlowBackend[] = this.drawer.Backends;
-        let svgElement: SVGElement = (<SvgVexFlowBackend>backends[0]).getSvgElement();
-
-        let pageWidth: number = 210;
-        let pageHeight: number = 297;
-        const engravingRulesPageFormat: PageFormat = this.rules.PageFormat;
-        if (engravingRulesPageFormat && !engravingRulesPageFormat.IsUndefined) {
-            pageWidth = engravingRulesPageFormat.width;
-            pageHeight = engravingRulesPageFormat.height;
-        } else {
-            pageHeight = pageWidth * svgElement.clientHeight / svgElement.clientWidth;
-        }
-
-        const orientation: string = pageHeight > pageWidth ? "p" : "l";
-        // create a new jsPDF instance
-        const pdf: any = new jspdf(orientation, "mm", [pageWidth, pageHeight]);
-        const scale: number = pageWidth / svgElement.clientWidth;
-        for (let idx: number = 0, len: number = backends.length; idx < len; ++idx) {
-            if (idx > 0) {
-                pdf.addPage();
-            }
-            svgElement = (<SvgVexFlowBackend>backends[idx]).getSvgElement();
-
-            // render the svg element
-            svg2pdf(svgElement, pdf, {
-                scale: scale,
-                xOffset: 0,
-                yOffset: 0
-            });
-        }
-
-        // simply save the created pdf
-        pdf.save(pdfName);
-
-        // note that using jspdf with svg2pdf creates unnecessary console warnings "AcroForm-Classes are not populated into global-namespace..."
-        // this will hopefully be fixed with a new jspdf release, see https://github.com/yWorks/jsPDF/pull/32
-    }
-
     //#region GETTER / SETTER
     public set DrawSkyLine(value: boolean) {
         this.drawSkyLine = value;