X-Git-Url: https://git.kianting.info/?a=blobdiff_plain;f=src%2Flibclo%2Findex.ts;fp=src%2Flibclo%2Findex.ts;h=53b837c63572ddbc503bb4f69d3ba0fe581364c7;hb=a4f79a3761539f45ac7d86fe919bdc32cf290db0;hp=bb884fae1260a5fed6209a6895b835091f3a4607;hpb=8eeb5dfab510bb59e3e9d0987b3279ce831b73a1;p=clo diff --git a/src/libclo/index.ts b/src/libclo/index.ts index bb884fa..53b837c 100644 --- a/src/libclo/index.ts +++ b/src/libclo/index.ts @@ -3,6 +3,8 @@ import {tkTree} from "../parser"; import {FontStyle, TextStyle, TextWeight, fontStyleTofont} from "../canva"; import { JSDOM } from "jsdom"; import * as fontkit from "fontkit"; +import * as util from "node:util"; +import * as breakLines from "./breakLines"; /** * TYPES @@ -21,6 +23,21 @@ export enum Direction{ BTT, } +/** + * Horizonal glue. + * - stretchFactor : the stretch factor in float + */ +export interface HGlue{ + stretchFactor: number +} + +export interface BreakPoint{ + original : BoxesItem, + newLined : BoxesItem +} + +export type BoxesItem = HGlue | Box | BreakPoint | BoxesItem[] ; + /** * frame box is a subclass of box * - directionInsideLine : text direction inside a line @@ -197,7 +214,8 @@ export function spacesToBreakpoint(arr : tkTree, clo : Clo) : tkTree{ for (let i = 0; i < arr.length; i++){ var item = arr[i]; if (!Array.isArray(item) && item.match(spacePattern)){ - result.push([ 'bp', item, "" ]); // push a newline command to the result `tkTree` + // push a breakpoint command to the result `tkTree` + result.push([ 'bp', [["hglue", "0.1"], item] , "" ]); } else{ result.push(item); @@ -266,14 +284,14 @@ export function hyphenTkTree(arr : tkTree, lang: string) : tkTree{ * @param preprocessed * @param defaultFontStyle */ -export async function calculateTextWidthHeight(element : tkTree, style : TextStyle): Promise { +export async function calculateTextWidthHeight(element : tkTree, style : TextStyle): Promise { var res = []; for (var i=0; i { - var result : any = []; +export async function calculateTextWidthHeightAux(element : tkTree, style : TextStyle): Promise { + var result : BoxesItem = []; @@ -328,12 +346,29 @@ export async function calculateTextWidthHeightAux(element : tkTree, style : Text }else if(element[0] == "bp"){ - let beforeNewLine = await calculateTextWidthHeightAux(element[1], style); + + var beforeNewLine = await calculateTextWidthHeightAux(element[1], style); + if (Array.isArray(beforeNewLine)){ + beforeNewLine = beforeNewLine.flat(); + } + let afterNewLine = await calculateTextWidthHeightAux(element[2], style); + if (Array.isArray(afterNewLine)){ + afterNewLine = afterNewLine.flat(); + } - return ["bp", beforeNewLine, afterNewLine]; - }else{ - return calculateTextWidthHeight(element[1], style); + let breakPointNode : BreakPoint = { + original : beforeNewLine, + newLined : afterNewLine, + } + + return breakPointNode; + }else if(element[0] == "hglue" && !Array.isArray(element[1])){ + let hGlue : HGlue = {stretchFactor : parseFloat(element[1])} + return hGlue; + } + else{ + return calculateTextWidthHeight(element, style); } } @@ -392,7 +427,7 @@ export class Clo{ this.preprocessors.push(f); } - public generatePdf(){ + public async generatePdf(){ // preprocessed var preprocessed = this.mainStream; for (var i = 0; i