Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var
- popupButtonSettings, popupCounter, popupTextarea, popupTextareaContainer, popupFilterTabs, popupFilterTabsContainer,
- popupButtonCopy, popupButtonExport,
- popupFormat, popupLabelFormatTitles, popupLabelFormatCustom, popupLimitWindow,
- currentWindowId, os,
- optionsIgnoreNonHTTP, optionsIgnorePinned, optionsFormatCustom, optionsFilterTabs, optionsCustomHeader
- var defaultPopupStates = {
- 'states': {
- format: false,
- popupLimitWindow: false
- }
- }
- browser.runtime.getPlatformInfo(function (info) {
- os = info.os
- })
- browser.windows.getLastFocused(function (currentWindow) {
- currentWindowId = currentWindow.id
- })
- w.addEventListener('load', function () {
- popupCounter = d.getElementsByClassName('popup-counter')[0]
- popupFilterTabs = d.getElementsByClassName('popup-filter-tabs')[0]
- popupFilterTabsContainer = d.getElementsByClassName('popup-filter-tabs-container')[0]
- popupTextarea = d.getElementsByClassName('popup-textarea')[0]
- popupTextareaContainer = d.getElementsByClassName('popup-textarea-container')[0]
- popupFormat = d.getElementById('popup-format')
- popupLabelFormatTitles = d.getElementsByClassName('popup-label-format-titles')[0]
- popupLabelFormatCustom = d.getElementsByClassName('popup-label-format-custom')[0]
- popupLimitWindow = d.getElementById('popup-limit-window')
- popupButtonCopy = d.getElementsByClassName('popup-button-copy')[0]
- popupButtonExport = d.getElementsByClassName('popup-button-export')[0]
- popupButtonSettings = d.getElementsByClassName('popup-button-settings')[0]
- setLimitWindowVisibility()
- popupFormat.addEventListener('change', function () {
- savePopupStates()
- updatePopup()
- })
- popupButtonSettings.addEventListener('click', function () {
- browser.runtime.openOptionsPage()
- })
- popupLimitWindow.addEventListener('change', function () {
- savePopupStates()
- updatePopup()
- })
- popupFilterTabs.addEventListener('input', function () {
- updatePopup()
- })
- popupButtonCopy.addEventListener('click', function () {
- copyToClipboard()
- })
- popupButtonExport.addEventListener('click', function () {
- download()
- })
- getOptions()
- restorePopupStates()
- localization()
- })
- function updatePopup () {
- browser.tabs.query(
- {},
- function (tabs) {
- var list = ''
- var header = ''
- var format = '{url}\r\n'
- var actualNbTabs = 0
- var totalNbTabs = tabs.length
- var nbFilterMatch = 0
- var userInput = popupFilterTabs.value
- if (popupFormat.checked) format = '{title}\r\n{url}\r\n\r\n'
- if (optionsFormatCustom) {
- popupLabelFormatTitles.classList.add('hidden')
- popupLabelFormatCustom.classList.remove('hidden')
- if (popupFormat.checked) format = optionsFormatCustom.replace(/\\n/g, '\n').replace(/\\r/g, '\r')
- }
- if (optionsFilterTabs) popupFilterTabsContainer.classList.remove('hidden')
- for (var i = 0; i < totalNbTabs; i++) {
- var tabWindowId = tabs[i].windowId
- var tabPinned = tabs[i].pinned
- var tabURL = tabs[i].url
- var tabTitle = tabs[i].title
- if (optionsIgnorePinned && tabPinned) continue
- if (popupLimitWindow.checked && tabWindowId !== currentWindowId) continue
- if ((optionsIgnoreNonHTTP && tabURL.startsWith('http')) || !optionsIgnoreNonHTTP) {
- actualNbTabs += 1
- if (filterMatch(userInput, [tabTitle, tabURL]) || userInput === '') {
- nbFilterMatch += 1
- if (/<\/?[a-zA-Z]+\/?>/.test(format)) tabTitle = tabTitle.replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"')
- list += format.replace(/{title}/g, tabTitle).replace(/{url}/g, tabURL).replace(/{window-id}/g, tabWindowId)
- }
- }
- }
- popupTextarea.value = ''
- if (optionsCustomHeader) {
- var nbTabs = (userInput !== '') ? nbFilterMatch : actualNbTabs
- header = optionsCustomHeader.replace(/\\n/g, '\n').replace(/\\r/g, '\r').replace(/{num-tabs}/g, nbTabs)
- popupTextarea.value += header + '\r\n\r\n'
- }
- popupTextarea.value += list
- popupCounter.textContent = (userInput !== '') ? nbFilterMatch + ' / ' + actualNbTabs : actualNbTabs
- setSeparatorStyle()
- popupFilterTabs.focus()
- }
- )
- }
- function filterMatch (needle, haystack) {
- var regex = new RegExp(needle, 'i')
- var match = false
- haystack.forEach(function (element) {
- if (regex.test(element)) match = true
- })
- return match
- }
- function setSeparatorStyle () {
- if (hasScrollbar(popupTextarea)) {
- popupTextareaContainer.classList.add('has-scrollbar')
- } else {
- popupTextareaContainer.classList.remove('has-scrollbar')
- }
- }
- function setLimitWindowVisibility () {
- let getting = browser.windows.getAll()
- getting.then(function (windowInfoArray) {
- if (windowInfoArray.length > 1) {
- popupLimitWindow.parentNode.classList.remove('hidden')
- }
- })
- }
- function copyToClipboard () {
- if (popupButtonCopy.classList.contains('disabled')) return
- popupTextarea.select()
- var message = d.execCommand('copy') ? 'copiedToClipboard' : 'notCopiedToClipboard'
- browser.notifications.create('ExportTabsURLs', {
- 'type': 'basic',
- 'title': browser.i18n.getMessage('appName'),
- 'iconUrl': '../img/icon.svg',
- 'message': browser.i18n.getMessage(message)
- })
- popupButtonCopy.classList.add('disabled')
- setTimeout(function () {
- browser.notifications.clear('ExportTabsURLs')
- popupButtonCopy.classList.remove('disabled')
- }, 3000)
- }
- function download () {
- var list = popupTextarea.value
- // fix inconsistent behaviour on Windows, see https://github.com/alct/export-tabs-urls/issues/2
- if (os === 'win') list = list.replace(/\r?\n/g, '\r\n')
- var element = d.createElement('a')
- element.href = 'data:text/plain;charset=utf-8,' + encodeURIComponent(list)
- element.download = moment().format('YYYYMMDDTHHmmssZZ') + '_ExportTabsURLs.txt'
- element.style.display = 'none'
- d.body.appendChild(element)
- element.click()
- d.body.removeChild(element)
- }
- function restorePopupStates () {
- let gettingItem = browser.storage.local.get(defaultPopupStates)
- gettingItem.then(function (items) {
- popupLimitWindow.checked = items.states.popupLimitWindow
- popupFormat.checked = items.states.format
- updatePopup()
- })
- }
- function savePopupStates () {
- browser.storage.local.set({
- 'states': {
- format: popupFormat.checked,
- popupLimitWindow: popupLimitWindow.checked
- }
- })
- }
- function getOptions () {
- let gettingItem = browser.storage.local.get(defaultOptions)
- gettingItem.then(function (items) {
- optionsIgnoreNonHTTP = items.options.ignoreNonHTTP
- optionsIgnorePinned = items.options.ignorePinned
- optionsFormatCustom = items.options.formatCustom
- optionsFilterTabs = items.options.filterTabs
- optionsCustomHeader = items.options.customHeader
- })
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement