From b8ad79732a253968a84e381192825b38c4b88729 Mon Sep 17 00:00:00 2001 From: Sithel Date: Mon, 29 Apr 2024 22:08:47 -0700 Subject: [PATCH] now with a PDF Markup section + sewing marks on only some of the folios --- index.html | 1 + src/book.js | 10 ++--- src/book.test.js | 1 + src/html/page_layout.html | 79 +------------------------------------ src/main.js | 7 ++++ src/models/configuration.js | 5 +++ src/signatures.js | 6 +++ src/utils/clickHandlers.js | 9 +++++ src/utils/drawing.js | 12 +++++- src/utils/formUtils.js | 3 +- src/utils/layout.js | 2 +- src/utils/renderUtils.js | 4 ++ 12 files changed, 51 insertions(+), 88 deletions(-) diff --git a/index.html b/index.html index 250b012..f570ac6 100644 --- a/index.html +++ b/index.html @@ -33,6 +33,7 @@

Bookbinder JS

+ diff --git a/src/book.js b/src/book.js index 41d5090..86bfed2 100644 --- a/src/book.js +++ b/src/book.js @@ -21,6 +21,7 @@ import { interleavePages, embedPagesInNewPdf } from './utils/pdf.js'; * @property {string|number} info - page # or 'b' * @property {boolean} isSigStart * @property {boolean} isSigEnd + * @property {boolean} isSigMiddle * @property {number} signatureNum - which signature is this page in. 0 based */ @@ -91,6 +92,7 @@ export class Book { this.flyleafs = configuration.flyleafs; this.cropmarks = configuration.cropMarks; this.sewingMarks = { + sewingMarkLocation: configuration.sewingMarkLocation, isEnabled: configuration.sewingMarksEnabled, amount: configuration.sewingMarksAmount, marginPt: configuration.sewingMarksMarginPt, @@ -231,13 +233,6 @@ export class Book { this.cropbox = newPage.getCropBox(); } - console.log( - 'The updatedDoc doc has : ', - this.managedDoc.getPages(), - ' vs --- ', - this.managedDoc.getPageCount() - ); - switch (this.format) { case 'perfect': case 'booklet': @@ -610,6 +605,7 @@ export class Book { ? drawSewingMarks( sigDetails[i], positions[i], + sewingMarks.sewingMarkLocation, sewingMarks.amount, sewingMarks.marginPt, sewingMarks.tapeWidthPt diff --git a/src/book.test.js b/src/book.test.js index 7bd5476..f24ee15 100644 --- a/src/book.test.js +++ b/src/book.test.js @@ -45,6 +45,7 @@ describe('Book model', () => { top: 0, }, sewingMarks: { + sewing_mark_locations: 'all', amount: 3, isEnabled: false, marginPt: 72, diff --git a/src/html/page_layout.html b/src/html/page_layout.html index 7b6e176..dd510eb 100644 --- a/src/html/page_layout.html +++ b/src/html/page_layout.html @@ -9,43 +9,6 @@

Page Layout

Sextodecimo - sixteen pages per side of sheet -
- - - -
-
- -
-
Folding instructions for quarto/octavo @@ -86,49 +49,9 @@

Page Layout

- - - - -
- Detailed settings for sewing - Look at the image below. - - - pt
- - -
- - - pt
- sewing image -
-
-
-
White Space Manipulation. All values are in points, relative to original document.

1 diff --git a/src/main.js b/src/main.js index 5a1b15c..29a92fb 100644 --- a/src/main.js +++ b/src/main.js @@ -9,6 +9,7 @@ import { handleGenerateClick, handlePreviewClick, handleResetSettingsClick, + handleSewingMarksCheckboxState, } from './utils/clickHandlers.js'; import { renderPaperSelectOptions } from './utils/renderUtils.js'; @@ -25,6 +26,8 @@ window.addEventListener('DOMContentLoaded', () => { const fileInput = document.getElementById('input_file'); const inputs = document.querySelectorAll('input, select'); const sourceRotation = document.getElementById('source_rotation'); + const sewingMarks = document.getElementById('add_sewing_marks_checkbox'); + const sewingMarksDetails = document.getElementById('sewing_marks_details'); const sourceRotationExamples = Array.from( document.getElementsByClassName('source_rotation_example') ); @@ -53,4 +56,8 @@ window.addEventListener('DOMContentLoaded', () => { example.style.display = example.id === selectedValue ? 'block' : 'none'; }); }); + sewingMarks.addEventListener('change', (e) => { + const willBeEnabled = e.srcElement.checked + handleSewingMarksCheckboxState(willBeEnabled) + }); }); diff --git a/src/models/configuration.js b/src/models/configuration.js index e5a56a5..899fc70 100644 --- a/src/models/configuration.js +++ b/src/models/configuration.js @@ -35,6 +35,10 @@ const sourceRotation = urlSafe( z.enum(['none', '90cw', '90ccw', 'out_binding', 'in_binding']) ).default('none'); +const sewingMarkLocation = urlSafe( + z.enum(['all', 'only_out', 'only_in', 'in_n_out']) +).default('all'); + /** @type { keyof typeof import("../constants").PAGE_SIZES } */ const availablePaperSizes = Object.keys(PAGE_SIZES); @@ -97,6 +101,7 @@ export const schema = z.object({ flyleafs: urlSafe(z.coerce.number()).default(1), sewingMarksEnabled: urlSafe(coercedBoolean).default(false), + sewingMarkLocation, sewingMarksMarginPt: urlSafe(z.coerce.number()).default(72), sewingMarksAmount: urlSafe(z.coerce.number()).default(3), sewingMarksTapeWidthPt: urlSafe(z.coerce.number()).default(36), diff --git a/src/signatures.js b/src/signatures.js index 0f8a861..b3509a5 100644 --- a/src/signatures.js +++ b/src/signatures.js @@ -148,26 +148,32 @@ export class Signatures { const block = [...front_block, ...back_block]; + console.log("Looking front_config : block.length "+block.length+" : given center "+center+", front_start "+front_start+" - front_end "+front_end+", back_start "+back_start+" - back_end "+back_end+", pages.length "+pages.length) front_config.forEach((pnum) => { const page = block[pnum - 1]; //page layouts are 1-indexed, not 0-index pagelistdetails[0].push({ info: page, isSigStart: front_start == 0 && pnum == 1, isSigEnd: front_start == 0 && pnum == block.length, + isSigMiddle: front_end == back_start && block.length/2 + 1 == pnum, signatureNum: sig_num, }); + console.log(" >> "+pnum+" :: "+page+" :: "+(front_end == back_start && block.length/2 + 1 == pnum)) }); const backlist = this.duplex ? 0 : 1; + console.log("Looking back_config : given center "+center+", front_start "+front_start+" - front_end "+front_end+", back_start "+back_start+" - back_end "+back_end+", pages.length "+pages.length) back_config.forEach((pnum) => { const page = block[pnum - 1]; pagelistdetails[backlist].push({ info: page, isSigStart: front_start == 0 && pnum == 1, isSigEnd: front_start == 0 && pnum == block.length, + isSigMiddle: front_end == back_start && block.length/2 + 1 == pnum, signatureNum: sig_num, }); + console.log(" >> "+pnum+" :: "+page+" :: "+(front_end == back_start && block.length/2 + 1 == pnum)) }); // Update all our counters diff --git a/src/utils/clickHandlers.js b/src/utils/clickHandlers.js index 6c6e3a0..8d3bd9c 100644 --- a/src/utils/clickHandlers.js +++ b/src/utils/clickHandlers.js @@ -53,3 +53,12 @@ export function handleResetSettingsClick(book) { updateAddOrRemoveCustomPaperOption(); updatePaperSelectOptionsUnits(); } + +export function handleSewingMarksCheckboxState(sewingMarksEnabled) { + const sewingMarkDetailsEl = document.getElementById('sewing_marks_details'); + if (sewingMarksEnabled) { + sewingMarkDetailsEl.setAttribute("open", 0) + } else { + sewingMarkDetailsEl.removeAttribute("open") + } +} diff --git a/src/utils/drawing.js b/src/utils/drawing.js index 5fa98b8..30d0d03 100644 --- a/src/utils/drawing.js +++ b/src/utils/drawing.js @@ -124,12 +124,13 @@ export function drawCropmarks(papersize, per_sheet) { /** * @param {@param {import("../book.js").PageInfo}} sigDetails - information about signature where marks will be printed * @param {import("../book.js").Position} position - position info object + * @param sewingMarkLocation - see ./models/configuration.js for possible values * @param {number} amount - amount of sewing crosses. * @param {number} marginPt - distance from the end of sheet of paper to kettle mark * @param {number} tapeWidthPt - distance between two points in a single sewwing cross. * @returns {Point[]} */ -export function drawSewingMarks(sigDetails, position, amount, marginPt, tapeWidthPt) { +export function drawSewingMarks(sigDetails, position, sewingMarkLocation, amount, marginPt, tapeWidthPt) { // Here normalize coordinates to always think in x an y like this // | P |H| P | // | A |E| A | @@ -139,7 +140,16 @@ export function drawSewingMarks(sigDetails, position, amount, marginPt, tapeWidt // |-POSITION-| | | // Left pages have spine position on the edge :/ + console.log("try to draw") if (position.isLeftPage) return []; + console.log(" on right") + + if (sewingMarkLocation == "only_out" && !sigDetails.isSigStart) return []; + console.log(" a") + if (sewingMarkLocation == "only_in" && !sigDetails.isSigMiddle) return []; + console.log(" b") + if (sewingMarkLocation == "in_n_out" && !(sigDetails.isSigStart || sigDetails.isSigMiddle)) return []; + console.log(" c") var arePageRotated = Math.abs(position.rotation) === 90; let totalSpineHeight = 0; diff --git a/src/utils/formUtils.js b/src/utils/formUtils.js index fb81749..89618a6 100644 --- a/src/utils/formUtils.js +++ b/src/utils/formUtils.js @@ -42,7 +42,8 @@ const fromFormToConfiguration = (form) => paperSizeCustomWidth: form.get('paper_size_custom_width'), paperSizeCustomHeight: form.get('paper_size_custom_height'), - sewingMarksEnabled: form.get('add_sewing_marks_checkbox'), + sewingMarksEnabled: form.has('add_sewing_marks_checkbox'), + sewingMarkLocation: form.get('sewing_mark_locations'), sewingMarksMarginPt: form.get('sewing_marks_margin_pt'), sewingMarksAmount: form.get('sewing_marks_amount'), sewingMarksTapeWidthPt: form.get('sewing_marks_tape_width_pt'), diff --git a/src/utils/layout.js b/src/utils/layout.js index a040371..033792f 100644 --- a/src/utils/layout.js +++ b/src/utils/layout.js @@ -131,7 +131,7 @@ export function calculateDimensions(book) { top: padding_pt.top * sy, }; - // page_positioning has 2 options: centered, binding_alinged + // page_positioning has 2 options: centered, binding_aligned const positioning = page_positioning; const xForeEdgeShiftFunc = function () { diff --git a/src/utils/renderUtils.js b/src/utils/renderUtils.js index 3a3fdba..18a6c67 100644 --- a/src/utils/renderUtils.js +++ b/src/utils/renderUtils.js @@ -3,6 +3,7 @@ // file, You can obtain one at https://mozilla.org/MPL/2.0/. import { PAGE_SIZES } from '../constants'; +import {handleSewingMarksCheckboxState} from './clickHandlers.js'; export function renderPageCount(book) { const pageCount = document.getElementById('page_count'); @@ -203,8 +204,11 @@ export function renderFormFromSettings(configuration) { ).checked = true; // Set french link stitches settings + handleSewingMarksCheckboxState(configuration.sewingMarksEnabled) document.querySelector('input[name="add_sewing_marks_checkbox"]').checked = configuration.sewingMarksEnabled; + document.querySelector('select[name="sewing_mark_locations"]').value = + configuration.sewingMarkLocation; document.querySelector('input[name="sewing_marks_margin_pt"]').value = configuration.sewingMarksMarginPt; document.querySelector('input[name="sewing_marks_amount"]').value =