fix: word-break seperators (#2593)

This commit is contained in:
Niklas von Hertzen 2021-07-15 21:05:26 +08:00 committed by GitHub
parent 4c360fc1f0
commit e9f7f48d57
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 151 additions and 123 deletions

View File

@ -70,6 +70,9 @@ const breakText = (value: string, styles: CSSParsedDeclaration): string[] => {
return styles.letterSpacing !== 0 ? toCodePoints(value).map((i) => fromCodePoint(i)) : breakWords(value, styles); return styles.letterSpacing !== 0 ? toCodePoints(value).map((i) => fromCodePoint(i)) : breakWords(value, styles);
}; };
// https://drafts.csswg.org/css-text/#word-separator
const wordSeparators = [0x0020, 0x00a0, 0x1361, 0x10100, 0x10101, 0x1039, 0x1091];
const breakWords = (str: string, styles: CSSParsedDeclaration): string[] => { const breakWords = (str: string, styles: CSSParsedDeclaration): string[] => {
const breaker = LineBreaker(str, { const breaker = LineBreaker(str, {
lineBreak: styles.lineBreak, lineBreak: styles.lineBreak,
@ -81,7 +84,24 @@ const breakWords = (str: string, styles: CSSParsedDeclaration): string[] => {
while (!(bk = breaker.next()).done) { while (!(bk = breaker.next()).done) {
if (bk.value) { if (bk.value) {
words.push(bk.value.slice()); const value = bk.value.slice();
const codePoints = toCodePoints(value);
let word = '';
codePoints.forEach((codePoint) => {
if (wordSeparators.indexOf(codePoint) === -1) {
word += fromCodePoint(codePoint);
} else {
if (word.length) {
words.push(word);
}
words.push(fromCodePoint(codePoint));
word = '';
}
});
if (word.length) {
words.push(word);
}
} }
} }

View File

@ -8,6 +8,7 @@
body { body {
font-family: Arial; font-family: Arial;
} }
.small { .small {
font-size: 14px; font-size: 14px;
line-height: 1vw; line-height: 1vw;
@ -17,16 +18,20 @@
font-size: 18px; font-size: 18px;
line-height: 2vw; line-height: 2vw;
} }
.large { .large {
font-size: 24px; font-size: 24px;
line-height: 3vw; line-height: 3vw;
} }
div { div {
float: left; float: left;
} }
h2 { h2 {
clear: both; clear: both;
} }
h1 { h1 {
font-size: 36px; font-size: 36px;
line-height: 4vw; line-height: 4vw;
@ -41,10 +46,17 @@
font-size: 16px; font-size: 16px;
line-height: 2vw; line-height: 2vw;
} }
.raw {
font-size: 60px;
word-spacing: 30px;
}
</style> </style>
</head> </head>
<body> <h1>&lt;h1&gt; text-decoration</h1> <body>
<h1>&lt;h1&gt; text-decoration</h1>
<div style="font-family:Arial;"> <div style="font-family:Arial;">
<h2>Arial</h2> <h2>Arial</h2>
<ol class="small"> <ol class="small">
@ -77,18 +89,8 @@
<li style="text-decoration:line-through;">text-decoration:line-through;</li> <li style="text-decoration:line-through;">text-decoration:line-through;</li>
</ol> </ol>
<ol class="medium"> <div class="raw">
<li style="text-decoration:none;">text-decoration:none;</li> <span>[AB / CD]</span>
<li style="text-decoration:underline;">text-decoration:underline;</li>
<li style="text-decoration:overline;">text-decoration:overline;</li>
<li style="text-decoration:line-through;">text-decoration:line-through;</li>
</ol>
<ol class="large">
<li style="text-decoration:none;">text-decoration:none;</li>
<li style="text-decoration:underline;">text-decoration:underline;</li>
<li style="text-decoration:overline;">text-decoration:overline;</li>
<li style="text-decoration:line-through;">text-decoration:line-through;</li>
</ol>
</div> </div>
<div style="font-family:Tahoma;"> <div style="font-family:Tahoma;">
@ -117,13 +119,16 @@
<h2>&lt;h2&gt; text-transform</h2> <h2>&lt;h2&gt; text-transform</h2>
<ul> <ul>
<li style="text-transform:none;">text-transform:none;</li> <li style="text-transform:none;">text-transform:none;</li>
<li style="text-transform:capitalize;">text-transform: capitalize; (including foreign characters such as Öaäå)</li> <li style="text-transform:capitalize;">text-transform: capitalize; (including foreign characters such as Öaäå)
</li>
<li style="text-transform:uppercase;">text-transform:uppercase;</li> <li style="text-transform:uppercase;">text-transform:uppercase;</li>
<li style="text-transform:lowercase;">text-transform:lowercase;</li> <li style="text-transform:lowercase;">text-transform:lowercase;</li>
</ul> </ul>
<h3>&lt;h3&gt; misc text alignments</h3> <h3>&lt;h3&gt; misc text alignments</h3>
<ul> <ul>
<li style="word-spacing:5px;">word-spacing:5px; (as each letter is rendered individually, the bounds will always be correct)</li> <li style="word-spacing:5px;">word-spacing:5px; (as each letter is rendered individually, the bounds will always
be correct)
</li>
<li style="line-height:35px;">line-height:35px; <br/>(same goes for line-height)</li> <li style="line-height:35px;">line-height:35px; <br/>(same goes for line-height)</li>
<li style="letter-spacing:5px;">letter-spacing:5px;</li> <li style="letter-spacing:5px;">letter-spacing:5px;</li>
<li style="letter-spacing:0.9px;">letter-spacing:0.9px;</li> <li style="letter-spacing:0.9px;">letter-spacing:0.9px;</li>
@ -132,6 +137,9 @@
</ul> </ul>
<div style="font-family: 'Inconsolata', Monaco, Consolas, 'Andale Mono', monospace">npm install --save html2canvas</div> <div style="font-family: 'Inconsolata', Monaco, Consolas, 'Andale Mono', monospace">npm install --save html2canvas</div>
<div class="raw" style="">
<span>[AB / CD]</span>
</div>
</div>
</body> </body>
</html> </html>