background.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /* https://stackoverflow.com/a/71604665 */
  2. const imageUrlToBase64 = async url => {
  3. const response = await fetch(url);
  4. const blob = await response.blob();
  5. return new Promise((onSuccess, onError) => {
  6. try {
  7. const reader = new FileReader() ;
  8. reader.onload = function(){ onSuccess(this.result) } ;
  9. reader.readAsDataURL(blob) ;
  10. } catch(e) {
  11. onError(e);
  12. }
  13. });
  14. };
  15. /* https://stackoverflow.com/a/48032528 */
  16. async function replaceAsync(str, regex, asyncFn) {
  17. const promises = [];
  18. str.replace(regex, (match, ...args) => {
  19. const promise = asyncFn(match, ...args);
  20. promises.push(promise);
  21. });
  22. const data = await Promise.all(promises);
  23. return str.replace(regex, () => data.shift());
  24. }
  25. browser.browserAction.onClicked.addListener(async (tab) => {
  26. try {
  27. const result = await browser.tabs.executeScript(tab.id, {
  28. file: "/Readability.js"
  29. });
  30. const articleHtml = result[0]["body"];
  31. const pageUrl = result[0]["url"];
  32. const baseUrl = result[0]["baseurl"];
  33. //console.log("Obtained result: ", baseUrl, articleHtml);
  34. // Replace all URLs with data-urls
  35. const srcRegexp = /src="(https?:\/\/.+?)"/g;
  36. const inlinedImageHtml = await replaceAsync(articleHtml, srcRegexp, async function(match, src) {
  37. let absoluteUrl;
  38. if (src.startsWith('http://') || src.startsWith('https://')) {
  39. absoluteUrl = src;
  40. } else {
  41. absoluteUrl = baseUrl + "/" + src;
  42. }
  43. const dataUrl = await imageUrlToBase64(absoluteUrl);
  44. return "src=\"" + dataUrl + "\"";
  45. });
  46. console.log("All matching done", inlinedImageHtml)
  47. const url = (await browser.storage.local.get("koreaderurl")).koreaderurl;
  48. console.log("posting to " + url);
  49. try {
  50. await fetch(url, {
  51. method: 'POST',
  52. body: inlinedImageHtml
  53. });
  54. } catch(error) {
  55. throw 'KOReader server unreachable, check connection and URL in settings';
  56. }
  57. } catch(err) {
  58. browser.notifications.create({
  59. 'type': 'basic',
  60. 'message': 'Could not post article to KOReader: ' + err,
  61. 'title': 'Firefox2KOReader'
  62. });
  63. }
  64. })
  65. //browser.tabs.onCreated.addListener(() => {
  66. // browser.browserAction.disable()
  67. //})
  68. //browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
  69. // console.log("Tab updated!", tab)
  70. // if (tab.isInReaderMode) {
  71. // browser.browserAction.enable()
  72. // } else {
  73. // browser.browserAction.disable()
  74. // }
  75. //
  76. //})