popup.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. var state = {
  2. compiler: '',
  3. options: {},
  4. content: {},
  5. theme: '',
  6. themes: [],
  7. raw: false,
  8. tab: '',
  9. tabs: ['theme', 'compiler', 'content'],
  10. compilers: {},
  11. description: {
  12. scroll: 'Remember scroll position',
  13. toc: 'Generate Table of Contents'
  14. }
  15. }
  16. var events = {
  17. tab: (e) => {
  18. state.tab = e.target.parentNode.hash.replace('#tab-', '')
  19. localStorage.setItem('tab', state.tab)
  20. },
  21. compiler: {
  22. name: (e) => {
  23. state.compiler = Object.keys(state.compilers)[e.target.selectedIndex]
  24. chrome.runtime.sendMessage({
  25. message: 'compiler.name',
  26. compiler: state.compiler
  27. }, () => {
  28. chrome.runtime.sendMessage({message: 'settings'}, init)
  29. })
  30. },
  31. options: (e) => {
  32. state.options[e.target.name] = !state.options[e.target.name]
  33. chrome.runtime.sendMessage({
  34. message: 'compiler.options',
  35. compiler: state.compiler,
  36. options: state.options
  37. })
  38. }
  39. },
  40. content: (e) => {
  41. state.content[e.target.name] = !state.content[e.target.name]
  42. chrome.runtime.sendMessage({
  43. message: 'content',
  44. content: state.content
  45. })
  46. },
  47. theme: (e) => {
  48. state.theme = state.themes[e.target.selectedIndex]
  49. chrome.runtime.sendMessage({
  50. message: 'theme',
  51. theme: state.theme
  52. })
  53. },
  54. raw: () => {
  55. state.raw = !state.raw
  56. chrome.runtime.sendMessage({
  57. message: 'raw',
  58. raw: state.raw
  59. })
  60. },
  61. defaults: () => {
  62. chrome.runtime.sendMessage({
  63. message: 'defaults'
  64. }, () => {
  65. chrome.runtime.sendMessage({message: 'settings'}, init)
  66. localStorage.removeItem('tab')
  67. })
  68. },
  69. advanced: () => {
  70. chrome.runtime.sendMessage({message: 'advanced'})
  71. }
  72. }
  73. function init (res) {
  74. state.compiler = res.compiler
  75. state.options = res.options
  76. state.content = res.content
  77. state.theme = res.theme
  78. state.themes = chrome.runtime.getManifest().web_accessible_resources
  79. .filter((file) => (file.indexOf('/themes/') === 0))
  80. .map((file) => (file.replace(/\/themes\/(.*)\.css/, '$1')))
  81. state.raw = res.raw
  82. state.tab = localStorage.getItem('tab') || 'theme'
  83. state.compilers = res.compilers
  84. m.redraw()
  85. }
  86. chrome.runtime.sendMessage({message: 'settings'}, init)
  87. function oncreate (vnode) {
  88. componentHandler.upgradeElements(vnode.dom)
  89. }
  90. var onupdate = (tab, key) => (vnode) => {
  91. var value = tab === 'compiler' ? state.options[key]
  92. : tab === 'content' ? state.content[key]
  93. : null
  94. if (vnode.dom.classList.contains('is-checked') !== value) {
  95. vnode.dom.classList.toggle('is-checked')
  96. }
  97. }
  98. m.mount(document.querySelector('body'), {
  99. view: (vnode) =>
  100. m('#popup',
  101. // defaults
  102. m('button.mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect',
  103. {oncreate, onclick: events.raw},
  104. (state.raw ? 'Html' : 'Markdown')),
  105. m('button.mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect',
  106. {oncreate, onclick: events.defaults},
  107. 'Defaults'),
  108. // tabs
  109. m('.mdl-tabs mdl-js-tabs mdl-js-ripple-effect', {oncreate},
  110. m('.mdl-tabs__tab-bar', {onclick: events.tab}, state.tabs.map((tab) =>
  111. m('a.mdl-tabs__tab', {
  112. href: '#tab-' + tab,
  113. class: state.tab === tab ? 'is-active' : undefined
  114. }, tab))
  115. ),
  116. // theme
  117. m('.mdl-tabs__panel #tab-theme', {class: state.tab === 'theme' ? 'is-active' : undefined},
  118. m('select.mdl-shadow--2dp', {onchange: events.theme}, state.themes.map((theme) =>
  119. m('option', {selected: state.theme === theme}, theme)
  120. ))
  121. ),
  122. // compiler
  123. m('.mdl-tabs__panel #tab-compiler', {class: state.tab === 'compiler' ? 'is-active' : undefined},
  124. m('select.mdl-shadow--2dp', {onchange: events.compiler.name}, Object.keys(state.compilers).map((name) =>
  125. m('option', {selected: state.compiler === name}, name)
  126. )),
  127. m('.scroll', {class: Object.keys(state.options).length > 8 ? 'max' : undefined},
  128. m('.mdl-grid', Object.keys(state.options || [])
  129. .filter((key) => typeof state.options[key] === 'boolean')
  130. .map((key) =>
  131. m('.mdl-cell',
  132. m('label.mdl-switch mdl-js-switch mdl-js-ripple-effect',
  133. {oncreate, onupdate: onupdate('compiler', key),
  134. title: state.compilers[state.compiler].description[key]},
  135. m('input[type="checkbox"].mdl-switch__input', {
  136. name: key,
  137. checked: state.options[key],
  138. onchange: events.compiler.options
  139. }),
  140. m('span.mdl-switch__label', key)
  141. )
  142. ))
  143. )
  144. )
  145. ),
  146. // content
  147. m('.mdl-tabs__panel #tab-content',
  148. {class: state.tab === 'content' ? 'is-active' : undefined},
  149. m('.scroll',
  150. m('.mdl-grid', Object.keys(state.content).map((key) =>
  151. m('.mdl-cell',
  152. m('label.mdl-switch mdl-js-switch mdl-js-ripple-effect',
  153. {oncreate, onupdate: onupdate('content', key), title: state.description[key]},
  154. m('input[type="checkbox"].mdl-switch__input', {
  155. name: key,
  156. checked: state.content[key],
  157. onchange: events.content
  158. }),
  159. m('span.mdl-switch__label', key)
  160. )
  161. )
  162. ))
  163. )
  164. )
  165. ),
  166. // advanced options
  167. m('button.mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect',
  168. {oncreate, onclick: events.advanced},
  169. 'Advanced Options')
  170. )
  171. })