|
import logger from '../lib/logger' |
|
import emitter from '../lib/emitter' |
|
import Url from 'licia/Url' |
|
import now from 'licia/now' |
|
import startWith from 'licia/startWith' |
|
import $ from 'licia/$' |
|
import upperFirst from 'licia/upperFirst' |
|
import loadJs from 'licia/loadJs' |
|
import trim from 'licia/trim' |
|
import LunaModal from 'luna-modal' |
|
import { isErudaEl } from '../lib/util' |
|
import evalCss from '../lib/evalCss' |
|
|
|
let style = null |
|
|
|
export default [ |
|
{ |
|
name: 'すべての境界線', |
|
fn() { |
|
if (style) { |
|
evalCss.remove(style) |
|
style = null |
|
return |
|
} |
|
|
|
style = evalCss( |
|
'* { outline: 2px dashed #707d8b; outline-offset: -3px; }', |
|
document.head |
|
) |
|
}, |
|
desc: 'すべての要素に色の境界線を追加する', |
|
}, |
|
{ |
|
name: 'ページを更新', |
|
fn() { |
|
const url = new Url() |
|
url.setQuery('timestamp', now()) |
|
|
|
window.location.replace(url.toString()) |
|
}, |
|
desc: 'URLにタイムスタンプを追加して更新する', |
|
}, |
|
{ |
|
name: '検索テキスト', |
|
fn() { |
|
LunaModal.prompt('テキストを入力してください').then((keyword) => { |
|
if (!keyword || trim(keyword) === '') { |
|
return |
|
} |
|
|
|
search(keyword) |
|
}) |
|
}, |
|
desc: 'ページ上の指定されたテキストを強調表示します', |
|
}, |
|
{ |
|
name: 'ページの編集', |
|
fn() { |
|
const body = document.body |
|
|
|
body.contentEditable = body.contentEditable !== 'true' |
|
}, |
|
desc: 'bodyのcontentEditableを切り替える', |
|
}, |
|
{ |
|
name: '画面に合わせる', |
|
|
|
fn() { |
|
const body = document.body |
|
const html = document.documentElement |
|
const $body = $(body) |
|
if ($body.data('scaled')) { |
|
window.scrollTo(0, +$body.data('scaled')) |
|
$body.rmAttr('data-scaled') |
|
$body.css('transform', 'none') |
|
} else { |
|
const documentHeight = Math.max( |
|
body.scrollHeight, |
|
body.offsetHeight, |
|
html.clientHeight, |
|
html.scrollHeight, |
|
html.offsetHeight |
|
) |
|
const viewportHeight = Math.max( |
|
document.documentElement.clientHeight, |
|
window.innerHeight || 0 |
|
) |
|
const scaleVal = viewportHeight / documentHeight |
|
$body.css('transform', `scale(${scaleVal})`) |
|
$body.data('scaled', window.scrollY) |
|
window.scrollTo(0, documentHeight / 2 - viewportHeight / 2) |
|
} |
|
}, |
|
desc: 'ページ全体を画面に合わせて縮小します', |
|
}, |
|
{ |
|
name: 'Vueプラグインを読み込む', |
|
fn() { |
|
loadPlugin('vue') |
|
}, |
|
desc: 'Vue 開発ツール', |
|
}, |
|
{ |
|
name: 'Monitorプラグインを読み込む', |
|
fn() { |
|
loadPlugin('monitor') |
|
}, |
|
desc: 'ページのfps、メモリ、DOMノードを表示する', |
|
}, |
|
{ |
|
name: 'Featuresプラグインを読み込む', |
|
fn() { |
|
loadPlugin('features') |
|
}, |
|
desc: 'ブラウザ機能の検出', |
|
}, |
|
{ |
|
name: 'Timingプラグインを読み込む', |
|
fn() { |
|
loadPlugin('timing') |
|
}, |
|
desc: 'パフォーマンスとリソースのタイミングを表示する', |
|
}, |
|
{ |
|
name: 'Codeプラグインを読み込む', |
|
fn() { |
|
loadPlugin('code') |
|
}, |
|
desc: 'JavaScript を編集して実行する', |
|
}, |
|
{ |
|
name: 'Benchmarkプラグインを読み込む', |
|
fn() { |
|
loadPlugin('benchmark') |
|
}, |
|
desc: 'JavaScriptベンチマークを実行する', |
|
}, |
|
{ |
|
name: 'Geolocationプラグインを読み込む', |
|
fn() { |
|
loadPlugin('geolocation') |
|
}, |
|
desc: '地理位置情報をテストする', |
|
}, |
|
{ |
|
name: 'Orientationプラグインを読み込む', |
|
fn() { |
|
loadPlugin('orientation') |
|
}, |
|
desc: 'テストオリエンテーション API', |
|
}, |
|
{ |
|
name: 'Touchesプラグインを読み込む', |
|
fn() { |
|
loadPlugin('touches') |
|
}, |
|
desc: '画面タッチを視覚化する', |
|
}, |
|
] |
|
|
|
evalCss(require('./searchText.scss'), document.head) |
|
|
|
function search(text) { |
|
const root = document.body |
|
const regText = new RegExp(text, 'ig') |
|
|
|
traverse(root, (node) => { |
|
const $node = $(node) |
|
|
|
if (!$node.hasClass('eruda-search-highlight-block')) return |
|
|
|
return document.createTextNode($node.text()) |
|
}) |
|
|
|
traverse(root, (node) => { |
|
if (node.nodeType !== 3) return |
|
|
|
let val = node.nodeValue |
|
val = val.replace( |
|
regText, |
|
(match) => `<span class="eruda-keyword">${match}</span>` |
|
) |
|
if (val === node.nodeValue) return |
|
|
|
const $ret = $(document.createElement('div')) |
|
|
|
$ret.html(val) |
|
$ret.addClass('eruda-search-highlight-block') |
|
|
|
return $ret.get(0) |
|
}) |
|
} |
|
|
|
function traverse(root, processor) { |
|
const childNodes = root.childNodes |
|
|
|
if (isErudaEl(root)) return |
|
|
|
for (let i = 0, len = childNodes.length; i < len; i++) { |
|
const newNode = traverse(childNodes[i], processor) |
|
if (newNode) root.replaceChild(newNode, childNodes[i]) |
|
} |
|
|
|
return processor(root) |
|
} |
|
|
|
function loadPlugin(name) { |
|
const globalName = 'eruda' + upperFirst(name) |
|
if (window[globalName]) return |
|
|
|
let protocol = location.protocol |
|
if (!startWith(protocol, 'http')) protocol = 'http:' |
|
|
|
loadJs( |
|
`${protocol}//cdn.jsdelivr.net/npm/eruda-${name}@${pluginVersion[name]}`, |
|
(isLoaded) => { |
|
if (!isLoaded || !window[globalName]) |
|
return logger.error('Fail to load plugin ' + name) |
|
|
|
emitter.emit(emitter.ADD, window[globalName]) |
|
emitter.emit(emitter.SHOW, name) |
|
} |
|
) |
|
} |
|
|
|
const pluginVersion = { |
|
monitor: '1.1.1', |
|
features: '2.1.0', |
|
timing: '2.0.1', |
|
code: '2.2.0', |
|
benchmark: '2.0.1', |
|
geolocation: '2.1.0', |
|
orientation: '2.1.1', |
|
touches: '2.1.0', |
|
vue: '1.1.1', |
|
} |
|
|