Skip to content

Instantly share code, notes, and snippets.

@tallykatt
Forked from notmasteryet/debug.js
Created July 25, 2016 02:20
Show Gist options
  • Select an option

  • Save tallykatt/0b1734040d1e1b127cf12f74d678e24c to your computer and use it in GitHub Desktop.

Select an option

Save tallykatt/0b1734040d1e1b127cf12f74d678e24c to your computer and use it in GitHub Desktop.

Revisions

  1. @notmasteryet notmasteryet created this gist Jan 18, 2012.
    102 changes: 102 additions & 0 deletions debug.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,102 @@
    /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
    /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */

    // save the file as '<pdf.js>/font~/debug.js'
    // bookmarklet -> javascript:(function(){if(window.fontDebugScript)%20return;%20var%20script%20=%20window.fontDebugScript%20=%20document.createElement('script');script.setAttribute('src',%20'../font~/debug.js');document.body.appendChild(script);})();

    'use strict';

    (function fontDebug() {
    var fonts;
    var panelWidth = 300;
    function initUI() {
    var ui = document.createElement('div');
    ui.setAttribute('style', 'position: fixed; top:35px; bottom:5px; right: 0; width: ' + panelWidth + 'px; background: white; border: 2px black solid; padding: 5px; overflow: scroll;');
    document.body.appendChild(ui);
    var tmp;
    tmp = document.createElement('p');
    tmp.textContent = 'pdf.js font instrumentation';
    ui.appendChild(tmp);

    tmp = document.createElement('button');
    tmp.addEventListener('click', refresh);
    tmp.textContent = 'Refresh';
    ui.appendChild(tmp);
    ui.appendChild(document.createElement('br'));

    fonts = document.createElement('div');
    ui.appendChild(fonts);

    var style = document.createElement('style');
    style.textContent = '.showtext { background: yellow; color: blue; opacity: 0.3; } .hidetext:hover { background: yellow; opacity: 0.3; }';
    ui.appendChild(style);

    document.body.setAttribute('style', 'padding-right: ' + panelWidth + 'px;');
    document.body.addEventListener('click', textLayerClick, true);
    refresh();
    }
    function refresh() {
    resetSelection();
    fonts.innerHTML = '';
    var styles = document.styleSheets;
    for (var i = 0; i < styles.length; i++) {
    var style = styles[i];
    if (!style.cssRules || style.cssRules.length != 1) continue;
    var rule = style.cssRules[0];
    var text = rule.cssText;
    var m = /(pdfFont\d+)/.exec(text);
    if (!m) continue;
    var fontName = m[1];
    m = /url\(['"]?([^\)"']+)/.exec(text);
    var font = document.createElement('div');
    var name = document.createElement('a');
    name.href = m[1];
    name.textContent = fontName;
    font.appendChild(name);
    var select = document.createElement('input');
    select.setAttribute('type', 'checkbox');
    select.dataset.fontName = fontName;
    select.addEventListener('click', (function(select, fontName) {
    return (function() {
    selectFont(fontName, select.checked);
    });
    })(select, fontName));
    font.appendChild(select);

    fonts.appendChild(font);
    }
    }
    function resetSelection() {
    var divs = document.getElementsByTagName('div');
    for (var i = 0; i < divs.length; ++i) {
    var div = divs[i], style = div.getAttribute('style');
    if (!style || style.indexOf('pdfFont') < 0) continue;
    var m = /(pdfFont\d+)/.exec(style);
    div.dataset.fontName = m[1];
    div.className = 'hidetext';
    }
    }
    function selectFont(fontName, show) {
    var divs = document.getElementsByTagName('div');
    for (var i = 0; i < divs.length; ++i) {
    var div = divs[i], style = div.getAttribute('style');
    if (div.dataset.fontName != fontName) continue;
    div.className = show ? 'showtext' : 'hidetext';
    }
    }
    function textLayerClick(e) {
    if (!e.target.dataset.fontName || e.target.tagName != 'DIV')
    return;
    var fontName = e.target.dataset.fontName;
    var selects = document.getElementsByTagName('input');
    for (var i = 0; i < selects.length; ++i) {
    var select = selects[i];
    if (select.dataset.fontName != fontName) continue;
    select.checked = !select.checked;
    selectFont(fontName, select.checked);
    select.scrollIntoView();
    }
    }

    initUI();
    })();