|
@@ -1,190 +1,191 @@
|
|
|
|
|
|
-var state = {
|
|
|
- compiler: '',
|
|
|
- options: {},
|
|
|
- content: {},
|
|
|
- theme: '',
|
|
|
- themes: {},
|
|
|
- _themes: [
|
|
|
- 'github',
|
|
|
- 'github-dark',
|
|
|
- // 'air',
|
|
|
- 'almond',
|
|
|
- 'awsm',
|
|
|
- 'axist',
|
|
|
- 'bamboo',
|
|
|
- 'bullframe',
|
|
|
- 'holiday',
|
|
|
- 'kacit',
|
|
|
- 'latex',
|
|
|
- 'marx',
|
|
|
- 'mini',
|
|
|
- 'modest',
|
|
|
- 'new',
|
|
|
- 'no-class',
|
|
|
- 'pico',
|
|
|
- 'retro',
|
|
|
- 'sakura',
|
|
|
- 'sakura-vader',
|
|
|
- 'semantic',
|
|
|
- 'simple',
|
|
|
- // 'splendor',
|
|
|
- 'style-sans',
|
|
|
- 'style-serif',
|
|
|
- 'stylize',
|
|
|
- 'superstylin',
|
|
|
- 'tacit',
|
|
|
- 'vanilla',
|
|
|
- 'water',
|
|
|
- 'water-dark',
|
|
|
- 'writ',
|
|
|
- ],
|
|
|
- _width: [
|
|
|
- 'auto',
|
|
|
- 'full',
|
|
|
- 'wide',
|
|
|
- 'large',
|
|
|
- 'medium',
|
|
|
- 'small',
|
|
|
- 'tiny',
|
|
|
- ],
|
|
|
- raw: false,
|
|
|
- tab: '',
|
|
|
- tabs: ['theme', 'compiler', 'content'],
|
|
|
- compilers: [],
|
|
|
- description: {
|
|
|
+var Popup = () => {
|
|
|
+
|
|
|
+ var state = {
|
|
|
+ compiler: '',
|
|
|
+ options: {},
|
|
|
+ content: {},
|
|
|
+ theme: '',
|
|
|
themes: {},
|
|
|
- compiler: {},
|
|
|
- content: {
|
|
|
- autoreload: 'Auto reload on file change',
|
|
|
- emoji: 'Convert emoji :shortnames: into EmojiOne images',
|
|
|
- toc: 'Generate Table of Contents',
|
|
|
- mathjax: 'Render MathJax formulas',
|
|
|
- mermaid: 'Mermaid diagrams',
|
|
|
- syntax: 'Syntax highlighting for fenced code blocks',
|
|
|
- }
|
|
|
- },
|
|
|
- settings: {}
|
|
|
-}
|
|
|
+ _themes: [
|
|
|
+ 'github',
|
|
|
+ 'github-dark',
|
|
|
+ // 'air',
|
|
|
+ 'almond',
|
|
|
+ 'awsm',
|
|
|
+ 'axist',
|
|
|
+ 'bamboo',
|
|
|
+ 'bullframe',
|
|
|
+ 'holiday',
|
|
|
+ 'kacit',
|
|
|
+ 'latex',
|
|
|
+ 'marx',
|
|
|
+ 'mini',
|
|
|
+ 'modest',
|
|
|
+ 'new',
|
|
|
+ 'no-class',
|
|
|
+ 'pico',
|
|
|
+ 'retro',
|
|
|
+ 'sakura',
|
|
|
+ 'sakura-vader',
|
|
|
+ 'semantic',
|
|
|
+ 'simple',
|
|
|
+ // 'splendor',
|
|
|
+ 'style-sans',
|
|
|
+ 'style-serif',
|
|
|
+ 'stylize',
|
|
|
+ 'superstylin',
|
|
|
+ 'tacit',
|
|
|
+ 'vanilla',
|
|
|
+ 'water',
|
|
|
+ 'water-dark',
|
|
|
+ 'writ',
|
|
|
+ ],
|
|
|
+ _width: [
|
|
|
+ 'auto',
|
|
|
+ 'full',
|
|
|
+ 'wide',
|
|
|
+ 'large',
|
|
|
+ 'medium',
|
|
|
+ 'small',
|
|
|
+ 'tiny',
|
|
|
+ ],
|
|
|
+ raw: false,
|
|
|
+ tab: '',
|
|
|
+ tabs: ['theme', 'compiler', 'content'],
|
|
|
+ compilers: [],
|
|
|
+ description: {
|
|
|
+ themes: {},
|
|
|
+ compiler: {},
|
|
|
+ content: {
|
|
|
+ autoreload: 'Auto reload on file change',
|
|
|
+ emoji: 'Convert emoji :shortnames: into EmojiOne images',
|
|
|
+ toc: 'Generate Table of Contents',
|
|
|
+ mathjax: 'Render MathJax formulas',
|
|
|
+ mermaid: 'Mermaid diagrams',
|
|
|
+ syntax: 'Syntax highlighting for fenced code blocks',
|
|
|
+ }
|
|
|
+ },
|
|
|
+ settings: {}
|
|
|
+ }
|
|
|
|
|
|
-var events = {
|
|
|
- tab: (e) => {
|
|
|
- state.tab = e.target.hash.replace('#tab-', '')
|
|
|
- localStorage.setItem('tab', state.tab)
|
|
|
- return false
|
|
|
- },
|
|
|
+ var events = {
|
|
|
+ tab: (e) => {
|
|
|
+ state.tab = e.target.hash.replace('#tab-', '')
|
|
|
+ localStorage.setItem('tab', state.tab)
|
|
|
+ return false
|
|
|
+ },
|
|
|
|
|
|
- compiler: {
|
|
|
- name: (e) => {
|
|
|
- state.compiler = state.compilers[e.target.selectedIndex]
|
|
|
+ compiler: {
|
|
|
+ name: (e) => {
|
|
|
+ state.compiler = state.compilers[e.target.selectedIndex]
|
|
|
+ chrome.runtime.sendMessage({
|
|
|
+ message: 'popup.compiler.name',
|
|
|
+ compiler: state.compiler,
|
|
|
+ }, () => {
|
|
|
+ chrome.runtime.sendMessage({message: 'popup'}, init)
|
|
|
+ })
|
|
|
+ },
|
|
|
+ options: (e) => {
|
|
|
+ state.options[e.target.name] = !state.options[e.target.name]
|
|
|
+ chrome.runtime.sendMessage({
|
|
|
+ message: 'popup.compiler.options',
|
|
|
+ compiler: state.compiler,
|
|
|
+ options: state.options,
|
|
|
+ })
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ content: (e) => {
|
|
|
+ state.content[e.target.name] = !state.content[e.target.name]
|
|
|
chrome.runtime.sendMessage({
|
|
|
- message: 'popup.compiler.name',
|
|
|
- compiler: state.compiler,
|
|
|
- }, () => {
|
|
|
- chrome.runtime.sendMessage({message: 'popup'}, init)
|
|
|
+ message: 'popup.content',
|
|
|
+ content: state.content,
|
|
|
})
|
|
|
},
|
|
|
- options: (e) => {
|
|
|
- state.options[e.target.name] = !state.options[e.target.name]
|
|
|
+
|
|
|
+ themes: (e) => {
|
|
|
+ state.themes.width = state._width[e.target.selectedIndex]
|
|
|
chrome.runtime.sendMessage({
|
|
|
- message: 'popup.compiler.options',
|
|
|
- compiler: state.compiler,
|
|
|
- options: state.options,
|
|
|
+ message: 'popup.themes',
|
|
|
+ themes: state.themes,
|
|
|
})
|
|
|
- }
|
|
|
- },
|
|
|
-
|
|
|
- content: (e) => {
|
|
|
- state.content[e.target.name] = !state.content[e.target.name]
|
|
|
- chrome.runtime.sendMessage({
|
|
|
- message: 'popup.content',
|
|
|
- content: state.content,
|
|
|
- })
|
|
|
- },
|
|
|
-
|
|
|
- themes: (e) => {
|
|
|
- state.themes.width = state._width[e.target.selectedIndex]
|
|
|
- chrome.runtime.sendMessage({
|
|
|
- message: 'popup.themes',
|
|
|
- themes: state.themes,
|
|
|
- })
|
|
|
- },
|
|
|
+ },
|
|
|
|
|
|
- theme: (e) => {
|
|
|
- state.theme = state._themes[e.target.selectedIndex]
|
|
|
- chrome.runtime.sendMessage({
|
|
|
- message: 'popup.theme',
|
|
|
- theme: state.theme
|
|
|
- })
|
|
|
- },
|
|
|
+ theme: (e) => {
|
|
|
+ state.theme = state._themes[e.target.selectedIndex]
|
|
|
+ chrome.runtime.sendMessage({
|
|
|
+ message: 'popup.theme',
|
|
|
+ theme: state.theme
|
|
|
+ })
|
|
|
+ },
|
|
|
|
|
|
- raw: () => {
|
|
|
- state.raw = !state.raw
|
|
|
- chrome.runtime.sendMessage({
|
|
|
- message: 'popup.raw',
|
|
|
- raw: state.raw
|
|
|
- })
|
|
|
- },
|
|
|
+ raw: () => {
|
|
|
+ state.raw = !state.raw
|
|
|
+ chrome.runtime.sendMessage({
|
|
|
+ message: 'popup.raw',
|
|
|
+ raw: state.raw
|
|
|
+ })
|
|
|
+ },
|
|
|
|
|
|
- defaults: () => {
|
|
|
- chrome.runtime.sendMessage({
|
|
|
- message: 'popup.defaults'
|
|
|
- }, () => {
|
|
|
- chrome.runtime.sendMessage({message: 'popup'}, init)
|
|
|
- localStorage.removeItem('tab')
|
|
|
- state._tabs.activeTabIndex = 0
|
|
|
- })
|
|
|
- },
|
|
|
+ defaults: () => {
|
|
|
+ chrome.runtime.sendMessage({
|
|
|
+ message: 'popup.defaults'
|
|
|
+ }, () => {
|
|
|
+ chrome.runtime.sendMessage({message: 'popup'}, init)
|
|
|
+ localStorage.removeItem('tab')
|
|
|
+ state._tabs.activeTabIndex = 0
|
|
|
+ })
|
|
|
+ },
|
|
|
|
|
|
- advanced: () => {
|
|
|
- chrome.runtime.sendMessage({message: 'popup.advanced'})
|
|
|
+ advanced: () => {
|
|
|
+ chrome.runtime.sendMessage({message: 'popup.advanced'})
|
|
|
+ }
|
|
|
}
|
|
|
-}
|
|
|
|
|
|
-var init = (res) => {
|
|
|
- state.compiler = res.compiler
|
|
|
- state.options = res.options
|
|
|
- state.content = res.content
|
|
|
- state.theme = res.theme
|
|
|
- state.themes = res.themes
|
|
|
+ var init = (res) => {
|
|
|
+ state.compiler = res.compiler
|
|
|
+ state.options = res.options
|
|
|
+ state.content = res.content
|
|
|
+ state.theme = res.theme
|
|
|
+ state.themes = res.themes
|
|
|
|
|
|
- state.raw = res.raw
|
|
|
- state.tab = localStorage.getItem('tab') || 'theme'
|
|
|
- state.compilers = res.compilers
|
|
|
- state.description.compiler = res.description
|
|
|
+ state.raw = res.raw
|
|
|
+ state.tab = localStorage.getItem('tab') || 'theme'
|
|
|
+ state.compilers = res.compilers
|
|
|
+ state.description.compiler = res.description
|
|
|
|
|
|
- state.settings = res.settings
|
|
|
- document.querySelector('body').classList.add(state.settings.theme)
|
|
|
+ state.settings = res.settings
|
|
|
+ document.querySelector('body').classList.add(state.settings.theme)
|
|
|
|
|
|
- m.redraw()
|
|
|
-}
|
|
|
+ m.redraw()
|
|
|
+ }
|
|
|
|
|
|
-chrome.runtime.sendMessage({message: 'popup'}, init)
|
|
|
+ chrome.runtime.sendMessage({message: 'popup'}, init)
|
|
|
|
|
|
-var oncreate = {
|
|
|
- ripple: (vnode) => {
|
|
|
- mdc.ripple.MDCRipple.attachTo(vnode.dom)
|
|
|
- },
|
|
|
- tabs: (vnode) => {
|
|
|
- state._tabs = mdc.tabs.MDCTabBar.attachTo(vnode.dom)
|
|
|
- setTimeout(() => {
|
|
|
- state._tabs.activeTabIndex = state.tabs.indexOf(state.tab)
|
|
|
- }, 250)
|
|
|
+ var oncreate = {
|
|
|
+ ripple: (vnode) => {
|
|
|
+ mdc.ripple.MDCRipple.attachTo(vnode.dom)
|
|
|
+ },
|
|
|
+ tabs: (vnode) => {
|
|
|
+ state._tabs = mdc.tabs.MDCTabBar.attachTo(vnode.dom)
|
|
|
+ setTimeout(() => {
|
|
|
+ state._tabs.activeTabIndex = state.tabs.indexOf(state.tab)
|
|
|
+ }, 250)
|
|
|
+ }
|
|
|
}
|
|
|
-}
|
|
|
|
|
|
-var onupdate = (tab, key) => (vnode) => {
|
|
|
- var value = tab === 'compiler' ? state.options[key]
|
|
|
- : tab === 'content' ? state.content[key]
|
|
|
- : null
|
|
|
+ var onupdate = (tab, key) => (vnode) => {
|
|
|
+ var value = tab === 'compiler' ? state.options[key]
|
|
|
+ : tab === 'content' ? state.content[key]
|
|
|
+ : null
|
|
|
|
|
|
- if (vnode.dom.classList.contains('is-checked') !== value) {
|
|
|
- vnode.dom.classList.toggle('is-checked')
|
|
|
+ if (vnode.dom.classList.contains('is-checked') !== value) {
|
|
|
+ vnode.dom.classList.toggle('is-checked')
|
|
|
+ }
|
|
|
}
|
|
|
-}
|
|
|
|
|
|
-m.mount(document.querySelector('body'), {
|
|
|
- view: (vnode) =>
|
|
|
+ var render = () =>
|
|
|
m('#popup',
|
|
|
// raw
|
|
|
m('button.mdc-button mdc-button--raised m-button', {
|
|
@@ -302,4 +303,118 @@ m.mount(document.querySelector('body'), {
|
|
|
'Advanced Options'
|
|
|
)
|
|
|
)
|
|
|
-})
|
|
|
+
|
|
|
+ var options = () =>
|
|
|
+ m('.row m-settings hidden',
|
|
|
+ m('.col-xxl-4.col-xl-4.col-lg-6.col-md-6.col-sm-12',
|
|
|
+ m('h3', 'Theme'),
|
|
|
+ m('.bs-callout m-theme',
|
|
|
+ m('.row',
|
|
|
+ m('.col-xxl-6.col-xl-6.col-lg-6.col-md-6.col-sm-12',
|
|
|
+ m('span.m-label',
|
|
|
+ 'Content Theme'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ m('.col-xxl-6.col-xl-6.col-lg-6.col-md-6.col-sm-12',
|
|
|
+ m('select.mdc-elevation--z2 m-select', {
|
|
|
+ onchange: events.theme
|
|
|
+ },
|
|
|
+ state._themes.map((theme) =>
|
|
|
+ m('option', {selected: state.theme === theme}, theme)
|
|
|
+ )
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ m('.row',
|
|
|
+ m('.col-xxl-6.col-xl-6.col-lg-6.col-md-6.col-sm-12',
|
|
|
+ m('span.m-label',
|
|
|
+ 'Content Width'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ m('.col-xxl-6.col-xl-6.col-lg-6.col-md-6.col-sm-12',
|
|
|
+ m('select.mdc-elevation--z2 m-select', {
|
|
|
+ onchange: events.themes
|
|
|
+ },
|
|
|
+ state._width.map((width) =>
|
|
|
+ m('option', {
|
|
|
+ selected: state.themes.width === width,
|
|
|
+ }, width)
|
|
|
+ )
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ settings.render()
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+
|
|
|
+ m('.col-xxl-4.col-xl-4.col-lg-6.col-md-6.col-sm-12',
|
|
|
+ m('h3', 'Compiler'),
|
|
|
+ m('.bs-callout m-compiler',
|
|
|
+ m('select.mdc-elevation--z2 m-select', {
|
|
|
+ onchange: events.compiler.name
|
|
|
+ },
|
|
|
+ state.compilers.map((name) =>
|
|
|
+ m('option', {selected: state.compiler === name}, name)
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ m('.scroll', {
|
|
|
+ class: Object.keys(state.options)
|
|
|
+ .filter((key) => typeof state.options[key] === 'boolean')
|
|
|
+ .length > 8
|
|
|
+ ? 'max' : ''
|
|
|
+ },
|
|
|
+ Object.keys(state.options)
|
|
|
+ .filter((key) => typeof state.options[key] === 'boolean')
|
|
|
+ .map((key) =>
|
|
|
+ m('label.mdc-switch m-switch', {
|
|
|
+ onupdate: onupdate('compiler', key),
|
|
|
+ title: state.description.compiler[key]
|
|
|
+ },
|
|
|
+ m('input.mdc-switch__native-control', {
|
|
|
+ type: 'checkbox',
|
|
|
+ name: key,
|
|
|
+ checked: state.options[key],
|
|
|
+ onchange: events.compiler.options
|
|
|
+ }),
|
|
|
+ m('.mdc-switch__background', m('.mdc-switch__knob')),
|
|
|
+ m('span.mdc-switch-label', key)
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+
|
|
|
+ m('.col-xxl-4.col-xl-4.col-lg-6.col-md-6.col-sm-12',
|
|
|
+ m('h3', 'Content'),
|
|
|
+ m('.bs-callout m-content',
|
|
|
+ m('.scroll', Object.keys(state.content).map((key) =>
|
|
|
+ m('label.mdc-switch m-switch', {
|
|
|
+ onupdate: onupdate('content', key),
|
|
|
+ title: state.description.content[key]
|
|
|
+ },
|
|
|
+ m('input.mdc-switch__native-control', {
|
|
|
+ type: 'checkbox',
|
|
|
+ name: key,
|
|
|
+ checked: state.content[key],
|
|
|
+ onchange: events.content
|
|
|
+ }),
|
|
|
+ m('.mdc-switch__background', m('.mdc-switch__knob')),
|
|
|
+ m('span.mdc-switch-label', key)
|
|
|
+ ))
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ )
|
|
|
+
|
|
|
+ return {state, render, options}
|
|
|
+}
|
|
|
+
|
|
|
+if (document.querySelector('.is-popup')) {
|
|
|
+ var popup = Popup()
|
|
|
+ m.mount(document.querySelector('body'), {
|
|
|
+ view: (vnode) => popup.render()
|
|
|
+ })
|
|
|
+}
|
|
|
+else {
|
|
|
+ var settings = Settings()
|
|
|
+}
|