PageSourceSearch

https://njyoon.github.io/pdf.html

html njyoon.github.io collected 2026-10-03 09:41:11 UTC 63,170 bytes, 1,306 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en">
3  <head>
4    <meta charset="UTF-8" />
5    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
7    <title>Crossword PDF Editor</title>
8
9    <link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png">
10    <link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png">
11    <link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png">
12
13    <link
14      rel="stylesheet"
15      href="css/bootstrap.min.css"
16    />
17
18    <link href="https://fonts.googleapis.com/icon?family=Material+Icons"
19      rel="stylesheet">
vendor: 69 bytes, lines 19-21
19
20
21    <script async src="https://www.googletagmanager.com/gtag/js?id=
21G-L1FXWP7B18
vendor: 16 bytes, lines 21-22
21"></script>
22    
22<script src="js/grapheme-splitter.min.js"></script>
22
23    
23<script src="js/twemoji.min.js"></script>
23
24    
24<script>
25    
vendor: 140 bytes, lines 25-29
25window.dataLayer = window.dataLayer || [];
26    function gtag(){dataLayer.push(arguments);}
27    gtag('js', new Date());
28
29    gtag('config', '
29G-L1FXWP7B18
vendor: 8 bytes, lines 29-30
29');
30    
30</script>
30
31
32    <style>
33    html {margin-left: calc(100vw - 100%);}
34    head{height:100%}
35    body{
36        background-color:#fcfcfc;
37    }
38    h1 {
39        color:#06AED5;
40        font-size:2rem;
41        font-weight:bold;
42    }
43
44    h4 {
45        font-size:1.1rem;
46        color:#686868;
47    }
48
49    .material-icons {
50        font-size: 24px;
51        vertical-align: bottom;
52    }
53
54    .collapsible-link {
55    width: 100%;
56    position: relative;
57    text-align: left;
58    }
59
60    .collapsible-link::before {
61    content: '\e5cf';
62    position: absolute;
63    top: 50%;
64    right: 0.8rem;
65    transform: translateY(-50%);
66    display: block;
67    font-family: 'Material Icons';
68    font-size: 1.1rem;
69    }
70
71    .collapsible-link[aria-expanded='true']::before {
72    content: '\e5ce';
73    }
74
75    .plus-link {
76    width: 100%;
77    position: relative;
78    }
79
80    .plus-link::before {
81    content: '\e145';
82    position: absolute;
83    font-family: 'Material Icons';
84    font-size: 1rem;
85    left: -0.3rem;
86    transform: translateY(-5%);
87    }
88
89    .plus-link[aria-expanded='true']::before {
90    content: '\e15b';
91    }
92
93    ::placeholder {
94        color:lightgrey;
95    }
96
97    .pdfobject-container {
98        height: 40rem;
99    }
100
101    .btn.focus,.btn:active.focus,.btn.active {
102        box-shadow: none;
103        outline: none;
104    }
105
106    .nyt {
107        color:#f55d4b;
108        border-color:#f55d4b;
109    }
110
111    .nyt:hover {
112        background-color:#f55d4b;
113        border-color:#f55d4b;
114    }
115
116
117    input[type=file] {
118    white-space: nowrap;
119    overflow: hidden;
120    text-overflow: ellipsis;
121    width: 250px;
122    }
123
124    </style>
125
126
127  </head>
128
129  <body>
130    <div class="container pt-3">
131        <div class="row">
132            <div class="col-12 col-lg-9"><h1>Crossword PDF Editor</h1></div>
133            <div class="d-none d-lg-block col-lg-3"><a type="button" href="nyt.html" class="btn btn-outline-danger rounded-pill shadow-none nyt float-right"><b>NYT Submission Editor</b></a></div>
134        </div>
135        <h4 class="pt-1 pb-1">This tool adds some additional editing options to Crossword Nexus's <a href="https://crosswordnexus.com/apps/puz-to-pdf/">PUZ to PDF Converter</a>.  To get started, just select a puzzle file and click "Preview PDF".  Limited documentation available <a href="https://github.com/njyoon/njyoon.github.io#readme">here.</a></h4>
136      <hr>
137      <div class="row pt-1 pb-5">
138
139          <div class="col-12 col-lg-4">
140
141              <div class="accordion shadow" id="accordionMain">
142                    <form>
143                        <div class="card">
144                            <div class="card-header bg-white shadow-sm border-0" id="headingOne">
145
146                                    <a data-toggle="collapse" data-target="#collapseOne" aria-expanded="true" aria-controls="collapseOne" class="btn btn-link text-dark font-weight-bold text-uppercase collapsible-link">
147                                        Choose File
148                                    </a>
149
150                            </div>
151                            <div id="collapseOne" class="collapse show" aria-labelledby="headingOne" data-parent="#accordionMain">
152                                <div class="card-body mx-2 px-4 pt-3 pb-2">
153                                    <div class="form-group">
154                                        <label for="files">Select your puzzle file to export as a PDF:</label>
155                                        <input type="file" accept=".puz,.xml,.jpz,.xpz,.ipuz,.cfp" class="form-control-file" id="files" name="files">
156                                    </div>
157                                </div>
158                            </div>
159                        </div>
160
161
162                        <div class="card">
163                            <div id="headingTwo" class="card-header bg-white shadow-sm border-0">
164
165                                    <a data-toggle="collapse" data-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo" class="btn btn-link collapsed text-dark font-weight-bold text-uppercase collapsible-link">Header Content</a>
166
167                            </div>
168                            <div id="collapseTwo" aria-labelledby="headingTwo" data-parent="#accordionMain" class="collapse">
169                                <div class="card-body mx-2 px-4 py-3">
170
171                                    <div class="form-group">
172                                        <label for="headerText">Main Header Content </label>
173                                        <div class="btn-group btn-group-toggle pl-2 pb-2" data-toggle="buttons">
174
175                                            <label class="btn btn-outline-primary active p-0" id="header-left-button">
176                                                <input type="radio" id="header-left" name="header-align" checked><span class="material-icons">format_align_left</span>
177                                            </label>
178                                            <label class="btn btn-outline-primary p-0" id="header-center-button">
179                                                <input type="radio" id="header-center" name="header-align"><span class="material-icons">format_align_center</span>
180                                            </label>
181
182                                        </div>
183                                        <textarea class="form-control pv-2 pl-3 pr-2 col-10" id="headerText" rows="2" placeholder='Empty field will default to title from puz file'></textarea>
184                                    </div>
185
186                                    <div class="custom-control custom-switch">
187                                        <input type="checkbox" class="custom-control-input" id="useHeader2" checked>
188                                        <label class="custom-control-label" for="useHeader2">Add Right Header Content</label>
189                                    </div>
190
191
192                                    <div class="form-group pt-2 pb-2 mb-0 collapse show" id="additional-header">
193                                        <div class="btn-group btn-group-toggle pb-2" data-toggle="buttons">
194
195                                            <label class="btn btn-outline-primary p-0" id="header2-left-button">
196                                                <input type="radio" id="header2-left" name="header2-align"><span class="material-icons" aria-hidden="true">format_align_left</span>
197                                            </label>
198                                            <label class="btn btn-outline-primary active p-0" id="header2-right-button">
199                                                <input type="radio" id="header2-right" name="header2-align" checked><span class="material-icons" aria-hidden="true">format_align_right</span>
200                                            </label>
201
202                                        </div>
203                                        <div class="btn-group btn-group-toggle pl-2 pb-2" data-toggle="buttons">
204
205                                            <label class="btn btn-outline-primary p-0" id="header2-top-button">
206                                                <input type="radio" id="header2-top" name="header2-vAlign"><span class="material-icons" aria-hidden="true">vertical_align_top</span>
207                                            </label>
208                                            <label class="btn btn-outline-primary p-0" id="header2-middle-button">
209                                                <input type="radio" id="header2-middle" name="header2-vAlign"><span class="material-icons" aria-hidden="true">vertical_align_center</span>
210                                            </label>
211                                            <label class="btn btn-outline-primary active p-0" id="header2-bottom-button">
212                                                <input type="radio" id="header2-bottom" name="header2-vAlign" checked><span class="material-icons" aria-hidden="true">vertical_align_bottom</span>
213                                            </label>
214
215                                        </div>
216                                        <textarea class="form-control pv-2 pl-3 pr-2 mb-0 col-10" id="headerText2" rows="2" placeholder='Empty field will default to author from puz file'></textarea>
217                                    </div>
218
219                                    <div class="custom-control custom-switch pt-2">
220                                        <input type="checkbox" class="custom-control-input" id="useSubheader">
221                                        <label class="custom-control-label" for="useSubheader">Add Subheader Content</label>
222                                    </div>
223                                    <div class="form-group pt-2 collapse" id="subheader">
224                                        <div class="btn-group btn-group-toggle pb-2" data-toggle="buttons">
225
226                                            <label class="btn btn-outline-primary active p-0" id="subheader-left-button">
227                                                <input type="radio" id="subheader-left" name="subheader-align" checked><span class="material-icons" aria-hidden="true">format_align_left</span>
228                                            </label>
229                                            <label class="btn btn-outline-primary p-0" id="subheader-center-button">
230                                                <input type="radio" id="subheader-center" name="subheader-align"><span class="material-icons" aria-hidden="true">format_align_center</span>
231                                            </label>
232                                            <label class="btn btn-outline-primary p-0" id="subheader-right-button">
233                                                <input type="radio" id="subheader-right" name="subheader-align"><span class="material-icons" aria-hidden="true" aria-checked="">format_align_right</span>
234                                            </label>
235
236                                        </div>
237                                        <textarea class="form-control pv-2 pl-3 pr-2 mb-0 col-10" id="subheaderText" rows="2" placeholder='Add any subheader text here'></textarea>
238                                    </div>
239
240                                    <div class="custom-control custom-switch pt-2">
241                                        <input type="checkbox" class="custom-control-input" id="useLogo">
242                                        <label class="custom-control-label" for="useLogo">
242Add Image <span style="color:red">(IN BETA)</span></label>
243                                    </div>
244                                    <div class="form-group collapse pt-2 pl-4" id="add-logo">
245                                        <label for="logo">Select an image to import:</label><br>
246                                        <input type="file" accept='image/*' class="form-control-file pb-2" id="logo" name="logo">
247
248                                        <label for="logoX">image-x (pt)</label><br>
249                                        <input type="number" class="form-control-sm mb-2 col-4" id="logoX" value="36" step="1"><br>
250
251                                        <label for="logoY">image-y (pt)</label><br>
252                                        <input type="number" class="form-control-sm mb-2 col-4" id="logoY" value="36" step="1"><br>
253
254                                        <label for="logoS">image size (%)</label><br>
255                                        <input type="number" class="form-control-sm mb-2 col-4" id="logoS" value="100" step="1"><br>
256
257                                    </div>
258
259
260                                </div>
261                            </div>
262                        </div>
263
264                        <div class="card">
265                            <div id="headingThree" class="card-header bg-white shadow-sm border-0">
266
267                                    <a data-toggle="collapse" data-target="#collapseThree" aria-expanded="false" aria-controls="collapseThree" class="btn btn-link collapsed text-dark font-weight-bold text-uppercase collapsible-link">Basic Options</a>
268
269                            </div>
270                            <div id="collapseThree" aria-labelledby="headingThree" data-parent="#accordionMain" class="collapse">
271                                <div class="card-body mx-2 px-4 py-3">
272                                    <div class="form-group">
273                                        <label for="hFontSize">Main Header Font Size (pt)</label><br>
274                                        <input type="number" class="form-control col-4" id="hFontSize" value="20">
275                                    </div>
276                                    <div class="form-group">
277                                        <label for="h2FontSize">Right Header Font Size (pt)</label><br>
278                                        <input type="number" class="form-control col-4" id="h2FontSize" value="16">
279                                    </div>
280                                    <div class="form-group" id="subheader-font-size">
281                                        <label for="sFontSize">Subheader Font Size (pt)</label><br>
282                                        <input type="number" class="form-control col-4" id="sFontSize" value="14">
283                                    </div>
284                                    <div class="form-group">
285                                        <label for="cFontSize">Starting Clue Font Size (pt)</label><br>
286                                        <input type="number" class="form-control col-4" id="cFontSize" value="14">
287                                    </div>
288                                    <div class="form-group">
289                                        <label for="columns">Number of Columns</label>
290                                        <br>
291                                        <select class="form-control col-6" id="columns">
292                                        <option value="auto" selected>Auto</option>
293                                        <option value="2">2</option>
294                                        <option value="3">3</option>
295                                        <option value="4">4</option>
296                                        <option value="5">5</option>
297                                        <option value="6">6</option>
298                                        <option value="new">New Page (BETA)</option>
299                                        </select>
300                                    </div>
301                                    <div class="custom-control custom-switch">
302                                        <input type="checkbox" class="custom-control-input" id="useCopyright" checked>
303                                        <label class="custom-control-label" for="useCopyright">Include Copyright</label>
304                                    </div>
305
306                                    <textarea class="form-control mt-2 pv-2 pl-3 pr-2 col-10 collapse show" id="copyright" rows="2" placeholder='Empty field will default to copyright from puz file'></textarea>
307
308                                    <div class="custom-control custom-switch pt-2">
309                                        <input type="checkbox" class="custom-control-input" id="grid_br">
310                                        <label class="custom-control-label" for="grid_br">Align Grid to Bottom-Right</label>
311                                    </div>
312
313                                    <div class="custom-control custom-switch pt-2">
314                                        <input type="checkbox" class="custom-control-input" id="grid_bl">
315                                        <label class="custom-control-label" for="grid_bl">Align Grid to Bottom-Left</label>
316                                    </div>
317
318                                    <div class="custom-control custom-switch pt-2">
319                                        <input type="checkbox" class="custom-control-input" id="gray">
320                                        <label class="custom-control-label" for="gray">Inksaver Mode</label>
321                                    </div>
322
323                                    <div class="custom-control custom-switch pt-2">
324                                        <input type="checkbox" class="custom-control-input" id="shade">
325                                        <label class="custom-control-label" for="shade">Replace Circles With Shade</label>
326                                    </div>
327
328                                    <div class="custom-control custom-switch pt-2">
329                                        <input type="checkbox" class="custom-control-input" id="solution">
330                                        <label class="custom-control-label" for="solution">Print Solution in Grid</label>
331                                    </div>
332
333                                    <div class="custom-control custom-switch pt-2">
334                                        <input type="checkbox" class="custom-control-input" id="remember">
335                                        <label class="custom-control-label" for="remember">Remember Options <span style="color:red">(IN BETA)</span></label>
336                                    </div>
337
338                                    <div class="ml-1 pl-2 pt-1" id="remember-buttons">
339
340                                        <button type="button" class="btn btn-outline-primary btn-sm mt-1 ml-4" id="save">Save Options</button>
341
342                                        <button type="button" class="btn btn-outline-primary btn-sm mt-1 ml-1" id="clear">Clear Cache</button>
343
344                                    </div>
345
346
347                                </div>
348                            </div>
349                        </div>
350
351
352                        <div class="card">
353                            <div id="headingFour" class="card-header bg-white shadow-sm border-0">
354
355                                    <a data-toggle="collapse" data-target="#collapseFour" aria-expanded="false" aria-controls="collapseFour" class="btn btn-link collapsed text-dark font-weight-bold text-uppercase collapsible-link">Advanced Options</a>
356
357                            </div>
358                            <div id="collapseFour" aria-labelledby="headingFour" data-parent="#accordionMain" class="collapse">
359
360                                <div class="card-body mx-2 px-4 pt-3 pb-1">
361
362
363                                    <div class="accordion" id="accordionAdvanced">
364
365                                        <div id="headingMargins" class="card-header bg-white m-0 p-0 border-0">
366                                            <a data-toggle="collapse" data-target="#collapseMargins" aria-expanded="false" aria-controls="collapseMargins" class="btn btn-link text-left mx-1 mb-2 px-3 col-12 plus-link"><h6>Margins</h6></a>
367                                        </div>
368                                        <div id="collapseMargins" aria-labelledby="headingMargins" data-parent="#accordionAdvanced" class="collapse ml-3 px-3 border-left">
369                                            <div class="form-group">
370                                                 <label for="marginSize">Top Margin (in.) </label><br>
371                                                 <input type="number" class="form-control-sm col-4" id="marginSize" value="
3710.5" step=".1">
372                                            </div>
373                                            <div class="form-group">
374                                                <label for="bottommarginSize">Bottom Margin (in.) </label><br>
375                                                <input type="number" class="form-control-sm col-4" id="bottommarginSize" value="0.5" step=".1">
376                                           </div>
377                                            <div class="form-group">
378                                                <label for="sidemarginSize">Side Margins (in.) </label><br>
379                                                <input type="number" class="form-control-sm col-4" id="sidemarginSize" value="0.5" step=".1">
380                                           </div>
381                                           <div class="form-group" id="useHeaderWidth">
382                                                <label for="headerWidth">Main Header Text Width (%) </label><br>
383                                                <input type="number" class="form-control-sm col-4" id="headerWidth" value="67" step="1">
384                                            </div>
385
386                                        </div>
387
388                                        <div id="headingPadding" class="card-header bg-white m-0 p-0 border-0">
389                                            <a data-toggle="collapse" data-target="#collapsePadding" aria-expanded="false" aria-controls="collapsePadding" class="btn btn-link text-left mx-1 mb-2 px-3 col-12 plus-link"><h6>Padding</h6></a>
390                                        </div>
391                                        <div id="collapsePadding" aria-labelledby="headingPadding" data-parent="#accordionAdvanced" class="collapse ml-3 px-3 border-left">
392                                            <div class="form-group">
393                                                <label for="hsPadding">Header-Subheader Padding (pt)</label><br>
394                                                <input type="number" class="form-control-sm col-4" id="hsPadding" value="4" step="1">
395                                            </div>
396                                            <div class="form-group">
397                                                <label for="hbPadding">Header-Body Padding (pt)</label><br>
398                                                <input type="number" class="form-control-sm col-4" id="hbPadding" value="12" step="1">
399                                            </div>
400                                            <div class="form-group">
401                                                <label for="hlPadding">Header Left Padding (pt)</label><br>
402                                                <input type="number" class="form-control-sm col-4" id="hlPadding" value="0" step="1">
403                                            </div>
404                                            <div class="form-group">
405                                                <label for="slPadding">Subheader Left Padding (pt)</label><br>
406                                                <input type="number" class="form-control-sm col-4" id="slPadding" value="0" step="1">
407                                            </div>
408                                            <div class="form-group">
409                                                <label for="gridPadding">Grid Vertical Padding (pt)</label><br>
410                                                <input type="number" class="form-control-sm col-4" id="gridPadding" value="20" step="1">
411                                            </div>
412                                            <div class="form-group">
413                                                <label for="columnPadding">Gutter / Column Padding (pt)</label><br>
414                                                <input type="number" class="form-control-sm col-4" id="columnPadding" value="10" step="1">
415                                            </div>
416                                        </div>
417
418                                        <div id="headingFonts" class="card-header bg-white m-0 p-0 border-0">
419                                            <a data-toggle="collapse" data-target="#collapseFonts" aria-expanded="false" aria-controls="collapseFonts" class="btn btn-link text-left mx-1 mb-2 px-3 col-12 plus-link"><h6>Fonts</h6></a>
420                                        </div>
421                                        <div id="collapseFonts" aria-labelledby="headingFonts" data-parent="#accordionAdvanced" class="collapse ml-3 px-3 border-left">
422                                            <div class="custom-control custom-switch pb-2">
423                                                <input type="checkbox" class="custom-control-input" id="useCustom">
424                                                <label class="custom-control-label" for="useCustom">Add Custom Header Font</label>
425                                            </div>
426                                            <div class="form-group collapse c" id="add-custom-font">
427                                                <label for="customFont">Select a .ttf file to import:</label><br>
428                                                <input type="file" accept='.ttf' class="form-control-file" id="customFont" name="customFont">
429                                            </div>
430                                            <div class="form-group">
431                                                <label for="headerFont">Header Font</label>
432                                                <br>
433                                                <select class="form-control" id="headerFont">
434                                                <option value="RobotoCondensed" selected>Roboto Condensed</option>
435                                                <option value="NunitoSans-Regular">Nunito Sans</option>
436                                                <option value="helvetica">Helvetica</option>
437                                                <option value="courier">Courier</option>
438                                                <option value="times">Times New Roman</option>
439                                                <option value="myFont" class="c">Custom Header Font</option>
440                                                </select>
441                                            </div>
442                                            <div class="form-group">
443                                                <label for="gridFont">Grid Font</label>
444                                                <br>
445                                                <select class="form-control" id="gridFont">
446                                                <option value="RobotoCondensed">Roboto Condensed</option>
447                                                <option value="NunitoSans-Regular" selected>Nunito Sans</option>
448                                                <option value="helvetica">Helvetica</option>
449                                                <option value="courier">Courier</option>
450                                                <option value="times">Times New Roman</option>
451                                                </select>
452                                            </div>
453                                            <div class="form-group">
454                                                <label for="clueFont">Clue Font</label>
455                                                <br>
456                                                <select class="form-control" id="clueFont">
457                                                <option value="RobotoCondensed" selected>Roboto Condensed</option>
458                                                <option value="NunitoSans-Regular">Nunito Sans</option>
459                                                <option value="MH">MH</option>
460                                                <option value="helvetica">Helvetica</option>
461                                                <option value="courier">Courier</option>
462                                                <option value="times">Times New Roman</option>
463                                                </select>
464                                            </div>
465                                            <div class="form-group" id="add-bold-font">
466                                                <label for="boldFont">These settings require a <b>bold</b> style of your custom font.  Select the .ttf file to import:</label><br>
467                                                <input type="file" accept='.ttf' class="form-control-file" id="boldF
467ont" name="boldFont">
468                                            </div>
469                                        </div>
470
471                                        <div id="headingGrid" class="card-header bg-white m-0 p-0 border-0">
472                                           <a data-toggle="collapse" data-target="#collapseGrid" aria-expanded="false" aria-controls="collapseGrid" class="btn btn-link text-left mx-1 mb-2 px-3 col-12 plus-link"><h6>Grid</h6></a>
473                                        </div>
474                                        <div id="collapseGrid" aria-labelledby="headingGrid" data-parent="#accordionAdvanced" class="collapse ml-3 px-3 border-left">
475                                            <div class="form-group">
476                                                <label for="numberSize">Number Size (% of sq. height)</label><br>
477                                                <input type="number" class="form-control-sm col-4" id="numberSize" value="30">
478                                            </div>
479                                            <div class="form-group">
480                                                <label for="lineWidth">Line Width (pt)</label><br>
481                                                <input type="number" class="form-control-sm col-4" id="lineWidth" value="0.4" step=".1">
482                                            </div>
483                                            <div class="form-group">
484                                                <label for="borderWidth">Border Width (pt)</label><br>
485                                                <input type="number" class="form-control-sm col-4" id="borderWidth" value="0.4" step=".1">
486                                            </div>
487                                        </div>
488
489                                        <div id="headingClue" class="card-header bg-white m-0 p-0 border-0">
490                                            <a data-toggle="collapse" data-target="#collapseClue" aria-expanded="false" aria-controls="collapseClue" class="btn btn-link text-left mx-1 mb-2 px-3 col-12 plus-link"><h6>Clues</h6></a>
491                                         </div>
492                                         <div id="collapseClue" aria-labelledby="headingClue" data-parent="#accordionAdvanced" class="collapse ml-3 px-3 pb-2 border-left">
493                                            <div class="form-group">
494                                                <label for="interSpacing">Min. Line Spacing Between Clues</label><br>
495                                                <input type="number" class="form-control-sm col-4" id="interSpacing" value="1.3" step=".1" min="1.0">
496                                            </div>
497                                            <div class="custom-control custom-switch">
498                                                <input type="checkbox" class="custom-control-input" id="boldHeadings" checked>
499                                                <label class="custom-control-label" for="boldHeadings">Bold Headings</label>
500                                            </div>
501                                            <div class="custom-control custom-switch pt-2">
502                                                <input type="checkbox" class="custom-control-input" id="boldNumbers" checked>
503                                                <label class="custom-control-label" for="boldNumbers">Bold Numbers</label>
504                                            </div>
505                                         </div>
506
507
508                                    </div>
509
510
511
512                                </div>
513                            </div>
514                        </div>
515
516                        <div class="card">
517                            <div class="btn-group p-2" role="group" aria-label="preview button">
518                                <button class="btn btn-outline-primary col-6 mr-2" id="previewButton" type="button" onclick="handleFileSelect('preview');return false;">Preview PDF</button>
519
520                                <button class="btn btn-outline-primary col-6" id="downloadButton" type="button" onclick="handleFileSelect('download');return false;">Download PDF</button>
521                            </div>
522                        </div>
523
524
525                        </div>
526
527                    </form>
528
529            </div>
530
531        <div class = "col-12 col-lg-8" id="example1">
532
533        </div>
534    </div>
535
536        
536<script src="js/jquery-3.3.1.slim.min.js"></script>
536
537
538        
538<script>
539        var myFont = '';
540        var boldFont = '';
541        var logo;
542
543        // hide unnecessary features unless user turns them on
544
545        $('.c').hide();
546        $('#add-bold-font').hide();
547        $("#header-center-button").hide();
548        $("#subheader-font-size").hide();
549
550        function handleCustomFont(evt) {
551
552            var fonts = evt.target.files; // FileList object
553
554            // fonts is a FileList of File objects.
555            for (var i = 0, f; f = fonts[i]; i++) {
556
557                // Only process files under 2mb.
558                if (f.size >= 2000000) {
559                    alert('This file is too big.');
560                    continue;
561                }
562                if (f) {
563                    var reader = new FileReader();
564
565                    reader.onload = function (readerEvt) {
566
567                        var binaryString = readerEvt.target.result;
568
569                        if (evt.target.id == 'customFont') {
570                            myFont = btoa(binaryString);
571                        } else if (evt.target.id == 'boldFont') {
572                            boldFont = btoa(binaryString);
573                        }
574                    }
575                } else {
576                    alert("Failed to load file");
577                }
578
579                reader.readAsBinaryString(f);
580
581            }
582
583        }
584
585        function handleCustomImage(evt) {
586            var images = evt.target.files; // FileList object
587
588            // images is a FileList of File objects.
589            for (var i = 0, f; f = images[i]; i++) {
590
591                // Only process files under 2mb.
592                if (f.size >= 2000000) {
593                    alert('This file is too big.');
594                    continue;
595                }
596
597                if (f) {
598                    var reader = new FileReader();
599
600                    reader.onload = function (readerEvt) {
601
602                        logo = readerEvt.target.result;
603                    }
604                } else {
605                    alert("Failed to load file");
606                }
607
608                reader.readAsDataURL(f);
609
610            }
611        }
612
613        document.getElementById('customFont').addEventListener('change', handleCustomFont);
614        document.getElementById('boldFont').addEventListener('change', handleCustomFont);
615        document.getElementById('logo').addEventListener('change', handleCustomImage);
616
617        if (window.localStorage.getItem('remember') == 'true') {
618            loadOptions();
619            $('#remember').prop("checked",true);
620            $('#remember-buttons').show();
621        } else {
622            $('#remember-buttons').hide();
623        }
624
625        $('#remember').change( function() {
626
627            if ($('#remember').is(':checked')) {
628
629                window.localStorage.setItem('remember','true');
630                $('#remember-buttons').show();
631
632            } else {
633
634                window.localStorage.setItem('remember','false');
635                $('#remember-buttons').hide();
636
637            }
638        });
639
640        $('#clear').click(function() {
641            window.localStorage.clear();
642            $('#remember-buttons').hide();
643            $('#remember').prop("checked",false);
644        });
645
646        $('#save').click(function() {
647            saveOptions();
648        });
649
650        $('#useCustom').change( function() {
651            if ($('#useCustom').is(':checked')) {
652                $('.c').show();
653                $('#headerFont option[value="myFont"]').prop('selected',true);
654            } else {
655                $('.c').hide();
656                $('#headerFont option[value="RobotoCondensed"]').prop('selected',true);
657            }
658        });
659
660
661        $('#clueFont').change( function() {
662            if (this.value=="myFont" && (document.getElementById('boldHeadings').checked || document.getElementById('boldNumbers').checked)) {
663                $('#add-bold-font').show();
664            } else {
665                $('#add-bold-font').hide();
666            }
667        });
668
669        $('#useHeader2').change( function() {
670            if ($('#useHeader2').is(':checked')) {
671                $("#header-left").prop("checked",true).trigger("click");
672                $("#header-center-button").hide();
673                $("#useHeaderWidth").show();
674                $('#additional-header').show();
675            } else {
676                $("#header-center-button").show();
677                $("#useHeaderWidth").hide();
678                $('#additional-header').hide();
679
680            }
681        });
682
683        $('#useSubheader').change( function() {
684            if ($('#useSubheader').is(':checked')) {
685                $("#subheader-font-size").show();
686                $("#subheader").show();
687            } else {
688                $("#subheader-font-size").hide();
689                $("#subheader").hide();
690
691            }
692        });
693
694        $('#useLogo').change( function() {
695            if ($('#useLogo').is(':checked')) {
696                $("#add-logo").show();
697            } else {
698                $("#add-logo").hide();
699
700            }
701        });
702
703        $('#useCopyright').change( function() {
704            if ($('#useCopyright').is(':checked')) {
705                $("#copyright").show();
706            } else {
707                $("#copyright").hide();
708
709            }
710        });
711
712
713        function saveOptions() {
714
715            // write to localStorage
716
717            // header content
718            if ($('#header-center').is(':checked')) {
719                window.localStorage.setItem('header-center','true');
720            } else {
721                window.localStorage.setItem('header-center','fal
721se');
722            }
723
724            window.localStorage.setItem('headerText',$('#headerText').val());
725
726
727            if (!$('#useHeader2').is(':checked')) {
728                window.localStorage.setItem('useHeader2','false');
729            } else {
730                window.localStorage.setItem('useHeader2','true');
731            }
732
733            if ($('#header2-left').is(':checked')) {
734                window.localStorage.setItem('header2-left','true');
735            } else {
736                window.localStorage.setItem('header2-left','false');
737            }
738
739            if ($('#header2-top').is(':checked')) {
740                window.localStorage.setItem('header2-top','true');
741            } else {
742                window.localStorage.setItem('header2-top','false');
743            }
744
745            if ($('#header2-middle').is(':checked')) {
746                window.localStorage.setItem('header2-middle','true');
747            } else {
748                window.localStorage.setItem('header2-middle','false');
749            }
750
751            window.localStorage.setItem('headerText2',$('#headerText2').val());
752
753
754            if ($('#useSubheader').is(':checked')) {
755                window.localStorage.setItem('useSubheader','true');
756            } else {
757                window.localStorage.setItem('useSubheader','false');
758            }
759
760            if ($('#subheader-center').is(':checked')) {
761                window.localStorage.setItem('subheader-center','true');
762            } else {
763                window.localStorage.setItem('subheader-center','fal
763se');
764            }
765
766            if ($('#subheader-right').is(':checked')) {
767                window.localStorage.setItem('subheader-right','true');
768            } else {
769                window.localStorage.setItem('subheader-right','false');
770            }
771
772            window.localStorage.setItem('subheaderText',$('#subheaderText').val());
773
774
775            // add image
776            if ($('#useLogo').is(':checked')) {
777                window.localStorage.setItem('useLogo','true');
778
779                if (logo) {
780                    window.localStorage.setItem('logo', logo);
781                }
782
783            } else {
784                window.localStorage.setItem('useLogo','false');
785            }
786
787            window.localStorage.setItem('logoX',$('#logoX').val());
788            window.localStorage.setItem('logoY',$('#logoY').val());
789            window.localStorage.setItem('logoS',$('#logoS').val());
790
791            // basic options
792            window.localStorage.setItem('hFontSize',$('#hFontSize').val());
793            window.localStorage.setItem('h2FontSize',$('#h2FontSize').val());
794            window.localStorage.setItem('sFontSize',$('#sFontSize').val());
795            window.localStorage.setItem('cFontSize',$('#cFontSize').val());
796            window.localStorage.setItem('columns',$('#columns').val());
797
798
799            if (!$('#useCopyright').is(':checked')) {
800                window.localStorage.setItem('useCopyright','false');
801            } else {
802                window.localStorage.setItem('useCopyright','true');
803            }
804
805            if ($('#grid_br').is(':checked')) {
806                window.localStorage.setItem('grid_br','true');
807            }
808
809            if ($('#grid_bl').is(':checked')) {
810                window.localStorage.setItem('grid_bl','true');
811            }
812
813            if ($('#gray').is(':checked')) {
814                window.localStorage.setItem('gray','true');
815            }
816
817            if ($('#shade').is(':checked')) {
818                window.localStorage.setItem('shade','true');
819            }
820
821            if ($('#solution').is(':checked')) {
822                window.localStorage.setItem('solution','true');
823            }
824
825            // advanced settings -- margins
826
827            window.localStorage.setItem('marginSize',$('#marginSize').val());
828            window.localStorage.setItem('bottommarginSize',$('#bottommarginSize').val());
829            window.localStorage.setItem('sidemarginSize',$('#sidemarginSize').val());
830            window.localStorage.setItem('headerWidth',$('#headerWidth').val());
831
832
833            // advanced settings -- padding
834
835            window.localStorage.setItem('hsPadding',$('#hsPadding').val());
836            window.localStorage.setItem('hbPadding',$('#hbPadding').val());
837            window.localStorage.setItem('hlPadding',$('#hlPadding').val());
838            window.localStorage.setItem('slPadding',$('#slPadding').val());
839            window.localStorage.setItem('gridPadding',$('#gridPadding').val());
840            window.localStorage.setItem('columnPadding',$('#columnPadding').val());
841
842            // advanced settings -- fonts
843
844            if ($('#useCustom').is(':checked')) {
845                window.localStorage.setItem('useCustom','true');
846
847                if (myFont.length > 0) {
848                    window.localStorage.setItem('myFont', myFont);
849                }
850            }
851
852            window.localStorage.setItem('headerFont',$('#headerFont').val());
853            window.localStorage.setItem('gridFont',$('#gridFont').val());
854            window.localStorage.setItem('clueFont',$('#clueFont').val());
855
856
857            // advanced settings -- grid
858
859            window.localStorage.setItem('numberSize',$('#numberSize').val());
860            window.localStorage.setItem('lineWidth',$('#lineWidth').val());
861            window.localStorage.setItem('borderWidth',$('#borderWidth').val());
862
863            // advanced settings -- clues
864
865            window.localStorage.setItem('interSpacing',$('#interSpacing').val());
866
867            if (!$('#boldHeadings').is(':checked')) {
868                window.localStorage.setItem('boldHeadings','false');
869            }
870
871            if (!$('#boldNumbers').is(':checked')) {
872                window.localStorage.setItem('boldNumbers','false');
873            }
874
875
876        }
877
878        function loadOptions() {
879
880            // -- retrieve from storage --
881
882            // header content
883
884            if (window.localStorage.getItem('headerText')) {
885                $('#headerText').val(window.localStorage.getItem('headerText'));
886            }
887
888            if (window.localStorage.getItem('useHeader2')=='false') {
889                $('#useHeader2').prop("checked",false);
890                $("#header-center-button").show();
891                $("#useHeaderWidth").hide();
892                $("#additional-header").hide();
893
894                if (window.localStorage.getItem('header-center')=='true') {
895                    $('#header-center').prop("checked",true);
896                    $('#header-left-button').removeClass('active');
897                    $('#header-center-button').addClass('active');
898                }
899            }
900
901            if (window.localStorage.getItem('header2-left')=='true') {
902                    $('#header2-left').prop("checked",true);
903                    $('#header2-right-button').removeClass('active');
904                    $('#header2-left-button').addClass('active');
905            }
906
907            if (window.localStorage.getItem('header2-top')=='true') {
908                    $('#header2-top').prop("checked",true);
909                    $('#header2-bottom-button').removeClass('active');
910                    $('#header2-top-button').addClass('active');
911            }
912
913            if (window.localStorage.getItem('header2-middle')=='true') {
914                    $('#header2-middle').prop("checked",true);
915                    $('#header2-bottom-button').removeClass('active');
916                    $('#header2-middle-button').addClass('active');
917            }
918
919            if (window.localStorage.getItem('headerText2')) {
920                $('#headerText2').val(window.localStorage.getItem('headerText2'));
921            }
922
923            if (window.localStorage.getItem('useSubheader')=='true') {
924                $('#useSubheader').prop("checked",true);
925                $('#subheader').show();
926            }
927
928            if (window.localStorage.getItem('subheader-center')=='true') {
929                $('#subheader-center').prop("checked",true);
930                $('#subheader-left-button').removeClass('active');
931                $('#subheader-center-button').addClass('active');
932            }
933
934            if (window.localStorage.getItem('subheader-right')=='true') {
935                $('#subheader-right').prop("checked",true);
936                $('#subheader-left-button').removeClass('active');
937                $('#subheader-right-button').addClass('active');
938            }
939
940            if (window.localStorage.getItem('subheaderText')) {
941                $('#subheaderText').val(window.localStorage.getItem('subheaderText'));
942            }
943
944            // add image
945
946            if (window.localStorage.getItem('useLogo')=='true') {
947                $('#useLogo').prop("checked",true);
948                $('#add-logo').show();
949
950                if (window.localStorage.getItem('logo')) {
951                    logo = window.localStorage.getItem('logo');
952                }
953
954            }
955
956            if ((window.localStorage.getItem('logoX') != '36') && (window.localStorage.getItem('logoX') != null)) {
957                $('#logoX').val(window.localStorage.getItem('logoX'));
958            }
959
960            if ((window.localStorage.getItem('logoY') != '36') && (window.localStorage.getItem('logoY') != null)) {
961                $('#logoY').val(window.localStorage.getItem('logoY'));
962            }
963
964            if ((window.localStorage.getItem('logoS') != '100') && (window.localStorage.getItem('logoS') != null)) {
965                $('#logoS').val(window.localStorage.getItem('logoS'));
966            }
967
968
969
970            // basic options
971            if (window.localStorage.getItem('hFontSize')) {
972                $('#hFontSize').val(window.localStorage.getItem('hFontSize'));
973            }
974
975            if (window.localStorage.getItem('h2FontSize')) {
976                $('#h2FontSize').val(window.localStorage.getItem('h2FontSize'));
977            }
978
979            if (window.localStorage.getItem('sFontSize')) {
980                $('#sFontSize').val(window.localStorage.getItem('sFontSize'));
981            }
982
983            if (window.localStorage.getItem('cFontSize')) {
984                $('#cFontSize').val(window.localStorage.getItem('cFontSize'));
985            }
986
987            if (window.localStorage.getItem('columns')) {
988                $('#columns').val(window.localStorage.getItem('columns'));
989            }
990
991            if (window.localStorage.getItem('useCopyright') == 'false') {
992                $('#useCopyright').prop("checked",false);
993            } else {
994                $('#useCopyright').prop("checked",true);
995            }
996
997            if (window.localStorage.getItem('grid_br') == 'true') {
998                $('#grid_br').prop("checked",true);
999            }
1000
1001            if (window.localStorage.getItem('grid_bl') == 'true') {
1002                $('#grid_bl').prop("checked",true);
1003            }
1004
1005            if (window.localStorage.getItem('gray') == 'true') {
1006                $('#gray').prop("checked",true);
1007            }
1008
1009            if (window.localStorage.getItem('shade') == 'true') {
1010                $('#shade').prop("checked",true);
1011            }
1012
1013            if (window.localStorage.getItem('solution') == 'true') {
1014                $('#solution').prop("checked",true);
1015            }
1016
1017
1018            // advanced settings -- margins
1019
1020            if (window.localStorage.getItem('marginSize')) {
1021                $('#marginSize').val(window.localStorage.getItem('marginSize'));
1022            }
1023
1024            if (window.localStorage.getItem('bottommarginSize')) {
1025                $('#bottommarginSize').val(window.localStorage.getItem('bottommarginSize'));
1026            }
1027
1028            if (window.localStorage.getItem('sidemarginSize')) {
1029                $('#sidemarginSize').val(window.localStorage.getItem('sidemarginSize'));
1030            }
1031
1032            if (window.localStorage.getItem('headerWidth')) {
1033                $('#headerWidth').val(window.localStorage.getItem('headerWidth'));
1034            }
1035
1036            // advanced settings -- padding
1037
1038            if (window.localStorage.getItem('hsPadding')) {
1039                $('#hsPadding').val(window.localStorage.getItem('hsPadding'));
1040            }
1041
1042            if (window.localStorage.getItem('hbPadding')) {
1043                $('#hbPadding').val(window.localStorage.getItem('hbPadding'));
1044            }
1045
1046            if (window.localStorage.getItem('hlPadding')) {
1047                $('#hlPadding').val(window.localStorage.getItem('hlPadding'));
1048            }
1049
1050            if (window.localStorage.getItem('slPadding')) {
1051                $('#slPadding').val(window.localStorage.getItem('slPadding'));
1052            }
1053
1054            if (window.localStorage.getItem('gridPadding')) {
1055                $('#gridPadding').val(window.localStorage.getItem('gridPadding'));
1056            }
1057
1058            if (window.localStorage.getItem('columnPadding')) {
1059                $('#columnPadding').val(window.localStorage.getItem('columnPadding'));
1060            }
1061
1062            // advanced settings -- fonts
1063
1064            if (window.localStorage.getItem('useCustom') == 'true') {
1065                $('#useCustom').prop("checked",true);
1066                $('.c').show();
1067                $('#headerFont option[value="myFont"]').prop('selected',true);
1068
1069                if (window.localStorage.getItem('myFont')) {
1070                    myFont = window.localStorage.getItem('myFont');
1071                }
1072
1073            }
1074
1075            if (window.localStorage.getItem('headerFont')) {
1076                $('#headerFont').val(window.localStorage.getItem('headerFont'));
1077            }
1078
1079            if (window.localStorage.getItem('gridFont')) {
1080                $('#gridFont').val(window.localStorage.getItem('gridFont'));
1081            }
1082
1083            if (window.localStorage.getItem('clueFont')) {
1084                $('#clueFont').val(window.localStorage.getItem('clueFont'));
1085            }
1086
1087            // advanced settings -- grid
1088
1089            if (window.localStorage.getItem('numberSize')) {
1090                $('#numberSize').val(window.localStorage.getItem('numberSize'));
1091            }
1092
1093            if (window.localStorage.getItem('lineWidth')) {
1094                $('#lineWidth').val(window.localStorage.getItem('lineWidth'));
1095            }
1096
1097            if (window.localStorage.getItem('borderWidth')) {
1098                $('#borderWidth').val(window.localStorage.getItem('borderWidth'));
1099            }
1100
1101            // advanced settings -- clues
1102
1103            if (window.localStorage.getItem('interSpacing')) {
1104                $('#interSpacing').val(window.localStorage.getItem('interSpacing'));
1105            }
1106
1107            if (window.localStorage.getItem('boldHeadings') == 'false') {
1108                $('#boldHeadings').prop("checked",false);
1109            }
1110
1111            if (window.localStorage.getItem('boldNumbers') == 'false') {
1112                $('#boldNumbers').prop("checked",false);
1113            }
1114
1115        }
1116
1117
1118        function handleFileSelect(evt) {
1119
1120            // get the address and e-mail
1121            var header_text = document.getElementById('headerText').value;
1122            var header2_text = document.getElementById('headerText2').value;
1123            var subheader_text = document.getElementById('subheaderText').value;
1124            var header_align = 'left';
1125            var header2_align = 'right';
1126            var subheader_align = 'left';
1127            var y_align = 'alphabetic';
1128            var gray = 0;
1129            var number = document.getElementById('numberSize').value;
1130            var clue_entry_pt = document.getElementById('cFontSize').value*1;
1131            var header_pt = document.getElementById('hFontSize').value*1;
1132            var header2_pt = document.getElementById('h2FontSize').value*1;
1133            var subheader_pt = document.getElementById('sFontSize').value*1;
1134            var margin = document.getElementById('marginSize').value*72;
1135            var side_margin = document.getElementById('sidemarginSize').value*72;
1136            var bottom_margin = document.getElementById('bottommarginSize').value*72;
1137            var header_width = document.getElementById('headerWidth').value*.01;
1138            var grid_padding = document.getElementById('gridPadding').value*1;
1139            var header_indent = document.getElementById('hlPadding').value*1;
1140            var subheader_indent = document.getElementById('slPadding').value*1;
1141            var subheader_mt = document.getElementById('hsPadding').value*1;
1142            var under_title_padding = document.getElementById('hbPadding').value*1;
1143            var line_width = document.getElementById('lineWidth').value*1;
1144            var border_width = document.getElementById('borderWidth').value*1;
1145            var column_padding = document.getElementById('columnPadding').value*1;
1146            var clue_spacing = document.getElementById('interSpacing').value-1;
1147            var heading_style = 'bold';
1148            var number_style = 'bold';
1149            var shade = false;
1150            var solution = false;
1151            var header_font = document.getElementById('headerFont').value;
1152            var grid_font = document.getElementById('gridFont').value;
1153            var clue_font = document.getElementById('clueFont').value;
1154            var right_header = true;
1155            var subheader = false;
1156            var copyright = true;
1157            var copyright_text = document.getElementById('copyright').value;
1158            var columns = document.getElementById('columns').value;
1159            var grid_placement = 'top';
1160            var logoX = document.getElementById('logoX').value*1;
1161            var logoY = document.getElementById('logoY').value*1;
1162            var logoS = document.getElementById('logoS').value/100;
1163
1164            if (document.getElementById('grid_br').checked) {
1165                grid_placement = 'bottom';
1166            }
1167
1168            if (document.getElementById('grid_bl').checked) {
1169                grid_placement = 'left';
1170            }
1171
1172            if (document.getElementById('header-center').checked) {
1173                header_align = 'center';
1174            }
1175
1176            if (document.getElementById('subheader-center').checked) {
1177                subheader_align = 'center';
1178            }
1179
1180            if (document.getElementById('subheader-right').checked) {
1181                subheader_align = 'right';
1182            }
1183
1184            if (!document.getElementById('useHeader2').checked) {
1185                right_header = false;
1186            }
1187
1188            if (document.getElementById('useSubheader').checked) {
1189                subheader = true;
1190            }
1191
1192            if (document.getElementById('header2-top').checked) {
1193                y_align = 'top';
1194            }
1195
1196            if (document.getElementById('header2-middle').checked) {
1197                y_align = 'middle';
1198            }
1199
1200            if (document.getElementById('header2-left').checked) {
1201                header2_align = 'left';
1202            }
1203
1204            if (!document.getElementById('useCopyright').checked) {
1205                copyright = false;
1206            }
1207
1208            if (!document.getElementById('boldHeadings').checked) {
1209                heading_style = 'normal';
1210            }
1211
1212            if (!document.getElementById('boldNumbers').checked) {
1213                number_style = 'normal';
1214            }
1215
1216            if (!document.getElementById('useCustom').checked) {
1217                document.getElementById('customFont').value = "";
1218            }
1219
1220            if (!document.getElementById('useLogo').checked) {
1221                logo = null;
1222            }
1223
1224            if (document.getElementById('gray').checked) {
1225                gray = 0.6;
1226            }
1227
1228            if (document.getElementById('shade').checked) {
1229                shade = true;
1230            }
1231
1232            if (document.getElementById('solution').checked) {
1233                solution = true;
1234            }
1235
1236            var files = document.getElementById('files').files; // FileList object
1237
1238            if (!files[0]) {
1239                alert('Please choose a puzzle file.');
1240                return;
1241            }
1242
1243            // files is a FileList of File objects.
1244            for (var i = 0, f; f = files[i]; i++) {
1245
1246                // Only process small files.
1247                if (f.size >= 2000000) {
1248                    alert('This file is too big.');
1249                    continue;
1250                }
1251                if (f) {
1252                    var r = new FileReader();
1253                    var filename = f.name;
1254                    filename = filename.substring(0,filename.length - 4);
1255                    var outname = filename + '.pdf';
1256                    r.onload = (function(theFile) {
1257                        return function(e) {
1258                            var contents = e.target.result;
1259                            //var puzdata = PUZAPP.parsepuz(contents);
1260                            var xw_constructor = new JSCrossword();
1261                            var puzdata = xw_constructor.fromData(contents);
1262                            var options = {outfile: outname, header_text: header_text, header2_text: header2_text, header_align: header_align, header2_align: header2_align, y_align: y_align, gray: gray, output: evt, number_pct: number, margin: margin, side_margin: side_margin, bottom_margin: bottom_margin, max_clue_pt: clue_entry_pt, header_pt: header_pt, header2_pt: header2_pt, grid_padding: grid_padding, line_width: line_width, border_width: border_width, column_padding: column_padding, clue_spacing:clue_spacing, heading_style: heading_style, number_style: number_style, shade: shade, my_font: myFont, bold_font: boldFont, header_font: header_font, grid_font: grid_font, clue_font: clue_font, right_header: right_header, subheader: subheader, subheader_text: subheader_text, subheader_pt: subheader_pt, subheader_align: subheader_align, copyright: copyright, copyright_text: copyright_text, subheader_mt: subheader_mt, under_title_spacing: under_title_padding, header_width: header_width, columns:columns, grid_placement: grid_placement, solution: solution, logo: logo, logoX: logoX, logoY: logoY, logoS:logoS, header_indent: header_indent, subheader_indent: subheader_indent};
1263                            puzdata_to_pdf(puzdata,options);
1264                        };
1265                    })(f);
1266                    r.readAsBinaryString(f);
1267                    document.querySelector('#previewButton').textContent = 'Update Preview';
1268                } else {
1269                    alert("Failed to load file");
1270                }
1271            }
1272
1273
1274        }
1275
1276        </script>
1276
1277
1278        <p>
1279        <hr/>
1280        Original code from
1281        <a
1282          href="https://crosswordnexus.com/apps/puz-to-nyt/"
1283          >Crossword Nexus</a>, licensed under MIT License.
1284        <br>
1285
1286      </p>
1287    </div>
1288
1289    
1289<script src="js/jspdf.umd.min.js"></script>
1289
1290    
1290<script src="js/RobotoCondensed-normal.js"></script>
1290
1291    
1291<script src="js/RobotoCondensed-bold.js"></script>
1291
1292    
1292<script src="js/RobotoCondensed-italic.js"></script>
1292
1293    
1293<script src="js/RobotoCondensed-bolditalic.js"></script>
1293
1294    
1294<script src="js/NunitoSans-Regular-normal.js"></script>
1294
1295    
1295<script src="js/NunitoSans-Regular-bold.js"></script>
1295
1296    
1296<script src="js/MH-normal.js"></script>
1296
1297    
1297<script src="js/MH-bold.js"></script>
1297
1298    
1298<script src="js/MH-italic.js"></script>
1298
1299    
1299<script src="js/jscrossword_combined.js" type="text/javascript"></script>
1299
1300    
1300<script src="js/puz_functions.js" type="text/javascript"></script>
1300
1301    
1301<script src="js/pdfobject.min.js"></script>
1301
1302    
1302<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
1302
1303    
1303<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
1303
1304
1305  </body>
1306</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.