diff --git a/CHANGELOG.md b/CHANGELOG.md index e92eab04..889e3659 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,7 +24,7 @@ 아래에 반사를 그린다(크기: 그림 높이의 0 초과 1 이하, 거리, 시작·끝 투명도 0~1, 흐림). 부드러운 가장자리는 자리를 차지하지 않고, 반사는 대략 크기만큼의 그림 높이와 거리만큼 아래로 자리를 차지한다. - FormFit과 쪽 수 추정이 한컴 글꼴 8종의 글자 폭을 안다: HCI Poppy·HCI Hollyhock·한양중고딕·한양신명조·한양견고딕· - 휴먼옛체(한/글이 배치하는 폭)와 HY견명조·HY동녘M(글꼴의 설계 폭, 글꼴에 없는 글자와 `` ` ``는 함초롬바탕의 폭). + 휴먼옛체(한/글이 배치하는 폭)와 HY견명조·HY동녘M(글꼴의 설계 폭, 글꼴에 없는 글자는 함초롬바탕의 폭). 전에는 한글 아닌 글자에 글자 종류의 평균 폭을 썼다. 한글 음절은 모두 한 em이다. 이 글꼴로 쓴 칸의 채우기 결과와, 줄 배치 정보가 없는 문서의 쪽 수가 달라질 수 있다. - FormFit과 쪽 수 추정이 KoPub 글꼴 12종도 글꼴의 설계 폭으로 잰다: KoPub돋움체·KoPub바탕체·KoPubWorld돋움체· @@ -77,6 +77,18 @@ - `doc.tables`를 번호로 꺼낼 수 있다: `doc.tables[0]`, `doc.tables[-1]`, `doc.tables[1:3]`(문서 순서, `doc.tables.all[...]`와 같다). 범위 밖이면 `IndexError`. +### 바꿈 + +- FormFit과 쪽 수 추정의 글자 폭을 한컴오피스 2024의 한/글에 맞췄다. 칸 채우기 결과와 줄 배치 정보가 없는 문서의 쪽 수가 + 달라질 수 있다. + - `!`는 어느 글꼴에서든 반 em이다(공백처럼, 다만 장평·자간은 다른 글자처럼 받는다). + - 함초롬돋움의 간격 수정 문자·일반 문장 부호(따옴표 빼고)·통화 기호는 함초롬바탕의 폭이다(…·※·‰·—·–·₩ 등). + 함초롬돋움으로 대신 그리는 글꼴(한컴산뜻돋움·한컴 고딕 등)의 이 글자들도 그렇다. + - HY헤드라인M은 한컴오피스 2024에 든 글꼴 판의 설계 폭을 쓴다(라틴 글자 폭이 옛 판과 다르다). + - 휴먼명조·휴먼고딕은 한/글이 배치하는 폭이다(1024 단위, 10·40·80pt에서 잰 값: 괄호는 320 단위라 15pt에서 468). HY헤드라인M과 이 둘의 그리스·키릴 문자와 글꼴에 없는 + 글자도 한/글이 배치하는 폭이다. + - HY견고딕·HY울릉도M·HY견명조·HY동녘M의 `` ` ``는 0.584 em이고, HY울릉도M에 없는 글자는 함초롬바탕의 폭이다. + ### 고침 - `.hwp`를 열 때 그림의 투명도와 반전을 한/글이 읽는 자리에서 읽는다. 한/글은 그림 레코드의 투명도를 그림 원래 크기 diff --git a/src/hwpx/form_fit/_glyph_table.py b/src/hwpx/form_fit/_glyph_table.py index 54eba8f4..ea77fa8b 100644 --- a/src/hwpx/form_fit/_glyph_table.py +++ b/src/hwpx/form_fit/_glyph_table.py @@ -5,8 +5,11 @@ Halfwidth and Fullwidth Forms blocks (Hangul, Hanja and kana left out); for the symbol faces Wingdings and Symbol, the private-use code points U+F020-F0FF their glyphs are stored at. A face lacking a glyph lays it out at its fallback face's advance. The table is read from the font files, not written by hand, but for a few glyphs Hancom lays out -at an advance of its own (я in 한컴 고딕 and HY헤드라인M, for one), which they carry instead. Each text face's -ascent and descent are here too, for the line height of a paragraph that takes it from the font. +at an advance of its own (я in 한컴 고딕, for one), which they carry instead: 함초롬돋움's spacing modifier letters, +general punctuation but the quotation marks and currency symbols take 함초롬바탕's, and 휴먼명조, 휴먼고딕 and +HY헤드라인M carry the advances Hancom Office 2024 lays their glyphs out at where they differ from the font's (the +Greek and Cyrillic letters, and the glyphs they lack). Each text face's ascent and descent are here too, for the +line height of a paragraph that takes it from the font. """ from __future__ import annotations @@ -40,7 +43,7 @@ "KoPubWorld바탕체 Bold": 1000, "한컴 말랑말랑 Bold": 1000, "한컴산뜻돋움": 1000, - "휴먼고딕": 512, + "휴먼고딕": 1024, "한컴돋움": 1024, "HY울릉도M": 1024, "HY울릉도B": 1024, @@ -64,7 +67,7 @@ "새굴림": 1024, "한컴 말랑말랑 Regular": 1000, "MD개성체": 1024, - "휴먼명조": 512, + "휴먼명조": 1024, "HY헤드라인M": 1024, "Wingdings": 2048, "Symbol": 2048, @@ -102,6 +105,7 @@ "한컴 말랑말랑 Regular": "함초롬바탕", "HY견명조": "함초롬바탕", "HY동녘M": "함초롬바탕", + "HY울릉도M": "함초롬바탕", } #: Each text face's ascent and descent (OS/2 usWinAscent, usWinDescent) in its units per em: a paragraph @@ -120,7 +124,7 @@ "함초롬돋움": (1070, 230), "맑은 고딕": (2229, 495), "한컴산뜻돋움": (1000, 300), - "휴먼고딕": (440, 100), + "휴먼고딕": (880, 200), "한컴돋움": (879, 145), "HY울릉도M": (879, 145), "HY울릉도B": (879, 145), @@ -145,7 +149,7 @@ "한컴 말랑말랑 Regular": (1040, 250), "한컴 말랑말랑 Bold": (1040, 250), "MD개성체": (879, 145), - "휴먼명조": (440, 100), + "휴먼명조": (880, 200), "HY헤드라인M": (879, 145), "HY견명조": (879, 145), "HY동녘M": (879, 145), @@ -1042,70 +1046,70 @@ }, "함초롬돋움": { 0: "\u302a\u302b", - 134: "˙", - 203: "˛", - 207: "ː", - 226: "˚", - 237: "‐", + 157: "˙", + 168: "ː", 240: "´", + 257: "˛", 258: "ĺļ", + 264: "˚", 268: "ĵ", 271: "ìíîïĩīĭįı", 287: "Ι", - 288: "‚‛․‧", + 288: "‚‛", + 289: "․‧", 290: "⁚", - 291: "⁝⁞", - 297: "⁏", - 300: "\u00a0‑", - 304: "′‵", + 291: "⁏⁝⁞", + 300: "\u00a0", 309: "ſ", 317: "ÌÍÎÏĨĪĬĮİ", 320: "²³¹⁴ⁿ₁₂₃₄", 330: "ι", 333: "¡", 334: "ł", - 338: "˘", - 343: "⁅⁆", - 348: "‾", + 335: "‖′‵", 349: "ţŧ", - 359: "⁄", 361: "ľ", - 368: "‖", - 373: "¸ˇ", + 369: "‣", + 373: "¸", + 377: "˘", 378: "ªť", 382: "ŀ", 385: "º", - 398: "‒", - 408: "˝", - 419: "‗", + 386: "ˇ", + 396: "‹›", + 399: "•", 427: "ŕŗř", - 436: "⁑", - 447: "τ", - 448: "‡‹›", + 435: "˝", + 438: "‡", + 447: "τ‼", 451: "„", + 456: "⁃", 464: "¦", 466: "ýÿŷ", + 472: "⁅⁆", + 474: "″‶", 478: "\u00ad¯", 479: "źżž", + 480: "‽", 485: ( "〿。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロ" "ワン゙゚ᄀᄁᆪᄂᆬᆭᄃᄄᄅᆰᆱᆲᆳᆴᆵᄚᄆᄇᄈᄡᄉᄊᄋᄌᄍᄎᄏᄐᄑ하ᅢᅣᅤᅥᅦᅧᅨᅩᅪᅫᅬᅭᅮᅯᅰᅱᅲᅳᅴᅵ│←↑→↓" "■○" ), - 486: "§", - 488: "‟″‶", + 486: "§⁎⁑", + 488: "‟", 489: "ij", - 494: "‸", 500: "ð【】〔〕〖〗〘〙〚〛", - 502: "‼", - 507: "₰", + 511: "₫", 513: "çćĉċčśŝşš", 514: "¢¨", 515: "Ĵ", - 517: "⁁", - 518: "её†", + 517: "₰", + 518: "её", 524: "δ", - 531: "¬", + 525: "‸", + 528: "‐‑", + 531: "¬⁊", 533: "ζξ", 534: "Þсэ", 535: "«", @@ -1115,82 +1119,78 @@ 540: "х", 541: "þу", 542: "μ", - 543: "¶⁋", - 544: "‥‷", - 546: "₮", - 549: "ь⁊", - 550: "‴", - 551: "⁎", + 543: "¶", + 549: "ь", 552: "ρ", - 555: "¥µε", - 556: "£‽", - 558: "⁕", + 555: "¥µε⁒", + 556: "£", + 558: "†⁕", 559: "ķĸ", 560: "а", 563: "àáâãäåāăąĝğġģ", 566: "κ", 567: "èéêëēĕėęě", - 570: "¤¿οо", + 570: "¤¿οо₤", 571: "б", 572: "Ŧгт", - 573: "ŢŤγ⁌⁍", - 576: "Ρ₤", + 573: "ŢŤγ⁗", + 576: "Ρ", + 579: "‗", 581: "ÝŶŸ", 582: "òóôõöøōŏő", 583: "ß", 584: "ĹĻĽĿŁŹŻŽ", - 586: "•", 587: "Β", - 590: "η‣", + 590: "η", 591: "υ", 592: "В", 593: "θ", - 594: "ĥħ", - 595: "ñùúûüńņňŋũūŭůűų", - 598: "к₫", + 594: "ĥħ‾", + 595: "ñùúûüńņňŋũūŭůűų₦", + 598: "к", 599: "в", 600: "φ", + 601: "₠₪", 602: "З", - 603: "⁙₡₢₵", + 603: "⁙", 604: "đ", - 606: "Р", - 607: "₴", - 608: "Ζря", + 606: "Р₲", + 608: "Ζря‴‷₵", 609: "ΕЁБЕ", - 610: "⁒", 612: "Γ", + 613: "₴", 617: "ŚŜŞŠχий", 622: "Г", - 624: "⁘", - 625: "ÈÉÊËĒĔĖĘĚ⁗", - 626: "€", - 630: "ч₣", - 631: "₳", + 624: "⁈⁘", + 625: "ÈÉÊËĒĔĖĘĚ‒", + 630: "ч", + 632: "₣", 633: "ÇĆĈĊČ", - 634: "ц", + 634: "ц⁉", + 635: "⁄", + 637: "₱", + 640: "‥", 642: "ΚЯ", 645: "ĜĞĠĢ", - 646: "ΤТ", - 647: "₪", + 646: "ΤТ⁋⁌⁍", 649: "Ь", - 650: "₲", - 654: "ÀÁÂÃÄÅĀĂĄ", + 650: "₭", + 654: "ÀÁÂÃÄÅĀĂĄ₮", 655: "н", + 656: "€", 657: "σ", 658: "С", 660: "α", 661: "ΞЭ", 662: "ď", - 663: "₭", 664: "Ķ", - 665: "лп₠", - 666: "ψ", - 672: "К―", + 665: "лп₥", + 666: "ψ⁁₡₢", + 672: "К", 676: "ÒÓÔÕÖØŌŎŐ", - 681: "⁃", 683: "ŔŖŘ", 684: "⁛", - 688: "⁈⁓", + 688: "⁓", 693: "ʼn", 694: "ĤĦ", 695: "Δм", @@ -1203,69 +1203,68 @@ 704: "ΑА", 707: "λ", 709: "ъ", - 710: "д₱", - 712: "⁉", + 710: "д", 714: "πω", 716: "ΗΝН", 719: "ИЙ", 721: "Ω", 728: "ÑŃŅŇŊ", - 734: "ПЦ₥", + 734: "ПЦ", 735: "ΛЛ", - 740: "₩", 744: "Д", 746: "Ψ", 747: "ΦФ", 750: "У", 755: "Σ", 760: "ŵ", - 764: "⁂", - 769: "⁜", - 770: "⁔", - 780: "₦", + 769: "⁜₳", + 770: "‿⁀⁔", 781: "ж", 782: "IJ", 789: "Ъ", + 794: "₩", 795: "ю", + 799: "⁐", 806: "ы", + 810: "₨", 821: "ΜМ", 825: "шщ", 847: "æ", 858: "©®", 865: "ШЩ", 874: "Ы", + 875: "―", + 878: "⁇", 897: "Ŵ", 898: "ф", + 909: "⁂", 929: "Ж", - 930: "⁇₯", - 931: "₨", 934: "Œ", - 937: "₧", - 941: "‿⁀⁐", 948: "Ю", 950: "œ", 956: "‱", + 957: "₧", 967: "Æ", 970: ( - "¼½¾\u205f℉ℓ№℡™ΩÅ⅓⅔⅛⅜⅝⅞↔↕↖↗↘↙⇒⇔∀∁∂∃∄∅∆∇∈∉∊∋∌∍∎∏∐∑−∓∔∕∖∗∘∙√∛∜∝∞∟∠∡∢" - "∣∤∥∦∧∨∩∪∫∬∭∮∯∰∱∲∳∴∵∶∷∸∹∺∻∼∽∾∿≀≁≂≃≄≅≆≇≈≉≊≋≌≍≎≏≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞" - "≟≠≡≢≣≤≥≦≧≨≩≪≫≬≭≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿⊀⊁⊂⊃⊄⊅⊆⊇⊈⊉⊊⊋⊌⊍⊎⊏⊐⊑⊒⊓⊔⊕⊖⊗⊘⊙⊚" - "⊛⊜⊝⊞⊟⊠⊡⊢⊣⊤⊥⊦⊧⊨⊩⊪⊫⊬⊭⊮⊯⊰⊱⊲⊳⊴⊵⊶⊷⊸⊹⊺⊻⊼⊽⊾⊿⋀⋁⋂⋃⋄⋅⋆⋇⋈⋉⋊⋋⋌⋍⋎⋏⋐⋑⋒⋓⋔⋕⋖" - "⋗⋘⋙⋚⋛⋜⋝⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋮⋯⋰⋱⋲⋳⋴⋵⋶⋷⋸⋹⋺⋻⋼⋽⋾⋿⌒⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭" - "⒮⒯⒰⒱⒲⒳⒴⒵ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ─━│┃┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡" - "┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋▒▢▣▤▥▦▧▨▩▪▫▬▭▮▯▰▱▴" - "▵▶▷▸▹►▻▼▽▾▿◀◁◂◃◄◅◈◉◊◌◍◎◐◑◒◓◔◕◖◗◘◙◚◛◜◝◞◟◠◡◢◣◤◥◦◧◨◩◪◫◬◭◮◯◰◱◲◳◴" - "◵◶◷◸◹◺◻◼◽◾◿☀☁☂☃☄☇☈☉☊☋☌☍☎☏☐☑☒☓☔☕☖☗☘☙☚☛☝☟☠☡☢☣☤☥☦☧☨☩☪☫☬☭☮☯☰☱☲☳☴" - "☵☶☷☸☹☺☻☼☽☾☿♀♁♂♃♄♅♆♇♈♉♊♋♌♍♎♏♐♑♒♓♔♕♖♗♘♙♚♛♜♝♞♟♠♡♢♣♤♥♦♧♨♩♪♫♬♭♮♯♰" - "♱♲♳♴♵♶♷♸♹♺♻♼♽♾♿⚀⚁⚂⚃⚄⚅⚆⚇⚈⚉⚊⚋⚌⚍⚎⚏⚐⚑⚒⚓⚔⚕⚖⚗⚘⚙⚚⚛⚜⚠⚡⚢⚣⚤⚥⚦⚧⚨⚩⚪⚫⚬⚭⚮⚯" - "⚰⚱⚲✁✂✃✄✆✇✈✉✌✍✎✏✐✑✒✓✔✕✖✗✘✙✚✛✜✝✞✟✠✡✢✣✤✥✦✧✩✪✫✬✭✮✯✰✱✲✳✴✵✶✷✸✹✺✻✼✽" - "✾✿❀❁❂❃❄❅❆❇❈❉❊❋❍❏❐❑❒❖❘❙❚❛❜❝❞❡❢❣❤❥❦❧❨❩❪❫❬❭❮❯❰❱❲❳❴❵❶❷❸❹❺❻❼❽❾❿➀➁" - "➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓➔➘➙➚➛➜➝➞➟➠➡➢➣➤➥➦➧➨➩➪➫➬➭➮➯➱➲➳➴➵➶➷➸➹➺➻➼➽➾\u3000、。" - "〃〄々〆〇〒〓〜〝〞〟〠〡〢〣〤〥〦〧〨〩〰〱〲〳〴〵〶〷〸〹〺〻〼〽〾㈀㈁㈂㈃㈄㈅㈆㈇㈈㈉㈊㈋㈌㈍㈎㈏㈐㈑㈒㈓㈔㈕㈖㈗" - "㈘㈙㈚㈛㈜㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻㉿㎀㎁㎂㎃㎄㎈㎉㎊㎋㎌㎍㎎㎏㎐㎑㎒㎓㎔㎕㎖㎗㎘㎙㎚㎛㎜" - "㎝㎞㎟㎠㎡㎢㎣㎤㎥㎦㎧㎨㎩㎪㎫㎬㎭㎮㎯㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎺㎻㎼㎽㎾㎿㏀㏁㏂㏃㏄㏅㏆㏇㏈㏉㏊㏏㏐㏓㏖㏘㏛㏜㏝!"#$%&" - "'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ab" - "cdefghijklmnopqrstuvwxyz{|}~⦅⦆ᅠ¢£¬ ̄¦¥₩" + "¼½¾\u205f₯℉ℓ№℡™ΩÅ⅓⅔⅛⅜⅝⅞↔↕↖↗↘↙⇒⇔∀∁∂∃∄∅∆∇∈∉∊∋∌∍∎∏∐∑−∓∔∕∖∗∘∙√∛∜∝∞∟∠∡" + "∢∣∤∥∦∧∨∩∪∫∬∭∮∯∰∱∲∳∴∵∶∷∸∹∺∻∼∽∾∿≀≁≂≃≄≅≆≇≈≉≊≋≌≍≎≏≐≑≒≓≔≕≖≗≘≙≚≛≜≝" + "≞≟≠≡≢≣≤≥≦≧≨≩≪≫≬≭≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿⊀⊁⊂⊃⊄⊅⊆⊇⊈⊉⊊⊋⊌⊍⊎⊏⊐⊑⊒⊓⊔⊕⊖⊗⊘⊙" + "⊚⊛⊜⊝⊞⊟⊠⊡⊢⊣⊤⊥⊦⊧⊨⊩⊪⊫⊬⊭⊮⊯⊰⊱⊲⊳⊴⊵⊶⊷⊸⊹⊺⊻⊼⊽⊾⊿⋀⋁⋂⋃⋄⋅⋆⋇⋈⋉⋊⋋⋌⋍⋎⋏⋐⋑⋒⋓⋔⋕" + "⋖⋗⋘⋙⋚⋛⋜⋝⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋮⋯⋰⋱⋲⋳⋴⋵⋶⋷⋸⋹⋺⋻⋼⋽⋾⋿⌒⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬" + "⒭⒮⒯⒰⒱⒲⒳⒴⒵ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ─━│┃┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠" + "┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋▒▢▣▤▥▦▧▨▩▪▫▬▭▮▯▰▱" + "▴▵▶▷▸▹►▻▼▽▾▿◀◁◂◃◄◅◈◉◊◌◍◎◐◑◒◓◔◕◖◗◘◙◚◛◜◝◞◟◠◡◢◣◤◥◦◧◨◩◪◫◬◭◮◯◰◱◲◳" + "◴◵◶◷◸◹◺◻◼◽◾◿☀☁☂☃☄☇☈☉☊☋☌☍☎☏☐☑☒☓☔☕☖☗☘☙☚☛☝☟☠☡☢☣☤☥☦☧☨☩☪☫☬☭☮☯☰☱☲☳" + "☴☵☶☷☸☹☺☻☼☽☾☿♀♁♂♃♄♅♆♇♈♉♊♋♌♍♎♏♐♑♒♓♔♕♖♗♘♙♚♛♜♝♞♟♠♡♢♣♤♥♦♧♨♩♪♫♬♭♮♯" + "♰♱♲♳♴♵♶♷♸♹♺♻♼♽♾♿⚀⚁⚂⚃⚄⚅⚆⚇⚈⚉⚊⚋⚌⚍⚎⚏⚐⚑⚒⚓⚔⚕⚖⚗⚘⚙⚚⚛⚜⚠⚡⚢⚣⚤⚥⚦⚧⚨⚩⚪⚫⚬⚭⚮" + "⚯⚰⚱⚲✁✂✃✄✆✇✈✉✌✍✎✏✐✑✒✓✔✕✖✗✘✙✚✛✜✝✞✟✠✡✢✣✤✥✦✧✩✪✫✬✭✮✯✰✱✲✳✴✵✶✷✸✹✺✻✼" + "✽✾✿❀❁❂❃❄❅❆❇❈❉❊❋❍❏❐❑❒❖❘❙❚❛❜❝❞❡❢❣❤❥❦❧❨❩❪❫❬❭❮❯❰❱❲❳❴❵❶❷❸❹❺❻❼❽❾❿➀" + "➁➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓➔➘➙➚➛➜➝➞➟➠➡➢➣➤➥➦➧➨➩➪➫➬➭➮➯➱➲➳➴➵➶➷➸➹➺➻➼➽➾\u3000、" + "。〃〄々〆〇〒〓〜〝〞〟〠〡〢〣〤〥〦〧〨〩〰〱〲〳〴〵〶〷〸〹〺〻〼〽〾㈀㈁㈂㈃㈄㈅㈆㈇㈈㈉㈊㈋㈌㈍㈎㈏㈐㈑㈒㈓㈔㈕㈖" + "㈗㈘㈙㈚㈛㈜㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻㉿㎀㎁㎂㎃㎄㎈㎉㎊㎋㎌㎍㎎㎏㎐㎑㎒㎓㎔㎕㎖㎗㎘㎙㎚㎛" + "㎜㎝㎞㎟㎠㎡㎢㎣㎤㎥㎦㎧㎨㎩㎪㎫㎬㎭㎮㎯㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎺㎻㎼㎽㎾㎿㏀㏁㏂㏃㏄㏅㏆㏇㏈㏉㏊㏏㏐㏓㏖㏘㏛㏜㏝!"#$%" + "&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a" + "bcdefghijklmnopqrstuvwxyz{|}~⦅⦆ᅠ¢£¬ ̄¦¥₩" ), 1012: "☜☞", }, @@ -1638,40 +1637,217 @@ 2134: "\uf0ab\uf0db", }, "HY헤드라인M": { + 1: "\u302a\u302b", + 228: "ι", + 256: "¦", + 276: "‚‛", + 285: "Ι", + 298: "ìíîïįĵĺļ", + 360: "ĩīĭ", + 374: "г", + 379: "„‟", + 384: "¯ÌÍÎÏĨĪĬĮİţſ", + 393: "ľ", + 406: "τ", + 426: "ŕŗř", + 448: "к", + 452: "ζ", + 457: "ε", + 459: "ξ", + 469: "Ĵт", + 470: "з", + 481: "źżž", + 496: "ť", 512: ( - "\u00a0¢£¥¦©«¬®¯µ»ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïñòóôõöù" - "úûüýÿ" + "«»àáâãäåāăąćĉċčśŝşšγκλνсух・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニ" + "ヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚ᅠ" ), - 553: "я", - 993: "✀", + 523: "э", + 532: "ç", + 534: "чь", + 538: "χ", + 544: "в", + 554: "µèéêëñòóôõöùúûüēĕėęěĝğġģĥķńņňōŏőũūŭůűų", + 555: "Гпя", + 560: "υ", + 564: "Γ", + 566: "н", + 570: "δηθοаеорё", + 572: "ий", + 583: "ρ", + 587: "бц", + 589: "β", + 590: "μ", + 592: "α", + 597: "ýÿŷК", + 598: "дл", + 619: "З", + 626: "ΖΤТ", + 632: "σ", + 633: "Σ", + 640: "ĹĻĽŚŜŞŠъ", + 651: "У", + 664: "φ", + 666: "Ξ", + 672: "БЛЬ", + 682: "ÈÉÊËÝĆĈĊČĒĔĖĘĚŔŖŘŶŸ", + 683: "ΑΒΕΚΡΥΧАВЕРХЧ", + 684: "ΔΛЁ", + 685: "ж", + 690: "Ç", + 693: "ď", + 694: "Д", + 705: "м", + 707: "π", + 725: "ÒÓÔÕÖĎĐĜĞĠĢŌŎŐ", + 730: "ψ", + 736: "ИЙПЭы", + 740: "ΗΝΠНСЯ", + 758: "Ц", + 766: "Ω", + 768: "ÀÁÂÃÄÅÑÙÚÛÜĀĂĄĤĶŃŅŇŢŤŨŪŬŮŰŲю", + 779: "Ф", + 797: "ΘΟО", + 800: "ω", + 802: "©", + 810: "ŵ", + 811: "Ъ", + 817: "Φ", + 822: "ш", + 843: "фщ", + 853: "ΜМ", + 856: "Ψ", + 907: "Ы", + 939: "Ш", + 946: "Ж", + 960: "Щ", + 981: "Ŵ", 1024: ( - "¡¤§¨ª\u00ad²³´¶¸¹º¼½¾¿ÆÐØÞßæðøþđĦħıIJijĸĿŀŁłʼnŊŋŒœŦŧˇː˘˙˚˛˝ΑΒΓΔΕΖΗΘΙ" - "ΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψωЁАБВГДЕЖЗИЙКЛМНОПРСТУ" - "ФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюё―†‡‥′″⁴ⁿ₁₂₃₄℉ℓ№℡" - "™ΩÅ⅓⅔⅛⅜⅝⅞↔↕↖↗↘↙⇒⇔∀∂∃∇∈∋∏∑√∝∞∠∥∧∨∩∪∫∬∮∴∵∼∽≒≠≡≤≥≪≫⊂⊃⊆⊇⊙⊥⌒⒜⒝⒞⒟⒠" - "⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ─━│┃┌┍┎┏┐┑┒┓└" - "┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋▒▣▤▥▦" - "▧▨▩▶▷▼▽◀◁◈◎◐◑☎☏☜☞♀♂♠♡♣♤♥♧♨♩♪♬♭\u3000、。〃【】〓〔〕㈀㈁㈂㈃㈄㈅㈆㈇㈈㈉㈊㈋㈌㈍㈎㈏㈐㈑㈒㈓㈔" - "㈕㈖㈗㈘㈙㈚㈛㈜㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻㉿㎀㎁㎂㎃㎄㎈㎉㎊㎋㎌㎍㎎㎏㎐㎑㎒㎓㎔㎕㎖㎗㎘㎙" - "㎚㎛㎜㎝㎞㎟㎠㎡㎢㎣㎤㎥㎦㎧㎨㎩㎪㎫㎬㎭㎮㎯㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎺㎻㎼㎽㎾㎿㏀㏁㏂㏃㏄㏅㏆㏇㏈㏉㏊㏏㏐㏓㏖㏘㏛㏜㏝!"#" - "$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_" - "`abcdefghijklmnopqrstuvwxyz{|}~¢£¬ ̄¥₩" + "¡¢£¤¥§¨ª¬\u00ad®²³´¶¸¹º¼½¾¿ÆÐØÞßæðøþđĦħıIJijĸĿŀŁłʼnŊŋŒœŦŧˇː˘˙˚˛˝―‖†‡" + "‥′″‾⁴ⁿ₁₂₃₄₩€℉ℓ№℡™ΩÅ⅓⅔⅛⅜⅝⅞↔↕↖↗↘↙⇒⇔∀∂∃∇∈∋∏∑√∝∞∠∥∧∨∩∪∫∬∮∴∵∼∽≒≠≡" + "≤≥≪≫⊂⊃⊆⊇⊙⊥⌒⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦ" + "ⓧⓨⓩ─━│┃┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀" + "╁╂╃╄╅╆╇╈╉╊╋▒▣▤▥▦▧▨▩▶▷▼▽◀◁◈◉◎◐◑☎☏☜☞♀♂♠♡♣♤♥♧♨♩♪♬♭\u3000、。〃々〆【】〒〓〔〕〜" + "〞〟㈀㈁㈂㈃㈄㈅㈆㈇㈈㈉㈊㈋㈌㈍㈎㈏㈐㈑㈒㈓㈔㈕㈖㈗㈘㈙㈚㈛㈜㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻㉿" + "㎀㎁㎂㎃㎄㎈㎉㎊㎋㎌㎍㎎㎏㎐㎑㎒㎓㎔㎕㎖㎗㎘㎙㎚㎛㎜㎝㎞㎟㎠㎡㎢㎣㎤㎥㎦㎧㎨㎩㎪㎫㎬㎭㎮㎯㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎺㎻㎼㎽㎾" + "㎿㏀㏁㏂㏃㏄㏅㏆㏇㏈㏉㏊㏏㏐㏓㏖㏘㏛㏜㏝!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH" + "IJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¢£¬ ̄¥₩" ), + 1035: "Ю", }, "휴먼명조": { + 1: "\u302a\u302b", + 228: "ι", + 256: "¦", + 276: "‚‛", + 284: "Ι", + 296: "⁚", + 298: "ìíîïįĵĺļ", + 360: "ĩīĭ", + 374: "г", + 380: "„‟", + 384: "¯ÌÍÎÏĨĪĬĮİţſ", + 394: "ľ", + 404: "τ", + 426: "ŕŗř", + 448: "к", + 452: "ζ", + 456: "ε", + 458: "ξ", + 470: "Ĵзт", + 482: "źżž", + 486: "‶", + 496: "ť", 512: ( - "¡¤§¨ª\u00ad²³´¶¸¹º¼½¾¿ÆÐØÞßæðøþđĦħıIJijĸĿŀŁłʼnŊŋŒœŦŧˇː˘˙˚˛˝ΑΒΓΔΕΖΗΘΙ" - "ΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψωЁАБВГДЕЖЗИЙКЛМНОПРСТУ" - "ФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё―†‡‥′″⁴ⁿ₁₂₃₄₩℉ℓ" - "№℡™ΩÅ⅓⅔⅛⅜⅝⅞↔↕↖↗↘↙⇒⇔∀∂∃∇∈∋∏∑√∝∞∠∥∧∨∩∪∫∬∮∴∵∼∽≒≠≡≤≥≪≫⊂⊃⊆⊇⊙⊥⌒⒜⒝⒞" - "⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ─━│┃┌┍┎┏┐┑┒" - "┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋▒▣▤" - "▥▦▧▨▩▶▷▼▽◀◁◈◎◐◑☎☏☜☞♀♂♠♡♣♤♥♧♨♩♪♬♭\u3000、。〃【】〓〔〕㈀㈁㈂㈃㈄㈅㈆㈇㈈㈉㈊㈋㈌㈍㈎㈏㈐㈑㈒" - "㈓㈔㈕㈖㈗㈘㈙㈚㈛㈜㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻㉿㎀㎁㎂㎃㎄㎈㎉㎊㎋㎌㎍㎎㎏㎐㎑㎒㎓㎔㎕㎖㎗" - "㎘㎙㎚㎛㎜㎝㎞㎟㎠㎡㎢㎣㎤㎥㎦㎧㎨㎩㎪㎫㎬㎭㎮㎯㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎺㎻㎼㎽㎾㎿㏀㏁㏂㏃㏄㏅㏆㏇㏈㏉㏊㏏㏐㏓㏖㏘㏛㏜㏝!" - ""#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]" - "^_`abcdefghijklmnopqrstuvwxyz{|}~¢£¬ ̄¥₩" + "¢£«»àáâãäåāăąćĉċčśŝşšγκλνсух・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテト" + "ナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚ᅠ" + ), + 522: "э", + 532: "ç", + 534: "чь", + 538: "χ", + 544: "в", + 550: "⁖", + 554: "µèéêëñòóôõöùúûüēĕėęěĝğġģĥķńņňōŏőũūŭůűųГпя", + 560: "υ", + 564: "Γ", + 566: "н", + 570: "δηθοаеорё", + 572: "ий⁕", + 582: "ρ", + 586: "бц", + 590: "βμ", + 592: "α", + 596: "К", + 598: "ýÿŷдл", + 618: "З", + 620: "₲", + 626: "ΖΤТ", + 632: "σ", + 634: "Σ", + 640: "ĹĻĽŚŜŞŠъ", + 650: "У⁉", + 664: "φ", + 666: "Ξ", + 672: "БЛЬ", + 682: "¥ÈÉÊËÝĆĈĊČĒĔĖĘĚŔŖŘŶŸЧ", + 684: "ΑΒΔΕΚΛΡΥΧЁАВЕРХ", + 686: "ж", + 690: "Ç", + 694: "ďД", + 704: "м", + 706: "π", + 726: "ÒÓÔÕÖĎĐĜĞĠĢŌŎŐ", + 730: "ψ", + 736: "ИЙПЭы", + 740: "ΗΝΠНСЯ", + 758: "Ц", + 766: "Ω", + 768: "ÀÁÂÃÄÅÑÙÚÛÜĀĂĄĤĶŃŅŇŢŤŨŪŬŮŰŲю", + 778: "Ф", + 796: "ΘΟО", + 800: "ω", + 802: "©®", + 804: "¬", + 810: "ŵЪ", + 814: "₩", + 818: "Φ", + 822: "ш", + 830: "₨", + 842: "фщ", + 854: "ΜМ", + 856: "Ψ", + 900: "⁇", + 906: "Ы", + 938: "Ш", + 946: "Ж", + 960: "Щ", + 982: "Ŵ", + 994: ( + "₯∁∄∅∆∉∊∌∍∎∐−∓∔∕∖∗∘∙∛∜∟∡∢∣∤∦∭∯∰∱∲∳∶∷∸∹∺∻∾∿≀≁≂≃≄≅≆≇≈≉≊≋≌≍≎≏≐≑≓" + "≔≕≖≗≘≙≚≛≜≝≞≟≢≣≦≧≨≩≬≭≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿⊀⊁⊄⊅⊈⊉⊊⊋⊌⊍⊎⊏⊐⊑⊒⊓⊔⊕⊖⊗⊘⊚" + "⊛⊜⊝⊞⊟⊠⊡⊢⊣⊤⊦⊧⊨⊩⊪⊫⊬⊭⊮⊯⊰⊱⊲⊳⊴⊵⊶⊷⊸⊹⊺⊻⊼⊽⊾⊿⋀⋁⋂⋃⋄⋅⋆⋇⋈⋉⋊⋋⋌⋍⋎⋏⋐⋑⋒⋓⋔⋕⋖⋗" + "⋘⋙⋚⋛⋜⋝⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋮⋯⋰⋱⋲⋳⋴⋵⋶⋷⋸⋹⋺⋻⋼⋽⋾⋿▢▪▫▬▭▮▯▰▱▴▵▸▹►▻▾▿◂◃◄" + "◅◉◊◌◍◒◓◔◕◖◗◘◙◚◛◜◝◞◟◠◡◢◣◤◥◦◧◨◩◪◫◬◭◮◯◰◱◲◳◴◵◶◷◸◹◺◻◼◽◾◿☀☁☂☃☄☇☈☉☊" + "☋☌☍☐☑☒☓☔☕☖☗☘☙☚☛☝☟☠☡☢☣☤☥☦☧☨☩☪☫☬☭☮☯☰☱☲☳☴☵☶☷☸☹☺☻☼☽☾☿♁♃♄♅♆♇♈♉♊♋♌" + "♍♎♏♐♑♒♓♔♕♖♗♘♙♚♛♜♝♞♟♢♦♫♮♯♰♱♲♳♴♵♶♷♸♹♺♻♼♽♾♿⚀⚁⚂⚃⚄⚅⚆⚇⚈⚉⚊⚋⚌⚍⚎⚏⚐⚑⚒⚓" + "⚔⚕⚖⚗⚘⚙⚚⚛⚜⚠⚡⚢⚣⚤⚥⚦⚧⚨⚩⚪⚫⚬⚭⚮⚯⚰⚱⚲✁✂✃✄✆✇✈✉✌✍✎✏✐✑✒✓✔✕✖✗✘✙✚✛✜✝✞✟✠✡✢✣" + "✤✥✦✧✩✪✫✬✭✮✯✰✱✲✳✴✵✶✷✸✹✺✻✼✽✾✿❀❁❂❃❄❅❆❇❈❉❊❋❍❏❐❑❒❖❘❙❚❛❜❝❞❡❢❣❤❥❦❧❨" + "❩❪❫❬❭❮❯❰❱❲❳❴❵❶❷❸❹❺❻❼❽❾❿➀➁➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓➔➘➙➚➛➜➝➞➟➠➡➢➣➤➥➦➧" + "➨➩➪➫➬➭➮➯➱➲➳➴➵➶➷➸➹➺➻➼➽➾〄〇〜〝〠〡〢〣〤〥〦〧〨〩〰〱〲〳〴〵〶〷〸〹〺〻〼〽〾⦅⦆¦" + ), + 1024: ( + "¡¤§¨ª\u00ad²³´¶¸¹º¼½¾¿ÆÐØÞßæðøþđĦħıIJijĸĿŀŁłʼnŊŋŒœŦŧˇː˘˙˚˛˝―†‡‥′″⁴ⁿ₁" + "₂₃₄℉ℓ№℡™ΩÅ⅓⅔⅛⅜⅝⅞↔↕↖↗↘↙⇒⇔∀∂∃∇∈∋∏∑√∝∞∠∥∧∨∩∪∫∬∮∴∵∼∽≒≠≡≤≥≪≫⊂⊃⊆⊇⊙" + "⊥⌒⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ─━│┃┌┍" + "┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉" + "╊╋▒▣▤▥▦▧▨▩▶▷▼▽◀◁◈◎◐◑☎☏☜☞♀♂♠♡♣♤♥♧♨♩♪♬♭\u3000、。〃々〆【】〒〓〔〕〞〟㈀㈁㈂㈃㈄㈅㈆㈇㈈" + "㈉㈊㈋㈌㈍㈎㈏㈐㈑㈒㈓㈔㈕㈖㈗㈘㈙㈚㈛㈜㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻㉿㎀㎁㎂㎃㎄㎈㎉㎊㎋㎌㎍" + "㎎㎏㎐㎑㎒㎓㎔㎕㎖㎗㎘㎙㎚㎛㎜㎝㎞㎟㎠㎡㎢㎣㎤㎥㎦㎧㎨㎩㎪㎫㎬㎭㎮㎯㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎺㎻㎼㎽㎾㎿㏀㏁㏂㏃㏄㏅㏆㏇㏈㏉" + "㏊㏏㏐㏓㏖㏘㏛㏜㏝!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRS" + "TUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¢£¬ ̄¥₩" ), + 1034: "Ю", }, "한컴산뜻돋움": { 254: "ι", @@ -1786,19 +1962,150 @@ 970: "◉◯☐☑❍", }, "휴먼고딕": { + 1: "\u302a\u302b", + 228: "ι", + 256: "¦", + 276: "‚‛", + 284: "Ι", + 296: "․‧⁚", + 298: "ìíîïįĵĺļ⁏⁝⁞", + 344: "‖‵", + 360: "ĩīĭ", + 374: "г", + 378: "‣", + 380: "„‟", + 384: "¯ÌÍÎÏĨĪĬĮİţſ", + 394: "ľ", + 404: "τ", + 406: "‹›", + 408: "•", + 426: "ŕŗř", + 448: "к", + 452: "ζ", + 456: "ε", + 458: "ξ‼", + 466: "⁃", + 470: "Ĵзт", + 482: "źżž", + 484: "⁅⁆", + 486: "‶", + 492: "‽", + 496: ( + "ť〿。「」、ᄀᄁᆪᄂᆬᆭᄃᄄᄅᆰᆱᆲᆳᆴᆵᄚᄆᄇᄈᄡᄉᄊᄋᄌᄍᄎᄏᄐᄑ하ᅢᅣᅤᅥᅦᅧᅨᅩᅪᅫᅬᅭᅮᅯᅰᅱᅲᅳᅴᅵ│←↑" + "→↓■○" + ), + 498: "⁎⁑", 512: ( - "¡¤§¨ª\u00ad²³´¶¸¹º¼½¾¿ÆÐØÞßæðøþđĦħıIJijĸĿŀŁłʼnŊŋŒœŦŧˇː˘˙˚˛˝ΑΒΓΔΕΖΗΘΙ" - "ΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψωЁАБВГДЕЖЗИЙКЛМНОПРСТУ" - "ФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё―†‡‥′″⁴ⁿ₁₂₃₄℉ℓ№" - "℡™ΩÅ⅓⅔⅛⅜⅝⅞↔↕↖↗↘↙⇒⇔∀∂∃∇∈∋∏∑√∝∞∠∥∧∨∩∪∫∬∮∴∵∼∽≒≠≡≤≥≪≫⊂⊃⊆⊇⊙⊥⌒⒜⒝⒞⒟" - "⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ─━│┃┌┍┎┏┐┑┒┓" - "└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋▒▣▤▥" - "▦▧▨▩▶▷▼▽◀◁◈◎◐◑☎☏☜☞♀♂♠♡♣♤♥♧♨♩♪♬♭\u3000、。〃【】〓〔〕㈀㈁㈂㈃㈄㈅㈆㈇㈈㈉㈊㈋㈌㈍㈎㈏㈐㈑㈒㈓" - "㈔㈕㈖㈗㈘㈙㈚㈛㈜㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻㉿㎀㎁㎂㎃㎄㎈㎉㎊㎋㎌㎍㎎㎏㎐㎑㎒㎓㎔㎕㎖㎗㎘" - "㎙㎚㎛㎜㎝㎞㎟㎠㎡㎢㎣㎤㎥㎦㎧㎨㎩㎪㎫㎬㎭㎮㎯㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎺㎻㎼㎽㎾㎿㏀㏁㏂㏃㏄㏅㏆㏇㏈㏉㏊㏏㏐㏓㏖㏘㏛㏜㏝!"" - "#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^" - "_`abcdefghijklmnopqrstuvwxyz{|}~¢£¬ ̄¥₩" + "¢£«»àáâãäåāăąćĉċčśŝşšγκλνсух〖〗〘〙〚〛・ヲァィゥェォャュョッーアイウエオカキクケコサシスセ" + "ソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚ᅠ" + ), + 522: "э", + 524: "₫", + 530: "₰", + 532: "ç", + 534: "чь", + 538: "χ‸", + 540: "‐‑", + 544: "в⁊", + 550: "⁖", + 554: "µèéêëñòóôõöùúûüēĕėęěĝğġģĥķńņňōŏőũūŭůűųГпя", + 560: "υ", + 564: "Γ", + 566: "н", + 568: "⁒", + 570: "δηθοаеорё", + 572: "ий⁕", + 582: "ρ", + 584: "₤", + 586: "бц⁗", + 590: "βμ", + 592: "α‗", + 596: "К", + 598: "ýÿŷдл", + 608: "‾", + 610: "₦", + 616: "₠₪", + 618: "З⁙", + 620: "₲", + 622: "‴‷₵", + 626: "ΖΤТ", + 628: "₴", + 632: "σ", + 634: "Σ", + 638: "⁈⁘", + 640: "ĹĻĽŚŜŞŠŹŻŽъ‒", + 648: "₣", + 650: "У⁄⁉", + 652: "₱", + 662: "⁋⁌⁍", + 664: "φ", + 666: "Ξ₭", + 670: "₮", + 672: "БЛЬ€", + 680: "₥", + 682: "¥ÈÉÊËÝĆĈĊČĒĔĖĘĚŔŖŘŶŸЧ⁁₡₢", + 684: "ΑΒΔΕΚΛΡΥΧЁАВЕРХ", + 686: "ж", + 690: "Ç", + 694: "ďД", + 700: "⁛", + 704: "м⁓", + 706: "π", + 726: "ÒÓÔÕÖĎĐĜĞĠĢŌŎŐ", + 730: "ψ", + 736: "ИЙПЭы", + 740: "ΗΝΠНСЯ", + 758: "Ц", + 766: "Ω", + 768: "ÀÁÂÃÄÅÑÙÚÛÜĀĂĄĤĶŃŅŇŢŤŨŪŬŮŰŲю", + 778: "Ф", + 788: "‿⁀⁔⁜₳", + 796: "ΘΟО", + 800: "ω", + 802: "©®", + 804: "¬", + 810: "ŵЪ", + 814: "₩", + 818: "Φ⁐", + 822: "ш", + 830: "₨", + 842: "фщ", + 854: "ΜМ", + 856: "Ψ", + 900: "⁇", + 906: "Ы", + 930: "⁂", + 938: "Ш", + 946: "Ж", + 960: "Щ", + 978: "‱", + 980: "₧", + 982: "Ŵ", + 994: ( + "₯∁∄∅∆∉∊∌∍∎∐−∓∔∕∖∗∘∙∛∜∟∡∢∣∤∦∭∯∰∱∲∳∶∷∸∹∺∻∾∿≀≁≂≃≄≅≆≇≈≉≊≋≌≍≎≏≐≑≓" + "≔≕≖≗≘≙≚≛≜≝≞≟≢≣≦≧≨≩≬≭≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿⊀⊁⊄⊅⊈⊉⊊⊋⊌⊍⊎⊏⊐⊑⊒⊓⊔⊕⊖⊗⊘⊚" + "⊛⊜⊝⊞⊟⊠⊡⊢⊣⊤⊦⊧⊨⊩⊪⊫⊬⊭⊮⊯⊰⊱⊲⊳⊴⊵⊶⊷⊸⊹⊺⊻⊼⊽⊾⊿⋀⋁⋂⋃⋄⋅⋆⋇⋈⋉⋊⋋⋌⋍⋎⋏⋐⋑⋒⋓⋔⋕⋖⋗" + "⋘⋙⋚⋛⋜⋝⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋮⋯⋰⋱⋲⋳⋴⋵⋶⋷⋸⋹⋺⋻⋼⋽⋾⋿▢▪▫▬▭▮▯▰▱▴▵▸▹►▻▾▿◂◃◄" + "◅◉◊◌◍◒◓◔◕◖◗◘◙◚◛◜◝◞◟◠◡◢◣◤◥◦◧◨◩◪◫◬◭◮◯◰◱◲◳◴◵◶◷◸◹◺◻◼◽◾◿☀☁☂☃☄☇☈☉☊" + "☋☌☍☐☑☒☓☔☕☖☗☘☙☚☛☝☟☠☡☢☣☤☥☦☧☨☩☪☫☬☭☮☯☰☱☲☳☴☵☶☷☸☹☺☻☼☽☾☿♁♃♄♅♆♇♈♉♊♋♌" + "♍♎♏♐♑♒♓♔♕♖♗♘♙♚♛♜♝♞♟♢♦♫♮♯♰♱♲♳♴♵♶♷♸♹♺♻♼♽♾♿⚀⚁⚂⚃⚄⚅⚆⚇⚈⚉⚊⚋⚌⚍⚎⚏⚐⚑⚒⚓" + "⚔⚕⚖⚗⚘⚙⚚⚛⚜⚠⚡⚢⚣⚤⚥⚦⚧⚨⚩⚪⚫⚬⚭⚮⚯⚰⚱⚲✁✂✃✄✆✇✈✉✌✍✎✏✐✑✒✓✔✕✖✗✘✙✚✛✜✝✞✟✠✡✢✣" + "✤✥✦✧✩✪✫✬✭✮✯✰✱✲✳✴✵✶✷✸✹✺✻✼✽✾✿❀❁❂❃❄❅❆❇❈❉❊❋❍❏❐❑❒❖❘❙❚❛❜❝❞❡❢❣❤❥❦❧❨" + "❩❪❫❬❭❮❯❰❱❲❳❴❵❶❷❸❹❺❻❼❽❾❿➀➁➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓➔➘➙➚➛➜➝➞➟➠➡➢➣➤➥➦➧" + "➨➩➪➫➬➭➮➯➱➲➳➴➵➶➷➸➹➺➻➼➽➾〄〇〜〝〠〡〢〣〤〥〦〧〨〩〰〱〲〳〴〵〶〷〸〹〺〻〼〽〾⦅⦆¦" + ), + 1024: ( + "¡¤§¨ª\u00ad²³´¶¸¹º¼½¾¿ÆÐØÞßæðøþđĦħıIJijĸĿŀŁłʼnŊŋŒœŦŧˇː˘˙˚˛˝―†‡‥′″⁴ⁿ₁" + "₂₃₄℉ℓ№℡™ΩÅ⅓⅔⅛⅜⅝⅞↔↕↖↗↘↙⇒⇔∀∂∃∇∈∋∏∑√∝∞∠∥∧∨∩∪∫∬∮∴∵∼∽≒≠≡≤≥≪≫⊂⊃⊆⊇⊙" + "⊥⌒⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ─━│┃┌┍" + "┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉" + "╊╋▒▣▤▥▦▧▨▩▶▷▼▽◀◁◈◎◐◑☎☏☜☞♀♂♠♡♣♤♥♧♨♩♪♬♭\u3000、。〃【】〓〔〕㈀㈁㈂㈃㈄㈅㈆㈇㈈㈉㈊㈋㈌㈍" + "㈎㈏㈐㈑㈒㈓㈔㈕㈖㈗㈘㈙㈚㈛㈜㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻㉿㎀㎁㎂㎃㎄㎈㎉㎊㎋㎌㎍㎎㎏㎐㎑㎒" + "㎓㎔㎕㎖㎗㎘㎙㎚㎛㎜㎝㎞㎟㎠㎡㎢㎣㎤㎥㎦㎧㎨㎩㎪㎫㎬㎭㎮㎯㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎺㎻㎼㎽㎾㎿㏀㏁㏂㏃㏄㏅㏆㏇㏈㏉㏊㏏㏐㏓㏖" + "㏘㏛㏜㏝!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX" + "YZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¢£¬ ̄¥₩" ), + 1034: "Ю", }, "한컴돋움": { 165: "˙", diff --git a/src/hwpx/form_fit/measure.py b/src/hwpx/form_fit/measure.py index b5e5d558..137918eb 100644 --- a/src/hwpx/form_fit/measure.py +++ b/src/hwpx/form_fit/measure.py @@ -118,6 +118,9 @@ _GLYPH_SPACE = "\ufdd0" #: The spaces Hancom makes half an em wide (unless the font's own space is used). _HALF_EM_SPACES = frozenset(" \u00a0") +#: The glyphs Hancom lays out at half an em in every face, whatever the font's own advance (a glyph all the +#: same: rounded, \uc7a5\ud3c9 and \uc790\uac04 applied as any other is). +_HALF_EM_GLYPHS = frozenset("!") #: Closing punctuation that never starts a line; it moves down with the #: character before it. _NO_LINE_START = frozenset("!%),.:;?]}¢°’”‰′″℃〉》」』】〕…·、。") @@ -151,7 +154,8 @@ #: space, and each glyph of ``_GLYPHS`` (0: not in the face, or one Hancom lays #: out from the fallback face all the same). The faces Hancom ships in its own #: font format (HCI Poppy, HCI Hollyhock, 한양중고딕, 한양신명조, 한양견고딕, -#: 휴먼옛체) are given at the advances Hancom lays them out at. +#: 휴먼옛체) are given at the advances Hancom lays them out at. 함초롬돋움's … is +#: 함초롬바탕's (960), as Hancom lays it out. _DESIGN: dict[str, tuple[int, int, int, tuple[int, ...]]] = { "함초롬바탕": (1000, 970, 300, ( 320, 320, 610, 610, 830, 724, 320, 320, 320, 550, 550, 320, 550, 320, 550, 550, @@ -174,10 +178,10 @@ 654, 664, 633, 701, 625, 609, 645, 694, 317, 515, 664, 584, 826, 728, 676, 660, 681, 683, 617, 573, 702, 594, 897, 607, 581, 584, 338, 373, 329, 562, 532, 373, 563, 581, 513, 578, 567, 336, 563, 594, 271, 268, 559, 258, 919, 595, 582, 552, - 552, 427, 513, 349, 595, 469, 760, 483, 466, 479, 372, 342, 372, 546, 294, 702, - 451, 453, 288, 288, 500, 500, 500, 500, 500, 500, 500, 500, 690, 970, 970, 970, + 552, 427, 513, 349, 595, 469, 760, 483, 466, 479, 372, 342, 372, 546, 294, 960, + 451, 453, 288, 288, 500, 500, 500, 500, 500, 500, 500, 500, 770, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 587, 670, 782, 306, - 970, 892, 522, 348, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, + 970, 988, 875, 625, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, @@ -334,34 +338,34 @@ 0, 0, 0, 0, )), "HY헤드라인M": (1024, 1024, 341, ( - 256, 384, 853, 597, 810, 640, 213, 298, 298, 341, 597, 213, 597, 213, 384, 597, - 597, 597, 597, 597, 597, 597, 597, 597, 597, 256, 256, 469, 597, 469, 597, 853, - 597, 640, 640, 640, 469, 469, 640, 640, 256, 341, 597, 426, 810, 597, 597, 554, - 597, 597, 597, 512, 640, 640, 938, 597, 554, 469, 341, 384, 341, 554, 512, 0, - 597, 597, 597, 597, 640, 384, 597, 597, 256, 298, 554, 256, 853, 597, 640, 597, - 597, 426, 554, 384, 597, 554, 810, 512, 512, 426, 426, 298, 426, 725, 1024, 1024, + 256, 384, 853, 598, 817, 597, 213, 298, 301, 492, 601, 244, 515, 248, 393, 597, + 597, 597, 597, 597, 597, 597, 597, 597, 597, 271, 271, 596, 601, 602, 597, 873, + 597, 644, 644, 644, 518, 498, 651, 650, 297, 521, 620, 472, 825, 629, 636, 580, + 636, 610, 606, 532, 640, 640, 939, 597, 565, 497, 331, 393, 330, 555, 512, 332, + 597, 597, 593, 597, 632, 433, 606, 615, 290, 346, 555, 288, 867, 603, 640, 608, + 608, 415, 555, 428, 613, 555, 811, 512, 593, 458, 427, 299, 427, 725, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, - 1024, 1024, 0, 0, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 0, 0, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 0, 0, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 0, 0, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 0, 0, 0, 0, 0, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 0, 0, 0, 0, 0, )), - "휴먼명조": (512, 512, 256, ( - 104, 256, 336, 258, 384, 394, 148, 160, 160, 256, 256, 138, 256, 138, 160, 256, - 256, 256, 256, 256, 256, 256, 256, 256, 256, 138, 138, 256, 256, 256, 220, 398, - 338, 308, 328, 348, 320, 298, 360, 348, 132, 202, 330, 296, 400, 354, 366, 294, - 352, 334, 254, 320, 346, 340, 478, 364, 344, 306, 164, 160, 164, 186, 256, 166, - 260, 278, 248, 260, 268, 200, 264, 284, 128, 136, 268, 128, 408, 282, 262, 276, - 276, 206, 210, 174, 276, 276, 370, 250, 262, 232, 150, 104, 150, 256, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 0, 0, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 0, 0, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 0, 0, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 0, 0, 0, 0, 0, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 0, - 0, 0, 0, 0, + "휴먼명조": (1024, 1024, 512, ( + 512, 512, 672, 516, 768, 788, 296, 320, 320, 512, 512, 276, 512, 276, 320, 512, + 512, 512, 512, 512, 512, 512, 512, 512, 512, 276, 276, 512, 512, 512, 440, 796, + 676, 616, 656, 696, 640, 596, 720, 696, 264, 404, 660, 592, 800, 708, 732, 588, + 704, 668, 508, 640, 692, 680, 956, 728, 688, 612, 328, 320, 328, 372, 512, 332, + 520, 556, 496, 520, 536, 400, 528, 568, 256, 272, 536, 256, 816, 564, 524, 552, + 552, 412, 420, 348, 552, 552, 740, 500, 524, 464, 300, 208, 300, 512, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 896, 640, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 994, 994, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 994, 994, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 994, 994, 994, 994, 994, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 994, + 994, 994, 994, 994, )), "한컴산뜻돋움": (1000, 932, 264, ( 446, 297, 583, 583, 892, 892, 297, 446, 446, 446, 583, 297, 583, 297, 446, 583, @@ -378,20 +382,20 @@ 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 0, 0, 0, 0, 0, )), - "휴먼고딕": (512, 512, 256, ( - 134, 200, 360, 296, 432, 352, 144, 160, 160, 256, 256, 148, 256, 122, 160, 258, - 258, 258, 258, 258, 258, 258, 258, 258, 258, 132, 126, 256, 256, 256, 264, 398, - 306, 288, 304, 294, 276, 256, 332, 296, 100, 236, 306, 252, 366, 300, 346, 274, - 346, 282, 284, 276, 296, 314, 428, 302, 296, 274, 164, 160, 164, 198, 256, 152, - 256, 262, 256, 270, 272, 146, 276, 256, 100, 124, 254, 100, 392, 256, 270, 266, - 270, 184, 238, 160, 258, 260, 348, 240, 244, 228, 150, 136, 150, 256, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 0, 0, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 0, 0, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 0, 0, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 0, 0, 0, 0, 0, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 0, - 0, 0, 0, 0, + "휴먼고딕": (1024, 1024, 512, ( + 512, 400, 720, 592, 864, 704, 288, 320, 320, 512, 512, 296, 512, 244, 320, 516, + 516, 516, 516, 516, 516, 516, 516, 516, 516, 264, 252, 512, 512, 512, 528, 796, + 612, 576, 608, 588, 552, 512, 664, 592, 200, 472, 612, 504, 732, 600, 692, 548, + 692, 564, 568, 552, 592, 628, 856, 604, 592, 548, 328, 320, 328, 396, 512, 304, + 512, 524, 512, 540, 544, 292, 552, 512, 200, 248, 508, 200, 784, 512, 540, 532, + 540, 368, 476, 320, 516, 520, 696, 480, 488, 456, 300, 272, 300, 512, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 896, 640, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 994, 994, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 994, 994, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 994, 994, 994, 994, 994, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 994, + 994, 994, 994, 994, )), "한컴돋움": (1024, 1024, 341, ( 342, 425, 640, 512, 937, 726, 297, 384, 384, 597, 594, 384, 604, 384, 425, 597, @@ -412,7 +416,7 @@ 375, 371, 854, 627, 971, 830, 226, 371, 371, 596, 883, 329, 883, 329, 358, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 329, 329, 883, 883, 883, 611, 1056, 730, 591, 838, 760, 525, 500, 881, 689, 279, 502, 632, 483, 917, 746, 884, 599, - 888, 601, 529, 493, 646, 658, 939, 655, 608, 566, 371, 351, 371, 798, 511, 256, + 888, 601, 529, 493, 646, 658, 939, 655, 608, 566, 371, 351, 371, 798, 511, 598, 732, 736, 692, 735, 713, 342, 713, 650, 271, 275, 563, 271, 970, 651, 711, 731, 734, 351, 446, 347, 650, 544, 759, 518, 593, 473, 512, 542, 512, 798, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, @@ -457,7 +461,7 @@ 426, 597, 725, 640, 981, 810, 341, 469, 469, 554, 682, 384, 682, 384, 426, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 384, 384, 597, 682, 597, 725, 1024, 810, 810, 810, 810, 725, 682, 853, 810, 384, 597, 853, 682, 896, 810, 853, 725, - 853, 810, 768, 725, 810, 725, 1024, 768, 768, 725, 469, 426, 469, 554, 512, 256, + 853, 810, 768, 725, 810, 725, 1024, 768, 768, 725, 469, 426, 469, 554, 512, 598, 640, 682, 640, 682, 640, 384, 682, 682, 384, 341, 682, 384, 981, 682, 682, 682, 682, 469, 640, 426, 682, 640, 853, 640, 640, 597, 512, 384, 512, 682, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, @@ -937,7 +941,7 @@ 682, 597, 768, 768, 981, 981, 426, 469, 469, 682, 725, 384, 725, 384, 512, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 426, 426, 640, 725, 640, 682, 981, 853, 810, 810, 853, 768, 725, 853, 938, 469, 554, 938, 768, 981, 896, 896, 768, - 896, 810, 725, 896, 853, 810, 1024, 853, 810, 725, 469, 512, 469, 597, 512, 0, + 896, 810, 725, 896, 853, 810, 1024, 853, 810, 725, 469, 512, 469, 597, 512, 598, 597, 640, 597, 640, 640, 469, 640, 725, 426, 384, 725, 426, 981, 682, 640, 682, 682, 512, 554, 469, 640, 640, 896, 682, 640, 554, 426, 341, 426, 768, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, @@ -952,7 +956,7 @@ 363, 331, 823, 648, 917, 782, 191, 332, 332, 519, 846, 311, 846, 311, 356, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 311, 311, 703, 846, 703, 585, 1023, 654, 676, 686, 739, 623, 573, 705, 721, 309, 440, 688, 558, 901, 729, 732, 670, - 728, 703, 677, 532, 687, 656, 945, 654, 633, 618, 351, 356, 351, 591, 512, 0, + 728, 703, 677, 532, 687, 656, 945, 654, 633, 618, 351, 356, 351, 591, 512, 598, 614, 606, 565, 608, 611, 409, 604, 610, 282, 285, 580, 282, 911, 608, 608, 590, 590, 383, 564, 388, 601, 601, 759, 537, 537, 477, 505, 505, 505, 846, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, @@ -1340,6 +1344,8 @@ def char_advance(ch: str, font_pt: float, style: TextStyle | None = None) -> flo return _laid_out_space(height, ratio, spacing) if cls == "hangul": design, base = _hangul_units(style.hangul_face, ch), style.hangul_advance + elif ch in _HALF_EM_GLYPHS: + design, base = (1, 2), _ADVANCE_EM[cls] else: design, base = _design_units(style.glyph_face, ch), _ADVANCE_EM[cls] if design is not None: diff --git a/tests/fixtures/hancom_saved/formfit_dodum_punctuation_cells.hwpx b/tests/fixtures/hancom_saved/formfit_dodum_punctuation_cells.hwpx new file mode 100644 index 00000000..5b061f03 Binary files /dev/null and b/tests/fixtures/hancom_saved/formfit_dodum_punctuation_cells.hwpx differ diff --git a/tests/fixtures/hancom_saved/formfit_glyph_widths.hwpx b/tests/fixtures/hancom_saved/formfit_glyph_widths.hwpx index ba96c8e2..f58af39b 100644 Binary files a/tests/fixtures/hancom_saved/formfit_glyph_widths.hwpx and b/tests/fixtures/hancom_saved/formfit_glyph_widths.hwpx differ diff --git a/tests/fixtures/hancom_saved/formfit_hy_headline_cells.hwpx b/tests/fixtures/hancom_saved/formfit_hy_headline_cells.hwpx index cafe1805..43908a83 100644 Binary files a/tests/fixtures/hancom_saved/formfit_hy_headline_cells.hwpx and b/tests/fixtures/hancom_saved/formfit_hy_headline_cells.hwpx differ diff --git a/tests/fixtures/hancom_saved/formfit_script_symbols.hwpx b/tests/fixtures/hancom_saved/formfit_script_symbols.hwpx index 17d63764..452a15e5 100644 Binary files a/tests/fixtures/hancom_saved/formfit_script_symbols.hwpx and b/tests/fixtures/hancom_saved/formfit_script_symbols.hwpx differ diff --git a/tests/test_form_fit_hancom_rules.py b/tests/test_form_fit_hancom_rules.py index 7d0fec45..f07f79e2 100644 --- a/tests/test_form_fit_hancom_rules.py +++ b/tests/test_form_fit_hancom_rules.py @@ -71,6 +71,7 @@ MORE_FACES_HANGUL = Path(__file__).parent / "fixtures" / "hancom_saved" / "formfit_more_faces_hangul_cells.hwpx" KOPUB_FACES_CELLS = Path(__file__).parent / "fixtures" / "hancom_saved" / "formfit_kopub_faces_cells.hwpx" HFT_FACES_CELLS = Path(__file__).parent / "fixtures" / "hancom_saved" / "formfit_hft_faces_cells.hwpx" +DODUM_PUNCTUATION = Path(__file__).parent / "fixtures" / "hancom_saved" / "formfit_dodum_punctuation_cells.hwpx" NO_BREAK_SPACES = Path(__file__).parent / "fixtures" / "hancom_saved" / "pages_no_break_spaces.hwpx" FIXED_WIDTH_SPACES = Path(__file__).parent / "fixtures" / "hancom_saved" / "pages_fixed_width_spaces.hwpx" SCRIPT_ROWS = [ @@ -162,6 +163,26 @@ def test_cells_in_hancom_font_faces_break_where_hancom_breaks_them() -> None: assert len(cells) == 224 and len(faces) == 8 +def test_dodum_punctuation_and_the_exclamation_mark_break_where_hancom_breaks_them() -> None: + # Hancom Office 2024 laid this document out: each cell holds a glyph and five Hangul syllables in 함초롬돋움, + # 한컴산뜻돋움 or 한컴 고딕 at one of the two widths where its line count changes, at 10 pt and 30 pt. It lays + # out ! at half an em in every face, and 함초롬돋움's spacing modifier letters, general punctuation (but the + # quotation marks) and currency symbols at 함초롬바탕's advances, the faces falling back on it with them. + doc = HwpxDocument.open(DODUM_PUNCTUATION) + cells = list(doc.oxml.sections[0].element.iter(f"{HP}tc")) + for cell in cells: + paragraph = cell.find(f"{HP}subList/{HP}p") + text = "".join(t.text or "" for t in paragraph.iter(f"{HP}t")) + ref = paragraph.find(f"{HP}run").get("charPrIDRef") + style = text_style_from_refs(doc.oxml, paragraph.get("paraPrIDRef"), [ref]) + points = int(doc.oxml.char_property(ref).attributes["height"]) / 100 + margins = cell.find(f"{HP}cellMargin") + width = int(cell.find(f"{HP}cellSz").get("width")) - int(margins.get("left")) - int(margins.get("right")) + hancom = len(paragraph.findall(f"{HP}linesegarray/{HP}lineseg")) + assert estimate_lines(text, width, points, style) == hancom, (style.glyph_face, f"U+{ord(text[0]):04X}", points) + assert len(cells) == 144 + + def test_cells_in_more_faces_break_where_hancom_breaks_them() -> None: # Hancom laid these documents out: each cell holds a glyph and five Hangul syllables in 한컴산뜻돋움, HY중고딕, # HY견고딕, HY신명조, 새굴림 or 한컴 말랑말랑 Regular at one of the two widths where its line count changes, at @@ -182,13 +203,15 @@ def test_cells_in_more_faces_break_where_hancom_breaks_them() -> None: points = int(doc.oxml.char_property(ref).attributes["height"]) / 100 if style.glyph_face.startswith("한컴 말랑말랑") and (text.startswith("0") or (points == 30 and "고" in text)): continue + if text[0] in "—‐‑" and style.glyph_face in ("한컴산뜻돋움", "새굴림"): # from 함초롬돋움, which Hancom + continue # Office 2024 lays them out from 함초롬바탕 (test_dodum_punctuation_...) margins = cell.find(f"{HP}cellMargin") width = int(cell.find(f"{HP}cellSz").get("width")) - int(margins.get("left")) - int(margins.get("right")) hancom = len(paragraph.findall(f"{HP}linesegarray/{HP}lineseg")) assert estimate_lines(text, width, points, style) == hancom, ( style.glyph_face, f"U+{ord(text[0]):04X}", points, width) faces[style.glyph_face] = faces.get(style.glyph_face, 0) + 1 - assert faces == {"한컴산뜻돋움": 58, "HY중고딕": 58, "HY견고딕": 52, "HY신명조": 52, "새굴림": 34, + assert faces == {"한컴산뜻돋움": 40, "HY중고딕": 58, "HY견고딕": 52, "HY신명조": 52, "새굴림": 20, "한컴 말랑말랑 Regular": 56, "한컴 말랑말랑 Bold": 4} @@ -247,11 +270,13 @@ def test_a_line_taking_its_height_from_the_font_is_as_tall_as_the_face_makes_it( def test_human_myeongjo_takes_the_design_advances_of_its_font() -> None: - # 휴먼명조's font has 512 units per em: a Hangul syllable takes the full em, a parenthesis 160 units, the comma - # 138 and A 338. + # Hancom lays 휴먼명조 out in 1024 units per em: a Hangul syllable takes the full em, a parenthesis 320 units, + # the comma 276 and A 676. 320 and 321 units give a parenthesis the same width at 10 and 40 pt; at 15 pt + # Hancom lays it out 468 wide (321 would be 472), and at 80 pt 2500. style = TextStyle(hangul_face="휴먼명조", glyph_face="휴먼명조") - assert glyph_advance_em("휴먼명조", "(") == 160 / 512 + assert glyph_advance_em("휴먼명조", "(") == 320 / 1024 assert [char_advance(ch, 10, style) for ch in "가(,A"] == [1000, 312, 268, 660] + assert [char_advance("(", size, style) for size in (15, 80)] == [468, 2500] def test_every_fallback_face_has_a_table() -> None: