diff options
author | Karl Berry <karl@freefriends.org> | 2018-04-07 20:58:18 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2018-04-07 20:58:18 +0000 |
commit | 9e5940c56dfe63fab26f34250ac55e37ece2c560 (patch) | |
tree | 7d958a87f96e76f7e99de545fa4c13828224127b /Master/texmf-dist/tex/latex/polyglossia/gloss-korean.ldf | |
parent | 861b4de389db24dd94535880edb8de1ea4386cf6 (diff) |
polyglossia (7apr18)
git-svn-id: svn://tug.org/texlive/trunk@47358 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/polyglossia/gloss-korean.ldf')
-rw-r--r-- | Master/texmf-dist/tex/latex/polyglossia/gloss-korean.ldf | 484 |
1 files changed, 340 insertions, 144 deletions
diff --git a/Master/texmf-dist/tex/latex/polyglossia/gloss-korean.ldf b/Master/texmf-dist/tex/latex/polyglossia/gloss-korean.ldf index 6efc21a154c..13a4807c5d4 100644 --- a/Master/texmf-dist/tex/latex/polyglossia/gloss-korean.ldf +++ b/Master/texmf-dist/tex/latex/polyglossia/gloss-korean.ldf @@ -123,7 +123,7 @@ \XeTeXinterchartokenstate\@ne \XeTeXlinebreakpenalty 50 \fi - \XeTeXlinebreakskip 0pt plus.1em minus .01em + \XeTeXlinebreakskip 0pt plus.05em minus .01em \XeTeXlinebreaklocale "ko" } \def\noextras@korean{% @@ -186,9 +186,16 @@ \protected\def\으{\xpg@make@josa \empty 으} \protected\def\로{\으 로} \protected\def\라{\xpg@make@josa 라{이라}} +\def\xpg@make@josa@II{\xpg@make@josa\relax 이} \def\xpg@make@josa@I{% - \ifx\@let@token 라% - \expandafter\xpg@make@josa\expandafter\relax\expandafter 이% + \ifcat\@let@token\xpg@catcode@letter + \expandafter\expandafter\expandafter\count@\expandafter + \xpg@letter@to@num\meaning\@let@token\relax + \ifnum 0\ifnum\count@>"ABFF \ifnum\count@<"D7A4 1\fi\fi>\z@ + \expandafter\expandafter\expandafter\xpg@make@josa@II + \else + \expandafter\expandafter\expandafter\가 + \fi \else \expandafter\가 \fi @@ -277,8 +284,13 @@ % user macro to force zero skip \let\inhibitglue\relax % initialize interchartoks and classes -\let\XeTeXcharclassIgnore \@cclvi -\let\XeTeXcharclassBoundary\@cclv +\ifdim\the\XeTeXversion\XeTeXrevision pt<0.99994pt + \let\XeTeXcharclassIgnore \@cclvi + \let\XeTeXcharclassBoundary\@cclv +\else + \chardef\XeTeXcharclassIgnore =4096 + \chardef\XeTeXcharclassBoundary=4095 +\fi \ifdefined\XeTeXcharclassID\else \ifdefined\xtxHanGlue \let\XeTeXcharclassID\@ne @@ -288,6 +300,7 @@ \newXeTeXintercharclass\XeTeXcharclassID \newXeTeXintercharclass\XeTeXcharclassOP \newXeTeXintercharclass\XeTeXcharclassCL + \global\let\XeTeXcharclassCJ\XeTeXcharclassID \global\let\XeTeXcharclassEX\XeTeXcharclassCL \global\let\XeTeXcharclassIS\XeTeXcharclassCL \global\let\XeTeXcharclassNS\XeTeXcharclassCL @@ -364,10 +377,10 @@ \advance\count@\@ne \repeat % - \XeTeXinterchartoks\XPGKOcharclassAA\XeTeXcharclassID{\XPGKOstartID}% - \XeTeXinterchartoks\XPGKOcharclassAA\XeTeXcharclassOP{\XPGKOstopAA\XPGKOstartOP}% + \XeTeXinterchartoks\XPGKOcharclassAA\XeTeXcharclassID{\XPGKOstopAA\XPGKOlatincjk\XPGKOstartID}% + \XeTeXinterchartoks\XPGKOcharclassAA\XeTeXcharclassOP{\XPGKOstopAA\XPGKOhalfhalf\XPGKOstartOP}% \XeTeXinterchartoks\XPGKOcharclassAA\XeTeXcharclassCL{\XPGKOstopAA\XPGKOstartCL}% - \XeTeXinterchartoks\XPGKOcharclassAA\XPGKOcharclassMD{\XPGKOstopAA\XPGKOstartMD}% + \XeTeXinterchartoks\XPGKOcharclassAA\XPGKOcharclassMD{\XPGKOstopAA\XPGKOnobreak\XPGKOquarterquarter\XPGKOstartMD}% \XeTeXinterchartoks\XPGKOcharclassAA\XPGKOcharclassFS{\XPGKOstopAA\XPGKOstartFS}% \XeTeXinterchartoks\XPGKOcharclassAA\XPGKOcharclassAA{\XPGKOstartAA}% % @@ -377,7 +390,7 @@ \XeTeXinterchartoks\XeTeXcharclassID\XPGKOcharclassMD{\XPGKOstopID\XPGKOnobreak\XPGKOquarterquarter\XPGKOstartMD}% \XeTeXinterchartoks\XeTeXcharclassID\XPGKOcharclassFS{\XPGKOstopID\XPGKOstartFS}% \XeTeXinterchartoks\XeTeXcharclassID\XPGKOcharclassAO{\XPGKOstopID\XPGKOlatincjk}% - \XeTeXinterchartoks\XeTeXcharclassID\XPGKOcharclassAA{\XPGKOstartAA}% + \XeTeXinterchartoks\XeTeXcharclassID\XPGKOcharclassAA{\XPGKOstopID\XPGKOlatincjk\XPGKOstartAA}% % \XeTeXinterchartoks\XeTeXcharclassOP\XeTeXcharclassID{\XPGKOstopOP\XPGKOstartID}% \XeTeXinterchartoks\XeTeXcharclassOP\XeTeXcharclassOP{\XPGKOstopOP\XPGKOstartOP}% @@ -395,7 +408,7 @@ \XeTeXinterchartoks\XeTeXcharclassCL\XPGKOcharclassEX{\XPGKOstopCL\XPGKOnobreak\XPGKOhalfhalf}% \XeTeXinterchartoks\XeTeXcharclassCL\XPGKOcharclassAO{\XPGKOstopCL\XPGKOhalfhalf}% \XeTeXinterchartoks\XeTeXcharclassCL\XPGKOcharclassAC{\XPGKOstopCL\XPGKOnobreak\XPGKOhalfhalf}% - \XeTeXinterchartoks\XeTeXcharclassCL\XPGKOcharclassAA{\XPGKOstopCL\XPGKOstartAA}% + \XeTeXinterchartoks\XeTeXcharclassCL\XPGKOcharclassAA{\XPGKOstopCL\XPGKOhalfhalf\XPGKOstartAA}% % \XeTeXinterchartoks\XPGKOcharclassMD\XeTeXcharclassID{\XPGKOstopMD\XPGKOquarterquarter\XPGKOstartID}% \XeTeXinterchartoks\XPGKOcharclassMD\XeTeXcharclassOP{\XPGKOstopMD\XPGKOquarterquarter\XPGKOstartOP}% @@ -406,7 +419,7 @@ \XeTeXinterchartoks\XPGKOcharclassMD\XPGKOcharclassEX{\XPGKOstopMD\XPGKOnobreak\XPGKOquarterquarter}% \XeTeXinterchartoks\XPGKOcharclassMD\XPGKOcharclassAO{\XPGKOstopMD\XPGKOquarterquarter}% \XeTeXinterchartoks\XPGKOcharclassMD\XPGKOcharclassAC{\XPGKOstopMD\XPGKOnobreak\XPGKOquarterquarter}% - \XeTeXinterchartoks\XPGKOcharclassMD\XPGKOcharclassAA{\XPGKOstopMD\XPGKOstartAA}% + \XeTeXinterchartoks\XPGKOcharclassMD\XPGKOcharclassAA{\XPGKOstopMD\XPGKOquarterquarter\XPGKOstartAA}% % \XeTeXinterchartoks\XPGKOcharclassFS\XeTeXcharclassID{\XPGKOstopFS\XPGKOhalfzero\XPGKOstartID}% \XeTeXinterchartoks\XPGKOcharclassFS\XeTeXcharclassOP{\XPGKOstopFS\XPGKOhalfzero\XPGKOstartOP}% @@ -417,7 +430,7 @@ \XeTeXinterchartoks\XPGKOcharclassFS\XPGKOcharclassEX{\XPGKOstopFS\XPGKOnobreak\XPGKOhalfzero}% \XeTeXinterchartoks\XPGKOcharclassFS\XPGKOcharclassAO{\XPGKOstopFS\XPGKOhalfzero}% \XeTeXinterchartoks\XPGKOcharclassFS\XPGKOcharclassAC{\XPGKOstopFS\XPGKOnobreak\XPGKOhalfzero}% - \XeTeXinterchartoks\XPGKOcharclassFS\XPGKOcharclassAA{\XPGKOstopFS\XPGKOstartAA}% + \XeTeXinterchartoks\XPGKOcharclassFS\XPGKOcharclassAA{\XPGKOstopFS\XPGKOhalfzero\XPGKOstartAA}% % \XeTeXinterchartoks\XPGKOcharclassLD\XeTeXcharclassOP{\XPGKOhalfhalf\XPGKOstartOP}% \XeTeXinterchartoks\XPGKOcharclassLD\XPGKOcharclassMD{\XPGKOnobreak\XPGKOquarterquarter\XPGKOstartMD}% @@ -427,6 +440,7 @@ \XeTeXinterchartoks\XPGKOcharclassEX\XPGKOcharclassMD{\XPGKOnobreak\XPGKOquarterquarter\XPGKOstartMD}% \XeTeXinterchartoks\XPGKOcharclassEX\XPGKOcharclassAO{\XPGKOhalfhalf}% \XeTeXinterchartoks\XPGKOcharclassEX\XPGKOcharclassAC{\XPGKOnobreak\XPGKOhalfhalf}% + \XeTeXinterchartoks\XPGKOcharclassEX\XPGKOcharclassAA{\XPGKOhalfhalf\XPGKOstartAA}% % \XeTeXinterchartoks\XPGKOcharclassAO\XeTeXcharclassOP{\XPGKOnobreak\XPGKOhalfhalf\XPGKOstartOP}% \XeTeXinterchartoks\XPGKOcharclassAO\XPGKOcharclassMD{\XPGKOnobreak\XPGKOquarterquarter\XPGKOstartMD}% @@ -480,63 +494,66 @@ \@tmpa "FE13=\XeTeXcharclassID % ︓ PRESENTATION FORM FOR VERTICAL COLON \@tmpa "FE14=\XeTeXcharclassID % ︔ PRESENTATION FORM FOR VERTICAL SEMICOLON % CJ -\@tmpa "3041=\XeTeXcharclassID -\@tmpa "3043=\XeTeXcharclassID -\@tmpa "3045=\XeTeXcharclassID -\@tmpa "3047=\XeTeXcharclassID -\@tmpa "3049=\XeTeXcharclassID -\@tmpa "3063=\XeTeXcharclassID -\@tmpa "3083=\XeTeXcharclassID -\@tmpa "3085=\XeTeXcharclassID -\@tmpa "3087=\XeTeXcharclassID -\@tmpa "308E=\XeTeXcharclassID -\@tmpa "3095=\XeTeXcharclassID -\@tmpa "3096=\XeTeXcharclassID -\@tmpa "30A1=\XeTeXcharclassID -\@tmpa "30A3=\XeTeXcharclassID -\@tmpa "30A5=\XeTeXcharclassID -\@tmpa "30A7=\XeTeXcharclassID -\@tmpa "30A9=\XeTeXcharclassID -\@tmpa "30C3=\XeTeXcharclassID -\@tmpa "30E3=\XeTeXcharclassID -\@tmpa "30E5=\XeTeXcharclassID -\@tmpa "30E7=\XeTeXcharclassID -\@tmpa "30EE=\XeTeXcharclassID -\@tmpa "30F5=\XeTeXcharclassID -\@tmpa "30F6=\XeTeXcharclassID -\@tmpa "30FC=\XeTeXcharclassID -\count@"31F0 \loop - \expandafter\@tmpa\the\count@=\XeTeXcharclassID - \ifnum\count@<"31FF - \advance\count@\@ne - \repeat -\count@"FF67 \loop - \expandafter\@tmpa\the\count@=\XeTeXcharclassID - \ifnum\count@<"FF70 - \advance\count@\@ne - \repeat +\ifnum\the\XeTeXcharclass"3041=\XeTeXcharclassID \else + \@tmpa "3041=\XeTeXcharclassID % ぁ HIRAGANA LETTER SMALL A + \@tmpa "3043=\XeTeXcharclassID % ぃ HIRAGANA LETTER SMALL I + \@tmpa "3045=\XeTeXcharclassID % ぅ HIRAGANA LETTER SMALL U + \@tmpa "3047=\XeTeXcharclassID % ぇ HIRAGANA LETTER SMALL E + \@tmpa "3049=\XeTeXcharclassID % ぉ HIRAGANA LETTER SMALL O + \@tmpa "3063=\XeTeXcharclassID % っ HIRAGANA LETTER SMALL TU + \@tmpa "3083=\XeTeXcharclassID % ゃ HIRAGANA LETTER SMALL YA + \@tmpa "3085=\XeTeXcharclassID % ゅ HIRAGANA LETTER SMALL YU + \@tmpa "3087=\XeTeXcharclassID % ょ HIRAGANA LETTER SMALL YO + \@tmpa "308E=\XeTeXcharclassID % ゎ HIRAGANA LETTER SMALL WA + \@tmpa "3095=\XeTeXcharclassID % ゕ HIRAGANA LETTER SMALL KA + \@tmpa "3096=\XeTeXcharclassID % ゖ HIRAGANA LETTER SMALL KE + \@tmpa "30A1=\XeTeXcharclassID % ァ KATAKANA LETTER SMALL A + \@tmpa "30A3=\XeTeXcharclassID % ィ KATAKANA LETTER SMALL I + \@tmpa "30A5=\XeTeXcharclassID % ゥ KATAKANA LETTER SMALL U + \@tmpa "30A7=\XeTeXcharclassID % ェ KATAKANA LETTER SMALL E + \@tmpa "30A9=\XeTeXcharclassID % ォ KATAKANA LETTER SMALL O + \@tmpa "30C3=\XeTeXcharclassID % ッ KATAKANA LETTER SMALL TU + \@tmpa "30E3=\XeTeXcharclassID % ャ KATAKANA LETTER SMALL YA + \@tmpa "30E5=\XeTeXcharclassID % ュ KATAKANA LETTER SMALL YU + \@tmpa "30E7=\XeTeXcharclassID % ョ KATAKANA LETTER SMALL YO + \@tmpa "30EE=\XeTeXcharclassID % ヮ KATAKANA LETTER SMALL WA + \@tmpa "30F5=\XeTeXcharclassID % ヵ KATAKANA LETTER SMALL KA + \@tmpa "30F6=\XeTeXcharclassID % ヶ KATAKANA LETTER SMALL KE + \@tmpa "30FC=\XeTeXcharclassID % ー KATAKANA-HIRAGANA PROLONGED SOUND MARK + \count@"31F0 \loop + \expandafter\@tmpa\the\count@=\XeTeXcharclassID + \ifnum\count@<"31FF + \advance\count@\@ne + \repeat + \count@"FF67 \loop + \expandafter\@tmpa\the\count@=\XeTeXcharclassID + \ifnum\count@<"FF70 + \advance\count@\@ne + \repeat +\fi % -\@tmpa "28=\XPGKOcharclassAO % ( -\@tmpa "5B=\XPGKOcharclassAO % [ -\@tmpa "60=\XPGKOcharclassAO % ` -\@tmpa "7B=\XPGKOcharclassAO % { +\@tmpa "28=\XPGKOcharclassAO % ( LEFT PARENTHESIS +\@tmpa "5B=\XPGKOcharclassAO % [ LEFT SQUARE BRACKET +\@tmpa "60=\XPGKOcharclassAO % ` GRAVE ACCENT +\@tmpa "7B=\XPGKOcharclassAO % { LEFT CURLY BRACKET +\@tmpa "AB=\XPGKOcharclassAO % « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK % -\@tmpa "21=\XPGKOcharclassAC % ! -\@tmpa "27=\XPGKOcharclassAC % ' -\@tmpa "29=\XPGKOcharclassAC % ) -\@tmpa "2C=\XPGKOcharclassAC % , -\@tmpa "2E=\XPGKOcharclassAC % . -\@tmpa "3B=\XPGKOcharclassAC % ; -\@tmpa "3F=\XPGKOcharclassAC % ? -\@tmpa "5D=\XPGKOcharclassAC % ] -\@tmpa "7D=\XPGKOcharclassAC % } +\@tmpa "21=\XPGKOcharclassAC % ! EXCLAMATION MARK +\@tmpa "27=\XPGKOcharclassAC % ' APOSTROPHE +\@tmpa "29=\XPGKOcharclassAC % ) RIGHT PARENTHESIS +\@tmpa "2C=\XPGKOcharclassAC % , COMMA +\@tmpa "2E=\XPGKOcharclassAC % . FULL STOP +\@tmpa "3B=\XPGKOcharclassAC % ; SEMICOLON +\@tmpa "3F=\XPGKOcharclassAC % ? QUESTION MARK +\@tmpa "5D=\XPGKOcharclassAC % ] RIGHT SQUARE BRACKET +\@tmpa "7D=\XPGKOcharclassAC % } RIGHT CURLY BRACKET +\@tmpa "BB=\XPGKOcharclassAC % » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK % \@tmpa "2018=\XeTeXcharclassOP % ‘ LEFT SINGLE QUOTATION MARK \@tmpa "201C=\XeTeXcharclassOP % “ LEFT DOUBLE QUOTATION MARK % \@tmpa "2019=\XeTeXcharclassCL % ’ RIGHT SINGLE QUOTATION MARK \@tmpa "201D=\XeTeXcharclassCL % ” RIGHT DOUBLE QUOTATION MARK -\@tmpa "FE10=\XeTeXcharclassCL % ︐ PRESENTATION FORM FOR VERTICAL COMMA % NS \@tmpa "00B7=\XPGKOcharclassMD % · MIDDLE DOT \@tmpa "30FB=\XPGKOcharclassMD % ・ KATAKANA MIDDLE DOT @@ -593,76 +610,208 @@ local glyph_id = node.id("glyph") local hbox_id = node.id("hlist") local vbox_id = node.id("vlist") +local glue_id = node.id("glue") +local penalty_id = node.id("penalty") +local disc_id = node.id("disc") local attr_korean = luatexbase.attributes["xpg@attr@korean"] local attr_josa = luatexbase.attributes["xpg@attr@autojosa"] local nobr_after = { - [0x28] = 1, [0x2D] = 1, [0x2F] = 1, [0x3C] = 1, [0x5B] = 1, - [0x5C] = 1, [0x60] = 1, [0x7B] = 1, [0x7E] = 1, [0x2013] = 1, - [0x2018] = 1, [0x201C] = 1, [0x2329] = 1, [0x3008] = 1, - [0x300A] = 1, [0x300C] = 1, [0x300E] = 1, [0x3010] = 1, - [0x3014] = 1, [0x3016] = 1, [0x3018] = 1, [0x301A] = 1, - [0x301D] = 1, [0xFF08] = 1, [0xFF1C] = 1, [0xFF3B] = 1, - [0xFF5B] = 1, [0xFF5F] = 1, [0xFF62] = 1, + [0x28] = 1, % ( LEFT PARENTHESIS + [0x3C] = 1, % < LESS-THAN SIGN + [0x5B] = 1, % [ LEFT SQUARE BRACKET + [0x60] = 1, % ` GRAVE ACCENT + [0x7B] = 1, % { LEFT CURLY BRACKET + [0xAB] = 1, % « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + [0x2018] = 1, % ‘ LEFT SINGLE QUOTATION MARK + [0x201C] = 1, % “ LEFT DOUBLE QUOTATION MARK + [0x2329] = 1, % 〈 LEFT-POINTING ANGLE BRACKET + [0x3008] = 1, % 〈 LEFT ANGLE BRACKET + [0x300A] = 1, % 《 LEFT DOUBLE ANGLE BRACKET + [0x300C] = 1, % 「 LEFT CORNER BRACKET + [0x300E] = 1, % 『 LEFT WHITE CORNER BRACKET + [0x3010] = 1, % 【 LEFT BLACK LENTICULAR BRACKET + [0x3014] = 1, % 〔 LEFT TORTOISE SHELL BRACKET + [0x3016] = 1, % 〖 LEFT WHITE LENTICULAR BRACKET + [0x3018] = 1, % 〘 LEFT WHITE TORTOISE SHELL BRACKET + [0x301A] = 1, % 〚 LEFT WHITE SQUARE BRACKET + [0x301D] = 1, % 〝 REVERSED DOUBLE PRIME QUOTATION MARK + [0xFE17] = 1, % ︗ PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET + [0xFE35] = 1, % ︵ PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS + [0xFE37] = 1, % ︷ PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET + [0xFE39] = 1, % ︹ PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET + [0xFE3B] = 1, % ︻ PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET + [0xFE3D] = 1, % ︽ PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET + [0xFE3F] = 1, % ︿ PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET + [0xFE41] = 1, % ﹁ PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET + [0xFE43] = 1, % ﹃ PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET + [0xFE47] = 1, % ﹇ PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET + [0xFE59] = 1, % ﹙ SMALL LEFT PARENTHESIS + [0xFE5B] = 1, % ﹛ SMALL LEFT CURLY BRACKET + [0xFE5D] = 1, % ﹝ SMALL LEFT TORTOISE SHELL BRACKET + [0xFF08] = 1, % ( FULLWIDTH LEFT PARENTHESIS + [0xFF3B] = 1, % [ FULLWIDTH LEFT SQUARE BRACKET + [0xFF5B] = 1, % { FULLWIDTH LEFT CURLY BRACKET + [0xFF5F] = 1, % ⦅ FULLWIDTH LEFT WHITE PARENTHESIS + [0xFF62] = 1, % 「 HALFWIDTH LEFT CORNER BRACKET } -local nobr_before = { - [0x21] = 1, [0x22] = 1, [0x27] = 1, [0x29] = 1, [0x2C] = 1, - [0x2D] = 1, [0x2E] = 1, [0x2F] = 1, [0x3A] = 1, [0x3B] = 1, - [0x3E] = 1, [0x3F] = 1, [0x5C] = 1, [0x5D] = 1, [0x7D] = 1, - [0x7E] = 1, [0xB7] = 1, [0x2013] = 1, [0x2014] = 1, [0x2015] = 1, - [0x2019] = 1, [0x201D] = 1, [0x2025] = 1, [0x2026] = 1, - [0x232A] = 1, [0x3001] = 1, [0x3002] = 1, [0x3005] = 1, - [0x3009] = 1, [0x300B] = 1, [0x300D] = 1, [0x300F] = 1, - [0x3011] = 1, [0x3015] = 1, [0x3017] = 1, [0x3019] = 1, - [0x301B] = 1, [0x301C] = 1, [0x301E] = 1, [0x301F] = 1, - [0x3035] = 1, [0x303B] = 1, [0x303C] = 1, [0x3041] = 2, - [0x3043] = 2, [0x3045] = 2, [0x3047] = 2, [0x3049] = 2, - [0x3063] = 2, [0x3083] = 2, [0x3085] = 2, [0x3087] = 2, - [0x308E] = 2, [0x3095] = 2, [0x3096] = 2, [0x3099] = 1, - [0x309A] = 1, [0x309B] = 1, [0x309C] = 1, [0x309D] = 1, - [0x309E] = 1, [0x30A0] = 1, [0x30A1] = 2, [0x30A3] = 2, - [0x30A5] = 2, [0x30A7] = 2, [0x30A9] = 2, [0x30C3] = 2, - [0x30E3] = 2, [0x30E5] = 2, [0x30E7] = 2, [0x30EE] = 2, - [0x30F5] = 2, [0x30F6] = 2, [0x30FB] = 1, [0x30FC] = 1, - [0x30FD] = 1, [0x30FE] = 1, [0x31F0] = 2, [0x31F1] = 2, - [0x31F2] = 2, [0x31F3] = 2, [0x31F4] = 2, [0x31F5] = 2, - [0x31F6] = 2, [0x31F7] = 2, [0x31F8] = 2, [0x31F9] = 2, - [0x31FA] = 2, [0x31FB] = 1, [0x31FC] = 1, [0x31FD] = 1, - [0x31FE] = 1, [0x31FF] = 1, [0xFF01] = 1, [0xFF09] = 1, - [0xFF0C] = 1, [0xFF0E] = 1, [0xFF1A] = 1, [0xFF1B] = 1, - [0xFF1F] = 1, [0xFF3D] = 1, [0xFF5D] = 1, [0xFF60] = 1, - [0xFF61] = 1, [0xFF63] = 1, [0xFF64] = 1, [0xFF65] = 1, - [0xFF9E] = 1, [0xFF9F] = 1, -} -for i=0x1160, 0x11FF do nobr_before[i] = 2 end -for i=0xD7B0, 0xD7FB do nobr_before[i] = 2 end -for i=0x302A, 0x302F do nobr_before[i] = 1 end +local nobr_before = setmetatable({ + [0x21] = 1, % ! EXCLAMATION MARK + [0x22] = 1, % " QUOTATION MARK + [0x27] = 1, % ' APOSTROPHE + [0x29] = 1, % ) RIGHT PARENTHESIS + [0x2C] = 1, % , COMMA + [0x2D] = 0, % - HYPHEN-MINUS + [0x2E] = 1, % . FULL STOP + [0x2F] = 0, % / SOLIDUS + [0x3A] = 0, % : COLON + [0x3B] = 1, % ; SEMICOLON + [0x3E] = 1, % > GREATER-THAN SIGN + [0x3F] = 1, % ? QUESTION MARK + [0x5C] = 0, % \ REVERSE SOLIDUS + [0x5D] = 1, % ] RIGHT SQUARE BRACKET + [0x7D] = 1, % } RIGHT CURLY BRACKET + [0x7E] = 0, % ~ TILDE + [0xB7] = 1, % · MIDDLE DOT + [0xBB] = 1, % » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + [0x2013] = 0, % – EN DASH + [0x2014] = 0, % — EM DASH + [0x2015] = 1, % ― HORIZONTAL BAR + [0x2019] = 1, % ’ RIGHT SINGLE QUOTATION MARK + [0x201D] = 1, % ” RIGHT DOUBLE QUOTATION MARK + [0x2025] = 1, % ‥ TWO DOT LEADER + [0x2026] = 1, % … HORIZONTAL ELLIPSIS + [0x232A] = 1, % 〉 RIGHT-POINTING ANGLE BRACKET + [0x3001] = 1, % 、 IDEOGRAPHIC COMMA + [0x3002] = 1, % 。 IDEOGRAPHIC FULL STOP + [0x3005] = 1, % 々 IDEOGRAPHIC ITERATION MARK + [0x3009] = 1, % 〉 RIGHT ANGLE BRACKET + [0x300B] = 1, % 》 RIGHT DOUBLE ANGLE BRACKET + [0x300D] = 1, % 」 RIGHT CORNER BRACKET + [0x300F] = 1, % 』 RIGHT WHITE CORNER BRACKET + [0x3011] = 1, % 】 RIGHT BLACK LENTICULAR BRACKET + [0x3015] = 1, % 〕 RIGHT TORTOISE SHELL BRACKET + [0x3017] = 1, % 〗 RIGHT WHITE LENTICULAR BRACKET + [0x3019] = 1, % 〙 RIGHT WHITE TORTOISE SHELL BRACKET + [0x301B] = 1, % 〛 RIGHT WHITE SQUARE BRACKET + [0x301C] = 1, % 〜 WAVE DASH + [0x301E] = 1, % 〞 DOUBLE PRIME QUOTATION MARK + [0x301F] = 1, % 〟 LOW DOUBLE PRIME QUOTATION MARK + [0x3035] = 1, % 〵 VERTICAL KANA REPEAT MARK LOWER HALF + [0x303B] = 1, % 〻 VERTICAL IDEOGRAPHIC ITERATION MARK + [0x303C] = 1, % 〼 MASU MARK + [0x3041] = 3, % ぁ HIRAGANA LETTER SMALL A + [0x3043] = 3, % ぃ HIRAGANA LETTER SMALL I + [0x3045] = 3, % ぅ HIRAGANA LETTER SMALL U + [0x3047] = 3, % ぇ HIRAGANA LETTER SMALL E + [0x3049] = 3, % ぉ HIRAGANA LETTER SMALL O + [0x3063] = 3, % っ HIRAGANA LETTER SMALL TU + [0x3083] = 3, % ゃ HIRAGANA LETTER SMALL YA + [0x3085] = 3, % ゅ HIRAGANA LETTER SMALL YU + [0x3087] = 3, % ょ HIRAGANA LETTER SMALL YO + [0x308E] = 3, % ゎ HIRAGANA LETTER SMALL WA + [0x3095] = 3, % ゕ HIRAGANA LETTER SMALL KA + [0x3096] = 3, % ゖ HIRAGANA LETTER SMALL KE + [0x3099] = 1, % COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + [0x309A] = 1, % COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + [0x309B] = 1, % ゛ KATAKANA-HIRAGANA VOICED SOUND MARK + [0x309C] = 1, % ゜ KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + [0x309D] = 1, % ゝ HIRAGANA ITERATION MARK + [0x309E] = 1, % ゞ HIRAGANA VOICED ITERATION MARK + [0x30A0] = 1, % ゠ KATAKANA-HIRAGANA DOUBLE HYPHEN + [0x30A1] = 3, % ァ KATAKANA LETTER SMALL A + [0x30A3] = 3, % ィ KATAKANA LETTER SMALL I + [0x30A5] = 3, % ゥ KATAKANA LETTER SMALL U + [0x30A7] = 3, % ェ KATAKANA LETTER SMALL E + [0x30A9] = 3, % ォ KATAKANA LETTER SMALL O + [0x30C3] = 3, % ッ KATAKANA LETTER SMALL TU + [0x30E3] = 3, % ャ KATAKANA LETTER SMALL YA + [0x30E5] = 3, % ュ KATAKANA LETTER SMALL YU + [0x30E7] = 3, % ョ KATAKANA LETTER SMALL YO + [0x30EE] = 3, % ヮ KATAKANA LETTER SMALL WA + [0x30F5] = 3, % ヵ KATAKANA LETTER SMALL KA + [0x30F6] = 3, % ヶ KATAKANA LETTER SMALL KE + [0x30FB] = 1, % ・ KATAKANA MIDDLE DOT + [0x30FC] = 1, % ー KATAKANA-HIRAGANA PROLONGED SOUND MARK + [0x30FD] = 1, % ヽ KATAKANA ITERATION MARK + [0x30FE] = 1, % ヾ KATAKANA VOICED ITERATION MARK + [0xFE30] = 1, % ︰ PRESENTATION FORM FOR VERTICAL TWO DOT LEADER + [0xFE31] = 1, % ︱ PRESENTATION FORM FOR VERTICAL EM DASH + [0xFE32] = 1, % ︲ PRESENTATION FORM FOR VERTICAL EN DASH + [0xFE36] = 1, % ︶ PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS + [0xFE38] = 1, % ︸ PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET + [0xFE3A] = 1, % ︺ PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET + [0xFE3C] = 1, % ︼ PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET + [0xFE3E] = 1, % ︾ PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET + [0xFE40] = 1, % ﹀ PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET + [0xFE42] = 1, % ﹂ PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET + [0xFE44] = 1, % ﹄ PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET + [0xFE48] = 1, % ﹈ PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET + [0xFE5A] = 1, % ﹚ SMALL RIGHT PARENTHESIS + [0xFE5C] = 1, % ﹜ SMALL RIGHT CURLY BRACKET + [0xFE5E] = 1, % ﹞ SMALL RIGHT TORTOISE SHELL BRACKET + [0xFF01] = 1, % ! FULLWIDTH EXCLAMATION MARK + [0xFF09] = 1, % ) FULLWIDTH RIGHT PARENTHESIS + [0xFF0C] = 1, % , FULLWIDTH COMMA + [0xFF0E] = 1, % . FULLWIDTH FULL STOP + [0xFF1A] = 1, % : FULLWIDTH COLON + [0xFF1B] = 1, % ; FULLWIDTH SEMICOLON + [0xFF1F] = 1, % ? FULLWIDTH QUESTION MARK + [0xFF3D] = 1, % ] FULLWIDTH RIGHT SQUARE BRACKET + [0xFF5D] = 1, % } FULLWIDTH RIGHT CURLY BRACKET + [0xFF60] = 1, % ⦆ FULLWIDTH RIGHT WHITE PARENTHESIS + [0xFF61] = 1, % 。 HALFWIDTH IDEOGRAPHIC FULL STOP + [0xFF63] = 1, % 」 HALFWIDTH RIGHT CORNER BRACKET + [0xFF64] = 1, % 、 HALFWIDTH IDEOGRAPHIC COMMA + [0xFF65] = 1, % ・ HALFWIDTH KATAKANA MIDDLE DOT + [0xFF9E] = 1, % ゙ HALFWIDTH KATAKANA VOICED SOUND MARK + [0xFF9F] = 1, % ゚ HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +}, { __index = function(_,c) + if c >= 0x1160 and c <= 0x11FF then return 2 end + if c >= 0xD7B0 and c <= 0xD7FF then return 2 end + if c >= 0x302A and c <= 0x302F then return 1 end + if c >= 0x31F0 and c <= 0x31FF then return 3 end + if c >= 0xFF67 and c <= 0xFF70 then return 3 end + if c >= 0xFE00 and c <= 0xFE0F then return 1 end + if c >= 0xFE10 and c <= 0xFE19 and not (c == 0xFE17) then return 1 end + if c >= 0xFE50 and c <= 0xFE58 then return 1 end + if c >= 0xE0100 and c <= 0xE01EF then return 1 end + end +}) local function is_cjk (c) - return (c >= 0xAC00 and c <= 0xD7A3) - or (c >= 0x1100 and c <= 0x115F) - or (c >= 0xA960 and c <= 0xA97C) - or (c >= 0x3400 and c <= 0x9FFF) + return (c >= 0xAC00 and c <= 0xD7FF) + or (c >= 0x1100 and c <= 0x11FF) + or (c >= 0xA960 and c <= 0xA97F) + or (c >= 0x2E80 and c <= 0x9FFF) or (c >= 0xF900 and c <= 0xFAFF) - or (c >= 0x2E80 and c <= 0x2FFF) - or (c >= 0x3040 and c <= 0x30FF) - or (c >= 0x20000 and c <= 0x2CEAF) - or (c >= 0x2F800 and c <= 0x2FA1F) - or (nobr_after[c] and c > 0xFF) - or (nobr_before[c] and c > 0xFF) + or (c >= 0xFE10 and c <= 0xFE1F) + or (c >= 0xFE30 and c <= 0xFE6F) + or (c >= 0xFF00 and c <= 0xFFEF) + or (c >= 0x1F100 and c <= 0x1F2FF) + or (c >= 0x20000 and c <= 0x2FA1F) + or (nobr_after[c] and c > 0x2014) + or (nobr_before[c] and c > 0x2014) end local charclass = setmetatable({ [0x2018] = 1, [0x201C] = 1, [0x2329] = 1, [0x3008] = 1, [0x300A] = 1, [0x300C] = 1, [0x300E] = 1, [0x3010] = 1, [0x3014] = 1, [0x3016] = 1, [0x3018] = 1, [0x301A] = 1, - [0x301D] = 1, [0xFF08] = 1, [0xFF3B] = 1, [0xFF5B] = 1, - [0xFF5F] = 1, [0xFF62] = 1, [0x2019] = 2, [0x201D] = 2, - [0x232A] = 2, [0x3001] = 2, [0x3009] = 2, [0x300B] = 2, - [0x300D] = 2, [0x300F] = 2, [0x3011] = 2, [0x3015] = 2, - [0x3017] = 2, [0x3019] = 2, [0x301B] = 2, [0x301E] = 2, - [0x301F] = 2, [0xFF09] = 2, [0xFF0C] = 2, [0xFF3D] = 2, - [0xFF5D] = 2, [0xFF60] = 2, [0xFF63] = 2, [0xFF64] = 2, - [0x00B7] = 3, [0x30FB] = 3, [0xFF1A] = 3, [0xFF1B] = 3, - [0xFF65] = 3, [0x3002] = 4, [0xFF0E] = 4, [0xFF61] = 4, - [0x2015] = 5, [0x2025] = 5, [0x2026] = 5, [0xFF01] = 6, + [0x301D] = 1, [0xFE17] = 1, [0xFE35] = 1, [0xFE37] = 1, + [0xFE39] = 1, [0xFE3B] = 1, [0xFE3D] = 1, [0xFE3F] = 1, + [0xFE41] = 1, [0xFE43] = 1, [0xFE47] = 1, [0xFF08] = 1, + [0xFF3B] = 1, [0xFF5B] = 1, [0xFF5F] = 1, [0xFF62] = 1, + [0x2019] = 2, [0x201D] = 2, [0x232A] = 2, [0x3001] = 2, + [0x3009] = 2, [0x300B] = 2, [0x300D] = 2, [0x300F] = 2, + [0x3011] = 2, [0x3015] = 2, [0x3017] = 2, [0x3019] = 2, + [0x301B] = 2, [0x301E] = 2, [0x301F] = 2, [0xFE10] = 2, + [0xFE11] = 2, [0xFE18] = 2, [0xFE36] = 2, [0xFE38] = 2, + [0xFE3A] = 2, [0xFE3C] = 2, [0xFE3E] = 2, [0xFE40] = 2, + [0xFE42] = 2, [0xFE44] = 2, [0xFE48] = 2, [0xFF09] = 2, + [0xFF0C] = 2, [0xFF3D] = 2, [0xFF5D] = 2, [0xFF60] = 2, + [0xFF63] = 2, [0xFF64] = 2, [0x00B7] = 3, [0x30FB] = 3, + [0xFF1A] = 3, [0xFF1B] = 3, [0xFF65] = 3, [0x3002] = 4, + [0xFE12] = 4, [0xFF0E] = 4, [0xFF61] = 4, [0x2015] = 5, + [0x2025] = 5, [0x2026] = 5, [0xFE19] = 5, [0xFE30] = 5, + [0xFE31] = 5, [0xFE15] = 6, [0xFE16] = 6, [0xFF01] = 6, [0xFF1F] = 6, }, { __index = function() return 0 end }) local intercharclass = { [0] = @@ -679,13 +828,13 @@ local function get_new_penalty (p) penalty.penalty = p return penalty end -local function get_new_glue (wd, st, sh) +local function get_new_glue (wd, st, sh, sto, sho) local glue = node.new("glue") - local spec = node.new("glue_spec") - spec.width = wd - spec.stretch = st - spec.shrink = sh - glue.spec = spec + glue.width = wd or 0 + glue.stretch = st or 0 + glue.shrink = sh or 0 + glue.stretch_order = sto or 0 + glue.shrink_order = sho or 0 return glue end local function get_font_size (fid, space) @@ -703,9 +852,7 @@ local function glyph_to_box (head, curr, class) local size = get_font_size(g.font) head, curr = node.remove(head, curr) g.next, g.prev = nil, nil - local hss = get_new_glue(0, 65536, 65536) - hss.spec.stretch_order = 2 - hss.spec.shrink_order = 2 + local hss = get_new_glue(0, 65536, 65536, 2, 2) if class == 1 then h, hss.next, g.prev = hss, g, hss elseif class == 2 or class == 4 then @@ -714,6 +861,7 @@ local function glyph_to_box (head, curr, class) local hss2 = node.copy(hss) h, hss.next, g.prev, g.next, hss2.prev = hss, g, hss, hss2, g end + h = nodes.simple_font_handler(h) local box = node.hpack(h, size, "exactly") head, curr = node.insert_before(head, curr, box) return head, curr @@ -739,35 +887,64 @@ local function insert_penalty_glue (head, curr, f, var, x) if x then glue = get_new_glue(size/2, size/4, size/8) else - glue = get_new_glue(0, size/5, size/50) + glue = get_new_glue(0, size/10, size/50) end head, curr = node.insert_after(head, curr, glue) return head, curr end +local function avoid_widow_char (head) + local curr = node.tail(head) + while curr do + if curr.id == glyph_id then + local c = curr.char or 0 + if not nobr_before[c] or nobr_before[c] == 3 then + local var = node.has_attribute(curr, attr_korean) + if var and is_cjk(c) then + curr = curr.prev + if curr and curr.id == glue_id then + curr = curr.prev + if curr then + local pv = var == 1 and 500 or 1000 + if curr.id == penalty_id then + if curr.penalty < pv then curr.penalty = pv end + else + node.insert_after(head, curr, get_new_penalty(pv)) + end + end + end + end + break + end + end + curr = curr.prev + end +end local function korean_break (head, lb) local curr = head while curr do if curr.id == glyph_id then local var = node.has_attribute(curr, attr_korean) if var then - local c, f = curr.char, curr.font - local cc = charclass[c] + local c, f = curr.char or 0, curr.font or 0 + local cc, cjkc = charclass[c], is_cjk(c) if var > 0 and cc > 0 and cc < 5 then head, curr = glyph_to_box(head, curr, cc) end local next = curr.next if next and next.id == glyph_id then - local n = next.char + local n = next.char or 0 local nc = charclass[n] local nobr = nobr_before[n] or nobr_after[c] if var > 0 and intercharclass[cc][nc] then head, curr = insert_cjk_penalty_glue(head, curr, f, var, cc, nc, nobr) elseif not nobr then - local cjkc, cjkn = is_cjk(c), is_cjk(n) - if var > 0 and (cjkc or cjkn) and not (cjkc and cjkn) then - head, curr = insert_penalty_glue(head, curr, f, var, true) - elseif lb and (cjkc or cjkn) then - head, curr = insert_penalty_glue(head, curr, f, var) + local cjkn = is_cjk(n) + if cjkc or cjkn then + if var > 0 and not (cjkc and cjkn) and not (nobr_before[c] == 0) then + head, curr = insert_penalty_glue(head, curr, f, var, true) + elseif lb then + head, curr = insert_penalty_glue(head, curr, f, var) + end end end end @@ -775,6 +952,7 @@ local function korean_break (head, lb) end curr = curr.next end + if lb then avoid_widow_char(head) end return head end local josa_table = { @@ -834,9 +1012,9 @@ local josa_code = setmetatable({ local function get_prev_char (p) while p do if p.id == glyph_id then - local pc = p.char + local pc = p.char or 0 if not nobr_after[pc] then - if not nobr_before[pc] or nobr_before[pc] == 2 then + if not nobr_before[pc] or nobr_before[pc] >= 2 then return pc end end @@ -853,13 +1031,13 @@ local function auto_josa (head) if curr.id == glyph_id then local josa = node.has_attribute(curr, attr_josa) if josa then - local cc = curr.char + local cc = curr.char or 0 if josa == 0 then josa = josa_code[get_prev_char(curr.prev) or 0x30] end if cc == 0xC774 then local n = curr.next - if n and n.id == glyph_id and n.char == 0xB77C then + if n and n.char and n.char >= 0xAC00 and n.char <= 0xD7A3 then else cc = 0xAC00 end @@ -886,8 +1064,8 @@ local function reorder_tm (head) local curr, tone = node.tail(head) while curr do if curr.id == glyph_id and node.has_attribute(curr, attr_korean) then - local c, wd = curr.char, curr.width - if (c == 0x302E or c == 0x302F) and wd and wd > 0 then + local c, wd = curr.char or 0, curr.width or 0 + if (c == 0x302E or c == 0x302F) and wd > 0 then tone = curr elseif tone and not nobr_before[c] then head = node.remove(head, tone) @@ -916,6 +1094,24 @@ else luatexbase.add_to_callback(name, func, desc, 1) end end +prepend_to_callback ("hyphenate", + function(head) + local in_callback = luatexbase.in_callback or luatexbase.priority_in_callback + if in_callback("hyphenate", "polyglossia.disable_hyphenation") then + return false + end + local curr = head + while curr do + if curr.id == glyph_id and node.has_attribute(curr, attr_korean) and is_cjk(curr.char or 0) then + if curr.subtype == 1 then + curr.subtype = 0 + end + end + curr = curr.next + end + lang.hyphenate(head) + end, + "polyglossia.lang_korean") prepend_to_callback ("pre_linebreak_filter", function(head) head = auto_josa(head) |