diff --git a/demo/src/index.ts b/demo/src/index.ts index 264e5aa..7db8431 100644 --- a/demo/src/index.ts +++ b/demo/src/index.ts @@ -1,34 +1,8 @@ import { font, getGlyphPath } from "../../src/index.ts"; import { Glyph, Line, Vec } from "../../src/type"; -const lowercase = [ - ..."aáàăắằẵẳâấầẫẩǎåǻäǟãȧǡąāảȁȃạặậḁæǽǣẚɐɑɒ", - ..."bḃḅḇʙƀɓƃ", - ..."cćĉčċçḉȼƈɕ", - ..."dďḋḑđḍḓḏðȸdzʣdžʥʤɖɗƌȡẟ", - ..."eéèĕêếềễểěëẽėȩḝęēḗḕẻȅȇẹệḙḛɇǝəɛɘɚɜɝɞʚɤ", - ..."fḟʩƒ", - ..."gǵğĝǧġģḡɡɢǥɠʛɣ", - ..."ƣhĥȟḧḣḩħḥḫẖʜƕɦɧ", - ..."iíìĭîǐïḯĩįīỉȉȋịḭijıɪɨɩ", - ..."jĵǰȷɉʝɟʄ", - ..."kḱǩķḳḵƙʞ", - ..."lĺľļłḷḹḽḻŀljỻʪʫʟƚɫɬɭȴɮƛʎ", - ..."mḿṁṃɱ", - ..."nńǹňñṅņṇṋṉnjɴɲƞɳȵŋ", - ..."oóòŏôốồỗổǒöȫőõṍṏȭȯȱøǿǫǭōṓṑỏȍȏơớờỡởợọộœɶɔɵɷȣ", - ..."pṕṗƥɸqȹʠ", - ..."ɋĸ", - ..."rŕřṙŗȑȓṛṝṟʀɍɹɺɻɼɽɾɿʁ", - ..."sśṥŝšṧṡşṣṩșſẛßʂȿẜẝʃƪʅʆ", - ..."tťẗṫţṭțṱṯʨƾʦʧŧƫƭʈȶʇ", - ..."uúùŭûǔůüǘǜǚǖűũṹųūṻủȕȗưứừữửựụṳṷṵʉɥʮʯɯɰʊ", - ..."vṽṿʋỽʌ", - ..."wẃẁŵẘẅẇẉʍ", - ..."xẍẋ", - ..."yýỳŷẙÿỹẏȳỷỵʏɏƴỿȝ", - ..."zźẑžżẓẕƍƶȥʐʑɀʒǯƹƺʓþƿƨƽƅɂʕʡʢʖʗʘʬʭ", -], -DEBUG = false; +import letters from "./letters" + +const DEBUG = false; const rotateGlyph = (g: Glyph) => g.map((l: Line) => l.map((p: Vec) => [1 - p[0], 1 - p[1]])); @@ -47,12 +21,12 @@ const mirrorYGlyph = (g: Glyph) => // font["ɜ"] = mirrorYGlyph(font["ɛ"]) // alert(`ʖ: ${JSON.stringify(rotateGlyph(font["ʕ"]))},`); -for (let l = 0; l < lowercase.length; l++) { - if (font[lowercase[l]] === undefined) { - console.log(`%c ${lowercase[l]}`, "font-size: 3em"); +for (let l = 0; l < letters.length; l++) { + if (font[letters[l]] === undefined) { + console.log(`%c ${letters[l]}`, "font-size: 3em"); break; } else { - console.log(`%c ✅${lowercase[l]}`, "font-size: 2.5em"); + console.log(`%c ✅${letters[l]}`, "font-size: 2.5em"); } } diff --git a/demo/src/letters.ts b/demo/src/letters.ts new file mode 100644 index 0000000..e140487 --- /dev/null +++ b/demo/src/letters.ts @@ -0,0 +1,56 @@ +export default [ + // lowercase + ..."aáàăắằẵẳâấầẫẩǎåǻäǟãȧǡąāảȁȃạặậḁæǽǣẚɐɑɒ", + ..."bḃḅḇʙƀɓƃ", + ..."cćĉčċçḉȼƈɕ", + ..."dďḋḑđḍḓḏðȸdzʣdžʥʤɖɗƌȡẟ", + ..."eéèĕêếềễểěëẽėȩḝęēḗḕẻȅȇẹệḙḛɇǝəɛɘɚɜɝɞʚɤ", + ..."fḟʩƒ", + ..."gǵğĝǧġģḡɡɢǥɠʛɣ", + ..."ƣhĥȟḧḣḩħḥḫẖʜƕɦɧ", + ..."iíìĭîǐïḯĩįīỉȉȋịḭijıɪɨɩ", + ..."jĵǰȷɉʝɟʄ", + ..."kḱǩķḳḵƙʞ", + ..."lĺľļłḷḹḽḻŀljỻʪʫʟƚɫɬɭȴɮƛʎ", + ..."mḿṁṃɱ", + ..."nńǹňñṅņṇṋṉnjɴɲƞɳȵŋ", + ..."oóòŏôốồỗổǒöȫőõṍṏȭȯȱøǿǫǭōṓṑỏȍȏơớờỡởợọộœɶɔɵɷȣ", + ..."pṕṗƥɸqȹʠ", + ..."ɋĸ", + ..."rŕřṙŗȑȓṛṝṟʀɍɹɺɻɼɽɾɿʁ", + ..."sśṥŝšṧṡşṣṩșſẛßʂȿẜẝʃƪʅʆ", + ..."tťẗṫţṭțṱṯʨƾʦʧŧƫƭʈȶʇ", + ..."uúùŭûǔůüǘǜǚǖűũṹųūṻủȕȗưứừữửựụṳṷṵʉɥʮʯɯɰʊ", + ..."vṽṿʋỽʌ", + ..."wẃẁŵẘẅẇẉʍ", + ..."xẍẋ", + ..."yýỳŷẙÿỹẏȳỷỵʏɏƴỿȝ", + ..."zźẑžżẓẕƍƶȥʐʑɀʒǯƹƺʓþƿƨƽƅɂʕʡʢʖʗʘʬʭ", + // uppercase + ..."AÁÀĂẮẰẴẲÂẤẦẪẨǍÅǺÄǞÃȦǠĄĀẢȀȂẠẶẬḀÆǼǢȺ", + ..."BḂḄḆɃƁƂ", + ..."CĆĈČĊÇḈȻƇ", + ..."DĎḊḐĐḌḒḎÐDZƉƊƋ", + ..."EÉÈĔÊẾỀỄỂĚËẼĖȨḜĘĒḖḔẺȄȆẸỆḘḚɆƎƏƐ", + ..."FḞƑ", + ..."GǴĞĜǦĠĢḠǤƓƔƢ", + ..."HĤȞḦḢḨĦḤḪǶ", + ..."IÍÌĬÎǏÏḮĨİĮĪỈȈȊỊḬIJƗƖ", + ..."JĴɈ", + ..."KḰǨĶḲḴƘ", + ..."LĹĽĻŁḶḸḼḺĿLJỺȽ", + ..."MḾṀṂ", + ..."NŃǸŇÑṄŅṆṊṈNJƝȠŊ", + ..."OÓÒŎÔỐỒỖỔǑÖȪŐÕṌṎȬȮȰØǾǪǬŌṒṐỎȌȎƠỚỜỠỞỢỌỘŒƆƟȢ", + ..."PṔṖƤ", + ..."QɊ", + ..."RŔŘṘŖȐȒṚṜṞƦɌ", + ..."SŚṤŜŠṦṠŞṢṨȘẞƩ", + ..."TŤṪŢṬȚṰṮŦȾƬƮ", + ..."UÚÙŬÛǓŮÜǗǛǙǕŰŨṸŲŪṺỦȔȖƯỨỪỮỬỰỤṲṶṴɄƜƱ", + ..."VṼṾƲỼɅ", + ..."WẂẀŴẄẆẈ", + ..."XẌẊ", + ..."YÝỲŶŸỸẎȲỶỴɎƳỾ", + ..."ȜZŹẐŽŻẒẔƵȤⱿƷǮƸÞǷƧƼƄɁ", +]; diff --git a/src/glyphs/diacritics.ts b/src/glyphs/diacritics.ts index 08a6e84..efc01ce 100644 --- a/src/glyphs/diacritics.ts +++ b/src/glyphs/diacritics.ts @@ -136,6 +136,17 @@ const diacritics = { [0.45, 0.15], ], ], + // angstorm or circle or ring (bottom) + gsb: [ + [ + [0.45, 0.9], + [0.45, 0.85], + [0.55, 0.85], + [0.55, 0.9], + [0.45, 0.9], + ], + ], + // cedilla cd: [ [ @@ -235,7 +246,7 @@ const diacritics = { // barred (kind of /) brd: [ [ - [0.55, 0.2], + [0.65, 0.1], [0.35, 0.8], ], ], diff --git a/src/glyphs/lowercase/index.ts b/src/glyphs/lowercase/index.ts index c8a9cd4..452e5fe 100644 --- a/src/glyphs/lowercase/index.ts +++ b/src/glyphs/lowercase/index.ts @@ -1,127 +1,20 @@ -import { Font, Glyph, DiaGroup, Line, Vec } from "../../type"; -import diacritics from "../diacritics"; +import { Font, Glyph, DiaGroup } from "../../type"; import { base } from "./base"; import { diaBaseAssociation } from "./diaBaseAssociation"; - -// A list of top keys diactricts -// Use to detect and move diacritics -const topDia = [ - "gr", - "ct", - "cr", - "dr", - "tl", - "br", - "bri", - "hcr", - "mc", - "gs", - "da", - "ha", - "hc" -] as Array; - -const topDiaCount = (diaKey: keyof Font): number => - topDia.includes(diaKey) ? 1 : 0; - -const moveDia = { - tp: (g: Glyph) => g.map((l: Line) => l.map((p: Vec) => [p[0], p[1] - 0.125])), - bt: (g: Glyph) => g.map((l: Line) => l.map((p: Vec) => [p[0], p[1] + 0.1])), - lf: (g: Glyph) => g.map((l: Line) => l.map((p: Vec) => [p[0] - 0.125, p[1]])), - rg: (g: Glyph) => g.map((l: Line) => l.map((p: Vec) => [p[0] + 0.125, p[1]])), -}; - -const joinVector = (diaStack: Glyph[], movedDia: Glyph): Glyph => - diaStack.reduce( - (out: Glyph, curr: Glyph) => [...out, ...curr], - [...movedDia], - ); - -const mergeDia = (diaKeys: DiaGroup): Glyph => { - // check if theres is two diacritics and - // both are situated on top of letter - const multipleTopDia = diaKeys.reduce( - (acc: number, dia: keyof Font) => (acc += topDiaCount(dia)), - 0, - ); - if (diaKeys.length > 1 && multipleTopDia > 1) { - // check double grave - if ( - diaKeys.reduce((ct: number, k: keyof Font)=> ct += k === 'gr' ? 1 : 0, 0) > 1) { - return joinVector( - diaKeys.filter((k) => k != "gr").map((k) => diacritics[k]), - [...moveDia.lf(diacritics['gr']), ...moveDia.rg(diacritics['gr'])] - ) - } - // check double acute - if ( - diaKeys.reduce((ct: number, k: keyof Font)=> ct += k === 'ct' ? 1 : 0, 0) > 1) { - return joinVector( - diaKeys.filter((k) => k != "ct").map((k) => diacritics[k]), - [...moveDia.lf(diacritics['ct']), ...moveDia.rg(diacritics['ct'])] - ) - } - // move tild down - if (diaKeys.includes("tl")) { - return joinVector( - diaKeys.filter((k) => k != "tl").map((k) => diacritics[k]), - moveDia.bt(diacritics["tl"]), - ); - } - // move hacek down - else if (diaKeys.includes("hc")) { - return joinVector( - diaKeys.filter((k) => k != "hc").map((k) => diacritics[k]), - moveDia.bt(diacritics["hc"]), - ); - }   - // move macron down - else if (diaKeys.includes("mc")) { - return joinVector( - diaKeys.filter((k) => k != "mc").map((k) => diacritics[k]), - moveDia.bt(diacritics["mc"]), - ); - } - // move acute accent left - else if (diaKeys.includes("ct")) { - return joinVector( - diaKeys.filter((k) => k != "ct").map((k) => diacritics[k]), - moveDia.bt(diacritics["ct"]), - ); - } - // move grave accent right - else if (diaKeys.includes("gr")) { - return joinVector( - diaKeys.filter((k) => k != "gr").map((k) => diacritics[k]), - moveDia.bt(diacritics["gr"]), - ); - } - else { - return diaKeys.reduce( - (acc: Glyph, k: keyof Font) => [...acc, ...diacritics[k]], - [] as Glyph, - ); - } - } else { - return diaKeys.reduce( - (acc: Glyph, k: keyof Font) => [...acc, ...diacritics[k]], - [] as Glyph, - ); - } -}; +import { mergeDia } from "../mergeDia"; // Clone exisiting glyph and add diacritical marks -const accented = {} as Font; +const diacriticized = {} as Font; Object.keys(diaBaseAssociation).map((char) => { - accented[char as keyof typeof accented] = [ + diacriticized[char as keyof typeof diacriticized] = [ ...base[diaBaseAssociation[char][0] as keyof Font], ...mergeDia(diaBaseAssociation[char][1] as DiaGroup), ] as Glyph; }); -// Merge all glyphs and add some ligature +// Merge all glyphs (with and without diacritical marks) const lowercase = { ...base, - ...accented, + ...diacriticized, }; export default lowercase; diff --git a/src/glyphs/mergeDia.ts b/src/glyphs/mergeDia.ts new file mode 100644 index 0000000..d85eeca --- /dev/null +++ b/src/glyphs/mergeDia.ts @@ -0,0 +1,112 @@ +import { Font, Glyph, DiaGroup, Line, Vec } from "../type"; +import diacritics from "./diacritics"; + + +// A list of top keys diactricts +// Use to detect and move diacritics +const topDia = [ + "gr", + "ct", + "cr", + "dr", + "tl", + "br", + "bri", + "hcr", + "mc", + "gs", + "da", + "ha", + "hc" +] as Array; + +const topDiaCount = (diaKey: keyof Font): number => + topDia.includes(diaKey) ? 1 : 0; + +const moveDia = { + tp: (g: Glyph) => g.map((l: Line) => l.map((p: Vec) => [p[0], p[1] - 0.125])), + bt: (g: Glyph) => g.map((l: Line) => l.map((p: Vec) => [p[0], p[1] + 0.1])), + lf: (g: Glyph) => g.map((l: Line) => l.map((p: Vec) => [p[0] - 0.125, p[1]])), + rg: (g: Glyph) => g.map((l: Line) => l.map((p: Vec) => [p[0] + 0.125, p[1]])), +}; + +const joinVector = (diaStack: Glyph[], movedDia: Glyph): Glyph => + diaStack.reduce( + (out: Glyph, curr: Glyph) => [...out, ...curr], + [...movedDia], + ); + +const mergeDia = (diaKeys: DiaGroup): Glyph => { + // check if theres is two diacritics and + // both are situated on top of letter + const multipleTopDia = diaKeys.reduce( + (acc: number, dia: keyof Font) => (acc += topDiaCount(dia)), + 0, + ); + if (diaKeys.length > 1 && multipleTopDia > 1) { + // check double grave + if ( + diaKeys.reduce((ct: number, k: keyof Font)=> ct += k === 'gr' ? 1 : 0, 0) > 1) { + return joinVector( + diaKeys.filter((k) => k != "gr").map((k) => diacritics[k]), + [...moveDia.lf(diacritics['gr']), ...moveDia.rg(diacritics['gr'])] + ) + } + // check double acute + if ( + diaKeys.reduce((ct: number, k: keyof Font)=> ct += k === 'ct' ? 1 : 0, 0) > 1) { + return joinVector( + diaKeys.filter((k) => k != "ct").map((k) => diacritics[k]), + [...moveDia.lf(diacritics['ct']), ...moveDia.rg(diacritics['ct'])] + ) + } + // move tild down + if (diaKeys.includes("tl")) { + return joinVector( + diaKeys.filter((k) => k != "tl").map((k) => diacritics[k]), + moveDia.bt(diacritics["tl"]), + ); + } + // move hacek down + else if (diaKeys.includes("hc")) { + return joinVector( + diaKeys.filter((k) => k != "hc").map((k) => diacritics[k]), + moveDia.bt(diacritics["hc"]), + ); + }   + // move macron down + else if (diaKeys.includes("mc")) { + return joinVector( + diaKeys.filter((k) => k != "mc").map((k) => diacritics[k]), + moveDia.bt(diacritics["mc"]), + ); + } + // move acute accent left + else if (diaKeys.includes("ct")) { + return joinVector( + diaKeys.filter((k) => k != "ct").map((k) => diacritics[k]), + moveDia.bt(diacritics["ct"]), + ); + } + // move grave accent right + else if (diaKeys.includes("gr")) { + return joinVector( + diaKeys.filter((k) => k != "gr").map((k) => diacritics[k]), + moveDia.bt(diacritics["gr"]), + ); + } + else { + return diaKeys.reduce( + (acc: Glyph, k: keyof Font) => [...acc, ...diacritics[k]], + [] as Glyph, + ); + } + } else { + return diaKeys.reduce( + (acc: Glyph, k: keyof Font) => [...acc, ...diacritics[k]], + [] as Glyph, + ); + } +}; + +export { mergeDia } diff --git a/src/glyphs/uppercase.ts b/src/glyphs/uppercase/base.ts similarity index 64% rename from src/glyphs/uppercase.ts rename to src/glyphs/uppercase/base.ts index 54c26a2..e5f097d 100644 --- a/src/glyphs/uppercase.ts +++ b/src/glyphs/uppercase/base.ts @@ -1,4 +1,6 @@ -const uppercase = { +import { type Font } from '../../type'; + +const base = { A: [ [ [0.85, 0.7], @@ -11,6 +13,24 @@ const uppercase = { [0.85, 0.5], ], ], + Æ: [ + [ + [0.5, 0.7], + [0.5, 0.2], + [0.15, 0.2], + [0.15, 0.7], + ], + [ + [0.15, 0.5], + [0.6, 0.5], + ], + [ + [0.85, 0.2], + [0.5, 0.2], + [0.5, 0.7], + [0.85, 0.7], + ], + ], B: [ [ [0.6, 0.5], @@ -22,6 +42,49 @@ const uppercase = { [0.15, 0.5], ], ], + Ƀ: [ + [ + [0.6, 0.5], + [0.6, 0.2], + [0.25, 0.2], + [0.25, 0.7], + [0.85, 0.7], + [0.85, 0.5], + [0.25, 0.5], + ], + [ + [0.15, 0.6], + [0.35, 0.6] + ] + ], + Ɓ: [ + [ + [0.6, 0.5], + [0.6, 0.2], + [0.25, 0.2], + [0.25, 0.7], + [0.85, 0.7], + [0.85, 0.5], + [0.25, 0.5], + ], + [ + [0.3, 0.2], + [0.15, 0.2], + [0.15, 0.3] + ] + ], + Ƃ: [ + [ + [0.6, 0.2], + [0.25, 0.2], + [0.25, 0.7], + [0.85, 0.7], + [0.85, 0.5], + [0.25, 0.5], + ], + ], + + C: [ [ [0.85, 0.2], @@ -30,6 +93,18 @@ const uppercase = { [0.85, 0.7], ], ], + Ƈ: [ + [ + [0.85, 0.1], + [0.8, 0.11], + [0.75, 0.15], + [0.75, 0.2], + [0.25, 0.2], + [0.25, 0.7], + [0.75, 0.7], + ], + ], + D: [ [ [0.15, 0.2], @@ -42,6 +117,71 @@ const uppercase = { [0.3, 0.7], ], ], + Đ: [ + [ + [0.25, 0.2], + [0.85, 0.2], + [0.85, 0.7], + [0.25, 0.7], + ], + [ + [0.3, 0.2], + [0.3, 0.7], + ], + [ + [0.2, 0.45], + [0.4, 0.45] + ] + + ], + DZ: [ + [ + [0.15, 0.2], + [0.45, 0.2], + [0.45, 0.7], + [0.15, 0.7], + ], + [ + [0.2, 0.2], + [0.2, 0.7], + ], + [ + [0.55, 0.2], + [0.85, 0.2], + [0.55, 0.7], + [0.85, 0.7], + ], + + ], + Ɗ: [ + [ + [0.15, 0.3], + [0.15, 0.2], + [0.85, 0.2], + [0.85, 0.7], + [0.25, 0.7], + ], + [ + [0.3, 0.2], + [0.3, 0.7], + ], + ], + Ƌ: [ + [ + [0.15, 0.1], + [0.85, 0.1], + [0.85, 0.725], + ], + [ + [0.85, 0.7], + [0.15, 0.7], + [0.15, 0.3], + [0.85, 0.3], + ], + ], + + + E: [ [ [0.85, 0.2], @@ -267,6 +407,7 @@ const uppercase = { [0.85, 0.7], ], ], -}; +} as Font; + -export default uppercase; +export { base }; diff --git a/src/glyphs/uppercase/diaBaseAssociation.ts b/src/glyphs/uppercase/diaBaseAssociation.ts new file mode 100644 index 0000000..7bfd56b --- /dev/null +++ b/src/glyphs/uppercase/diaBaseAssociation.ts @@ -0,0 +1,66 @@ +import { type ExtendedTable } from "../../type"; + +// Associate diacritics with existing glyph +const diaBaseAssociation = { + // a + Á: ["A", ["ct"]], + À: ["A", ["gr"]], + Ă: ["A", ["br"]], + Ắ: ["A", ["br"]], + Ằ: ["A", ["br"]], + Ẵ: ["A", ["br"]], + Ẳ: ["A", ["br"]], + Â: ["A", ["cr"]], + Ấ: ["A", ["cr"]], + Ầ: ["A", ["cr"]], + Ẫ: ["A", ["cr"]], + Ẩ: ["A", ["cr"]], + Ǎ: ["A", ["hc"]], + Å: ["A", ["gs"]], + Ǻ: ["A", ["gs"]], + Ä: ["A", ["dr"]], + Ǟ: ["A", ["dr"]], + Ã: ["A", ["tl"]], + Ȧ: ["A", ["da"]], + Ǡ: ["A", ["da"]], + Ą: ["A", ["gnk"]], + Ā: ["A", ["mc"]], + Ả: ["A", ["ha"]], + Ȁ: ["A", ["gr", "gr"]], + Ȃ: ["A", ["bri"]], + Ạ: ["A", ["db"]], + Ặ: ["A", ["bri", "db"]], + Ậ: ["A", ["cr", "db"]], + Ḁ: ["A", ["gsb"]], + Ǽ: ["Æ", ["ct"]], + Ǣ: ["Æ", ["mc"]], + Ⱥ: ["A", ["brd"]], + + // B + Ḃ: ["B", ["da"]], + Ḅ: ["B", ["db"]], + Ḇ: ["B", ["lb"]], + + // C + Ć: ["C", ["ct"]], + Ĉ: ["C", ["cr"]], + Č: ["C", ["hc"]], + Ċ: ["C", ["da"]], + Ç: ["C", ["cd"]], + Ḉ: ["C", ["cd", "ct"]], + Ȼ: ["C", ["brd"]], + + // D + Ď: ["D", ["hc"]], + Ḋ: ["D", ["da"]], + Ḑ: ["D", ["cd"]], + Ḍ: ["D", ["db"]], + Ḓ: ["D", ["crb"]], + Ḏ: ["D", ["lb"]], + Ð: ["Đ", []], + Ɖ: ["Đ", []], + + +} as ExtendedTable; + +export { diaBaseAssociation }; diff --git a/src/glyphs/uppercase/index.ts b/src/glyphs/uppercase/index.ts new file mode 100644 index 0000000..452e5fe --- /dev/null +++ b/src/glyphs/uppercase/index.ts @@ -0,0 +1,20 @@ +import { Font, Glyph, DiaGroup } from "../../type"; +import { base } from "./base"; +import { diaBaseAssociation } from "./diaBaseAssociation"; +import { mergeDia } from "../mergeDia"; + +// Clone exisiting glyph and add diacritical marks +const diacriticized = {} as Font; +Object.keys(diaBaseAssociation).map((char) => { + diacriticized[char as keyof typeof diacriticized] = [ + ...base[diaBaseAssociation[char][0] as keyof Font], + ...mergeDia(diaBaseAssociation[char][1] as DiaGroup), + ] as Glyph; +}); + +// Merge all glyphs (with and without diacritical marks) +const lowercase = { + ...base, + ...diacriticized, +}; +export default lowercase; diff --git a/src/index.ts b/src/index.ts index 408df91..91ed003 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,6 @@ import { type Vec, Line, Glyph, Font } from "./type"; import lowercase from "./glyphs/lowercase/index"; -import uppercase from "./glyphs/uppercase"; +import uppercase from "./glyphs/uppercase/index"; import ponctuation from "./glyphs/poncuation"; import number from './glyphs/number';