Browse Source

feat(Fonts): read and apply fontStyle for UnknownExpressions like dolce (#348)

sschmid 4 years ago
parent
commit
28b313d73a

+ 17 - 5
src/MusicalScore/ScoreIO/MusicSymbolModules/ExpressionReader.ts

@@ -16,6 +16,7 @@ import {PlacementEnum} from "../../VoiceData/Expressions/AbstractExpression";
 import {TextAlignmentEnum} from "../../../Common/Enums/TextAlignment";
 import {ITextTranslation} from "../../Interfaces/ITextTranslation";
 import log from "loglevel";
+import { FontStyles } from "../../../Common/Enums/FontStyles";
 
 export class ExpressionReader {
     private musicSheet: MusicSheet;
@@ -350,6 +351,14 @@ export class ExpressionReader {
     }
     private interpretWords(wordsNode: IXmlElement, currentMeasure: SourceMeasure, inSourceMeasureCurrentFraction: Fraction): void {
         const text: string = wordsNode.value;
+        let fontStyle: FontStyles;
+        const fontStyleAttr: Attr = wordsNode.attribute("font-style");
+        if (fontStyleAttr) {
+            const fontStyleText: string = fontStyleAttr.value;
+            if (fontStyleText === "italic") {
+                fontStyle = FontStyles.Italic;
+            }
+        }
         if (text.length > 0) {
             if (wordsNode.hasAttributes && wordsNode.attribute("default-x")) {
                 this.directionTimestamp = Fraction.createFromFraction(inSourceMeasureCurrentFraction);
@@ -357,7 +366,7 @@ export class ExpressionReader {
             if (this.checkIfWordsNodeIsRepetitionInstruction(text)) {
                 return;
             }
-            this.fillMultiOrTempoExpression(text, currentMeasure);
+            this.fillMultiOrTempoExpression(text, currentMeasure, fontStyle);
             this.initialize();
         }
     }
@@ -423,7 +432,7 @@ export class ExpressionReader {
             }
         }
     }
-    private fillMultiOrTempoExpression(inputString: string, currentMeasure: SourceMeasure): void {
+    private fillMultiOrTempoExpression(inputString: string, currentMeasure: SourceMeasure, fontStyle: FontStyles): void {
         if (!inputString) {
             return;
         }
@@ -432,7 +441,7 @@ export class ExpressionReader {
         //const splitStrings: string[] = tmpInputString.split(/([\s,\r\n]and[\s,\r\n]|[\s,\r\n]und[\s,\r\n]|[\s,\r\n]e[\s,\r\n]|[\s,\r\n])+/g);
 
         //for (const splitStr of splitStrings) {
-        this.createExpressionFromString("", tmpInputString, currentMeasure, inputString);
+        this.createExpressionFromString("", tmpInputString, currentMeasure, inputString, fontStyle);
         //}
     }
     /*
@@ -464,7 +473,8 @@ export class ExpressionReader {
     }
     */
     private createExpressionFromString(prefix: string, stringTrimmed: string,
-                                       currentMeasure: SourceMeasure, inputString: string): boolean {
+                                       currentMeasure: SourceMeasure, inputString: string,
+                                       fontStyle: FontStyles): boolean {
         if (InstantaneousTempoExpression.isInputStringInstantaneousTempo(stringTrimmed) ||
             ContinuousTempoExpression.isInputStringContinuousTempo(stringTrimmed)) {
             // first check if there is already a tempo expression with the same function
@@ -478,7 +488,7 @@ export class ExpressionReader {
                     }
                 }
             }
-            this.createNewTempoExpressionIfNeeded(currentMeasure);
+            this.createNewTempoExpressionIfNeeded(currentMeasure); // TODO process fontStyle? (also for other expressions)
             this.currentMultiTempoExpression.CombinedExpressionsText = inputString;
             if (InstantaneousTempoExpression.isInputStringInstantaneousTempo(stringTrimmed)) {
                 const instantaneousTempoExpression: InstantaneousTempoExpression = new InstantaneousTempoExpression(  stringTrimmed,
@@ -539,6 +549,7 @@ export class ExpressionReader {
             this.createNewMultiExpressionIfNeeded(currentMeasure);
             currentMeasure.hasMoodExpressions = true;
             const moodExpression: MoodExpression = new MoodExpression(stringTrimmed, this.placement, this.staffNumber);
+            moodExpression.fontStyle = fontStyle;
             this.getMultiExpression.addExpression(moodExpression, prefix);
             return true;
         }
@@ -571,6 +582,7 @@ export class ExpressionReader {
         }
         const unknownExpression: UnknownExpression = new UnknownExpression(
             stringTrimmed, this.placement, textAlignment, this.staffNumber);
+        unknownExpression.fontStyle = fontStyle;
         this.getMultiExpression.addExpression(unknownExpression, prefix);
 
         return false;

+ 2 - 0
src/MusicalScore/VoiceData/Expressions/MoodExpression.ts

@@ -1,4 +1,5 @@
 import {PlacementEnum, AbstractExpression} from "./AbstractExpression";
+import { FontStyles } from "../../../Common/Enums/FontStyles";
 
 export class MoodExpression extends AbstractExpression {
     constructor(label: string, placement: PlacementEnum, staffNumber: number) {
@@ -46,6 +47,7 @@ export class MoodExpression extends AbstractExpression {
     private moodType: MoodEnum;
     private label: string;
     private staffNumber: number;
+    public fontStyle: FontStyles;
 
     public static isInputStringMood(inputString: string): boolean {
         if (!inputString) {

+ 2 - 1
src/MusicalScore/VoiceData/Expressions/MultiExpression.ts

@@ -119,7 +119,8 @@ export class MultiExpression {
            } else if (this.expressions[0].expression instanceof MoodExpression) {
             fontStyle = FontStyles.Italic;
            } else if (this.expressions[0].expression instanceof UnknownExpression) {
-            fontStyle = FontStyles.Regular;
+            const unknownExpression: UnknownExpression = (this.expressions[0].expression as UnknownExpression);
+            fontStyle = unknownExpression.fontStyle ?? FontStyles.Regular;
            }
        }
        return fontStyle;

+ 4 - 2
src/MusicalScore/VoiceData/Expressions/UnknownExpression.ts

@@ -1,5 +1,6 @@
-import {PlacementEnum, AbstractExpression} from "./AbstractExpression";
-import {TextAlignmentEnum} from "../../../Common/Enums/TextAlignment";
+import { PlacementEnum, AbstractExpression } from "./AbstractExpression";
+import { TextAlignmentEnum } from "../../../Common/Enums/TextAlignment";
+import { FontStyles } from "../../../Common/Enums/FontStyles";
 
 export class UnknownExpression extends AbstractExpression {
     constructor(label: string, placement: PlacementEnum, textAlignment: TextAlignmentEnum, staffNumber: number) {
@@ -14,6 +15,7 @@ export class UnknownExpression extends AbstractExpression {
     private label: string;
     private textAlignment: TextAlignmentEnum;
     private staffNumber: number;
+    public fontStyle: FontStyles;
 
     public get Label(): string {
         return this.label;