popup.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. var state = {
  2. compiler: {},
  3. content: {},
  4. themes: [],
  5. theme: '',
  6. raw: false,
  7. tab: localStorage.getItem('tab') || 'compiler'
  8. }
  9. var events = {
  10. changeTab: (e) => {
  11. state.tab = e.target.parentNode.hash.replace('#tab-', '')
  12. localStorage.setItem('tab', state.tab)
  13. },
  14. changeCompiler: (e) => {
  15. state.compiler[e.target.name] = !state.compiler[e.target.name]
  16. chrome.runtime.sendMessage({
  17. message: 'compiler',
  18. compiler: state.compiler
  19. })
  20. },
  21. changeTheme: (e) => {
  22. state.theme = state.themes[e.target.selectedIndex]
  23. chrome.runtime.sendMessage({
  24. message: 'theme',
  25. theme: state.theme
  26. })
  27. },
  28. viewRaw: () => {
  29. state.raw = !state.raw
  30. chrome.runtime.sendMessage({
  31. message: 'raw',
  32. raw: state.raw,
  33. theme: state.theme
  34. })
  35. },
  36. setDefaults: () => {
  37. chrome.runtime.sendMessage({
  38. message: 'defaults'
  39. }, (res) => {
  40. chrome.runtime.sendMessage({message: 'settings'}, init)
  41. })
  42. },
  43. advancedOptions: () => {
  44. chrome.runtime.sendMessage({message: 'advanced'})
  45. }
  46. }
  47. var description = {
  48. compiler: {
  49. gfm: 'Enable GFM\n(GitHub Flavored Markdown)',
  50. tables: 'Enable GFM tables\n(requires the gfm option to be true)',
  51. breaks: 'Enable GFM line breaks\n(requires the gfm option to be true)',
  52. pedantic: 'Don\'t fix any of the original markdown\nbugs or poor behavior',
  53. sanitize: 'Ignore any HTML\nthat has been input',
  54. smartLists: 'Use smarter list behavior\nthan the original markdown',
  55. smartypants: 'Use "smart" typograhic punctuation\nfor things like quotes and dashes'
  56. },
  57. content: {
  58. scroll: 'Remember scroll position',
  59. toc: 'Generate Table of Contents'
  60. }
  61. }
  62. function init (res) {
  63. state.compiler = res.compiler
  64. state.content = res.content
  65. state.theme = res.theme
  66. state.themes = chrome.runtime.getManifest().web_accessible_resources
  67. .filter((file) => (file.indexOf('/themes/') === 0))
  68. .map((file) => (file.replace(/\/themes\/(.*)\.css/, '$1')))
  69. state.raw = res.raw
  70. m.redraw()
  71. }
  72. function oncreate (vnode) {
  73. componentHandler.upgradeElements(vnode.dom)
  74. }
  75. var onupdate = (key) => (vnode) => {
  76. if (vnode.dom.classList.contains('is-checked') !== state.compiler[key]) {
  77. vnode.dom.classList.toggle('is-checked')
  78. }
  79. }
  80. chrome.runtime.sendMessage({message: 'settings'}, init)
  81. m.mount(document.querySelector('body'), {
  82. view: (vnode) =>
  83. m('#popup', [
  84. m('button.mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect',
  85. {oncreate, onclick: events.viewRaw},
  86. (state.raw ? 'Html' : 'Markdown')),
  87. m('button.mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect',
  88. {oncreate, onclick: events.setDefaults},
  89. 'Defaults'),
  90. m('.mdl-tabs mdl-js-tabs mdl-js-ripple-effect', {oncreate},
  91. m('.mdl-tabs__tab-bar',
  92. m('a.mdl-tabs__tab', {href: '#tab-theme', class: 'is-active'}, 'Theme')
  93. ),
  94. m('.mdl-tabs__panel #tab-theme', {class: 'is-active'},
  95. m('select.mdl-shadow--2dp', {onchange: events.changeTheme}, state.themes.map((theme) =>
  96. m('option', {selected: state.theme === theme}, theme)
  97. ))
  98. )
  99. ),
  100. m('.mdl-tabs mdl-js-tabs mdl-js-ripple-effect', {oncreate},
  101. m('.mdl-tabs__tab-bar', {onclick: events.changeTab},
  102. m('a.mdl-tabs__tab', {href: '#tab-compiler',
  103. class: state.tab === 'compiler' ? 'is-active' : null}, 'Compiler'),
  104. m('a.mdl-tabs__tab', {href: '#tab-content',
  105. class: state.tab === 'content' ? 'is-active' : null}, 'Content')
  106. ),
  107. m('.mdl-tabs__panel #tab-compiler',
  108. {class: state.tab === 'compiler' ? 'is-active' : null},
  109. m('.mdl-grid', Object.keys(state.compiler).map((key) =>
  110. m('.mdl-cell',
  111. m('label.mdl-switch mdl-js-switch mdl-js-ripple-effect',
  112. {oncreate, onupdate: onupdate(key), title: description.compiler[key]}, [
  113. m('input[type="checkbox"].mdl-switch__input', {
  114. name: key,
  115. checked: state.compiler[key],
  116. onchange: events.changeCompiler
  117. }),
  118. m('span.mdl-switch__label', key)
  119. ])
  120. )
  121. ))
  122. ),
  123. m('.mdl-tabs__panel #tab-content',
  124. {class: state.tab === 'content' ? 'is-active' : null},
  125. m('.mdl-grid', Object.keys(state.content).map((key) =>
  126. m('.mdl-cell',
  127. m('label.mdl-switch mdl-js-switch mdl-js-ripple-effect',
  128. {oncreate, onupdate: onupdate(key), title: description.content[key]}, [
  129. m('input[type="checkbox"].mdl-switch__input', {
  130. name: key,
  131. checked: state.content[key],
  132. onchange: events.changeContent
  133. }),
  134. m('span.mdl-switch__label', key)
  135. ])
  136. )
  137. ))
  138. )
  139. ),
  140. m('button.mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect',
  141. {oncreate, onclick: events.advancedOptions},
  142. 'Advanced Options')
  143. ])
  144. })