X-Git-Url: https://git.kianting.info/?a=blobdiff_plain;f=src%2Flibclo%2Findex.ts;fp=src%2Flibclo%2Findex.ts;h=b64a819c9c719a63d2f7af34d0ec4c73d749fc7a;hb=f12842e5a4ef531e38024e16f91b21c99ce1de92;hp=53b837c63572ddbc503bb4f69d3ba0fe581364c7;hpb=a4f79a3761539f45ac7d86fe919bdc32cf290db0;p=clo diff --git a/src/libclo/index.ts b/src/libclo/index.ts index 53b837c..b64a819 100644 --- a/src/libclo/index.ts +++ b/src/libclo/index.ts @@ -438,14 +438,133 @@ export class Clo{ let defaultFontStyle : TextStyle = this.attrs["defaultFrameStyle"].textStyle; let a = await calculateTextWidthHeight(preprocessed, defaultFontStyle); + let breakLineAlgorithms = new breakLines.BreakLineAlgorithm(); // TODO - console.log(util.inspect(a, true, 100)); - console.log(breakLines.totalCost(a,3,100)); + //console.log(breakLineAlgorithms.totalCost(a,70)); + let segmentedNodes = breakLineAlgorithms.segmentedNodes(a, 70); + + console.log(this.segmentedNodesToFrameBox(segmentedNodes, this.attrs["defaultFrameStyle"])); + } + + segmentedNodesToFrameBox(segmentedNodes : BoxesItem[][], frame : FrameBox) : Box{ + let baseLineskip = frame.baseLineskip; + let boxArrayEmpty : Box[] = []; + let bigBox : Box = { + x : frame.x, + y : frame.y, + textStyle : frame.textStyle, + direction : frame.direction, + width : frame.width, + height : frame.height, + content : boxArrayEmpty, + } + + var bigBoxContent : Box[] = boxArrayEmpty; + + let segmentedNodesFixed = segmentedNodes.map((x)=>this.removeBreakPoints +(x).flat()); + let segmentedNodeUnglue = segmentedNodesFixed.map((x)=>this.removeGlue(x, frame).flat()); + + for (var i=0; icurrentLineSkip ){ + currentLineSkip = glyphMaxHeight; + } + + var currentLineBox : Box = { + x : null, + y : null, + textStyle : defaultTextStyle, + direction : frame.directionInsideLine, + width : frame.width, + height : currentLineSkip, + content : segmentedNodeUnglue[i], + } + + bigBoxContent.push(currentLineBox); + + } + + bigBox.content = bigBoxContent; + + return bigBox; + } + + /** + * get the max height of the glyph`[a, b, c]` + * @param nodeLine the node line [a, b, c, ...] + * @returns + */ + getGlyphMaxHeight(nodeLine : BoxesItem[]) : number{ + let segmentedNodeLineHeight = nodeLine.map((x : BoxesItem)=>{if ("height" in x && x.height > 0.0){return x.height}else{return 0.0}}); + let maxHeight = Math.max(...segmentedNodeLineHeight); + return maxHeight; + } + + removeGlue(nodeLine : BoxesItem[], frame : FrameBox) : BoxesItem[]{ + let breakLineAlgorithms = new breakLines.BreakLineAlgorithm(); + let glueRemoved = nodeLine.filter((x)=>!breakLineAlgorithms.isHGlue(x)); + let onlyGlue = nodeLine.filter((x)=>breakLineAlgorithms.isHGlue(x)); + let sumStretchFactor = onlyGlue.map((x)=>{if("stretchFactor" in x){ return x.stretchFactor} else{return 0;}}) + .reduce((acc, cur)=>acc+cur , 0); + + let glueRemovedWidth = glueRemoved.map((x)=>{if("width" in x){ return x.width} else{return 0;}}) + .reduce((acc, cur)=>acc+cur , 0); + let offset = frame.width - glueRemovedWidth; + var res = []; + for (var i=0; i