From ab18ee6dfc2bd1885db2488daaae2f65d24235a8 Mon Sep 17 00:00:00 2001 From: Chia-liang Kao Date: Sun, 5 Jan 2014 10:26:20 -0800 Subject: [PATCH] Add Han.js 2.2.3 --- ajax/libs/Han/2.2.3/fonts/zhuyin.eot | Bin 0 -> 52290 bytes ajax/libs/Han/2.2.3/fonts/zhuyin.ttf | Bin 0 -> 52016 bytes ajax/libs/Han/2.2.3/han.css | 2277 ++++++++++++++++++++++++++ ajax/libs/Han/2.2.3/js/han.js | 1395 ++++++++++++++++ ajax/libs/Han/package.json | 25 + 5 files changed, 3697 insertions(+) create mode 100644 ajax/libs/Han/2.2.3/fonts/zhuyin.eot create mode 100644 ajax/libs/Han/2.2.3/fonts/zhuyin.ttf create mode 100644 ajax/libs/Han/2.2.3/han.css create mode 100644 ajax/libs/Han/2.2.3/js/han.js create mode 100644 ajax/libs/Han/package.json diff --git a/ajax/libs/Han/2.2.3/fonts/zhuyin.eot b/ajax/libs/Han/2.2.3/fonts/zhuyin.eot new file mode 100644 index 0000000000000000000000000000000000000000..b2cf183f05b4329d4e237a02f91198828e4a0a82 GIT binary patch literal 52290 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�=}EwUHdooN%l$L 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 literal 0 HcmV?d00001 diff --git a/ajax/libs/Han/2.2.3/han.css b/ajax/libs/Han/2.2.3/han.css new file mode 100644 index 000000000..082530072 --- /dev/null +++ b/ajax/libs/Han/2.2.3/han.css @@ -0,0 +1,2277 @@ +@charset "UTF-8"; +/*! + * 漢字標準格式 v2.2.3 + * --- + * Hanzi-optimised CSS Mode + * + * + * + * Lisence: MIT Lisence + * Last Modified: 2014/1/1 + * + */ +/*! normalize.css v2.1.3 | MIT License | git.io/normalize */ +/* ========================================================================== + HTML5 display definitions + ========================================================================== */ +/** + * Correct `block` display not defined in IE 8/9. + */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block; } + +/** + * Correct `inline-block` display not defined in IE 8/9. + */ +audio, +canvas, +video { + display: inline-block; } + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ +audio:not([controls]) { + display: none; + height: 0; } + +/** + * Address `[hidden]` styling not present in IE 8/9. + * Hide the `template` element in IE, Safari, and Firefox < 22. + */ +[hidden], +template { + display: none; } + +/* ========================================================================== + Base + ========================================================================== */ +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ +html { + font-family: sans-serif; + /* 1 */ + -ms-text-size-adjust: 100%; + /* 2 */ + -webkit-text-size-adjust: 100%; + /* 2 */ } + +/** + * Remove default margin. + */ +body { + margin: 0; } + +/* ========================================================================== + Links + ========================================================================== */ +/** + * Remove the gray background color from active links in IE 10. + */ +a { + background: transparent; } + +/** + * Address `outline` inconsistency between Chrome and other browsers. + */ +a:focus { + outline: thin dotted; } + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ +a:active, +a:hover { + outline: 0; } + +/* ========================================================================== + Typography + ========================================================================== */ +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari 5, and Chrome. + */ +h1 { + font-size: 2em; + margin: 0.67em 0; } + +/** + * Address styling not present in IE 8/9, Safari 5, and Chrome. + */ +abbr[title] { + border-bottom: 1px dotted; } + +/** + * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. + */ +b, +strong { + font-weight: bold; } + +/** + * Address styling not present in Safari 5 and Chrome. + */ +dfn { + font-style: italic; } + +/** + * Address differences between Firefox and other browsers. + */ +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; } + +/** + * Address styling not present in IE 8/9. + */ +mark { + background: #ff0; + color: #000; } + +/** + * Correct font family set oddly in Safari 5 and Chrome. + */ +code, +kbd, +pre, +samp { + font-family: monospace, serif; + font-size: 1em; } + +/** + * Improve readability of pre-formatted text in all browsers. + */ +pre { + white-space: pre-wrap; } + +/** + * Set consistent quote types. + */ +q { + quotes: "\201C" "\201D" "\2018" "\2019"; } + +/** + * Address inconsistent and variable font size in all browsers. + */ +small { + font-size: 80%; } + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; } + +sup { + top: -0.5em; } + +sub { + bottom: -0.25em; } + +/* ========================================================================== + Embedded content + ========================================================================== */ +/** + * Remove border when inside `a` element in IE 8/9. + */ +img { + border: 0; } + +/** + * Correct overflow displayed oddly in IE 9. + */ +svg:not(:root) { + overflow: hidden; } + +/* ========================================================================== + Figures + ========================================================================== */ +/** + * Address margin not present in IE 8/9 and Safari 5. + */ +figure { + margin: 0; } + +/* ========================================================================== + Forms + ========================================================================== */ +/** + * Define consistent border, margin, and padding. + */ +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; } + +/** + * 1. Correct `color` not being inherited in IE 8/9. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ +legend { + border: 0; + /* 1 */ + padding: 0; + /* 2 */ } + +/** + * 1. Correct font family not being inherited in all browsers. + * 2. Correct font size not being inherited in all browsers. + * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. + */ +button, +input, +select, +textarea { + font-family: inherit; + /* 1 */ + font-size: 100%; + /* 2 */ + margin: 0; + /* 3 */ } + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ +button, +input { + line-height: normal; } + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. + * Correct `select` style inheritance in Firefox 4+ and Opera. + */ +button, +select { + text-transform: none; } + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + /* 2 */ + cursor: pointer; + /* 3 */ } + +/** + * Re-set default cursor for disabled elements. + */ +button[disabled], +html input[disabled] { + cursor: default; } + +/** + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + /* 1 */ + padding: 0; + /* 2 */ } + +/** + * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome + * (include `-moz` to future-proof). + */ +input[type="search"] { + -webkit-appearance: textfield; + /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + /* 2 */ + box-sizing: content-box; } + +/** + * Remove inner padding and search cancel button in Safari 5 and Chrome + * on OS X. + */ +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; } + +/** + * Remove inner padding and border in Firefox 4+. + */ +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; } + +/** + * 1. Remove default vertical scrollbar in IE 8/9. + * 2. Improve readability and alignment in all browsers. + */ +textarea { + overflow: auto; + /* 1 */ + vertical-align: top; + /* 2 */ } + +/* ========================================================================== + Tables + ========================================================================== */ +/** + * Remove most spacing between table cells. + */ +table { + border-collapse: collapse; + border-spacing: 0; } + +/* + * @font-face字體設定 + * --- + * @font-face settings + * + */ +/* --------------------------------------- + `unicode-range` + --------------------------------------- + 瀏覽器若支援,[A-Za-z]顯示為無襯線字體; + 若不支援,顯示為襯線字體。 + --------------------------------------- */ +@font-face { + font-family: han-unicode-range; + src: local(Arial), local("Droid Sans"); } + +@font-face { + font-family: han-unicode-range; + src: local("Times New Roman"), local(Times), local("Droid Serif"); + unicode-range: U+270C; } + +/* --------------------------------------- + 四大字體集及標點 + --- + The Four Typefaces & Biaodian + --------------------------------------- */ +/* --------------------------------------- + 四大字體集・黑體 + --- + The Four Typefaces: Heiti (Gothic) + --------------------------------------- */ +@font-face { + font-family: 'Han Heiti'; + src: local("Hiragino Sans GB"), local("Lantinghei TC"), local("Lantinghei SC"), local("Heiti SC"), local("Heiti TC"), local("Microsoft Yahei"), local("Microsoft Jhenghei"), local("Droid Sans Fallback"); } + +@font-face { + unicode-range: U+4E00-9FFF, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3400-4DB5, U+9FBC-9FC2, U+9FC4-9FC5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+3040-309E, U+30A1-30FE, U+3007; + font-family: 'Han Heiti'; + src: local(YuGothic), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"); } + +@font-face { + font-family: 'Han Heiti CNS'; + src: local("Hiragino Sans GB"), local("Lantinghei TC"), local("Heiti TC"), local("Microsoft Jhenghei"), local("Heiti SC"), local("Lantinghei SC"), local("Microsoft Yahei"), local("Droid Sans Fallback"); } + +@font-face { + unicode-range: U+4E00-9FFF, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3400-4DB5, U+9FBC-9FC2, U+9FC4-9FC5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+3040-309E, U+30A1-30FE, U+3007; + font-family: 'Han Heiti CNS'; + src: local(YuGothic), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"); } + +@font-face { + font-family: 'Han Heiti GB'; + src: local("Hiragino Sans GB"), local("Lantinghei SC"), local("Heiti SC"), local("Microsoft Yahei"), local("Droid Sans Fallback"); } + +/* ----------------------------------------- + * 粗體 + * Bold + * ----------------------------------------- */ +@font-face { + font-family: 'Han Heiti'; + font-weight: 600; + src: local("Hiragino Sans GB W6"), local(HiraginoSansGB-W6), local("Lantinghei TC Demibold"), local("Lantinghei SC Demibold"), local(FZLTXHB--B51-0), local(FZLTZHK--GBK1-0), local("Heiti SC Medium"), local("Heiti TC Medium"), local(STHeitiSC-Medium), local(STHeitiTC-Medium), local("Microsoft YaHei Bold"), local("Microsoft Jhenghei Bold"), local(MicrosoftYaHei-Bold), local(MicrosoftJhengHeiBold); } + +@font-face { + unicode-range: U+4E00-9FFF, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3400-4DB5, U+9FBC-9FC2, U+9FC4-9FC5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+3040-309E, U+30A1-30FE, U+3007; + font-family: 'Han Heiti'; + font-weight: 600; + src: local("YuGothic Bold"), local("Hiragino Kaku Gothic ProN W6"), local("Hiragino Kaku Gothic Pro W6"), local(YuGo-Bold), local(HiraKakuProN-W6), local(HiraKakuPro-W6); } + +@font-face { + font-family: 'Han Heiti CNS'; + font-weight: 600; + src: local("Hiragino Sans GB W6"), local(HiraginoSansGB-W6), local("Lantinghei TC Demibold"), local("Heiti TC Medium"), local("Microsoft Jhenghei Bold"), local(FZLTXHB--B51-0), local(STHeitiTC-Medium), local(MicrosoftJhengHeiBold), local("Lantinghei SC Demibold"), local("Microsoft YaHei Bold"), local("Heiti SC Medium"), local(FZLTZHK--GBK1-0), local(STHeitiSC-Medium), local(MicrosoftYaHei-Bold); } + +@font-face { + unicode-range: U+4E00-9FFF, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3400-4DB5, U+9FBC-9FC2, U+9FC4-9FC5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+3040-309E, U+30A1-30FE, U+3007; + font-family: 'Han Heiti CNS'; + font-weight: 600; + src: local("YuGothic Bold"), local(YuGo-Bold), local("Hiragino Kaku Gothic ProN W6"), local("Hiragino Kaku Gothic Pro W6"), local(HiraKakuProN-W6), local(HiraKakuPro-W6); } + +@font-face { + font-family: 'Han Heiti GB'; + font-weight: 600; + src: local("Hiragino Sans GB W6"), local(HiraginoSansGB-W6), local("Lantinghei SC Demibold"), local("Microsoft YaHei Bold"), local("Heiti SC Medium"), local(FZLTZHK--GBK1-0), local(STHeitiSC-Medium), local(MicrosoftYaHei-Bold); } + +/* ----------------------------------------- + * 解決Firefox不支援`unicode-range`及粗體調用問題 + * Solution to Firefox's `unicode-range` + * and bold font issues + * ----------------------------------------- */ +@font-face { + font-family: 'Han Heiti'; + src: local("Hiragino Sans GB"), local("Lantinghei TC"), local("Lantinghei SC"), local("Heiti SC"), local("Heiti TC"), local("Microsoft Yahei"), local("Microsoft Jhenghei"), local("Droid Sans Fallback"); + unicode-range: U+270C; } + +@font-face { + font-family: 'Han Heiti'; + font-weight: 600; + src: local("Hiragino Sans GB W6"), local(HiraginoSansGB-W6), local("Lantinghei TC Demibold"), local("Lantinghei SC Demibold"), local(FZLTXHB--B51-0), local(FZLTZHK--GBK1-0), local("Heiti SC Medium"), local("Heiti TC Medium"), local(STHeitiSC-Medium), local(STHeitiTC-Medium), local("Microsoft YaHei Bold"), local("Microsoft Jhenghei Bold"), local(MicrosoftYaHei-Bold), local(MicrosoftJhengHeiBold); + unicode-range: U+270C; } + +@font-face { + font-family: 'Han Heiti CNS'; + src: local("Hiragino Sans GB"), local("Lantinghei TC"), local("Heiti TC"), local("Microsoft Jhenghei"), local("Heiti SC"), local("Lantinghei SC"), local("Microsoft Yahei"), local("Droid Sans Fallback"); + unicode-range: U+270C; } + +@font-face { + font-family: 'Han Heiti CNS'; + font-weight: 600; + src: local("Hiragino Sans GB W6"), local(HiraginoSansGB-W6), local("Lantinghei TC Demibold"), local("Heiti TC Medium"), local("Microsoft Jhenghei Bold"), local(FZLTXHB--B51-0), local(STHeitiTC-Medium), local(MicrosoftJhengHeiBold), local("Lantinghei SC Demibold"), local("Heiti SC Medium"), local("Microsoft YaHei Bold"), local(FZLTZHK--GBK1-0), local(STHeitiSC-Medium), local(MicrosoftYaHei-Bold); + unicode-range: U+270C; } + +@font-face { + font-family: 'Han Heiti GB'; + src: local("Hiragino Sans GB"), local("Lantinghei SC"), local("Heiti SC"), local("Microsoft Yahei"), local("Droid Sans Fallback"); + unicode-range: U+270C; } + +/* --------------------------------------- + 四大字體集・宋體(明朝體) + --- + The Four Typefaces: Songti (Mincho) + --------------------------------------- */ +@font-face { + font-family: 'Han Songti'; + src: local("Songti SC"), local("Songti TC"), local(STSong), local("Lisong Pro"), local(SimSun), local(PMingLiU); } + +@font-face { + unicode-range: U+4E00-9FFF, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3400-4DB5, U+9FBC-9FC2, U+9FC4-9FC5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+3040-309E, U+30A1-30FE, U+3007; + font-family: 'Han Songti'; + src: local(YuMincho), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("MS Mincho"); } + +@font-face { + font-family: 'Han Songti CNS'; + src: local("Songti TC"), local("Lisong Pro"), local("Songti SC"), local(STSong), local(PMingLiU), local(SimSun); } + +@font-face { + unicode-range: U+4E00-9FFF, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3400-4DB5, U+9FBC-9FC2, U+9FC4-9FC5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+3040-309E, U+30A1-30FE, U+3007; + font-family: 'Han Songti CNS'; + src: local(YuMincho), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"); } + +@font-face { + font-family: 'Han Songti GB'; + src: local("Songti SC"), local(STSong), local(SimSun), local(PMingLiU); } + +/* ----------------------------------------- + * 粗體 + * Bold + * ----------------------------------------- */ +@font-face { + font-family: 'Han Songti'; + font-weight: 600; + src: local("STSongti SC Bold"), local("STSongti TC Bold"), local(STSongti-SC-Bold), local(STSongti-TC-Bold); } + +@font-face { + unicode-range: U+4E00-9FFF, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3400-4DB5, U+9FBC-9FC2, U+9FC4-9FC5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+3040-309E, U+30A1-30FE, U+3007; + font-family: 'Han Songti'; + font-weight: 600; + src: local("YuMincho Demibold"), local("Hiragino Mincho ProN W6"), local("Hiragino Mincho Pro W6"), local(YuMin-Demibold), local(HiraMinProN-W6), local(HiraMinPro-W6); } + +@font-face { + font-family: 'Han Songti CNS'; + font-weight: 600; + src: local("STSongti TC Bold"), local("STSongti SC Bold"), local(STSongti-TC-Bold), local(STSongti-SC-Bold); } + +@font-face { + unicode-range: U+4E00-9FFF, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3400-4DB5, U+9FBC-9FC2, U+9FC4-9FC5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+3040-309E, U+30A1-30FE, U+3007; + font-family: 'Han Songti CNS'; + font-weight: 600; + src: local("YuMincho Demibold"), local("Hiragino Mincho ProN W6"), local("Hiragino Mincho Pro W6"), local(YuMin-Demibold), local(HiraMinProN-W6), local(HiraMinPro-W6); } + +@font-face { + font-family: 'Han Songti GB'; + font-weight: 600; + src: local("STSongti SC Bold"), local(STSongti-SC-Bold); } + +/* ----------------------------------------- + * 解決Firefox不支援`unicode-range`及粗體調用問題 + * Solution to Firefox's `unicode-range` + * and bold font issues + * ----------------------------------------- */ +@font-face { + font-family: 'Han Songti'; + src: local("Songti SC"), local("Songti TC"), local(STSongti), local("Lisong Pro"), local("MS Mincho"), local(SimSun), local(PMingLiU); + unicode-range: U+270C; } + +@font-face { + font-family: 'Han Songti'; + font-weight: 600; + src: local("STSongti TC Bold"), local("STSongti SC Bold"), local(STSongti-TC-Bold), local(STSongti-SC-Bold); + unicode-range: U+270C; } + +@font-face { + font-family: 'Han Songti CNS'; + src: local("Songti TC"), local("Lisong Pro"), local("Songti SC"), local(STSong), local("MS Mincho"), local(PMingLiU), local(SimSun); + unicode-range: U+270C; } + +@font-face { + font-family: 'Han Songti CNS'; + font-weight: 600; + src: local("STSongti TC Bold"), local("STSongti SC Bold"), local(STSongti-TC-Bold), local(STSongti-SC-Bold); + unicode-range: U+270C; } + +@font-face { + font-family: 'Han Songti GB'; + src: local("Songti SC"), local(STSong), local(SimSun); + unicode-range: U+270C; } + +/* --------------------------------------- + 四大字體集・楷體 + --- + The Four Typefaces: Kaiti (Cursive) + --------------------------------------- */ +@font-face { + font-family: cursive; + src: local("Kaiti SC"), local(STKaiti), local(BiauKai), local("標楷體"), local(DFKaiShu-SB-Estd-BF), local(Kaiti), local(DFKai-SB); } + +@font-face { + unicode-range: U+4E00-9FFF, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3400-4DB5, U+9FBC-9FC2, U+9FC4-9FC5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+3040-309E, U+30A1-30FE, U+3007; + font-family: 'Han Kaiti'; + src: local("Kaiti SC"), local(STKaiti), local(BiauKai), local("標楷體"), local(DFKaiShu-SB-Estd-BF), local(Kaiti), local(DFKai-SB); } + +@font-face { + unicode-range: U+4E00-9FFF, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3400-4DB5, U+9FBC-9FC2, U+9FC4-9FC5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+3040-309E, U+30A1-30FE, U+3007; + font-family: 'Han Kaiti CNS'; + src: local(BiauKai), local("標楷體"), local(DFKaiShu-SB-Estd-BF); } + +@font-face { + unicode-range: U+4E00-9FFF, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3400-4DB5, U+9FBC-9FC2, U+9FC4-9FC5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+3040-309E, U+30A1-30FE, U+3007; + font-family: 'Han Kaiti GB'; + src: local("Kaiti SC"), local(STKaiti), local(Kai), local(Kaiti), local(DFKai-SB); } + +/* ----------------------------------------- + * 粗體 + * Bold + * ----------------------------------------- */ +@font-face { + font-family: cursive; + font-weight: 600; + src: local("Kaiti SC Bold"), local(STKaiti-SC-Bold); } + +@font-face { + font-family: 'Han Kaiti'; + font-weight: 600; + src: local("Kaiti SC Bold"), local(STKaiti-SC-Bold); } + +@font-face { + font-family: 'Han Kaiti GB'; + font-weight: 600; + src: local("Kaiti SC Bold"), local(STKaiti-SC-Bold); } + +/* --------------------------------------- + 四大字體集・仿宋體 + --- + The Four Typefaces: Fangsong + --------------------------------------- */ +@font-face { + unicode-range: U+4E00-9FFF, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3400-4DB5, U+9FBC-9FC2, U+9FC4-9FC5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+3040-309E, U+30A1-30FE, U+3007; + font-family: 'Han Fangsong'; + src: local(STFangsong), local(FangSong); } + +@font-face { + unicode-range: U+4E00-9FFF, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3400-4DB5, U+9FBC-9FC2, U+9FC4-9FC5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+3040-309E, U+30A1-30FE, U+3007; + font-family: 'Han Fangsong CNS'; + src: local(STFangsong), local(FangSong); } + +@font-face { + unicode-range: U+4E00-9FFF, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3400-4DB5, U+9FBC-9FC2, U+9FC4-9FC5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+3040-309E, U+30A1-30FE, U+3007; + font-family: 'Han Fangsong GB'; + src: local(STFangsong), local(FangSong); } + +/* --------------------------------------- + 漢字標點 + --- + Hanzi puncuation, + ‘Biaodian’(zh) and ‘Yakumono’(ja) + -------------------------------------- + **注意:**為Windows設定的字體*必須*置於 + OS X字體設定後方。 + + **NOTE**: Font settings for Windows + should be *always* placed after tho- + se for OS X. Since there are quite a + few fonts from Windows existing on + OS X as well. + --------------------------------------- + + --------------------------------------- + 單點全形句號(.) + Fullwidth full stop + --------------------------------------- */ +@font-face { + font-family: 'Biaodian Sans'; + src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local("MS Gothic"), local(SimSun); + unicode-range: U+FF0E; } + +@font-face { + font-family: 'Biaodian Serif'; + src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local(SimSun); + unicode-range: U+FF0E; } + +@font-face { + font-family: 'Biaodian Pro Sans'; + src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local("MS Gothic"), local(SimSun); + unicode-range: U+FF0E; } + +@font-face { + font-family: 'Biaodian Pro Serif'; + src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local(SimSun); + unicode-range: U+FF0E; } + +@font-face { + font-family: 'Biaodian Pro Sans CNS'; + src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local("MS Gothic"), local(SimSun); + unicode-range: U+FF0E; } + +@font-face { + font-family: 'Biaodian Pro Serif CNS'; + src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local(SimSun); + unicode-range: U+FF0E; } + +@font-face { + font-family: 'Biaodian Pro Sans GB'; + src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local("MS Gothic"), local(SimSun); + unicode-range: U+FF0E; } + +@font-face { + font-family: 'Biaodian Pro Serif GB'; + src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local(SimSun); + unicode-range: U+FF0E; } + +/* 間隔號(·) + Middle dot + --------------------------------------- */ +@font-face { + font-family: 'Biaodian Sans'; + src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun); + unicode-range: U+00B7; } + +@font-face { + font-family: 'Biaodian Serif'; + src: local("Songti SC"), local(STSong), local("Heiti SC"), local(SimSun); + unicode-range: U+00B7; } + +@font-face { + font-family: 'Biaodian Pro Sans'; + src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun); + unicode-range: U+00B7; } + +@font-face { + font-family: 'Biaodian Pro Serif'; + src: local("Songti SC"), local(STSong), local("Heiti SC"), local(SimSun); + unicode-range: U+00B7; } + +@font-face { + font-family: 'Biaodian Pro Sans CNS'; + src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun); + unicode-range: U+00B7; } + +@font-face { + font-family: 'Biaodian Pro Serif CNS'; + src: local("Songti SC"), local(STSong), local("Heiti SC"), local(SimSun); + unicode-range: U+00B7; } + +@font-face { + font-family: 'Biaodian Pro Sans GB'; + src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun); + unicode-range: U+00B7; } + +@font-face { + font-family: 'Biaodian Pro Serif GB'; + src: local("Songti SC"), local(STSong), local("Heiti SC"), local(SimSun); + unicode-range: U+00B7; } + +/* 破折號(——) + Em dash + --------------------------------------- */ +@font-face { + font-family: 'Biaodian Sans'; + src: local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Microsoft Yahei"), local(SimSun); + unicode-range: U+2014; } + +@font-face { + font-family: 'Biaodian Serif'; + src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local("Microsoft Yahei"), local(SimSun); + unicode-range: U+2014; } + +@font-face { + font-family: 'Yakumono Sans'; + src: local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Arial Unicode MS"), local("MS Gothic"); + unicode-range: U+2014; } + +@font-face { + font-family: 'Yakumono Serif'; + src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("MS Mincho"), local("Microsoft Yahei"); + unicode-range: U+2014; } + +@font-face { + font-family: 'Biaodian Pro Sans'; + src: local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Microsoft Yahei"), local(SimSun); + unicode-range: U+2014; } + +@font-face { + font-family: 'Biaodian Pro Serif'; + src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local("Microsoft Yahei"), local(SimSun); + unicode-range: U+2014; } + +@font-face { + font-family: 'Biaodian Pro Sans CNS'; + src: local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Microsoft Yahei"), local(SimSun); + unicode-range: U+2014; } + +@font-face { + font-family: 'Biaodian Pro Serif CNS'; + src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local("Microsoft Yahei"), local(SimSun); + unicode-range: U+2014; } + +@font-face { + font-family: 'Biaodian Pro Sans GB'; + src: local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Microsoft Yahei"), local(SimSun); + unicode-range: U+2014; } + +@font-face { + font-family: 'Biaodian Pro Serif GB'; + src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local("Microsoft Yahei"), local(SimSun); + unicode-range: U+2014; } + +/* 省略號(……) + Ellipsis + --------------------------------------- */ +@font-face { + font-family: 'Biaodian Sans'; + src: local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local(Meiryo), local("MS Gothic"), local(SimSun), local(PMingLiU); + unicode-range: U+2026; } + +@font-face { + font-family: 'Biaodian Serif'; + src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local("MS Mincho"), local(SimSun), local(PMingLiU); + unicode-range: U+2026; } + +@font-face { + font-family: 'Yakumono Sans'; + src: local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local(Meiryo), local("MS Gothic"); + unicode-range: U+2026; } + +@font-face { + font-family: 'Yakumono Serif'; + src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("MS Mincho"); + unicode-range: U+2026; } + +@font-face { + font-family: 'Biaodian Pro Sans'; + src: local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local(SimSun), local(PMingLiU); + unicode-range: U+2026; } + +@font-face { + font-family: 'Biaodian Pro Serif'; + src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(SimSun), local(PMingLiU); + unicode-range: U+2026; } + +@font-face { + font-family: 'Biaodian Pro Sans CNS'; + src: local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local(SimSun), local(PMingLiU); + unicode-range: U+2026; } + +@font-face { + font-family: 'Biaodian Pro Serif CNS'; + src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSongti), local(SimSun), local(PMingLiU); + unicode-range: U+2026; } + +@font-face { + font-family: 'Biaodian Pro Sans GB'; + src: local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local(SimSun), local(PMingLiU); + unicode-range: U+2026; } + +@font-face { + font-family: 'Biaodian Pro Serif GB'; + src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSongti), local(SimSun), local(PMingLiU); + unicode-range: U+2026; } + +/* 彎引號(“‘’”) + Curve quotes + --------------------------------------- */ +@font-face { + font-family: 'Biaodian Sans'; + src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun), local(PMingLiU); + unicode-range: U+201C-201D, U+2018-2019; } + +@font-face { + font-family: 'Biaodian Serif'; + src: local("Lisong Pro"), local("Heiti SC"), local(STHeiti), local(SimSun), local(PMingLiU); + unicode-range: U+201C-201D, U+2018-2019; } + +@font-face { + font-family: 'Biaodian Pro Sans'; + src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun), local(PMingLiU); + unicode-range: U+201C-201D, U+2018-2019; } + +@font-face { + font-family: 'Biaodian Pro Serif'; + src: local("Lisong Pro"), local("Heiti SC"), local(STHeiti), local(SimSun), local(PMingLiU); + unicode-range: U+201C-201D, U+2018-2019; } + +@font-face { + font-family: 'Biaodian Pro Sans CNS'; + src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun), local(PMingLiU); + unicode-range: U+201C-201D, U+2018-2019; } + +@font-face { + font-family: 'Biaodian Pro Serif CNS'; + src: local("Lisong Pro"), local("Heiti SC"), local(STHeiti), local(SimSun), local(PMingLiU); + unicode-range: U+201C-201D, U+2018-2019; } + +@font-face { + font-family: 'Biaodian Pro Sans GB'; + src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun), local(PMingLiU); + unicode-range: U+201C-201D, U+2018-2019; } + +@font-face { + font-family: 'Biaodian Pro Serif GB'; + src: local("Lisong Pro"), local("Heiti SC"), local(STHeiti), local(SimSun), local(PMingLiU); + unicode-range: U+201C-201D, U+2018-2019; } + +/* 着重號(●) + Emphasis dots + --------------------------------------- */ +@font-face { + font-family: 'Biaodian Sans'; + src: local(Georgia), local("Times New Roman"), local("Droid Sans Fallback"); + unicode-range: U+25CF; } + +@font-face { + font-family: 'Biaodian Serif'; + src: local(Georgia), local("Times New Roman"), local("Droid Sans Fallback"); + unicode-range: U+25CF; } + +@font-face { + font-family: 'Biaodian Pro Sans'; + src: local(Georgia), local("Times New Roman"), local("Droid Sans Fallback"); + unicode-range: U+25CF; } + +@font-face { + font-family: 'Biaodian Pro Serif'; + src: local(Georgia), local("Times New Roman"), local("Droid Sans Fallback"); + unicode-range: U+25CF; } + +@font-face { + font-family: 'Biaodian Pro Sans CNS'; + src: local(Georgia), local("Times New Roman"), local("Droid Sans Fallback"); + unicode-range: U+25CF; } + +@font-face { + font-family: 'Biaodian Pro Serif CNS'; + src: local(Georgia), local("Times New Roman"), local("Droid Sans Fallback"); + unicode-range: U+25CF; } + +@font-face { + font-family: 'Biaodian Pro Sans GB'; + src: local(Georgia), local("Times New Roman"), local("Droid Sans Fallback"); + unicode-range: U+25CF; } + +@font-face { + font-family: 'Biaodian Pro Serif GB'; + src: local(Georgia), local("Times New Roman"), local("Droid Sans Fallback"); + unicode-range: U+25CF; } + +/* --------------------------------------- + 進階版標點樣式修正 + --- + Advanced Correction to + Hanzi Punctuation + --------------------------------------- + * + * a. 句、逗、頓號(。,、) + * Period, comma, paused comma + * + * b. 分、冒、問、嘆號(;:?!) + * Colon, semicolon, question, exclam- + * ation marks + * + * c. 連接號、正、反斜線(-/\) + * En dash (fullwidth hyphen-minus), + * division slash, back slash + * + */ +@font-face { + font-family: 'Biaodian Pro Sans'; + src: local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("MS Gothic"); + unicode-range: U+3002, U+FF0C, U+3001, U+FF1B, U+FF1A, U+FF1F, U+FF01, U+FF0D, U+FF0F, U+FF3C; } + +@font-face { + font-family: 'Biaodian Pro Serif'; + src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("MS Mincho"); + unicode-range: U+3002, U+FF0C, U+3001, U+FF1B, U+FF1A, U+FF1F, U+FF01, U+FF0D, U+FF0F, U+FF3C; } + +@font-face { + font-family: 'Biaodian Pro Sans CNS'; + src: local("Heiti TC"), local("Lihei Pro"), local("Microsoft Jhenghei"), local(PMingLiU); + unicode-range: U+3002, U+FF0C, U+3001; } + +@font-face { + font-family: 'Biaodian Pro Sans CNS'; + src: local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Heiti TC"), local("Lihei Pro"), local("Microsoft Jhenghei"), local(PMingLiU), local("MS Gothic"); + unicode-range: U+FF1B, U+FF1A, U+FF1F, U+FF01; } + +@font-face { + font-family: 'Biaodian Pro Sans CNS'; + src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("MS Mincho"); + unicode-range: U+FF0D, U+FF0F, U+FF3C; } + +@font-face { + font-family: 'Biaodian Pro Serif CNS'; + src: local(STSongti-TC-Regular), local("Lisong Pro"), local("Heiti TC"), local(PMingLiU); + unicode-range: U+3002, U+FF0C, U+3001; } + +@font-face { + font-family: 'Biaodian Pro Serif CNS'; + src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local(PMingLiU), local("MS Mincho"); + unicode-range: U+FF1B, U+FF1A, U+FF1F, U+FF01, U+FF0D, U+FF0F, U+FF3C; } + +@font-face { + font-family: 'Biaodian Pro Sans GB'; + src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local(SimSun), local("MS Gothic"); + unicode-range: U+3002, U+FF0C, U+3001, U+FF1B, U+FF1A, U+FF1F, U+FF01, U+FF0D, U+FF0F, U+FF3C; } + +@font-face { + font-family: 'Biaodian Pro Serif GB'; + src: local("Songti SC"), local(STSongti), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun), local("MS Mincho"); + unicode-range: U+3002, U+FF0C, U+3001, U+FF1B, U+FF1A, U+FF1F, U+FF01; } + +@font-face { + font-family: 'Biaodian Pro Serif GB'; + src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local(PMingLiU), local("MS Mincho"); + unicode-range: U+FF0D, U+FF0F, U+FF3C; } + +/* + * a. 引號(「『』」) + * Quotes + * + * b. 括號、書名號(()《》〈〉〔〕) + * Brackets + * + */ +@font-face { + font-family: 'Biaodian Pro Sans'; + src: local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local(SimSun), local(PMingLiU); + unicode-range: U+300C-300F, U+300A-300B, U+3008-3009, U+FF08-FF09, U+3014-3015; } + +@font-face { + font-family: 'Biaodian Pro Serif'; + src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local(SimSun); + unicode-range: U+300C-300F, U+300A-300B, U+3008-3009, U+FF08-FF09, U+3014-3015; } + +@font-face { + font-family: 'Biaodian Pro Sans CNS'; + src: local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local(SimSun), local(PMingLiU); + unicode-range: U+300C-300F, U+300A-300B, U+3008-3009, U+FF08-FF09, U+3014-3015; } + +@font-face { + font-family: 'Biaodian Pro Serif CNS'; + src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local(SimSun); + unicode-range: U+300C-300F, U+300A-300B, U+3008-3009, U+FF08-FF09, U+3014-3015; } + +@font-face { + font-family: 'Biaodian Pro Sans GB'; + src: local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local(SimSun), local(PMingLiU); + unicode-range: U+300C-300F, U+300A-300B, U+3008-3009, U+FF08-FF09, U+3014-3015; } + +@font-face { + font-family: 'Biaodian Pro Serif GB'; + src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local(SimSun); + unicode-range: U+300C-300F, U+300A-300B, U+3008-3009, U+FF08-FF09, U+3014-3015; } + +/* + * 解決Firefox不支援`Unicode-range`的問題 + * + * Solution to Firefox's `Unicode-range` + * unspported issue + --------------------------------------- */ +@font-face { + font-family: 'Biaodian Sans'; + src: local("Lying to Firefox"); + unicode-range: U+270C; } + +@font-face { + font-family: 'Biaodian Serif'; + src: local("Lying to Firefox"); + unicode-range: U+270C; } + +@font-face { + font-family: 'Biaodian Pro Sans'; + src: local("Lying to Firefox"); + unicode-range: U+270C; } + +@font-face { + font-family: 'Biaodian Pro Serif'; + src: local("Lying to Firefox"); + unicode-range: U+270C; } + +@font-face { + font-family: 'Biaodian Pro Sans CNS'; + src: local("Lying to Firefox"); + unicode-range: U+270C; } + +@font-face { + font-family: 'Biaodian Pro Serif CNS'; + src: local("Lying to Firefox"); + unicode-range: U+270C; } + +@font-face { + font-family: 'Biaodian Pro Sans GB'; + src: local("Lying to Firefox"); + unicode-range: U+270C; } + +@font-face { + font-family: 'Biaodian Pro Serif GB'; + src: local("Lying to Firefox"); + unicode-range: U+270C; } + +/* --------------------------------------- + @mixin: 四大字體集 + --- + @mixin: The Four Typefaces + --------------------------------------- + 黑體 + Heiti + --------------------------------------- */ +/* 宋體 + Songti + --------------------------------------- */ +/* 楷體 + Kaiti + --------------------------------------- */ +/* 仿宋體 + Fangsong + --------------------------------------- */ +/* --------------------------------------- + 特殊西文及數字字體 + --- + Latin Specialties & numerals + --------------------------------------- */ +/* --------------------------------------- + 襯線西文斜體 + --- + Latin italic serif + --------------------------------------- */ +@font-face { + font-family: 'Latin Italic Serif'; + src: local("Georgia Italic"), local("Times New Roman Italic"), local(Georgia-Italic), local(TimesNewRomanPS-ItalicMT), local(Times-Italic); } + +@font-face { + font-family: 'Latin Italic Serif'; + font-weight: 700; + src: local("Georgia Bold Italic"), local("Times New Roman Bold Italic"), local(Georgia-BoldItalic), local(TimesNewRomanPS-BoldItalicMT), local(Times-Italic); } + +/* --------------------------------------- + 無襯線西文斜體 + --- + Latin italic sans-serif + --------------------------------------- */ +@font-face { + font-family: 'Latin Italic Sans'; + src: local("Helvetica Neue Italic"), local("Helvetica Oblique"), local("Arial Italic"), local(HelveticaNeue-Italic), local(Helvetica-LightOblique), local(Arial-ItalicMT); } + +@font-face { + font-family: 'Latin Italic Sans'; + font-weight: 700; + src: local("Helvetica Neue Bold Italic"), local("Helvetica Bold Oblique"), local("Arial Bold Italic"), local(HelveticaNeue-BoldItalic), local(Helvetica-BoldOblique), local(Arial-BoldItalicMT); } + +/* --------------------------------------- + 數字 + --- + Numerals + --------------------------------------- + 文本數字 + Text figures + --------------------------------------- */ +@font-face { + unicode-range: U+0030-0039; + font-family: 'Numeral TF Sans'; + src: local(Skia), local("Neutraface 2 Text"), local(Candara), local(Corbel); } + +@font-face { + unicode-range: U+0030-0039; + font-family: 'Numeral TF Serif'; + src: local(Georgia), local("Hoefler Text"), local("Big Caslon"); } + +/* 等高數字 + Lining figures + --------------------------------------- */ +@font-face { + unicode-range: U+0030-0039; + font-family: 'Numeral LF Sans'; + src: local("Helvetica Neue"), local(Helvetica), local(Arial); } + +@font-face { + unicode-range: U+0030-0039; + font-family: 'Numeral LF Serif'; + src: local(Palatino), local("Palatino Linotype"), local("Times New Roman"); } + +/* ----------------------------------------- + * 解決Firefox不支援`unicode-range`的問題 + * Solution to Firefox's `unicode-range` + * issues + * ----------------------------------------- */ +@font-face { + font-family: 'Numeral TF Sans'; + src: local("Lying to Firefox"); + unicode-range: U+270C; } + +@font-face { + font-family: 'Numeral TF Serif'; + src: local("Lying to Firefox"); + unicode-range: U+270C; } + +@font-face { + font-family: 'Numeral LF Sans'; + src: local("Lying to Firefox"); + unicode-range: U+270C; } + +@font-face { + font-family: 'Numeral LF Serif'; + src: local("Lying to Firefox"); + unicode-range: U+270C; } + +/* --------------------------------------- + 注音符號 + --- + Zhuyin + --------------------------------------- */ +/* --------------------------------------- + 注音符號 + --- + Zhuyin + --------------------------------------- */ +@font-face { + unicode-range: U+3105-312D, U+31A0-31BA, U+02D9, U+02CA, U+02C5, U+02C7, U+02CB, U+02EA-02EB; + font-family: 'Zhuyin Kaiti'; + src: url("./fonts/zhuyin.eot") format("embedded-opentype"), url("./fonts/zhuyin.ttf") format("truetype"), local(BiauKai), local("標楷體"), local(DFKaiShu-SB-Estd-BF), local(PMingLiU); } + +@font-face { + unicode-range: U+3105-312D, U+31A0-31BA, U+02D9, U+02CA, U+02C5, U+02C7, U+02CB, U+02EA-02EB; + font-family: 'Zhuyin Heiti'; + src: local("Hiragino Sans GB"), local("Microsoft Jhenghei"), url("./fonts/zhuyin.eot") format("embedded-opentype"), url("./fonts/zhuyin.ttf") format("truetype"), local(PMingLiU), local(SimSun), local(BiauKai), local("標楷體"), local(DFKaiShu-SB-Estd-BF); } + +@font-face { + font-family: 'Zhuyin Heiti'; + src: local("Heiti TC"), local("Microsoft Jhenghei"), url("./fonts/zhuyin.eot") format("embedded-opentype"), url("./fonts/zhuyin.ttf") format("truetype"), local(PMingLiU), local(SimSun), local(BiauKai), local("標楷體"), local(DFKaiShu-SB-Estd-BF); + unicode-range: U+3127, U+02C7, U+02CA-B, U+02D9; } + +/* + * 以語言為基礎的元素樣式修正 + * --- + * Language-based style correction, + * Hanzi-optimised CSS Mode + * + */ + /* --------------------------------------- + 變數設定 + --- + Variables + --------------------------------------- + 顏色 + Colours + --------------------------------------- */ +/* --------------------------------------- + 針對normalize.css的改進 + --- + Improvements aim to normalize.css + --------------------------------------- */ +dfn { + font-style: inherit; + font-weight: bold; } + +/* 增進code區塊的可讀性 + Enhances the readability of code blocks + --------------------------------------- */ +pre code { + display: block; + overflow: auto; + white-space: pre; + word-wrap: normal; } + +/* --------------------------------------- + $(selector).charize() + --------------------------------------- + 避頭尾點 + Line breaking rules on punctuation + --------------------------------------- */ +.han-js-charized span.char, +.han-js-bitouwei-rendered span.bitouwei { + display: inline-block; + text-indent: 0; } + +.han-js-charized span.char.space, +.han-js-charized span.char > span { + display: inline; } + +/* --------------------------------------- + 底線 + --- + Underlines + --------------------------------------- + 註記元素(u)及兩相鄰時的底線區別(u+u) + Annotations and adjacent ones + --------------------------------------- */ +:lang(zh) u, +:lang(ja) u { + letter-spacing: 0; + border-bottom: 1px solid; + padding-bottom: 0.05em; + text-decoration: none; } + +u + u { + margin-left: .125em; } + +html.han-js-rendered u + u { + margin-left: 0; } + +html.han-js-rendered u.adjacent { + margin-left: .125em; } + +/* 實驗性功能 */ +/* 避免`border-box` reset的問題 */ +.han-js-rendered.han-lab-underline u, +.han-js-rendered.han-lab-underline u *, +.han-js-rendered.han-lab-underline u *:before, +.han-js-rendered.han-lab-underline u *:after { + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; } + +u.han-js-charized { + border-bottom: 0 none; + text-decoration: none; } + u.han-js-charized span.char:not(:first-of-type):not(:last-of-type) span, + u.han-js-charized hanla, + u.han-js-charized span.char:first-of-type span:after, + u.han-js-charized span.char:last-of-type span:after { + border-bottom: 1px solid; + padding-bottom: .125em; } + u.han-js-charized span.char:first-of-type span, + u.han-js-charized span.char:last-of-type span { + position: relative; } + u.han-js-charized span.char:first-of-type span:after, + u.han-js-charized span.char:last-of-type span:after { + content: ''; + display: inline-block; + left: 0; + margin-left: 1px; + position: absolute; + top: 0; + height: 100%; + width: -moz-calc(100% - 1px ); + width: -webkit-calc(100% - 1px ); + width: calc(100% - 1px ); } + u.han-js-charized span.char:last-of-type span:after { + margin: 0 1px 0 0; } + u.han-js-charized span.char:first-child:last-child span:after { + margin: 0 1px 0; + width: -moz-calc(100% - 2px ); + width: -webkit-calc(100% - 2px ); + width: calc(100% - 2px ); } + u.han-js-charized :not(:first-child) span.char:first-of-type span:after, + u.han-js-charized :not(:last-child) span.char:last-of-type span:after, + u.han-js-charized span.char:not(:first-child):first-of-type span:after, + u.han-js-charized span.char:not(:last-child):last-of-type span:after { + border-bottom: 0; } + u.han-js-charized :not(:first-child) span.char:first-of-type span, + u.han-js-charized :not(:last-child) span.char:last-of-type span, + u.han-js-charized span.char:not(:first-child):first-of-type span, + u.han-js-charized span.char:not(:last-child):last-of-type span { + border-bottom: 1px solid; + padding-bottom: .125em; } + u.han-js-charized hanla:first-child, + u.han-js-charized hanla:last-child { + border: 0 none; } + u.han-js-charized :not(:first-child) hanla:first-child, + u.han-js-charized :not(:last-child) hanla:last-child { + border: 1px solid; } + +/* 重新定製「連結、插入元素」的樣式 + Re-styles anchors and additions + --------------------------------------- */ +html:lang(zh) a:link, +html:lang(zh) a:visited, +html:lang(zh) a:hover, +html:lang(zh) a:active, +html:lang(zh) ins { + text-decoration: inherit; } +html:lang(zh) ins { + border-bottom: 3px double lightgrey; + padding-bottom: .05em; } + +/* --------------------------------------- + 文章內的「標題、一般及詩篇段落、清單等」 + --- + Headings, paragraphs and lists + in article + --------------------------------------- + 四、五號標題 + Headings of level 4 and 5 + --------------------------------------- */ +article h4, +article h5 { + margin: 1em 0; } + +article h4 + h5 { + margin-top: -.5em; } + +/* 段落及清單 + Paragraphs and lists + --------------------------------------- */ +article p, +article li { + line-height: 2; + text-align: justify; } + +article:lang(zh) p.poem-like, +article:lang(zh).poem-like p, +article:lang(zh) .poem-like p, +article:lang(ja) p.poem-like, +article:lang(ja).poem-like p, +article:lang(ja) .poem-like p { + text-indent: 0; + margin-left: 2em; } + +article:lang(ja) p.poem-like, +article:lang(ja).poem-like p, +article:lang(ja) .poem-like p { + margin-left: 1em; } + +article:lang(zh) ol, +article:lang(zh) ul, +article:lang(ja) ol, +article:lang(ja) ul { + margin: .5em 0 .5em 0; + padding: 0; } + article:lang(zh) ol > li, + article:lang(zh) ul > li, + article:lang(ja) ol > li, + article:lang(ja) ul > li { + margin-left: 2em; + padding: 0; } + +article h4 + ul, +article h4 + ol, +article h5 + ul, +article h5 + ol, +article h6 + ul, +article h6 + ol { + margin-top: -.5em; } + +article:lang(ja) ol, +article:lang(ja) ul { + margin-left: 1em; + padding-left: 1.5em; } + article:lang(ja) ol > li, + article:lang(ja) ul > li { + margin-left: 1em; } + +/* --------------------------------------- + 漢拉間隙 + --- + Kerning between Hanzi and Latin letter + --------------------------------------- */ +hanla, +html:not(.han-la) hanla { + display: none; } + +html.han-la hanla:lang(zh), +html.han-la hanla:lang(ja) { + display: inline; + position: static; } + +html.han-la hanla:after { + content: ' '; + display: inline; + font-size: 1ch; + font-size: -webkit-calc(.25em ); } + +html.han-la code hanla:after, +html.han-la pre hanla:after, +html.han-la kbd hanla:after, +html.han-la samp hanla:after, +html.han-la ol > hanla:after, +html.han-la ul > hanla:after { + display: none; } + +/* --------------------------------------- + 書名號(*棄用) + --- + Cites (*deprecated) + --------------------------------------- + * + * 1. 修正Webkit下的字體fallback + * Corrects font fallback on WebKit + * + */ +cite:lang(zh), +cite:lang(ja), +cite:lang(en).piece { + font-style: inherit; } + +cite:lang(zh):before, +cite:lang(zh):after { + content: '《'; + font-family: inherit; + /* 1 */ + line-height: inherit; } + +cite:lang(zh):after { + content: '》'; } + +cite:lang(zh).piece:before { + content: '〈'; } + +cite:lang(zh).piece:after { + content: '〉'; } + +cite:lang(ja):before { + content: '『'; } + +cite:lang(ja):after { + content: '』'; } + +cite:lang(ja).piece:before { + content: '「'; } + +cite:lang(ja).piece:after { + content: '」'; } + +cite:lang(en).piece:before, +cite:lang(en).piece:after { + content: '“'; + font-family: inherit; + /* 1 */ } + +cite:lang(en).piece:after { + content: '”'; } + +cite:lang(en-GB).piece:before { + content: '‘'; } + +cite:lang(en-GB).piece:after { + content: '’'; } + +.no-cite-mark cite:before, +.no-cite-mark cite:after, +cite.no-cite-mark:before, +cite.no-cite-mark:after { + content: '' !important; } + +/* --------------------------------------- + 着重號 + --- + Emphases + --------------------------------------- + * + * 1. Fallback + * + */ +em:lang(zh), +em:lang(ja) { + font-style: inherit; + border-bottom-style: dotted; + border-bottom-width: 2px; + padding-bottom: .05em; + -moz-text-emphasis: circle; + -webkit-text-emphasis: circle; + text-emphasis: circle; + -moz-text-emphasis-position: under; + -webkit-text-emphasis-position: under; + text-emphasis-position: under; + border-bottom-width: -webkit-calc(0px ); } + em:lang(zh) span.biaodian, + em:lang(ja) span.biaodian { + -moz-text-emphasis: none; + -webkit-text-emphasis: none; + text-emphasis: none; + -moz-text-emphasis-position: under; + -webkit-text-emphasis-position: under; + text-emphasis-position: under; } + +em:lang(ja) { + -moz-text-emphasis: sesame; + -webkit-text-emphasis: sesame; + text-emphasis: sesame; + -moz-text-emphasis-position: over; + -webkit-text-emphasis-position: over; + text-emphasis-position: over; } + +.han-js-rendered em:lang(zh), +.han-js-rendered em:lang(ja) { + border-bottom-width: 0; + padding-bottom: auto; } + +.no-textemphasis em:lang(zh) span.char { + font-style: inherit; + position: relative; } + +.no-textemphasis em:lang(zh) span.char:after { + display: inline-block; + left: 0; + margin: .4em 0 0 0; + overflow: hidden; + position: absolute; + text-indent: 0; + top: 0; + height: 1.9em; + content: '・'; + font-style: normal; + font-weight: normal; + line-height: 1.9em; + text-decoration: none; } + +.no-textemphasis em:lang(ja) span.char:after { + content: '、'; + margin: -1.55em 0 0 .32em; + overflow: inherit; } + +.no-textemphasis em:lang(zh) span.latin:after { + margin: .4em 0 0 -.25em; } + +.no-textemphasis em:lang(ja) span.latin:after { + margin: -1.5em 0 0 .1em; } + +.no-textemphasis :lang(zh) em span.space:after, +.no-textemphasis :lang(ja) em span.space:after, +.no-textemphasis :lang(zh) em span.biaodian:after, +.no-textemphasis :lang(ja) em span.biaodian:after { + content: none; } + +:not(:lang(zh)):not(:lang(ja)) em, +:not(:lang(zh)):not(:lang(ja)) em { + -moz-text-emphasis: none; + -webkit-text-emphasis: none; + text-emphasis: none; + -moz-text-emphasis-position: under; + -webkit-text-emphasis-position: under; + text-emphasis-position: under; + font-style: italic; } + +.no-textemphasis :not(:lang(zh)):not(:lang(ja)) em span.char:after { + content: none; } + +/* --------------------------------------- + 變音文字 + --- + Alternative voices + --------------------------------------- + * + * 1. 如果系統不支援楷體 + * If Kaiti is not supported + * + */ +:lang(zh) i, +:lang(ja) i, +i:lang(zh), +i:lang(ja) { + font-style: inherit; } + +i:lang(zh), +i:lang(ja) { + font-family: cursive, serif; } + +.no-fontface-kaiti i:lang(zh), +.no-fontface-kaiti i:lang(ja) { + font-family: serif; + border-bottom: 3px double lightgrey; + padding-bottom: .05em; } + +/* --------------------------------------- + 文章內重點 + --- + Importance in article + --------------------------------------- */ +article strong:lang(zh), +article strong:lang(ja) { + font-family: sans-serif; + font-weight: bold; } + +/* --------------------------------------- + 引用 + --- + Quotes + --------------------------------------- + 行內引言 + Inline quotation + --------------------------------------- */ +q { + quotes: '“' '”' '‘' '’' '“' '”' '‘' '’' '“' '”' '‘' '’'; } + q:lang(zh), q:lang(ja) { + quotes: '「' '」' '『' '』' '「' '」' '『' '』' '「' '」' '『' '』'; } + q:lang(zh-CN), q:lang(zh-Hans), q:lang(en) { + quotes: '“' '”' '‘' '’' '“' '”' '‘' '’' '“' '”' '‘' '’'; } + q:lang(en-GB) { + quotes: '‘' '’' '“' '”' '‘' '’' '“' '”' '‘' '’' '“' '”'; } + q:before { + content: open-quote; } + q:after { + content: close-quote; } + +/* 區塊引用 + Block quotes + --------------------------------------- + 文章內的區塊引用 + In articles + --------------------------------------- */ +article:lang(zh) blockquote, +article:lang(ja) blockquote { + font-family: serif; + margin: 1.5em 0 1.5em 2em; + width: auto; } + +/* 引用中的引用 + Blockquote hierarchies + --------------------------------------- */ +article:lang(zh) blockquote blockquote { + margin: 1em 0 1em 2em; } + +article:lang(ja) blockquote blockquote { + margin: 1em 0 1em 1em; } + +/* 文章區塊下描述元素內的區塊引用 + In article figures + --------------------------------------- */ +article:lang(zh) figure blockquote, +article:lang(ja) figure blockquote { + font-family: serif; + font-size: 1.25em; + margin: .5em 0 0; + padding: 7px; } + article:lang(zh) figure blockquote blockquote, + article:lang(ja) figure blockquote blockquote { + margin: inherit; } + article:lang(zh) figure blockquote p, + article:lang(ja) figure blockquote p { + margin: .2em 0; } + +article:lang(zh) figure figcaption, +article:lang(ja) figure figcaption { + border-top: 1px solid lightgrey; + clear: both; + color: #666; + font: .85em normal sans-serif; + padding-top: .25em; + text-align: justify; } + +/* --------------------------------------- + 漢字註音 + --- + Hanzi Rubies + --------------------------------------- + 羅馬拼音 + Romanisation + --------------------------------------- */ +html.han-js-rendered ruby rt:before, +html.han-js-rendered ruby rt:after { + content: ''; } + +html.ruby ruby rt { + padding: 0 .2em; } + +html.no-ruby ruby { + display: inline-block; + line-height: 1.2; + text-indent: 0; + vertical-align: 1.15em; } + +html.no-ruby ruby, +html.no-ruby ruby .rt { + text-indent: 0; } + +html.no-ruby ruby .rr { + display: inline-table; + text-align: center; } + +html.no-ruby ruby .rb { + display: table-row-group; } + +html.no-ruby ruby:not(.mps) .rt { + display: table-header-group; + font-size: .8em; + line-height: normal; + padding: 0 .05em; + white-space: nowrap; } + +html.no-ruby ruby .rt:empty:after { + content: ' '; + display: inherit; } + +/* 橫式注音符號 + Zhuyin (left-to-right) + --------------------------------------- */ +ruby.mps-ltr rt, +ruby.mps-ltr .rt { + font-family: cursive, serif; } + +/* --------------------------------------- + 代碼元素 + --- + Code + --------------------------------------- */ +code, +kbd, +pre, +samp { + font-family: monospace, sans-serif; } + +/* --------------------------------------- + 在小視窗瀏覽器上(如手持裝置)的微調 + --- + Adjustments to small-width windows + (i.e., mobile devices) + --------------------------------------- */ +@media only screen and (max-width: 480px), only screen and (device-aspect-ratio: 2 / 3), only screen and (device-aspect-ratio: 40 / 71) { + article:lang(zh).poem-like p, + article:lang(zh) .poem-like p, + article:lang(zh) p.poem-like, + article:lang(zh) ol > li, + article:lang(zh) ul > li { + margin-left: 1em; + padding: 0; } + + article:lang(zh) blockquote { + margin-left: 1em; } + + article:lang(zh) blockquote blockquote { + margin-left: 1em; + padding-left: 1em; } } +/* + * 字體設定 + * --- + * Font settings + * + */ + /* --------------------------------------- + 變數設定 + --- + Variables + --------------------------------------- + 預設字體fallback + Default font fallback + --------------------------------------- */ +/* 基本元素的標點樣式修正 */ +html:lang(zh), +button:lang(zh), +input:lang(zh), +select:lang(zh), +textarea:lang(zh) { + font-family: "Biaodian Sans", "Helvetica Neue", Helvetica, Arial, "Han Heiti", sans-serif; } + +html:lang(ja), +button:lang(ja), +input:lang(ja), +select:lang(ja), +textarea:lang(ja) { + font-family: "Yakumono Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } + +html.han-biaodian-pro, +html.han-biaodian-pro button, +html.han-biaodian-pro input, +html.han-biaodian-pro select, +html.han-biaodian-pro textarea { + font-family: "Biaodian Pro Sans", "Helvetica Neue", Helvetica, Arial, "Han Heiti", sans-serif; } + +html.han-biaodian-pro-cns, +html.han-biaodian-pro-cns button, +html.han-biaodian-pro-cns input, +html.han-biaodian-pro-cns select, +html.han-biaodian-pro-cns textarea { + font-family: "Biaodian Pro Sans CNS", "Helvetica Neue", Helvetica, Arial, "Han Heiti CNS", sans-serif; } + +html.han-biaodian-pro-gb, +html.han-biaodian-pro-gb button, +html.han-biaodian-pro-gb input, +html.han-biaodian-pro-gb select, +html.han-biaodian-pro-gb textarea { + font-family: "Biaodian Pro Sans GB", "Helvetica Neue", Helvetica, Arial, "Han Heiti GB", sans-serif; } + +html:lang(zh) :not(:lang(zh)):not(:lang(ja)), +html:lang(ja) :not(:lang(zh)):not(:lang(ja)), +html.han-biaodian-pro :not(:lang(zh)):not(:lang(ja)), +html.han-biaodian-pro-cns :not(:lang(zh)):not(:lang(ja)) { + font-family: "Helvetica Neue", Helvetica, Arial, "Han Heiti", sans-serif; } + +/* 書名號 */ +/* + * 1. Corrects font fallback on WebKit + */ +cite:lang(en).piece:before, +cite:lang(en).piece:after { + font-family: Georgia, Times, "Times New Roman", serif; + /* 1 */ } + +/* 着重號 */ +/* 不支援CSS着重號`text-emphasis`的hack所使用的着重號字體 */ +.no-textemphasis :lang(zh) em span.cjk:after, +.no-textemphasis :lang(ja) em span.cjk:after, +.no-textemphasis :lang(zh) em span.latin:after, +.no-textemphasis :lang(ja) em span.latin:after { + font-family: 'Hiragino Mincho ProN', 'Hiragino Mincho Pro', 'MS Mincho', MS-Mincho, serif !important; } + +/* 變音文字 */ +i:lang(zh) { + font-family: 'Biaodian Serif', 'Latin Italic Serif', 'Han Kaiti', cursive, serif; } + +article blockquote i:lang(zh) { + font-family: 'Biaodian Sans', 'Latin Italic Sans', sans-serif; } + +html.han-biaodian-pro i:lang(zh) { + font-family: 'Biaodian Pro Serif', 'Latin Italic Serif', 'Han Kaiti', cursive, serif; } + +html.han-biaodian-pro-cns i:lang(zh) { + font-family: 'Biaodian Pro Sans CNS', 'Latin Italic Serif', 'Han Kaiti', cursive, serif; } + +html.han-biaodian-pro article blockquote i:lang(zh) { + font-family: "Biaodian Pro Sans", "Latin Italic Sans", "Helvetica Neue", Helvetica, Arial, "Han Heiti", sans-serif; } + +html.han-biaodian-pro-cns article blockquote i:lang(zh) { + font-family: "Biaodian Pro Sans CNS", "Latin Italic Sans", "Helvetica Neue", Helvetica, Arial, "Han Heiti", sans-serif; } + +i:lang(ja) { + font-family: 'Yakumono Serif', 'Latin Italic Serif', 'Han Kaiti', cursive, serif; } + +article blockquote i:lang(ja), +html.han-biaodian-pro i:lang(ja), +html.han-biaodian-pro-cns i:lang(ja), +html.han-biaodian-pro article blockquote i:lang(ja), +html.han-biaodian-pro-cns article blockquote i:lang(ja) { + font-family: "Yakumono Sans", "Latin Italic Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } + +:lang(zh) i:not(:lang(zh)):not(:lang(ja)), +:lang(zh) i :not(:lang(zh)):not(:lang(ja)), +:lang(ja) i:not(:lang(zh)):not(:lang(ja)), +:lang(ja) i :not(:lang(zh)):not(:lang(ja)) { + font-family: "Latin Italic Serif", Georgia, Times, "Times New Roman", serif; } + +article:lang(zh) blockquote i:not(:lang(zh)):not(:lang(ja)), +article:lang(zh) blockquote i :not(:lang(zh)):not(:lang(ja)), +article:lang(ja) blockquote i:not(:lang(zh)):not(:lang(ja)), +article:lang(ja) blockquote i :not(:lang(zh)):not(:lang(ja)) { + font-family: "Latin Italic Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } + +:not(:lang(zh)):not(:lang(ja)) i:not(:lang(zh)):not(:lang(ja)), +:not(:lang(zh)):not(:lang(ja)) i :not(:lang(zh)):not(:lang(ja)), +:not(:lang(zh)):not(:lang(ja)) i:not(:lang(zh)):not(:lang(ja)), +:not(:lang(zh)):not(:lang(ja)) i :not(:lang(zh)):not(:lang(ja)) { + font-family: inherit; + font-style: italic; } + +/* 如果系統不支援楷體 */ +/* If Kaiti is not supported in users' OS. */ +.no-fontface-kaiti i:lang(zh), +.no-fontface-kaiti i:lang(ja) { + font-family: "Biaodian Serif", "Biaodian Sans", "Latin Italic Serif", Georgia, Times, "Times New Roman", "Han Songti", serif; } + +.no-fontface-kaiti i:lang(ja) { + font-family: "Yakumono Serif", "Yakumono Sans", "Latin Italic Serif", Georgia, Times, "Times New Roman", serif; } + +html.han-biaodian-pro.no-fontface-kaiti i:lang(zh) { + font-family: "Biaodian Pro Serif", "Biaodian Pro Sans", "Latin Italic Serif", Georgia, Times, "Times New Roman", "Han Songti", serif; } + +html.han-biaodian-pro-cns.no-fontface-kaiti i:lang(zh) { + font-family: "Biaodian Pro Serif CNS", "Biaodian Pro Sans CNS", "Latin Italic Serif", Georgia, Times, "Times New Roman", "Han Songti", serif; } + +/* 文章內重點(article strong) */ +article strong:lang(zh), +article strong:lang(ja) { + font-family: "Biaodian Sans", "Helvetica Neue", Helvetica, Arial, "Han Heiti", sans-serif; } + +article strong:lang(ja) { + font-family: "Yakumono Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } + +html.han-biaodian-pro article strong:lang(zh) { + font-family: "Biaodian Pro Sans", "Helvetica Neue", Helvetica, Arial, "Han Heiti", sans-serif; } + +html.han-biaodian-pro-cns article strong:lang(zh) { + font-family: "Biaodian Pro Sans CNS", "Helvetica Neue", Helvetica, Arial, "Han Heiti CNS", sans-serif; } + +html.han-biaodian-pro-gb article strong:lang(zh) { + font-family: "Biaodian Pro Sans GB", "Helvetica Neue", Helvetica, Arial, "Han Heiti GB", sans-serif; } + +article strong:not(:lang(zh)):not(:lang(ja)), +html.han-biaodian-pro article strong:not(:lang(zh)):not(:lang(ja)), +html.han-biaodian-pro-cns article strong:not(:lang(zh)):not(:lang(ja)) { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } + +/* 文章內的區塊引用(blockquote) */ +article:lang(zh) blockquote, +article:lang(ja) blockquote { + font-family: "Biaodian Serif", Georgia, Times, "Times New Roman", "Han Kaiti", cursive, "標楷體", serif; } + +html.han-biaodian-pro article blockquote { + font-family: 'Biaodian Pro Serif', 'Numeral LF Serif', Georgia, 'Times New Roman', 'Han Kaiti', cursive, serif; } + +html.han-biaodian-pro-cns article blockquote { + font-family: 'Biaodian Pro Serif CNS', 'Numeral LF Serif', Georgia, 'Times New Roman', 'Han Kaiti CNS', cursive, serif; } + +html.han-biaodian-pro-gb article blockquote { + font-family: 'Biaodian Pro Serif GB', 'Numeral LF Serif', Georgia, 'Times New Roman', 'Han Kaiti GB', cursive, serif; } + +article blockquote:lang(ja), +html.han-biaodian-pro article blockquote:lang(ja), +html.han-biaodian-pro-cns article blockquote:lang(ja) { + font-family: "Yakumono Serif", Georgia, Times, "Times New Roman", "Han Kaiti", cursive, "標楷體", serif; } + +article:lang(zh) blockquote:not(:lang(zh)):not(:lang(ja)), +article:lang(zh) blockquote :not(:lang(zh)):not(:lang(ja)), +article:lang(ja) blockquote:not(:lang(zh)):not(:lang(ja)), +article:lang(ja) blockquote :not(:lang(zh)):not(:lang(ja)) { + font-family: Georgia, Times, "Times New Roman", "Han Kaiti", cursive, "標楷體", serif; } + +/* 描述元素內的區塊引用 */ +figure:lang(zh) blockquote, +figure:lang(ja) blockquote, +figure:lang(zh) blockquote blockquote +figure:lang(ja) blockquote blockquote { + font-family: "Biaodian Serif", Georgia, Times, "Times New Roman", "Han Songti", serif; } + +html.han-biaodian-pro figure:lang(zh) blockquote { + font-family: 'Biaodian Pro Serif', 'Numeral LF Serif', Georgia, 'Times New Roman', 'Han Songti', serif; } + +html.han-biaodian-pro-cns figure:lang(zh) blockquote { + font-family: 'Biaodian Pro Serif CNS', 'Numeral LF Serif', Georgia, 'Times New Roman', 'Han Songti CNS', serif; } + +html.han-biaodian-pro-gb figure:lang(zh) blockquote { + font-family: 'Biaodian Pro Serif GB', 'Numeral LF Serif', Georgia, 'Times New Roman', 'Han Songti GB', serif; } + +figure:lang(ja) blockquote, +figure:lang(ja) blockquote blockquote, +html.han-biaodian-pro figure:lang(ja) blockquote, +html.han-biaodian-pro-cns figure:lang(ja) blockquote { + font-family: 'Yakumono Serif', 'Numeral LF Serif', Georgia, 'Times New Roman', serif; } + +figure:lang(zh) blockquote:before, +figure:lang(ja) blockquote:before { + font: 3em bold Georgia, Times, "Times New Roman", serif; } + +figure figcaption { + font: 0.85em normal "Biaodian Sans", "Helvetica Neue", Helvetica, Arial, "Han Heiti", sans-serif; } + +html.han-biaodian-pro figure:lang(zh) figcaption { + font-family: "Biaodian Pro Sans", "Helvetica Neue", Helvetica, Arial, "Han Heiti", sans-serif; } + +html.han-biaodian-pro-cns figure:lang(zh) figcaption { + font-family: "Biaodian Pro Sans CNS", "Helvetica Neue", Helvetica, Arial, "Han Heiti CNS", sans-serif; } + +html.han-biaodian-pro-gb figure:lang(zh) figcaption { + font-family: "Biaodian Pro Sans GB", "Helvetica Neue", Helvetica, Arial, "Han Heiti GB", sans-serif; } + +html.han-biaodian-pro figure:lang(ja) figcaption, +html.han-biaodian-pro-cns figure:lang(ja) figcaption { + font-family: "Yakumono Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } + +/* 代碼(code) */ +code, +kbd, +pre, +samp { + font-family: Courier, monospace, sans-serif; } + code:lang(zh), + kbd:lang(zh), + pre:lang(zh), + samp:lang(zh) { + font-family: 'Biaodian Sans', Courier, 'Han Heiti', monospace, sans-serif; } + code:lang(ja), + kbd:lang(ja), + pre:lang(ja), + samp:lang(ja) { + font-family: 'Yakumono Sans', Courier, monospace, sans-serif; } + html.han-biaodian-pro code, html.han-biaodian-pro + kbd, html.han-biaodian-pro + pre, html.han-biaodian-pro + samp { + font-family: 'Biaodian Pro Sans', Courier, 'Han Heiti', monospace, sans-serif; } + html.han-biaodian-pro-cns code, html.han-biaodian-pro-cns + kbd, html.han-biaodian-pro-cns + pre, html.han-biaodian-pro-cns + samp { + font-family: 'Biaodian Pro Sans CNS', Courier, 'Han Heiti CNS', monospace, sans-serif; } + html.han-biaodian-pro-gb code, html.han-biaodian-pro-gb + kbd, html.han-biaodian-pro-gb + pre, html.han-biaodian-pro-gb + samp { + font-family: 'Biaodian Pro Sans GB', Courier, 'Han Heiti GB', monospace, sans-serif; } + code:not(:lang(zh)):not(:lang(ja)), + code :not(:lang(zh)):not(:lang(ja)), + kbd:not(:lang(zh)):not(:lang(ja)), + kbd :not(:lang(zh)):not(:lang(ja)), + pre:not(:lang(zh)):not(:lang(ja)), + pre :not(:lang(zh)):not(:lang(ja)), + samp:not(:lang(zh)):not(:lang(ja)), + samp :not(:lang(zh)):not(:lang(ja)) { + font-family: Courier, 'Han Heiti', monospace, sans-serif; } + +/* `` + * + */ +hruby { + display: inline; + /* + * 實驗性註記元素(底線) + * Laboratory annotations + * + */ + /* + * 隱藏的``元素,利於複製貼上 + * Hidden `` elements, + * in order to copy and paste + * + */ + /* + * 羅馬拼音或文字註記 + * Romanization & annotations + * + */ + /* + * 複合式文字註記 + * Complex annotations + * + */ + /* + * 拼、注音直角共同顯示 + * Right-angle + * Romanization & Zhuyin + * + */ + /* + * 國語注音、台灣方言音符號 + * Zhuyin + * + */ + /* 依通用字體集選用注音字體 + * Define Zhuyin font according to + * its parental generic family */ + /* 注音及方言音符號 + * Zhuyin + *** + * a. 偽類`:before`為「注音符」 + * b. 偽類`:after`為「音調」 */ } + u.han-js-charized hruby, + hruby u.han-js-charized { + border-bottom: 1px solid; + padding-bottom: 0.125em; } + u.han-js-charized hruby span.char span, + hruby u.han-js-charized span.char span { + border-bottom: 0 none !important; } + hruby u.han-js-charized + u { + margin-left: 0.125em; } + hruby copy { + display: inline-block; + opacity: 0; + text-indent: -9999999px; + height: 0; + width: 0; } + hruby rb[annotation] { + display: inline-block; + position: relative; + text-indent: 0; } + hruby rb[annotation]:before { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + display: inline-block; + left: -200%; + position: absolute; + top: -0.5em; + vertical-align: middle; + -moz-transform: scale(0.55); + -webkit-transform: scale(0.55); + transform: scale(0.55); + height: 1em; + width: 500%; + content: attr(annotation); + line-height: 1.5; + text-align: center; + text-indent: 0; } + hruby[complex] rb[annotation][order="1"]:before { + top: -0.5em; } + hruby[complex] rb[annotation][order="2"]:before { + bottom: -0.25em; + top: auto; } + hruby[rightangle] rb[annotation]:before { + bottom: -0.25em; + top: auto; + margin-left: -0.3em; + line-height: 1; } + hruby[generic] rb[yin]:after { + font-family: "Zhuyin Kaiti", cursive, serif; } + hruby[generic="sans-serif"] rb[yin]:before, + hruby[generic="sans-serif"] rb[diao^="ㆴ"]:after, + hruby[generic="sans-serif"] rb[diao^="ㆵ"]:after, + hruby[generic="sans-serif"] rb[diao^="ㆶ"]:after, + hruby[generic="sans-serif"] rb[diao^="ㆷ"]:after { + font-family: "Zhuyin Heiti", sans-serif; } + hruby[generic="serif"] rb[yin]:before { + font-family: "Zhuyin Kaiti", cursive, serif; } + hruby rb[zhuyin] { + display: inline-block; + position: relative; + text-indent: 0; + width: 1.65em; + /* 依注音字符數量為「注音」及「調號」定位 + */ } + hruby rb[zhuyin]:before, hruby rb[zhuyin][diao]:after { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + display: inline-block; + position: absolute; + right: 0; + top: 0; + -moz-transform: scale(0.55); + -webkit-transform: scale(0.55); + transform: scale(0.55); + height: 2.7em; + width: 0.8em; + -moz-text-emphasis: none; + -webkit-text-emphasis: none; + text-emphasis: none; + -moz-text-emphasis-position: under; + -webkit-text-emphasis-position: under; + text-emphasis-position: under; + font-style: normal; + font-weight: normal; + line-height: 0.9; + text-indent: 0; + text-decoration: none; } + hruby rb[zhuyin]:before { + content: attr(yin); + line-height: 0.9; + white-space: pre-wrap; + word-break: break-all; } + hruby rb[zhuyin][diao]:after { + right: -0.6em; + width: 1em; + content: attr(diao); } + hruby rb[zhuyin][length="1"]:before { + margin-top: 0.25em; } + hruby rb[zhuyin][length="1"]:after { + margin-top: -0.35em; } + hruby rb[zhuyin][length="2"]:before { + margin-top: -0.15em; } + hruby rb[zhuyin][length="2"]:after { + margin-top: 0.125em; } + hruby rb[zhuyin][length="3"]:before { + margin-top: -0.4em; } + hruby rb[zhuyin][length="3"]:after { + margin-top: 0.25em; } + hruby rb[zhuyin][diao="˙"]:after { + right: -0.275em; } + hruby rb[zhuyin][diao="˙"][length="1"]:after { + margin-top: 0; } + hruby rb[zhuyin][diao="˙"][length="2"]:after { + margin-top: -0.25em; } + hruby rb[zhuyin][diao="˙"][length="3"]:after { + margin-top: -0.55em; } + hruby rb[zhuyin][diao="˪"]:after, hruby rb[zhuyin][diao="˫"]:after { + -moz-transform: scale(0.6); + -webkit-transform: scale(0.6); + transform: scale(0.6); + margin-right: -0.15em; } + hruby rb[zhuyin][diao^="ㆴ"]:after, hruby rb[zhuyin][diao^="ㆵ"]:after, hruby rb[zhuyin][diao^="ㆶ"]:after, hruby rb[zhuyin][diao^="ㆷ"]:after { + margin-right: -0.2em; + margin-top: 0.55em; } + +/* + * 在Retina Display螢幕下,使用更小字體的注音符號 + * Apply even littler font-size + * on Retina Display screen + * + */ +@media screen and (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 192dpi) { + hruby rb[zhuyin] { + width: 1.45em; + /* 依注音字符數量為「音符」及「調號」定位 + */ } + hruby rb[zhuyin]:before, hruby rb[zhuyin][diao]:after { + -moz-transform: scale(0.4); + -webkit-transform: scale(0.4); + transform: scale(0.4); + line-height: 0.9; } + hruby rb[zhuyin]:before { + right: -0.15em; } + hruby rb[zhuyin][length="1"]:before { + margin-top: 0; } + hruby rb[zhuyin][length="1"]:after { + margin-top: -0.125em; } + hruby rb[zhuyin][length="2"]:before { + margin-top: -0.2em; } + hruby rb[zhuyin][length="2"]:after { + margin-top: 0; } + hruby rb[zhuyin][length="3"]:after { + margin-top: 0.125em; } + hruby rb[zhuyin][diao="˙"]:after { + right: -0.375em; } + hruby rb[zhuyin][diao="˙"][length="1"]:after { + margin-top: -0.125em; } + hruby rb[zhuyin][diao="˙"][length="2"]:after { + margin-top: -0.25em; } + hruby rb[zhuyin][diao="˙"][length="3"]:after { + margin-top: -0.5em; } + hruby rb[zhuyin][diao="˪"]:after, hruby rb[zhuyin][diao="˫"]:after { + -moz-transform: scale(0.55); + -webkit-transform: scale(0.55); + transform: scale(0.55); + margin-right: -0.15em; } + hruby rb[zhuyin][diao^="ㆴ"]:after, hruby rb[zhuyin][diao^="ㆵ"]:after, hruby rb[zhuyin][diao^="ㆶ"]:after, hruby rb[zhuyin][diao^="ㆷ"]:after { + margin-right: -0.15em; + margin-top: 0.4em; } } +.writingmode .zhipai hruby rb[annotation]:before { + bottom: auto; + left: -0.1em; + top: -200%; + height: 500%; + width: 1em; } +.writingmode .zhipai hruby rb[zhuyin] { + width: 1.65em; } + .writingmode .zhipai hruby rb[zhuyin]:before, .writingmode .zhipai hruby rb[zhuyin][diao]:after { + top: -0.45em; + -webkit-writing-mode: horizontal-tb; } + .writingmode .zhipai hruby rb[zhuyin]:before { + right: 0.1em; } + .writingmode .zhipai hruby rb[zhuyin][diao]:after { + right: -0.45em; } diff --git a/ajax/libs/Han/2.2.3/js/han.js b/ajax/libs/Han/2.2.3/js/han.js new file mode 100644 index 000000000..f1fbf20bd --- /dev/null +++ b/ajax/libs/Han/2.2.3/js/han.js @@ -0,0 +1,1395 @@ + +/*! + * 漢字標準格式 v2.2.3 + * --- + * Hanzi-optimised CSS Mode + * + * + * + * Lisence: MIT Lisence + * Last Modified: 2014/1/1 + * + */ + +;jQuery.noConflict + +;(function($){ + var version = '2.2.3', + + tests = [], + rubies, + + unicode = [], + + rendered = 'han-js-rendered', + classes = [rendered], + fontfaces = [], + + + han = function() { + $(document).on('ready', function(){ + + // `unicode-range` + classes.push( ( test_for_unicoderange() ? '' : 'no-' ) + 'unicoderange' ) + + // The 4(-1) Typefaces + fontfaces['songti'] = test_for_fontface( 'Han Songti' ) + fontfaces['kaiti'] = test_for_fontface( 'Han Kaiti' ) + fontfaces['fangsong'] = test_for_fontface( 'Han Fangsong' ) + + for ( var font in fontfaces ) { + classes.push( ( fontfaces[font] ? '' : 'no-' ) + 'fontface-' + font ) + } + + // altogether + $('html').addClass( classes.join(' ') ) + + init() + }) + }, + + + init = function( range ) { + if ( !range && $('html').hasClass('no-han-init') ) + return + + var range = range || 'body' + + if ( range !== 'body' && !$(range).hasClass(rendered) ) + $(range).addClass(rendered) + else if ( range === 'body' && !$('html').hasClass(rendered) ) + $('html').addClass(rendered) + + + + /* + * 加強漢字註音功能 + * --- + * Enhance `` element + * + * **注意:**需置於``的hack前。 + * + * **Note:** The necessity of being + * placed before the hack of + * the `` element is required. + */ + + // 語義類別簡化 + $(range).find('ruby, rtc').filter('.pinyin').addClass('romanization') + $(range).find('ruby, rtc').filter('.mps').addClass('zhuyin') + $(range).find('ruby, rtc').filter('.romanization').addClass('annotation') + + $(range).find('ruby').each(function() { + var html = $(this).html(), + hruby = document.createElement('hruby') + + // 羅馬拼音(在不支援``的瀏覽器下) + if ( !tests['ruby']() && + !$(this).hasClass('complex') && + !$(this).hasClass('zhuyin') && + !$(this).hasClass('rightangle') ) { + + // 將拼音轉為元素屬性以便CSS產生偽類 + $(this) + .find('rt') + .each(function(){ + var anno = $(this).html(), + prev = this.previousSibling, + text = prev.nodeValue + + prev.nodeValue = '' + + $(prev).before( + $('') + .html( text ) + .attr('annotation', anno) + .replaceWith(_copy) + ) + + $(this).replaceWith( + _copy().html(anno) + ) + }) + + $(this) + .replaceWith( + $(hruby) + .html( $(this).html() ) + ) + + } else { + var attr = {} + + // 國語注音、台灣方言音符號 + if ( $(this).hasClass('zhuyin') ) { + // 將注音轉為元素屬性以便CSS產生偽類 + $(this).find('rt') + .each(function(){ + _apply_zhuyin(this) + }) + + // 雙行文字註記 + } else if ( $(this).hasClass('complex') ) { + attr.complex = 'complex' + + _apply_annotation(this) + + + // 拼音、注音直角顯示 + } else if ( $(this).hasClass('rightangle') ) { + attr.rightangle = 'rightangle' + + + // 國語注音、台灣方言音符號 + $(this).find('rtc.zhuyin') + .hide() + .each(function(){ + var t = $(this).prevAll('rbc'), + c, len, data + + $(this).find('rt') + .each(function(i){ + var rb = t.find('rb:not([annotation])').eq(i) + _apply_zhuyin(this, rb) + }) + }) + + // 羅馬拼音或文字註記 + _apply_annotation(this) + } + + // 以``元素替代``,避免UA原生樣式的干擾 + $(this).filter(function(){ + return $(this).hasClass("zhuyin") || + $(this).hasClass("complex") || + $(this).hasClass("rightangle") + }).replaceWith( + $(hruby) + .html( $(this).html() ) + .attr('generic', _get_zhuyin_font(this)) + .attr(attr) + ) + } + }) + + + + /* + * 漢拉間隙 + * --- + * Kerning between Hanzi and Latin Letter + * + */ + + if ( $('html').hasClass('han-la') ) + $(range).each(function(){ + var hanzi = unicode_set('hanzi'), + latin = unicode_set('latin') + '|' + unicode['punc'][0], + punc = unicode['punc'] + + patterns = [ + '/(' + hanzi + ')(' + latin + '|' + punc[1] + ')/ig', + '/(' + latin + '|' + punc[2] + ')(' + hanzi + ')/ig' + ] + + + patterns.forEach(function( exp ){ + findAndReplaceDOMText(this, { + find: eval(exp), + replace: '$1$2' + }) + }, this) + + findAndReplaceDOMText(this, { + find: '', + replace: function(){ + return document.createElement('hanla') + } + }) + + this.normalize() + + $('* > hanla:first-child').parent().each(function(){ + if ( this.firstChild.nodeType == 1 ) { + $(this).before( $('') ) + $(this).find('hanla:first-child').remove() + } + }) + }) + + + + /* + * 修正相鄰註記元素``的底線相連問題 + * --- + * fixing the underline-adjacency issue on `` element + * + */ + + if ( $('html').hasClass('han-lab-underline') ) + $(range).find('u').charize('', true, true) + else + $(range).find('u').each(function(){ + var next = this.nextSibling + + while ( next != null && ( next.nodeName === "WBR" || next.nodeType == 8 )) + next = next.nextSibling + + $(next).filter('u').addClass('adjacent') + }) + + + + /* 強調元素``的着重號 + * --- + * punctuation: CJK emphasis dots on `` element + * + */ + + $(range).find('em').charize({ + latin: ( tests['textemphasis']() ) ? 'none' : 'individual' + }) + }, + + + + unicode_set = function( set ) { + var join = ( set.match(/[hanzi|latin]/) ) ? true : false, + result = ( join ) ? unicode[set].join('|') : unicode[set] + + return result + }, + + + _span = function( className ) { + var span = document.createElement('span') + span.className = className + + return span + }, + + + _copy = function() { + return $(document.createElement('copy')) + }, + + + _apply_annotation = function( node ) { + $(node).find('rbc').find('rb') + .each(function(i){ + $(this).attr('index', i) + }) + + $(node).find('rtc:not(.zhuyin)') + .hide() + .each(function(t){ + var c = 0, + rtc = $(this), + rbc = $(this).prevAll('rbc'), + len = $(this).find('rt').length, + data = [] + + $(this).find('rt') + .each(function(h){ + var anno = $(this).html(), + rbspan = $(this).attr('rbspan') || 1, + i = c + + c += Number(rbspan) + + data[h] = { + 'annotation': anno, + 'order': (t==0) ? '1' : '2' + } + + for ( var j=i; j') + .attr( data[k] ) + ) + } + }) + + $(node).find('rb') + .after(' ') + .removeAttr('set index') + .filter('rb[annotation]') + .each(function(){ + var t = $(this).attr('annotation') + $(this).after( _copy().html( t ) ) + }) + }, + + + _get_zhuyin_font = function( node ) { + var reg = /(sans-serif|monospace)$/, + generic = $(node).css('font-family'), + font = generic.match(reg) ? 'sans-serif' : 'serif' + + return font + }, + + + _apply_zhuyin = function( node, rb ) { + var sm = unicode['zhuyin']['shengmu'], + jy = unicode['zhuyin']['jieyin'], + ym = unicode['zhuyin']['yunmu'], + yj = unicode['zhuyin']['yunjiao'], + tone = unicode['zhuyin']['diao'], + + prev, text, zi, + zy = $(node).html(), + yin, diao, form, length, data + + form = ( zy.match(eval('/(' + sm + ')/')) ) ? 'shengmu' : '' + form += ( zy.match(eval('/(' + jy + ')/')) ) ? (( form !== '' ) ? '-' : '') + 'jieyin' : '' + form += ( zy.match(eval('/(' + ym + ')/')) ) ? (( form !== '' ) ? '-' : '') + 'yunmu' : '' + + yin = zy + .replace(eval('/(' + tone + ')/g'), '') + .replace(eval('/(' + yj + '̍)/g'), '') + + length = (yin) ? yin.length : 0 + + diao = ( zy.match(/(\u02D9)/) ) ? '\u02D9' : + ( zy.match(/(\u02CA)/) ) ? '\u02CA' : + ( zy.match(/([\u02C5\u02C7])/) ) ? '\u02C7' : + ( zy.match(/(\u02CB)/) ) ? '\u02CB' : + ( zy.match(/(\u02EA)/) ) ? '\u02EA' : + ( zy.match(/(\u02EB)/) ) ? '\u02EB' : + ( zy.match(/(\u31B4[\u0358\u030d])/) ) ? '\u31B4\u0358' : + ( zy.match(/(\u31B5[\u0358\u030d])/) ) ? '\u31B5\u0358' : + ( zy.match(/(\u31B6[\u0358\u030d])/) ) ? '\u31B6\u0358' : + ( zy.match(/(\u31B7[\u0358\u030d])/) ) ? '\u31B7\u0358' : + ( zy.match(/(\u31B4)/) ) ? '\u31B4' : + ( zy.match(/(\u31B5)/) ) ? '\u31B5' : + ( zy.match(/(\u31B6)/) ) ? '\u31B6' : + ( zy.match(/(\u31B7)/) ) ? '\u31B7' : '' + + data = { + 'zhuyin': zy, + 'yin': yin, + 'diao': diao, + 'length': length, + 'form': form + } + + if ( rb ) + rb + .attr(data) + .append( _copy().html( zy ) ) + else { + prev = node.previousSibling + text = prev.nodeValue.split('') + zi = text.pop() + prev.nodeValue = text.join('') + + $(node) + .before( + $('') + .attr(data) + .text( zi ) + ) + .after( ' ' ) + //.replaceWith( '' ) + .replaceWith( _copy().html( zy ) ) + } + }, + + + findAndReplaceDOMText = function( a, b ) { + var b = b + + b.filterElements = function( el ) { + var name = el.nodeName.toLowerCase(), + classes = ( el.nodeType == 1 ) ? el.getAttribute('class') : '', + charized = ( classes && classes.match(/han-js-charized/) != null ) ? true : false + + return name !== 'style' && name !== 'script' && !charized + } + + return window.findAndReplaceDOMText(a,b) + }, + + + inject_element_with_styles = function( rule, callback, nodes, testnames ) { + var style, ret, node, docOverflow, + + docElement = document.documentElement, + div = document.createElement('div'), + body = document.body, + fakeBody = body || document.createElement('body') + + + style = [''].join('') + + ;(body ? div : fakeBody).innerHTML += style + fakeBody.appendChild(div) + + if ( !body ) { + fakeBody.style.background = '' + fakeBody.style.overflow = 'hidden' + docOverflow = docElement.style.overflow + docElement.style.overflow = 'hidden' + docElement.appendChild(fakeBody) + } + + ret = callback(div, rule) + + if ( !body ) { + fakeBody.parentNode.removeChild(fakeBody) + docElement.style.overflow = docOverflow + } else + div.parentNode.removeChild(div) + + return !!ret + }, + + + write_on_canvas = function( text, font ) { + var canvasNode = document.createElement('canvas') + canvasNode.width = '50' + canvasNode.height = '20' + + canvasNode.style.display = 'none' + canvasNode.className = 'han_support_tests' + document.body.appendChild(canvasNode) + var ctx = canvasNode.getContext('2d') + + ctx.textBaseline = 'top' + ctx.font = '15px ' + font + ', sans-serif' + ctx.fillStyle = 'black' + ctx.strokeStyle = 'black' + + ctx.fillText( text, 0, 0 ) + + return ctx + }, + + + test_for_fontface = function( test, compare, zi ) { + if ( !tests['fontface']() ) + return false + + var test = test, + compare = compare || 'sans-serif', + zi = zi || '辭Q' + + try { + var sans = write_on_canvas( zi, compare ), + test = write_on_canvas( zi, test ), + support + + for (var j=1; j<=20; j++) { + for (var i=1; i<=50; i++) { + var sansData = sans.getImageData(i, j, 1, 1).data, + testData = test.getImageData(i, j, 1, 1).data, + + alpha = [] + + alpha['sans'] = sansData[3] + alpha['test'] = testData[3] + + if ( support !== 'undefined' && alpha['test'] != alpha['sans'] ) + support = true + else if ( support ) + break + if ( i == 20 && j == 20 && !support ) + support = false + } + } + + $('canvas.han_support_tests').remove() + return support + } catch ( err ) { + return false + } + } + + + test_for_unicoderange = function() { + return !test_for_fontface( 'han-unicode-range', 'Arial, "Droid Sans"', 'a' ) + } + + + /** + * -------------------------------------------------------- + * Unicode區段說明(6.2.0) + * Unicode blocks + * -------------------------------------------------------- + * 或參考: + * http://css.hanzi.co/manual/api/javascript_jiekou-han.unicode + * -------------------------------------------------------- + * + ** 以下歸類為「拉丁字母」(`unicode('latin')`)** + * + * 基本拉丁字母:a-z + * 阿拉伯數字:0-9 + * 拉丁字母補充-1:[\u00C0-\u00FF] + * 拉丁字母擴展-A區:[\u0100-\u017F] + * 拉丁字母擴展-B區:[\u0180-\u024F] + * 拉丁字母附加區:[\u1E00-\u1EFF] + * + ** 符號:[~!@#&=_\$\%\^\*\-\+\,\.\/(\\)\?\:\'\"\[\]\(\)'"<>‘“”’] + * + * -------------------------------------------------------- + * + ** 以下歸類為「漢字」(`unicode('hanzi')`)** + * + * CJK一般:[\u4E00-\u9FFF] + * CJK擴展-A區:[\u3400-\u4DB5] + * CJK擴展-B區:[\u20000-\u2A6D6] + * CJK Unicode 4.1:[\u9FA6-\u9FBB]、[\uFA70-\uFAD9] + * CJK Unicode 5.1:[\u9FBC-\u9FC3] + * CJK擴展-C區:[\u2A700-\u2B734] + * CJK擴展-D區:[\u2B740-\u2B81D](急用漢字) + * CJK擴展-E區:[\u2B820-\u2F7FF](**註**:暫未支援) + * CJK擴展-F區(**註**:暫未支援) + * CJK筆畫區:[\u31C0-\u31E3] + * 數字「〇」:[\u3007] + * 日文假名:[\u3040-\u309E][\u30A1-\u30FA][\u30FD\u30FE](**註**:排除片假名中點、長音符) + * + * CJK相容表意文字: + * [\uF900-\uFAFF](**註**:不使用) + * [\uFA0E-\uFA0F\uFA11\uFA13-\uFA14\uFA1F\uFA21\uFA23-\uFA24\uFA27-\uFA29](**註**:12個例外) + * -------------------------------------------------------- + * + ** 符號 + * [·・︰、,。:;?!—⋯….·「『(〔【《〈“‘」』)〕】》〉’”–ー—] + * + ** 其他 + * + * 漢語注音符號、擴充:[\u3105-\u312D][\u31A0-\u31BA] + * 國語五聲調(三聲有二種符號):[\u02D9\u02CA\u02C5\u02C7\u02CB] + * 台灣漢語方言音擴充聲調:[\u02EA\u02EB] + * + */ + + unicode['latin'] = [ + '[A-Za-z0-9\u00C0-\u00FF\u0100-\u017F\u0180-\u024F\u1E00-\u1EFF]' + ] + + unicode['punc'] = [ + '[@&=_\,\.\?\!\$\%\^\*\-\+\/]', + '[\(\\[\'"<‘“]', + '[\)\\]\'">”’]' + ] + + unicode['hanzi'] = [ + '[\u4E00-\u9FFF]', + '[\u3400-\u4DB5\u9FA6-\u9FBB\uFA70-\uFAD9\u9FBC-\u9FC3\u3007\u3040-\u309E\u30A1-\u30FA\u30FD\u30FE\uFA0E-\uFA0F\uFA11\uFA13-\uFA14\uFA1F\uFA21\uFA23-\uFA24\uFA27-\uFA29]', + '[\uD840-\uD868][\uDC00-\uDFFF]|\uD869[\uDC00-\uDEDF]', + '\uD86D[\uDC00-\uDF3F]|[\uD86A-\uD86C][\uDC00-\uDFFF]|\uD869[\uDF00-\uDFFF]', + '\uD86D[\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1F]', + '[\u31C0-\u31E3]' + ] + + unicode['biaodian'] = [ + '[·・︰、,。:;?!—ー⋯….·/]', + '[「『(〔【《〈“‘]', + '[」』)〕】》〉’”]' + ] + + unicode['zhuyin'] = [] + unicode['zhuyin'][0] = '[\u3105-\u312D\u31A0-\u31BA]' + unicode['zhuyin']['shengmu'] = '[\u3105-\u3119\u312A-\u312C\u31A0-\u31A3]' + unicode['zhuyin']['jieyin'] = '[\u3127-\u3129]' + unicode['zhuyin']['yunmu'] = '[\u311A-\u3126\u312D\u31A4-\u31B3\u31B8-\u31BA]' + unicode['zhuyin']['yunjiao'] = '[\u31B4-\u31B7]' + unicode['zhuyin']['diao'] = '[\u02D9\u02CA\u02C5\u02C7\u02CB\u02EA\u02EB]' + + + + /** + * tests for HTML5/CSS3 features + * + */ + + /* CSS3 property: `column-width` */ + tests['columnwidth'] = function() { + var cw = $('
tester
'), + + bool = ( /^200px$/.test( cw.css("-webkit-column-width") ) || + /^200px$/.test( cw.css("-moz-column-width") ) || + /^200px$/.test( cw.css("-ms-column-width") ) || + /^200px$/.test( cw.css("column-width") ) ) ? true : false + + return bool + } + + + /* -------------------------------------------------------- + * test for '@font-face' + * -------------------------------------------------------- + * Originates from Modernizr (http://modernizr.com) + */ + + tests['fontface'] = function() { + var bool + + inject_element_with_styles('@font-face {font-family:"font"; src:url("https://")}', function( node, rule ) { + var style = document.getElementById('han-support'), + sheet = style.sheet || style.styleSheet, + cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ? sheet.cssRules[0].cssText : sheet.cssText || '') : '' + + bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0 + }) + + return bool + } + + + tests['ruby'] = function() { + if ( rubies != null ) + return rubies + + + var ruby = document.createElement('ruby'), + rt = document.createElement('rt'), + rp = document.createElement('rp'), + docElement = document.documentElement, + displayStyleProperty = 'display' + + ruby.appendChild(rp) + ruby.appendChild(rt) + docElement.appendChild(ruby) + + // browsers that support hide the via "display:none" + rubies = ( getStyle(rp, displayStyleProperty) == 'none' || + // but in IE browsers has "display:inline" so, the test needs other conditions: + getStyle(ruby, displayStyleProperty) == 'ruby' + && getStyle(rt, displayStyleProperty) == 'ruby-text' ) ? true : false + + + docElement.removeChild(ruby) + // the removed child node still exists in memory, so ... + ruby = null + rt = null + rp = null + + return rubies + + + function getStyle( element, styleProperty ) { + var result + + if ( window.getComputedStyle ) // for non-IE browsers + result = document.defaultView.getComputedStyle(element,null).getPropertyValue(styleProperty) + else if ( element.currentStyle ) // for IE + result = element.currentStyle[styleProperty] + + return result + } + } + + + tests['textemphasis'] = function() { + var em = $('tester'), + + bool = ( /^dot$/.test( em.css("-webkit-text-emphasis-style") ) || + /^dot$/.test( em.css("text-emphasis-style") ) || + /^dot$/.test( em.css("-moz-text-emphasis-style") ) || + /^dot$/.test( em.css("-ms-text-emphasis-style") ) ) ? true : false + + return bool + } + + + tests['writingmode'] = function() { + var wm = $('
tester
'), + + bool = ( /^tb-rl$/.test( wm.css("writing-mode") ) || + /^vertical-rl$/.test( wm.css("-webkit-writing-mode") ) || + /^tb-rl$/.test( wm.css("-moz-writing-mode") ) || + /^tb-rl$/.test( wm.css("-ms-writing-mode") ) ) ? true: false + + return bool + } + + + + $.fn.extend({ + hanInit: function() { + return init(this) + }, + + + bitouwei: function() { + return this.each(function(){ + $(this).addClass( 'han-js-bitouwei-rendered' ) + + var tou = unicode['biaodian'][0] + unicode['biaodian'][2], + wei = unicode['biaodian'][1], + start = unicode['punc'][0] + unicode['punc'][2], + end = unicode['punc'][1] + + tou = tou.replace(/\]\[/g, '' ) + start = start.replace(/\]\[/g, '' ) + + + // CJK characters + findAndReplaceDOMText(this, { + find: eval( '/(' + wei + ')(' + unicode_set('hanzi') + ')(' + tou + ')/ig' ), + wrap: _span( 'bitouwei bitouweidian' ) + }) + + findAndReplaceDOMText(this, { + find: eval( '/(' + unicode_set('hanzi') + ')(' + tou + ')/ig' ), + wrap: _span( 'bitouwei bitoudian' ) + }) + + findAndReplaceDOMText(this, { + find: eval( '/(' + wei + ')(' + unicode_set('hanzi') + ')/ig' ), + wrap: _span( 'bitouwei biweidian' ) + }) + + + // Latin letters + findAndReplaceDOMText(this, { + find: eval( '/(' + end + ')(' + unicode_set('latin') + '+)(' + start + ')/ig' ), + wrap: _span( 'bitouwei bitouweidian' ) + }) + + findAndReplaceDOMText(this, { + find: eval( '/(' + unicode_set('latin') + '+)(' + start + ')/ig' ), + wrap: _span( 'bitouwei bitoudian' ) + }) + + findAndReplaceDOMText(this, { + find: eval( '/(' + end + ')(' + unicode_set('latin') + '+)/ig' ), + wrap: _span( 'bitouwei biweidian' ) + }) + }) + }, + + + charize: function( glyph, charClass, innerSpan ){ + var glyph = glyph || {}, + charClass = (charClass == true) ? true : false + + glyph = { + cjk: glyph.cjk || 'individual', + bitouwei: (glyph.bitouwei == false) ? false : true, + latin: glyph.latin || 'group' + } + + return this.each(function(){ + if ( glyph.bitouwei ) + $(this).bitouwei() + + + // CJK characters + if ( glyph.cjk === 'individual' ) + findAndReplaceDOMText(this, { + find: eval( '/(' + unicode_set('hanzi') + ')/ig' ), + wrap: _span( 'char cjk' ) + }) + + + if ( glyph.cjk === 'individual' || glyph.cjk === 'biaodian' ) + findAndReplaceDOMText(this, { + find: eval( '/(' + unicode_set('biaodian') + ')/ig' ), + wrap: _span( 'char cjk biaodian' ) + }) + + + if ( glyph.cjk === 'group' ) + findAndReplaceDOMText(this, { + find: eval( '/(' + unicode_set('hanzi') + '+|' + unicode_set('biaodian') + '+)/ig' ), + wrap: _span( 'char cjk' ) + }) + + + var latin_regex = ( glyph.latin === 'group' ) ? + '/(' + unicode_set('latin') + '+)/ig' : + '/(' + unicode_set('latin') + ')/ig' + + findAndReplaceDOMText(this, { + find: eval( latin_regex ), + wrap: _span( 'char latin' ) + }) + + + findAndReplaceDOMText(this, { + find: eval( '/(' + unicode_set('punc') + '+)/ig' ), + wrap: _span( 'char latin punc' ) + }) + + findAndReplaceDOMText(this, { + find: /([\s]+)/ig, + wrap: _span( 'char space' ) + }) + + + if ( innerSpan ) + $(this).find('.char').each(function(){ + $(this).html( + $('').text( $(this).text() ) + ) + }) + + + if ( charClass ) + $(this).addClass('han-js-charized') + }) + } + }) + + + // tests + for ( var feature in tests ) { + classes.push( ( tests[feature]() ? '' : 'no-' ) + feature ) + + if ( !tester ) + var tester = '' + + tester += ' ' + feature + ': tests[\'' + feature + '\'](),\n' + } + + !function(window) { + eval("tester = ({\n" + tester.replace(/\n$/ig, + '\nunicoderange: test_for_unicoderange, \nfont: test_for_fontface\n}') + ")") + }() + + + + han() + + window.han = { + unicode: unicode_set, + support: tester + } + +})(jQuery) + + +/** + * findAndReplaceDOMText v 0.4.0 + * @author James Padolsey http://james.padolsey.com + * @license http://unlicense.org/UNLICENSE + * + * Matches the text of a DOM node against a regular expression + * and replaces each match (or node-separated portions of the match) + * in the specified element. + */ +;window.findAndReplaceDOMText = (function() { + + var PORTION_MODE_RETAIN = 'retain'; + var PORTION_MODE_FIRST = 'first'; + + var doc = document; + var toString = {}.toString; + + function isArray(a) { + return toString.call(a) == '[object Array]'; + } + + function escapeRegExp(s) { + return String(s).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); + } + + function exposed() { + // Try deprecated arg signature first: + return deprecated.apply(null, arguments) || findAndReplaceDOMText.apply(null, arguments); + } + + function deprecated(regex, node, replacement, captureGroup, elFilter) { + if ((node && !node.nodeType) && arguments.length <= 2) { + return false; + } + var isReplacementFunction = typeof replacement == 'function'; + + if (isReplacementFunction) { + replacement = (function(original) { + return function(portion, match) { + return original(portion.text, match.startIndex); + }; + }(replacement)); + } + + // Awkward support for deprecated argument signature (<0.4.0) + var instance = findAndReplaceDOMText(node, { + + find: regex, + + wrap: isReplacementFunction ? null : replacement, + replace: isReplacementFunction ? replacement : '$' + (captureGroup || '&'), + + prepMatch: function(m, mi) { + + // Support captureGroup (a deprecated feature) + + if (!m[0]) throw 'findAndReplaceDOMText cannot handle zero-length matches'; + + if (captureGroup > 0) { + var cg = m[captureGroup]; + m.index += m[0].indexOf(cg); + m[0] = cg; + } + + m.endIndex = m.index + m[0].length; + m.startIndex = m.index; + m.index = mi; + + return m; + }, + filterElements: elFilter + }); + + exposed.revert = function() { + return instance.revert(); + }; + + return true; + } + + /** + * findAndReplaceDOMText + * + * Locates matches and replaces with replacementNode + * + * @param {Node} node Element or Text node to search within + * @param {RegExp} options.find The regular expression to match + * @param {String|Element} [options.wrap] A NodeName, or a Node to clone + * @param {String|Function} [options.replace='$&'] What to replace each match with + * @param {Function} [options.filterElements] A Function to be called to check whether to + * process an element. (returning true = process element, + * returning false = avoid element) + */ + function findAndReplaceDOMText(node, options) { + return new Finder(node, options); + } + + exposed.Finder = Finder; + + /** + * Finder -- encapsulates logic to find and replace. + */ + function Finder(node, options) { + + options.portionMode = options.portionMode || PORTION_MODE_RETAIN; + + this.node = node; + this.options = options; + + // ENable match-preparation method to be passed as option: + this.prepMatch = options.prepMatch || this.prepMatch; + + this.reverts = []; + + this.matches = this.search(); + + if (this.matches.length) { + this.processMatches(); + } + + } + + Finder.prototype = { + + /** + * Searches for all matches that comply with the instance's 'match' option + */ + search: function() { + + var match; + var matchIndex = 0; + var regex = this.options.find; + var text = this.getAggregateText(); + var matches = []; + + regex = typeof regex === 'string' ? RegExp(escapeRegExp(regex), 'g') : regex; + + if (regex.global) { + while (match = regex.exec(text)) { + matches.push(this.prepMatch(match, matchIndex++)); + } + } else { + if (match = text.match(regex)) { + matches.push(this.prepMatch(match, 0)); + } + } + + return matches; + + }, + + /** + * Prepares a single match with useful meta info: + */ + prepMatch: function(match, matchIndex) { + + if (!match[0]) { + throw new Error('findAndReplaceDOMText cannot handle zero-length matches'); + } + + match.endIndex = match.index + match[0].length; + match.startIndex = match.index; + match.index = matchIndex; + + return match; + }, + + /** + * Gets aggregate text within subject node + */ + getAggregateText: function() { + + var elementFilter = this.options.filterElements; + + return getText(this.node); + + /** + * Gets aggregate text of a node without resorting + * to broken innerText/textContent + */ + function getText(node) { + + if (node.nodeType === 3) { + return node.data; + } + + if (elementFilter && !elementFilter(node)) { + return ''; + } + + var txt = ''; + + if (node = node.firstChild) do { + txt += getText(node); + } while (node = node.nextSibling); + + return txt; + + } + + }, + + /** + * Steps through the target node, looking for matches, and + * calling replaceFn when a match is found. + */ + processMatches: function() { + + var matches = this.matches; + var node = this.node; + var elementFilter = this.options.filterElements; + + var startPortion, + endPortion, + innerPortions = [], + curNode = node, + match = matches.shift(), + atIndex = 0, // i.e. nodeAtIndex + matchIndex = 0, + portionIndex = 0, + doAvoidNode; + + out: while (true) { + + if (curNode.nodeType === 3) { + + if (!endPortion && curNode.length + atIndex >= match.endIndex) { + + // We've found the ending + endPortion = { + node: curNode, + index: portionIndex++, + text: curNode.data.substring(match.startIndex - atIndex, match.endIndex - atIndex), + indexInMatch: atIndex - match.startIndex, + indexInNode: match.startIndex - atIndex, // always zero for end-portions + endIndexInNode: match.endIndex - atIndex, + isEnd: true + }; + + } else if (startPortion) { + // Intersecting node + innerPortions.push({ + node: curNode, + index: portionIndex++, + text: curNode.data, + indexInMatch: atIndex - match.startIndex, + indexInNode: 0 // always zero for inner-portions + }); + } + + if (!startPortion && curNode.length + atIndex > match.startIndex) { + // We've found the match start + startPortion = { + node: curNode, + index: portionIndex++, + indexInMatch: 0, + indexInNode: match.startIndex - atIndex, + endIndexInNode: match.endIndex - atIndex, + text: curNode.data.substring(match.startIndex - atIndex, match.endIndex - atIndex) + }; + } + + atIndex += curNode.data.length; + + } + + doAvoidNode = curNode.nodeType === 1 && elementFilter && !elementFilter(curNode); + + if (startPortion && endPortion) { + + curNode = this.replaceMatch(match, startPortion, innerPortions, endPortion); + + // processMatches has to return the node that replaced the endNode + // and then we step back so we can continue from the end of the + // match: + + atIndex -= (endPortion.node.data.length - endPortion.endIndexInNode); + + startPortion = null; + endPortion = null; + innerPortions = []; + match = matches.shift(); + portionIndex = 0; + matchIndex++; + + if (!match) { + break; // no more matches + } + + } else if ( + !doAvoidNode && + (curNode.firstChild || curNode.nextSibling) + ) { + // Move down or forward: + curNode = curNode.firstChild || curNode.nextSibling; + continue; + } + + // Move forward or up: + while (true) { + if (curNode.nextSibling) { + curNode = curNode.nextSibling; + break; + } else if (curNode.parentNode !== node) { + curNode = curNode.parentNode; + } else { + break out; + } + } + + } + + }, + + /** + * Reverts ... TODO + */ + revert: function() { + // Reversion occurs backwards so as to avoid nodes subsequently + // replaced during the matching phase (a forward process): + for (var l = this.reverts.length; l--;) { + this.reverts[l](); + } + this.reverts = []; + }, + + prepareReplacementString: function(string, portion, match, matchIndex) { + var portionMode = this.options.portionMode; + if ( + portionMode === PORTION_MODE_FIRST && + portion.indexInMatch > 0 + ) { + return ''; + } + string = string.replace(/\$(\d+|&|`|')/g, function($0, t) { + var replacement; + switch(t) { + case '&': + replacement = match[0]; + break; + case '`': + replacement = match.input.substring(0, match.startIndex); + break; + case '\'': + replacement = match.input.substring(match.endIndex); + break; + default: + replacement = match[+t]; + } + return replacement; + }); + + if (portionMode === PORTION_MODE_FIRST) { + return string; + } + + if (portion.isEnd) { + return string.substring(portion.indexInMatch); + } + + return string.substring(portion.indexInMatch, portion.indexInMatch + portion.text.length); + }, + + getPortionReplacementNode: function(portion, match, matchIndex) { + + var replacement = this.options.replace || '$&'; + var wrapper = this.options.wrap; + + if (wrapper && wrapper.nodeType) { + // Wrapper has been provided as a stencil-node for us to clone: + var clone = doc.createElement('div'); + clone.innerHTML = wrapper.outerHTML || new XMLSerializer().serializeToString(wrapper); + wrapper = clone.firstChild; + } + + if (typeof replacement == 'function') { + replacement = replacement(portion, match, matchIndex); + if (replacement && replacement.nodeType) { + return replacement; + } + return doc.createTextNode(String(replacement)); + } + + var el = typeof wrapper == 'string' ? doc.createElement(wrapper) : wrapper; + + replacement = doc.createTextNode( + this.prepareReplacementString( + replacement, portion, match, matchIndex + ) + ); + + if (!el) { + return replacement; + } + + el.appendChild(replacement); + + return el; + }, + + replaceMatch: function(match, startPortion, innerPortions, endPortion) { + + var matchStartNode = startPortion.node; + var matchEndNode = endPortion.node; + + var preceedingTextNode; + var followingTextNode; + + if (matchStartNode === matchEndNode) { + + var node = matchStartNode; + + if (startPortion.indexInNode > 0) { + // Add `before` text node (before the match) + preceedingTextNode = doc.createTextNode(node.data.substring(0, startPortion.indexInNode)); + node.parentNode.insertBefore(preceedingTextNode, node); + } + + // Create the replacement node: + var newNode = this.getPortionReplacementNode( + endPortion, + match + ); + + node.parentNode.insertBefore(newNode, node); + + if (endPortion.endIndexInNode < node.length) { // ????? + // Add `after` text node (after the match) + followingTextNode = doc.createTextNode(node.data.substring(endPortion.endIndexInNode)); + node.parentNode.insertBefore(followingTextNode, node); + } + + node.parentNode.removeChild(node); + + this.reverts.push(function() { + if (preceedingTextNode === newNode.previousSibling) { + preceedingTextNode.parentNode.removeChild(preceedingTextNode); + } + if (followingTextNode === newNode.nextSibling) { + followingTextNode.parentNode.removeChild(followingTextNode); + } + newNode.parentNode.replaceChild(node, newNode); + }); + + return newNode; + + } else { + // Replace matchStartNode -> [innerMatchNodes...] -> matchEndNode (in that order) + + + preceedingTextNode = doc.createTextNode( + matchStartNode.data.substring(0, startPortion.indexInNode) + ); + + followingTextNode = doc.createTextNode( + matchEndNode.data.substring(endPortion.endIndexInNode) + ); + + var firstNode = this.getPortionReplacementNode( + startPortion, + match + ); + + var innerNodes = []; + + for (var i = 0, l = innerPortions.length; i < l; ++i) { + var portion = innerPortions[i]; + var innerNode = this.getPortionReplacementNode( + portion, + match + ); + portion.node.parentNode.replaceChild(innerNode, portion.node); + this.reverts.push((function(portion, innerNode) { + return function() { + innerNode.parentNode.replaceChild(portion.node, innerNode); + }; + }(portion, innerNode))); + innerNodes.push(innerNode); + } + + var lastNode = this.getPortionReplacementNode( + endPortion, + match + ); + + matchStartNode.parentNode.insertBefore(preceedingTextNode, matchStartNode); + matchStartNode.parentNode.insertBefore(firstNode, matchStartNode); + matchStartNode.parentNode.removeChild(matchStartNode); + + matchEndNode.parentNode.insertBefore(lastNode, matchEndNode); + matchEndNode.parentNode.insertBefore(followingTextNode, matchEndNode); + matchEndNode.parentNode.removeChild(matchEndNode); + + this.reverts.push(function() { + preceedingTextNode.parentNode.removeChild(preceedingTextNode); + firstNode.parentNode.replaceChild(matchStartNode, firstNode); + followingTextNode.parentNode.removeChild(followingTextNode); + lastNode.parentNode.replaceChild(matchEndNode, lastNode); + }); + + return lastNode; + } + } + + }; + + return exposed; + +}()); + diff --git a/ajax/libs/Han/package.json b/ajax/libs/Han/package.json new file mode 100644 index 000000000..93c228b47 --- /dev/null +++ b/ajax/libs/Han/package.json @@ -0,0 +1,25 @@ +{ + "name": "Han", + "filename": "han.css", + "version": "2.2.3", + "description": "The CSS typography framework optimised for Hanzi", + "keywords": [ + "han", + "Chinese", + "Japanese", + "Korean" + ], + "author": "ethantw ", + "homepage": "http://http://css.hanzi.co/", + "bugs": "https://github.com/ethantw/Han/issues", + "licenses": [ + { + "type": "MIT", + "url": "http://css.hanzi.co/license.md" + } + ], + "repository": { + "type": "git", + "url": "git://github.com/ethantw/Han.git" + } +}