Advertisement
Guest User

tab export.js

a guest
May 23rd, 2023
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 6.95 KB | Source Code | 0 0
  1. var
  2.   popupButtonSettings, popupCounter, popupTextarea, popupTextareaContainer, popupFilterTabs, popupFilterTabsContainer,
  3.   popupButtonCopy, popupButtonExport,
  4.   popupFormat, popupLabelFormatTitles, popupLabelFormatCustom, popupLimitWindow,
  5.   currentWindowId, os,
  6.   optionsIgnoreNonHTTP, optionsIgnorePinned, optionsFormatCustom, optionsFilterTabs, optionsCustomHeader
  7.  
  8. var defaultPopupStates = {
  9.   'states': {
  10.     format: false,
  11.     popupLimitWindow: false
  12.   }
  13. }
  14.  
  15. browser.runtime.getPlatformInfo(function (info) {
  16.   os = info.os
  17. })
  18.  
  19. browser.windows.getLastFocused(function (currentWindow) {
  20.   currentWindowId = currentWindow.id
  21. })
  22.  
  23. w.addEventListener('load', function () {
  24.   popupCounter = d.getElementsByClassName('popup-counter')[0]
  25.   popupFilterTabs = d.getElementsByClassName('popup-filter-tabs')[0]
  26.   popupFilterTabsContainer = d.getElementsByClassName('popup-filter-tabs-container')[0]
  27.   popupTextarea = d.getElementsByClassName('popup-textarea')[0]
  28.   popupTextareaContainer = d.getElementsByClassName('popup-textarea-container')[0]
  29.   popupFormat = d.getElementById('popup-format')
  30.   popupLabelFormatTitles = d.getElementsByClassName('popup-label-format-titles')[0]
  31.   popupLabelFormatCustom = d.getElementsByClassName('popup-label-format-custom')[0]
  32.   popupLimitWindow = d.getElementById('popup-limit-window')
  33.   popupButtonCopy = d.getElementsByClassName('popup-button-copy')[0]
  34.   popupButtonExport = d.getElementsByClassName('popup-button-export')[0]
  35.   popupButtonSettings = d.getElementsByClassName('popup-button-settings')[0]
  36.  
  37.   setLimitWindowVisibility()
  38.  
  39.   popupFormat.addEventListener('change', function () {
  40.     savePopupStates()
  41.     updatePopup()
  42.   })
  43.  
  44.   popupButtonSettings.addEventListener('click', function () {
  45.     browser.runtime.openOptionsPage()
  46.   })
  47.  
  48.   popupLimitWindow.addEventListener('change', function () {
  49.     savePopupStates()
  50.     updatePopup()
  51.   })
  52.  
  53.   popupFilterTabs.addEventListener('input', function () {
  54.     updatePopup()
  55.   })
  56.  
  57.   popupButtonCopy.addEventListener('click', function () {
  58.     copyToClipboard()
  59.   })
  60.  
  61.   popupButtonExport.addEventListener('click', function () {
  62.     download()
  63.   })
  64.  
  65.   getOptions()
  66.   restorePopupStates()
  67.  
  68.   localization()
  69. })
  70.  
  71. function updatePopup () {
  72.   browser.tabs.query(
  73.     {},
  74.     function (tabs) {
  75.       var list = ''
  76.       var header = ''
  77.       var format = '{url}\r\n'
  78.       var actualNbTabs = 0
  79.       var totalNbTabs = tabs.length
  80.       var nbFilterMatch = 0
  81.       var userInput = popupFilterTabs.value
  82.  
  83.       if (popupFormat.checked) format = '{title}\r\n{url}\r\n\r\n'
  84.  
  85.       if (optionsFormatCustom) {
  86.         popupLabelFormatTitles.classList.add('hidden')
  87.         popupLabelFormatCustom.classList.remove('hidden')
  88.  
  89.         if (popupFormat.checked) format = optionsFormatCustom.replace(/\\n/g, '\n').replace(/\\r/g, '\r')
  90.       }
  91.  
  92.       if (optionsFilterTabs) popupFilterTabsContainer.classList.remove('hidden')
  93.  
  94.       for (var i = 0; i < totalNbTabs; i++) {
  95.         var tabWindowId = tabs[i].windowId
  96.         var tabPinned = tabs[i].pinned
  97.         var tabURL = tabs[i].url
  98.         var tabTitle = tabs[i].title
  99.  
  100.         if (optionsIgnorePinned && tabPinned) continue
  101.         if (popupLimitWindow.checked && tabWindowId !== currentWindowId) continue
  102.  
  103.         if ((optionsIgnoreNonHTTP && tabURL.startsWith('http')) || !optionsIgnoreNonHTTP) {
  104.           actualNbTabs += 1
  105.  
  106.           if (filterMatch(userInput, [tabTitle, tabURL]) || userInput === '') {
  107.             nbFilterMatch += 1
  108.  
  109.             if (/<\/?[a-zA-Z]+\/?>/.test(format)) tabTitle = tabTitle.replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;')
  110.  
  111.             list += format.replace(/{title}/g, tabTitle).replace(/{url}/g, tabURL).replace(/{window-id}/g, tabWindowId)
  112.           }
  113.         }
  114.       }
  115.  
  116.       popupTextarea.value = ''
  117.  
  118.       if (optionsCustomHeader) {
  119.         var nbTabs = (userInput !== '') ? nbFilterMatch : actualNbTabs
  120.  
  121.         header = optionsCustomHeader.replace(/\\n/g, '\n').replace(/\\r/g, '\r').replace(/{num-tabs}/g, nbTabs)
  122.  
  123.         popupTextarea.value += header + '\r\n\r\n'
  124.       }
  125.  
  126.       popupTextarea.value += list
  127.       popupCounter.textContent = (userInput !== '') ? nbFilterMatch + ' / ' + actualNbTabs : actualNbTabs
  128.  
  129.       setSeparatorStyle()
  130.       popupFilterTabs.focus()
  131.     }
  132.   )
  133. }
  134.  
  135. function filterMatch (needle, haystack) {
  136.   var regex = new RegExp(needle, 'i')
  137.   var match = false
  138.  
  139.   haystack.forEach(function (element) {
  140.     if (regex.test(element)) match = true
  141.   })
  142.  
  143.   return match
  144. }
  145.  
  146. function setSeparatorStyle () {
  147.   if (hasScrollbar(popupTextarea)) {
  148.     popupTextareaContainer.classList.add('has-scrollbar')
  149.   } else {
  150.     popupTextareaContainer.classList.remove('has-scrollbar')
  151.   }
  152. }
  153.  
  154. function setLimitWindowVisibility () {
  155.   let getting = browser.windows.getAll()
  156.  
  157.   getting.then(function (windowInfoArray) {
  158.     if (windowInfoArray.length > 1) {
  159.       popupLimitWindow.parentNode.classList.remove('hidden')
  160.     }
  161.   })
  162. }
  163.  
  164. function copyToClipboard () {
  165.   if (popupButtonCopy.classList.contains('disabled')) return
  166.  
  167.   popupTextarea.select()
  168.  
  169.   var message = d.execCommand('copy') ? 'copiedToClipboard' : 'notCopiedToClipboard'
  170.  
  171.   browser.notifications.create('ExportTabsURLs', {
  172.     'type': 'basic',
  173.     'title': browser.i18n.getMessage('appName'),
  174.     'iconUrl': '../img/icon.svg',
  175.     'message': browser.i18n.getMessage(message)
  176.   })
  177.  
  178.   popupButtonCopy.classList.add('disabled')
  179.  
  180.   setTimeout(function () {
  181.     browser.notifications.clear('ExportTabsURLs')
  182.     popupButtonCopy.classList.remove('disabled')
  183.   }, 3000)
  184. }
  185.  
  186. function download () {
  187.   var list = popupTextarea.value
  188.  
  189.   // fix inconsistent behaviour on Windows, see https://github.com/alct/export-tabs-urls/issues/2
  190.   if (os === 'win') list = list.replace(/\r?\n/g, '\r\n')
  191.  
  192.   var element = d.createElement('a')
  193.   element.href = 'data:text/plain;charset=utf-8,' + encodeURIComponent(list)
  194.   element.download = moment().format('YYYYMMDDTHHmmssZZ') + '_ExportTabsURLs.txt'
  195.   element.style.display = 'none'
  196.  
  197.   d.body.appendChild(element)
  198.   element.click()
  199.   d.body.removeChild(element)
  200. }
  201.  
  202. function restorePopupStates () {
  203.   let gettingItem = browser.storage.local.get(defaultPopupStates)
  204.  
  205.   gettingItem.then(function (items) {
  206.     popupLimitWindow.checked = items.states.popupLimitWindow
  207.     popupFormat.checked = items.states.format
  208.  
  209.     updatePopup()
  210.   })
  211. }
  212.  
  213. function savePopupStates () {
  214.   browser.storage.local.set({
  215.     'states': {
  216.       format: popupFormat.checked,
  217.       popupLimitWindow: popupLimitWindow.checked
  218.     }
  219.   })
  220. }
  221.  
  222. function getOptions () {
  223.   let gettingItem = browser.storage.local.get(defaultOptions)
  224.  
  225.   gettingItem.then(function (items) {
  226.     optionsIgnoreNonHTTP = items.options.ignoreNonHTTP
  227.     optionsIgnorePinned = items.options.ignorePinned
  228.     optionsFormatCustom = items.options.formatCustom
  229.     optionsFilterTabs = items.options.filterTabs
  230.     optionsCustomHeader = items.options.customHeader
  231.   })
  232. }
  233.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement