messages.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. md.messages = ({storage: {defaults, state, set}, compilers, mathjax, xhr, webrequest, icon}) => {
  2. return (req, sender, sendResponse) => {
  3. // content
  4. if (req.message === 'markdown') {
  5. var markdown = req.markdown
  6. if (state.content.mathjax) {
  7. var jax = mathjax()
  8. markdown = jax.tokenize(markdown)
  9. }
  10. var html = compilers[state.compiler].compile(markdown)
  11. if (state.content.mathjax) {
  12. html = jax.detokenize(html)
  13. }
  14. sendResponse({message: 'html', html})
  15. }
  16. else if (req.message === 'autoreload') {
  17. xhr.get(req.location, (err, body) => {
  18. sendResponse({err, body})
  19. })
  20. }
  21. else if (req.message === 'prism') {
  22. chrome.scripting.executeScript({
  23. target: {tabId: sender.tab.id},
  24. files: [
  25. `/vendor/prism/prism-${req.language}.min.js`,
  26. ],
  27. injectImmediately: true
  28. }, sendResponse)
  29. }
  30. else if (req.message === 'mathjax') {
  31. chrome.scripting.executeScript({
  32. target: {tabId: sender.tab.id},
  33. files: [
  34. `/vendor/mathjax/extensions/${req.extension}.js`,
  35. ],
  36. injectImmediately: true
  37. }, sendResponse)
  38. }
  39. // popup
  40. else if (req.message === 'popup') {
  41. sendResponse(Object.assign({}, state, {
  42. options: state[state.compiler],
  43. description: compilers[state.compiler].description,
  44. compilers: Object.keys(compilers),
  45. themes: state.themes,
  46. settings: {theme: state.settings.theme}
  47. }))
  48. }
  49. else if (req.message === 'popup.theme') {
  50. set({theme: req.theme})
  51. notifyContent({message: 'theme', theme: req.theme})
  52. sendResponse()
  53. }
  54. else if (req.message === 'popup.raw') {
  55. set({raw: req.raw})
  56. notifyContent({message: 'raw', raw: req.raw})
  57. sendResponse()
  58. }
  59. else if (req.message === 'popup.themes') {
  60. set({themes: req.themes})
  61. notifyContent({message: 'themes', themes: req.themes})
  62. sendResponse()
  63. }
  64. else if (req.message === 'popup.defaults') {
  65. var options = Object.assign({}, defaults)
  66. options.origins = state.origins
  67. set(options)
  68. notifyContent({message: 'reload'})
  69. sendResponse()
  70. }
  71. else if (req.message === 'popup.compiler.name') {
  72. set({compiler: req.compiler})
  73. notifyContent({message: 'reload'})
  74. sendResponse()
  75. }
  76. else if (req.message === 'popup.compiler.options') {
  77. set({[req.compiler]: req.options})
  78. notifyContent({message: 'reload'})
  79. sendResponse()
  80. }
  81. else if (req.message === 'popup.content') {
  82. set({content: req.content})
  83. notifyContent({message: 'reload'})
  84. webrequest()
  85. sendResponse()
  86. }
  87. else if (req.message === 'popup.advanced') {
  88. // ff: opens up about:addons with openOptionsPage
  89. if (/Firefox/.test(navigator.userAgent)) {
  90. chrome.management.getSelf((extension) => {
  91. chrome.tabs.create({url: extension.optionsUrl})
  92. })
  93. }
  94. else {
  95. chrome.runtime.openOptionsPage()
  96. }
  97. sendResponse()
  98. }
  99. // origins view
  100. else if (req.message === 'options.origins') {
  101. sendResponse({
  102. origins: state.origins,
  103. match: state.match,
  104. })
  105. }
  106. // origins options
  107. else if (req.message === 'origin.add') {
  108. state.origins[req.origin] = {
  109. header: true,
  110. path: true,
  111. match: defaults.match,
  112. }
  113. set({origins: state.origins})
  114. sendResponse()
  115. }
  116. else if (req.message === 'origin.remove') {
  117. delete state.origins[req.origin]
  118. set({origins: state.origins})
  119. webrequest()
  120. sendResponse()
  121. }
  122. else if (req.message === 'origin.update') {
  123. state.origins[req.origin] = req.options
  124. set({origins: state.origins})
  125. webrequest()
  126. sendResponse()
  127. }
  128. // settings view
  129. else if (req.message === 'options.settings') {
  130. sendResponse(state.settings)
  131. }
  132. // settings options
  133. else if (req.message === 'options.icon') {
  134. set({settings: req.settings})
  135. icon()
  136. sendResponse()
  137. }
  138. else if (req.message === 'options.theme') {
  139. set({settings: req.settings})
  140. sendResponse()
  141. }
  142. return true
  143. }
  144. function notifyContent (req, res) {
  145. chrome.tabs.query({active: true, currentWindow: true}, (tabs) => {
  146. chrome.tabs.sendMessage(tabs[0].id, req, res)
  147. })
  148. }
  149. }