popup.js 5.2 KB

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