| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299 | 
							
- var $ = document.querySelector.bind(document)
 
- var state = {
 
-   theme: args.theme,
 
-   raw: args.raw,
 
-   themes: args.themes,
 
-   content: args.content,
 
-   compiler: args.compiler,
 
-   html: '',
 
-   markdown: '',
 
-   toc: '',
 
-   interval: null,
 
-   ms: 1000,
 
- }
 
- chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
 
-   if (req.message === 'reload') {
 
-     location.reload(true)
 
-   }
 
-   else if (req.message === 'theme') {
 
-     state.theme = req.theme
 
-     m.redraw()
 
-   }
 
-   else if (req.message === 'themes') {
 
-     state.themes = req.themes
 
-     m.redraw()
 
-   }
 
-   else if (req.message === 'raw') {
 
-     state.raw = req.raw
 
-     m.redraw()
 
-   }
 
-   else if (req.message === 'autoreload') {
 
-     clearInterval(state.interval)
 
-   }
 
- })
 
- var oncreate = {
 
-   markdown: () => {
 
-     scroll.body()
 
-   },
 
-   html: () => {
 
-     scroll.body()
 
-     if (state.content.toc && !state.toc) {
 
-       state.toc = toc()
 
-       m.redraw()
 
-     }
 
-     setTimeout(() => Prism.highlightAll(), 20)
 
-     anchors()
 
-   },
 
-   toc: () => {
 
-     scroll.toc()
 
-   }
 
- }
 
- function mount () {
 
-   $('pre').style.display = 'none'
 
-   var md = $('pre').innerText
 
-   m.mount($('body'), {
 
-     oninit: () => {
 
-       state.markdown = md
 
-       chrome.runtime.sendMessage({
 
-         message: 'markdown',
 
-         compiler: state.compiler,
 
-         markdown: state.markdown
 
-       }, (res) => {
 
-         state.html = state.content.emoji ? emojinator(res.html) : res.html
 
-         m.redraw()
 
-       })
 
-     },
 
-     view: () => {
 
-       var dom = []
 
-       if (state.raw) {
 
-         dom.push(m('pre#_markdown', {oncreate: oncreate.markdown}, state.markdown))
 
-         $('body').classList.remove('_toc-left', '_toc-right')
 
-       }
 
-       else {
 
-         if (state.theme) {
 
-           dom.push(m('link#_theme', {
 
-             rel: 'stylesheet', type: 'text/css',
 
-             href: chrome.runtime.getURL(`/themes/${state.theme}.css`),
 
-           }))
 
-         }
 
-         if (state.html) {
 
-           dom.push(m('#_html', {oncreate: oncreate.html,
 
-             class: (/github(-dark)?/.test(state.theme) ? 'markdown-body' : 'markdown-theme') +
 
-             (state.themes.wide ? ' wide-theme' : '')
 
-           },
 
-             m.trust(state.html)
 
-           ))
 
-           if (state.content.toc && state.toc) {
 
-             dom.push(m('#_toc', {oncreate: oncreate.toc},
 
-               m.trust(state.toc)
 
-             ))
 
-             $('body').classList.add('_toc-left')
 
-           }
 
-           if (state.content.mathjax) {
 
-             dom.push(m('script', {
 
-               src: chrome.runtime.getURL('/vendor/mathjax/mathjax.init.js')
 
-             }))
 
-             dom.push(m('script', {
 
-               src: chrome.runtime.getURL('/vendor/mathjax/tex-mml-chtml.js')
 
-             }))
 
-           }
 
-         }
 
-       }
 
-       return (dom.length ? dom : m('div'))
 
-     }
 
-   })
 
- }
 
- var scroll = (() => {
 
-   function race (done) {
 
-     Promise.race([
 
-       Promise.all([
 
-         new Promise((resolve) => {
 
-           var diagrams = Array.from(document.querySelectorAll('code.language-mmd, code.language-mermaid'))
 
-           if (!state.content.mermaid || !diagrams.length) {
 
-             resolve()
 
-           }
 
-           else {
 
-             var timeout = setInterval(() => {
 
-               var svg = Array.from(document.querySelectorAll('code.language-mmd svg, code.language-mermaid svg'))
 
-               if (diagrams.length === svg.length) {
 
-                 clearInterval(timeout)
 
-                 resolve()
 
-               }
 
-             }, 50)
 
-           }
 
-         }),
 
-         new Promise((resolve) => {
 
-           var images = Array.from(document.querySelectorAll('img'))
 
-           if (!images.length) {
 
-             resolve()
 
-           }
 
-           else {
 
-             var loaded = 0
 
-             images.forEach((img) => {
 
-               img.addEventListener('load', () => {
 
-                 if (++loaded === images.length) {
 
-                   resolve()
 
-                 }
 
-               }, {once: true})
 
-             })
 
-           }
 
-         }),
 
-       ]),
 
-       new Promise((resolve) => setTimeout(resolve, 500))
 
-     ])
 
-     .then(done)
 
-   }
 
-   function debounce (container, done) {
 
-     var listener = /html|body/i.test(container.nodeName) ? window : container
 
-     var timeout = null
 
-     listener.addEventListener('scroll', () => {
 
-       clearTimeout(timeout)
 
-       timeout = setTimeout(done, 100)
 
-     })
 
-   }
 
-   function listen (container, prefix) {
 
-     var key = prefix + location.origin + location.pathname
 
-     try {
 
-       container.scrollTop = parseInt(localStorage.getItem(key))
 
-       debounce(container, () => {
 
-         localStorage.setItem(key, container.scrollTop)
 
-       })
 
-     }
 
-     catch (err) {
 
-       chrome.storage.local.get(key, (res) => {
 
-         container.scrollTop = parseInt(res[key])
 
-       })
 
-       debounce(container, () => {
 
-         chrome.storage.local.set({[key]: container.scrollTop})
 
-       })
 
-     }
 
-   }
 
-   return {
 
-     body: () => {
 
-       var loaded
 
-       race(() => {
 
-         if (!loaded) {
 
-           loaded = true
 
-           var container = ((html = $('html')) => (
 
-             html.scrollTop = 1,
 
-             html.scrollTop ? (html.scrollTop = 0, html) : $('body')
 
-           ))()
 
-           if (state.content.scroll) {
 
-             listen(container, 'md-')
 
-           }
 
-           else if (location.hash && $(location.hash)) {
 
-             container.scrollTop = $(location.hash).offsetTop
 
-           }
 
-         }
 
-       })
 
-     },
 
-     toc: () => {
 
-       listen($('#_toc'), 'md-toc-')
 
-     }
 
-   }
 
- })()
 
- function anchors () {
 
-   Array.from($('#_html').childNodes)
 
-   .filter((node) => /h[1-6]/i.test(node.tagName))
 
-   .forEach((node) => {
 
-     var a = document.createElement('a')
 
-     a.className = 'anchor'
 
-     a.name = node.id
 
-     a.href = '#' + node.id
 
-     a.innerHTML = '<span class="octicon octicon-link"></span>'
 
-     node.prepend(a)
 
-   })
 
- }
 
- var toc = (
 
-   link = (header) => '<a href="#' + header.id + '">' + header.title + '</a>') =>
 
-   Array.from($('#_html').childNodes)
 
-   .filter((node) => /h[1-6]/i.test(node.tagName))
 
-   .map((node) => ({
 
-     id: node.getAttribute('id'),
 
-     level: parseInt(node.tagName.replace('H', '')),
 
-     title: node.innerText.replace(/</g, '<').replace(/>/g, '>')
 
-   }))
 
-   .reduce((html, header) => {
 
-     html += '<div class="_ul">'.repeat(header.level)
 
-     html += link(header)
 
-     html += '</div>'.repeat(header.level)
 
-     return html
 
-   }, '')
 
- if (document.readyState === 'complete') {
 
-   mount()
 
- }
 
- else {
 
-   var timeout = setInterval(() => {
 
-     if (document.readyState === 'complete') {
 
-       clearInterval(timeout)
 
-       mount()
 
-     }
 
-   }, 0)
 
- }
 
- if (state.content.autoreload) {
 
-   ;(() => {
 
-     var initial = ''
 
-     var response = (body) => {
 
-       if (!initial) {
 
-         initial = body
 
-       }
 
-       else if (initial !== body) {
 
-         location.reload(true)
 
-       }
 
-     }
 
-     var xhr = new XMLHttpRequest()
 
-     xhr.onreadystatechange = () => {
 
-       if (xhr.readyState === 4) {
 
-         response(xhr.responseText)
 
-       }
 
-     }
 
-     var get = () => {
 
-       if (location.protocol === 'file:') {
 
-         chrome.runtime.sendMessage({
 
-           message: 'autoreload',
 
-           location: location.href
 
-         }, (res) => {
 
-           if (res.err) {
 
-             console.error(res.err)
 
-             clearInterval(state.interval)
 
-           }
 
-           else {
 
-             response(res.body)
 
-           }
 
-         })
 
-       }
 
-       else {
 
-         xhr.open('GET', location.href + '?preventCache=' + Date.now(), true)
 
-         try {
 
-           xhr.send()
 
-         }
 
-         catch (err) {
 
-           console.error(err)
 
-           clearInterval(state.interval)
 
-         }
 
-       }
 
-     }
 
-     get()
 
-     state.interval = setInterval(get, state.ms)
 
-   })()
 
- }
 
 
  |