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.