X-Git-Url: https://git.kianting.info/?a=blobdiff_plain;f=src%2Flibclo%2Findex.js;fp=src%2Flibclo%2Findex.js;h=665b35971f7fb38105559cef12b02bb105034973;hb=e9819c8bc28d209d79461117d5b70f7b6b94abb6;hp=43e410c89ec16e68d3bd84612dae41dfd047432a;hpb=9c51921978468526aed0da6060900fe54967848e;p=clo diff --git a/src/libclo/index.js b/src/libclo/index.js index 43e410c..665b359 100644 --- a/src/libclo/index.js +++ b/src/libclo/index.js @@ -36,8 +36,7 @@ exports.Clo = exports.calculateTextWidthHeightAux = exports.calculateTextWidthHe const canva_1 = require("../canva"); const fontkit = __importStar(require("fontkit")); const breakLines = __importStar(require("./breakLines")); -require("pdfkit"); -const pdf_lib_1 = require("pdf-lib"); +const PDFDocument = require('pdfkit'); const fs = __importStar(require("fs")); /** * TYPES @@ -71,8 +70,8 @@ exports.defaultFrameStyle = { direction: Direction.TTB, baseLineskip: ptToPx(15), textStyle: exports.defaultTextStyle, - x: exports.A4_IN_PX.width * 0.10, - y: exports.A4_IN_PX.height * 0.10, + x: exports.A4_IN_PX.width * 0.10 * 0.75, + y: exports.A4_IN_PX.height * 0.10 * 0.75, width: exports.A4_IN_PX.width * 0.80, height: exports.A4_IN_PX.height * 0.80, content: null, @@ -278,8 +277,8 @@ function calculateTextWidthHeightAux(element, style) { y: null, textStyle: style, direction: Direction.LTR, - width: (runGlyphsItem.advanceWidth) * (style.size) / 1000, - height: (runGlyphsItem.bbox.maxY - runGlyphsItem.bbox.minY) * (style.size) / 1000, + width: (runGlyphsItem.advanceWidth) * (style.size) * 0.75 / 1000, + height: (runGlyphsItem.bbox.maxY - runGlyphsItem.bbox.minY) * (style.size) * 0.75 / 1000, content: element[j], minX: runGlyphsItem.bbox.minX, maxX: runGlyphsItem.bbox.maxX, @@ -360,46 +359,140 @@ class Clo { preprocessed = this.preprocessors[i](preprocessed, this); } // generate the width and height of the stream - let defaultFontStyle = this.attrs["defaultFrameStyle"].textStyle; + let defaultFontStyle = this.attrs.defaultFrameStyle.textStyle; let a = yield calculateTextWidthHeight(preprocessed, defaultFontStyle); let breakLineAlgorithms = new breakLines.BreakLineAlgorithm(); // TODO //console.log(breakLineAlgorithms.totalCost(a,70)); - let segmentedNodes = breakLineAlgorithms.segmentedNodes(a, 70); - console.log(this.segmentedNodesToFrameBox(segmentedNodes, this.attrs["defaultFrameStyle"])); - // generate pdf - const pdfDoc = yield pdf_lib_1.PDFDocument.create(); - var page = pdfDoc.addPage(); - page.drawText('You can create PDFs!'); - for (var j = 0; j < 1000; j += 5) { - if (j % 50 == 0) { - page.drawText(j.toString(), { x: 50, y: j }); + let segmentedNodes = breakLineAlgorithms.segmentedNodes(a, this.attrs.defaultFrameStyle.width); + console.log(this.attrs.defaultFrameStyle.width); + let segmentedNodesToBox = this.segmentedNodesToFrameBox(segmentedNodes, this.attrs.defaultFrameStyle); + let boxesFixed = this.fixenBoxesPosition(segmentedNodesToBox); + // generate pdf7 + const doc = new PDFDocument({ size: 'A4' }); + doc.pipe(fs.createWriteStream('output.pdf')); + this.grid(doc); + yield this.putText(doc, boxesFixed); + // putChar + doc.end(); + }); + } + putText(doc, box) { + return __awaiter(this, void 0, void 0, function* () { + if (box.textStyle !== null) { + let fontInfo = (0, canva_1.fontStyleTofont)(box.textStyle); + if (fontInfo.path.match(/\.ttc$/g)) { + doc + .font(fontInfo.path, fontInfo.psName) + .fontSize(box.textStyle.size * 0.75); } - page.drawLine({ - start: { x: 0, y: j }, - end: { x: 1000, y: j }, - thickness: 0.5, - color: (0, pdf_lib_1.rgb)(0.75, 0.2, 0.2), - opacity: 0.20, - }); - } - for (var i = 0; i < 1000; i += 5) { - if (i % 50 == 0) { - page.drawText(i.toString(), { x: i, y: 50 }); + else { + doc + .font(fontInfo.path) + .fontSize(box.textStyle.size * 0.75); + } + if (box.textStyle.color !== undefined) { + doc.fill(box.textStyle.color); + } + if (Array.isArray(box.content)) { + for (var k = 0; k < box.content.length; k++) { + doc = yield this.putText(doc, box.content[k]); + } + } + else if (box.content !== null) { + console.log(box.content, box.x, box.y); + yield doc.text(box.content, (box.x !== null ? box.x : undefined), (box.y !== null ? box.y : undefined)); } - page.drawLine({ - start: { x: i, y: 0 }, - end: { x: i, y: 1000 }, - thickness: 0.5, - color: (0, pdf_lib_1.rgb)(0.75, 0.2, 0.2), - opacity: 0.20, - }); } - pdfDoc.save(); - const pdfBytes = yield pdfDoc.save(); - fs.writeFileSync("blank.pdf", pdfBytes); + return doc; }); } + ; + grid(doc) { + for (var j = 0; j < exports.A4_IN_PX.width; j += 5) { + if (j % 50 == 0) { + doc.save().fill('#000000') + .fontSize(8).text(j.toString(), j * 0.75, 50); + doc + .save() + .lineWidth(0.4) + .strokeColor("#dddddd") + .moveTo(j * 0.75, 0) + .lineTo(j * 0.75, 1000) + .stroke(); + } + doc + .save() + .lineWidth(0.2) + .strokeColor("#dddddd") + .moveTo(j * 0.75, 0) + .lineTo(j * 0.75, 1000) + .stroke(); + } + for (var i = 0; i < 1050; i += 5) { + if (i % 50 == 0) { + doc.save() + .fontSize(8).text(i.toString(), 50, i * 0.75); + doc + .save() + .lineWidth(0.4) + .strokeColor("#bbbbbb") + .moveTo(0, i * 0.75) + .lineTo(1000, i * 0.75) + .stroke(); + } + doc + .save() + .lineWidth(0.2) + .strokeColor("#bbbbbb") + .moveTo(0, i * 0.75) + .lineTo(1000, i * 0.75) + .stroke(); + } + doc + .save() + .moveTo(0, 200) + .lineTo(1000, 200) + .fill('#FF3300'); + } + /** + * make all the nest boxes's position fixed + * @param box the main boxes + * @returns the fixed boxes + */ + fixenBoxesPosition(box) { + console.log("~~~~~", box); + var currX = (box.x !== null ? box.x : 0); // current x + var currY = (box.y !== null ? box.y : 0); // current y + if (Array.isArray(box.content)) { + for (var i = 0; i < box.content.length; i++) { + if (box.direction == Direction.LTR) { + box.content[i].x = currX; + box.content[i].y = currY; + let elementWidth = box.content[i].width; + if (elementWidth !== null) { + currX += elementWidth; + } + } + if (box.direction == Direction.TTB) { + box.content[i].x = currX; + box.content[i].y = currY; + let elementHeight = box.content[i].height; + if (elementHeight !== null) { + currY += elementHeight; + } + } + box.content[i] = this.fixenBoxesPosition(box.content[i]); + } + } + return box; + } + /** + * input a `segmentedNodes` and a layed `frame`, return a big `Box` that nodes is put in. + * @param segmentedNodes the segmentnodes to be input + * @param frame the frame to be layed out. + * @returns the big `Box`. + */ segmentedNodesToFrameBox(segmentedNodes, frame) { let baseLineskip = frame.baseLineskip; let boxArrayEmpty = []; @@ -415,7 +508,7 @@ class Clo { var bigBoxContent = boxArrayEmpty; let segmentedNodesFixed = segmentedNodes.map((x) => this.removeBreakPoints(x).flat()); let segmentedNodeUnglue = segmentedNodesFixed.map((x) => this.removeGlue(x, frame).flat()); - for (var i = 0; i < segmentedNodesFixed.length - 1; i++) { + for (var i = 0; i < segmentedNodeUnglue.length; i++) { var currentLineSkip = baseLineskip; var glyphMaxHeight = this.getGlyphMaxHeight(segmentedNodesFixed[i]); if (currentLineSkip === null || glyphMaxHeight > currentLineSkip) { @@ -468,7 +561,8 @@ class Clo { return 0; } }) .reduce((acc, cur) => acc + cur, 0); - let offset = frame.width - glueRemovedWidth; + let offset = frame.width * 0.75 - glueRemovedWidth; + console.log("OFFSET", offset); var res = []; for (var i = 0; i < nodeLine.length; i++) { var ele = nodeLine[i];