/* -*- 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 '/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(); })();