messages.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. md.messages = ({storage: {defaults, state, set}, compilers, mathjax, webrequest}) => {
  2. return (req, sender, sendResponse) => {
  3. if (req.message === 'markdown') {
  4. var markdown = req.markdown
  5. if (state.content.mathjax) {
  6. var jax = mathjax()
  7. markdown = jax.tokenize(markdown)
  8. }
  9. var html = compilers[state.compiler].compile(markdown)
  10. if (state.content.mathjax) {
  11. html = jax.detokenize(html)
  12. }
  13. sendResponse({message: 'html', html})
  14. }
  15. // popup
  16. else if (req.message === 'popup') {
  17. sendResponse(Object.assign({}, state, {
  18. options: state[state.compiler],
  19. description: compilers[state.compiler].description,
  20. compilers: Object.keys(compilers),
  21. themes: state.themes,
  22. }))
  23. }
  24. else if (req.message === 'popup.theme') {
  25. set({theme: req.theme})
  26. notifyContent({message: 'theme', theme: req.theme})
  27. sendResponse()
  28. }
  29. else if (req.message === 'popup.raw') {
  30. set({raw: req.raw})
  31. notifyContent({message: 'raw', raw: req.raw})
  32. sendResponse()
  33. }
  34. else if (req.message === 'popup.defaults') {
  35. var options = Object.assign({}, defaults)
  36. options.origins = state.origins
  37. set(options)
  38. notifyContent({message: 'reload'})
  39. sendResponse()
  40. }
  41. else if (req.message === 'popup.compiler.name') {
  42. set({compiler: req.compiler})
  43. notifyContent({message: 'reload'})
  44. sendResponse()
  45. }
  46. else if (req.message === 'popup.compiler.options') {
  47. set({[req.compiler]: req.options})
  48. notifyContent({message: 'reload'})
  49. sendResponse()
  50. }
  51. else if (req.message === 'popup.content') {
  52. set({content: req.content})
  53. notifyContent({message: 'reload'})
  54. webrequest()
  55. sendResponse()
  56. }
  57. else if (req.message === 'popup.advanced') {
  58. // ff: opens up about:addons with openOptionsPage
  59. if (/Firefox/.test(navigator.userAgent)) {
  60. chrome.management.getSelf((extension) => {
  61. chrome.tabs.create({url: extension.optionsUrl})
  62. })
  63. }
  64. else {
  65. chrome.runtime.openOptionsPage()
  66. }
  67. sendResponse()
  68. }
  69. // options
  70. else if (req.message === 'options.origins') {
  71. sendResponse({
  72. origins: state.origins,
  73. header: state.header,
  74. match: state.match,
  75. })
  76. }
  77. else if (req.message === 'options.themes') {
  78. sendResponse({
  79. themes: state.themes,
  80. })
  81. }
  82. else if (req.message === 'options.header') {
  83. set({header: req.header})
  84. sendResponse()
  85. }
  86. // origins
  87. else if (req.message === 'origin.add') {
  88. state.origins[req.origin] = {
  89. match: defaults.match,
  90. csp: false,
  91. encoding: '',
  92. }
  93. set({origins: state.origins})
  94. sendResponse()
  95. }
  96. else if (req.message === 'origin.remove') {
  97. delete state.origins[req.origin]
  98. set({origins: state.origins})
  99. webrequest()
  100. sendResponse()
  101. }
  102. else if (req.message === 'origin.update') {
  103. state.origins[req.origin] = req.options
  104. set({origins: state.origins})
  105. webrequest()
  106. sendResponse()
  107. }
  108. // themes
  109. else if (req.message === 'themes') {
  110. set({themes: req.themes})
  111. ;(() => {
  112. var defaults = chrome.runtime.getManifest().web_accessible_resources
  113. .filter((file) => file.indexOf('/themes/') === 0)
  114. .map((file) => file.replace(/\/themes\/(.*)\.css/, '$1'))
  115. var custom = state.themes.map(({name}) => name)
  116. var all = custom.concat(defaults)
  117. if (!all.includes(state.theme.name)) {
  118. var theme = {
  119. name: 'github',
  120. url: chrome.runtime.getURL('/themes/github.css')
  121. }
  122. set({theme})
  123. }
  124. else if (custom.includes(state.theme.name)) {
  125. var theme = state.themes.find(({name}) => state.theme.name === name)
  126. set({theme})
  127. }
  128. })()
  129. sendResponse()
  130. }
  131. }
  132. function notifyContent (req, res) {
  133. chrome.tabs.query({active: true, currentWindow: true}, (tabs) => {
  134. chrome.tabs.sendMessage(tabs[0].id, req, res)
  135. })
  136. }
  137. }