mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-06-09 22:54:03 +09:00
hyphenation is super jank and not very well working
This commit is contained in:
@@ -28,7 +28,7 @@ const TYPESET_STRATEGY_JUSTIFIED = 3 // not implemented yet!
|
|||||||
const typesetStrats = [undefined, undefined, typesetLessRagged, typesetJustified]
|
const typesetStrats = [undefined, undefined, typesetLessRagged, typesetJustified]
|
||||||
|
|
||||||
let PAGE_HEIGHT = 60
|
let PAGE_HEIGHT = 60
|
||||||
let PAGE_WIDTH = 80
|
let PAGE_WIDTH = 72
|
||||||
// 80x60 -> 720x1080 text area; with 72px margin for each side, paper resolution is 864x1224, which is quite close to 1:sqrt(2) ratio
|
// 80x60 -> 720x1080 text area; with 72px margin for each side, paper resolution is 864x1224, which is quite close to 1:sqrt(2) ratio
|
||||||
|
|
||||||
let scroll = 0
|
let scroll = 0
|
||||||
@@ -265,20 +265,24 @@ function typesetJustified(lineStart, lineEnd) {
|
|||||||
serial.println("cond 2")
|
serial.println("cond 2")
|
||||||
|
|
||||||
let lastSpaces = []
|
let lastSpaces = []
|
||||||
|
let lastSpacesLen = 0
|
||||||
// nuke non-text words
|
// nuke non-text words
|
||||||
while ("tx" != words.last().type) {
|
while ("tx" != words.last().type) {
|
||||||
let pw = words.pop()
|
let pw = words.pop()
|
||||||
lastSpaces.unshift(pw)
|
lastSpaces.unshift(pw)
|
||||||
|
lastSpacesLen += pw.value.length
|
||||||
justLen -= pw.value.length
|
justLen -= pw.value.length
|
||||||
}
|
}
|
||||||
// also nuke the last word
|
// also nuke the last word
|
||||||
let lastWord = words.pop().value
|
let lastWord = words.pop().value
|
||||||
let penultSpaces = []
|
let penultSpaces = []
|
||||||
|
let penultSpacesLen = 0
|
||||||
justLen -= lastWord.length // new linelength -= length of the last word
|
justLen -= lastWord.length // new linelength -= length of the last word
|
||||||
// nuke spaces before the last word
|
// nuke spaces before the last word
|
||||||
while ("tx" != words.last().type) {
|
while ("tx" != words.last().type) {
|
||||||
let pw = words.pop()
|
let pw = words.pop()
|
||||||
penultSpaces.unshift(pw)
|
penultSpaces.unshift(pw)
|
||||||
|
penultSpacesLen += pw.value.length
|
||||||
justLen -= pw.value.length
|
justLen -= pw.value.length
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -292,9 +296,24 @@ function typesetJustified(lineStart, lineEnd) {
|
|||||||
|
|
||||||
let spcToFill = paintWidth - justLen
|
let spcToFill = paintWidth - justLen
|
||||||
let expandAgain = 0
|
let expandAgain = 0
|
||||||
|
|
||||||
|
// see if we can hyphenate
|
||||||
|
let testLineLen = justLen + penultSpacesLen
|
||||||
|
let hyphenated = false
|
||||||
|
if (testLineLen <= paintWidth - 3 && lastWord.length >= 4) {
|
||||||
|
let hypWord = lastWord.slice(0, paintWidth - testLineLen - 1)
|
||||||
|
words = words.concat(penultSpaces)
|
||||||
|
words.push(wordobj("tx", hypWord + '-'))
|
||||||
|
let addedLen = penultSpacesLen + hypWord.length + 1
|
||||||
|
justLen += addedLen
|
||||||
|
textCursor -= 1
|
||||||
|
hyphenated = true
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// make a decision to contract or expand
|
// make a decision to contract or expand
|
||||||
// contract
|
// contract
|
||||||
if (lastWord.length >= 4 && pns.length >= 2) { // TODO add condition to contract puncts
|
if (!hyphenated && lastWord.length >= 4 && pns.length >= 2) { // TODO add condition to contract puncts
|
||||||
|
|
||||||
serial.println(words.length)
|
serial.println(words.length)
|
||||||
serial.println(`spcToContract: ${spcToFill}`)
|
serial.println(`spcToContract: ${spcToFill}`)
|
||||||
@@ -310,9 +329,9 @@ function typesetJustified(lineStart, lineEnd) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
words = words.concat(penultSpaces, wordobj("tx", lastWord), lastSpaces)
|
words = words.concat(penultSpaces, wordobj("tx", lastWord), lastSpaces)
|
||||||
justLen += penultSpaces.map(o => o.value.length).sum()
|
justLen += penultSpacesLen
|
||||||
justLen += lastWord.length
|
justLen += lastWord.length
|
||||||
justLen += lastSpaces.map(o => o.value.length).sum()
|
justLen += lastSpacesLen
|
||||||
|
|
||||||
serial.println(`justLen after expansion: ${justLen}`)
|
serial.println(`justLen after expansion: ${justLen}`)
|
||||||
|
|
||||||
@@ -320,7 +339,7 @@ function typesetJustified(lineStart, lineEnd) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// expand
|
// expand
|
||||||
if (expandAgain > 0 || !(lastWord.length >= 4 && pns.length >= 2)) {
|
if (!hyphenated && (expandAgain > 0 || !(lastWord.length >= 4 && pns.length >= 2))) {
|
||||||
// expand puncts
|
// expand puncts
|
||||||
if (pns.length > 0) {
|
if (pns.length > 0) {
|
||||||
shufflePNs(pns) // strats: '.'s first, ','s second, then others
|
shufflePNs(pns) // strats: '.'s first, ','s second, then others
|
||||||
@@ -369,7 +388,7 @@ function typesetJustified(lineStart, lineEnd) {
|
|||||||
|
|
||||||
textCursor += getRealLength(printbuf.last())
|
textCursor += getRealLength(printbuf.last())
|
||||||
|
|
||||||
if (printbuf.length > 5) break
|
if (printbuf.length > 7) break
|
||||||
if (printbuf.length > paintHeight || textCursor >= text.length) break
|
if (printbuf.length > paintHeight || textCursor >= text.length) break
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user