From dfa6e5a0f181a345169d45563b0012ef6498efd0 Mon Sep 17 00:00:00 2001 From: Rich Roth Date: Fri, 29 May 2020 14:55:59 +0200 Subject: [PATCH 1/4] Patch for TB 68 I made a hacked version (notes below) you can find at: http://www.tnrglobal.com/2020/05/thunderbird-addons/ Hack issues: 1) It does require TB restart although it doesn't report that. 2) I've mainly used search and Ctl-Shift FIELD for searching, SO please try your favorite options and let me know if it works. 3) I don't have access to add better update info 4) FYI, This is a legacy mode extension I call it hacked because I not a extension pro, even if I am a Kernel level professional programmer. good luck. It is not in any way compromised as many use hacked to mean. If I get github access I will make a branch for this. fixes #80 --- bootstrap.js | 11 +- content/es.js | 105 +++++++++-------- content/help.html | 25 ++-- locale/de-DE/ExpressionSearch.dtd | 116 +++++++++--------- locale/de-DE/ExpressionSearch.properties | 144 +++++++++++------------ manifest.json | 6 +- 6 files changed, 211 insertions(+), 196 deletions(-) diff --git a/bootstrap.js b/bootstrap.js index 9d427a7..3f0a795 100644 --- a/bootstrap.js +++ b/bootstrap.js @@ -14,11 +14,14 @@ function loadIntoWindow(window) { if ( !window ) return; // windows is the global host context let document = window.document; // XULDocument let type = document.documentElement.getAttribute('windowtype'); // documentElement maybe 'messengerWindow' / 'addressbookWindow' + if ( targetWindows.indexOf(type) < 0 ) return; + + Services.console.logStringMessage("Expression Search: loading ExpressionSearchChrome"); ExpressionSearchChrome.init(); // will and add my filter, and TB want the domID exists when filter registered, so only called when have window ready ExpressionSearchChrome.Load(window); } - + var windowListener = { onOpenWindow: function(aWindow) { let onLoadWindow = function() { @@ -53,15 +56,15 @@ function startup(aData, aReason) { // validator warnings on the below line, ignore it if ( !sss.sheetRegistered(userCSS, sss.USER_SHEET) ) sss.loadAndRegisterSheet(userCSS, sss.USER_SHEET); // will be unregister when shutdown } - + function shutdown(aData, aReason) { // When the application is shutting down we normally don't have to clean up any UI changes made - if (aReason == APP_SHUTDOWN) return; + //** if (aReason == APP_SHUTDOWN) return; try { if ( sss.sheetRegistered(userCSS, sss.USER_SHEET) ) sss.unregisterSheet(userCSS, sss.USER_SHEET); } catch (err) {Cu.reportError(err);} - + try { Services.obs.removeObserver(windowListener, observeEvent); // Unload from any existing windows diff --git a/content/es.js b/content/es.js index 654e1fc..9e34121 100644 --- a/content/es.js +++ b/content/es.js @@ -22,45 +22,55 @@ var ExpressionSearchChrome = { isEnter: 0, hookedGlobalFunctions: [], three_panes: [], // 3pane windows - + needMoveId: "quick-filter-bar-main-bar", originalFilterId: "qfb-qs-textbox", textBoxDomId: "expression-search-textbox", strBundle: Services.strings.createBundle('chrome://expressionsearch/locale/ExpressionSearch.properties'), - + prefs: null, // preference object options: {}, // preference strings loaded: 0, init: function() { Cu.import("chrome://expressionsearch/content/log.js"); // load log first + //ChomeUtils.import("chrome://expressionsearch/content/log.js"); // load log first if ( this.loaded ) { + + try { + ExpressionSearchLog.log("Expression Search: init...1", false, true); + this.importModules(); + this.initPerf(); + } catch (err) { + ExpressionSearchLog.logException(err); + } + if ( !this.prefs && ExpressionSearchLog ) { - ExpressionSearchLog.log("Expression Search is NOT restartless! Please restart Thunderbird!", 1); + ExpressionSearchLog.log("Expression Search is now restartless!", 1); } else return; } this.loaded = 1; try { - ExpressionSearchLog.log("Expression Search: init...", false, true); + ExpressionSearchLog.log("Expression Search: init...2", false, true); this.importModules(); this.initPerf(); } catch (err) { ExpressionSearchLog.logException(err); } }, - + importModules: function() { /* https://bugzilla.mozilla.org/show_bug.cgi?id=1383215#c24 There are two ways that we currently support packaging omnijar: 1) Separate JAR files for toolkit (GRE) content and app-specific content. 2) One JAR file containing both app-specific and toolkit content. - + Firefox uses the former (but used to use the latter), and Thunderbird uses the latter. In case 2, resource:/// and resource://gre/ point to the same place, so it's technically possible to refer to app or toolkit content by two separate URLs, and it's easy to carelessly use the wrong one. We had a bunch of these issues (especially with add-ons) when we switched layouts. - + But the code that's using resource://gre/ URLs for app content, or vice versa, is still technically wrong. */ - + Cu.import("chrome://expressionsearch/content/gmailuiParse.js"); Cu.import("chrome://expressionsearch/content/aop.js"); Cu.import("chrome://expressionsearch/content/common.js"); @@ -88,12 +98,12 @@ var ExpressionSearchChrome = { //Cu.import("resource:///modules/gloda/msg_search.js"); Cu.import("chrome://expressionsearch/content/ExpressionSearchFilter.js"); }, - + // https://bugzilla.mozilla.org/show_bug.cgi?id=1415567 Remove {get,set}ComplexValue use of nsISupportsString in Thunderbird oldAPI_58: Services.vc.compare(Services.appinfo.platformVersion, '58') < 0, complexPrefs: ["c2s_regexpMatch", "c2s_regexpReplace", "installed_version", "virtual_folder_path"], mozIJSSubScriptLoader: Components.classes["@mozilla.org/moz/jssubscript-loader;1"].getService(Ci.mozIJSSubScriptLoader), - + // https://bugzilla.mozilla.org/show_bug.cgi?id=1413413 Remove support for extensions having their own prefs file setDefaultPrefs: function () { let branch = Services.prefs.getDefaultBranch(""); @@ -119,7 +129,7 @@ var ExpressionSearchChrome = { ExpressionSearchLog.logException(err); } }, - + initPerf: function() { this.setDefaultPrefs(); this.prefs = Services.prefs.getBranch("extensions.expressionsearch."); @@ -128,13 +138,14 @@ var ExpressionSearchChrome = { "results_label_size", "showbuttonlabel", "statusbar_info_showtime", "statusbar_info_hidetime", "c2s_enableCtrl", "c2s_enableShift", "c2s_enableCtrlReplace", "c2s_enableShiftReplace", "c2s_regexpMatch", "c2s_regexpReplace", "c2s_removeDomainName", "installed_version", "enable_statusbar_info", "enable_verbose_info"].forEach( function(key) { try { + ExpressionSearchLog.log("Expression Search: watch key:"+key, false, true); ExpressionSearchChrome.observe('', 'nsPref:changed', key); // we fake one } catch ( err ) { ExpressionSearchLog.logException(err); } }); }, - + // get called when event occurs with our perf branch observe: function(subject, topic, data) { if (topic != "nsPref:changed") { @@ -189,7 +200,7 @@ var ExpressionSearchChrome = { if ( !show && !aFilterer.visible && hasFilter ) aFilterer.visible = true; return invocation.proceed(); })[0] ); - + // onMakeActive && onTabSwitched: show or hide the buttons & search box win._expression_search.hookedFunctions.push( ExpressionSearchaop.around( {target: win.QuickFilterBarMuxer, method: 'onMakeActive'}, function(invocation) { let aFolderDisplay = invocation.arguments[0]; @@ -199,7 +210,7 @@ var ExpressionSearchChrome = { win.document.getElementById("qfb-results-label").style.visibility = appropriate ? 'visible': 'hidden'; return invocation.proceed(); })[0] ); - + win._expression_search.hookedFunctions.push( ExpressionSearchaop.before( {target: win.QuickFilterBarMuxer, method: 'onTabSwitched'}, function() { let filterer = this.maybeActiveFilterer; // filterer means if the tab can use quick filter @@ -207,7 +218,7 @@ var ExpressionSearchChrome = { win.document.getElementById(ExpressionSearchChrome.needMoveId).style.visibility = filterer /*&& filterer.visible*/ ? 'visible': 'hidden'; win.document.getElementById("qfb-results-label").style.visibility = filterer /*&& filterer.visible*/ ? 'visible': 'hidden'; })[0] ); - + // hook _flattenGroupifyTerms to avoid being flatten if ( !ExpressionSearchChrome.hookedGlobalFunctions.length ) { ExpressionSearchChrome.hookedGlobalFunctions.push( ExpressionSearchaop.around( {target: SearchSpec.prototype, method: '_flattenGroupifyTerms'}, function(invocation) { @@ -238,7 +249,7 @@ var ExpressionSearchChrome = { return outTerms; })[0] ); } - + // for results label to show correct colour by copy filterActive attribute from quick-filter-bar to qfb-results-label, and set colour in overlay.css win._expression_search.hookedFunctions.push( ExpressionSearchaop.after( {target: win.QuickFilterBarMuxer, method: 'reflectFiltererResults'}, function(result) { let qfb = win.document.getElementById("quick-filter-bar"); @@ -248,9 +259,9 @@ var ExpressionSearchChrome = { } return result; })[0] ); - + }, - + registerCallback(win) { this.three_panes.push(win); }, @@ -280,20 +291,20 @@ var ExpressionSearchChrome = { delete win._expression_search; delete win.ExpressionSearchChrome; }, - + cleanup: function() { this.prefs.removeObserver("", ExpressionSearchChrome); delete this.prefs; this.hookedGlobalFunctions.forEach( hooked => hooked.unweave() ); ExpressionSearchLog.info("Expression Search: cleanup done"); }, - + refreshFilterBar: function(win) { let document = win.document; let QuickFilterBarMuxer = win.QuickFilterBarMuxer; //thunderbird-private-tabmail-buttons // qfb-show-filter-bar : document.getElementById("qfb-show-filter-bar").checked = aFilterer.visible; - + //quick-filter-bar // quick-filter-bar-main-bar // qfb-sticky qfb-filter-label [quick-filter-bar-collapsible-buttons] [100 results] [search filter] @@ -301,7 +312,7 @@ var ExpressionSearchChrome = { // quick-filter-bar-tab-bar : it's taG bar // quick-filter-bar-filter-text-bar.collapsed=(aFilterValue.text == null); //QuickFilterState.visible - + //QuickFilterBarMuxer // onMakeActive for qfb-show-filter-bar visiable // reflectFiltererState for qfb-show-filter-bar checked @@ -349,11 +360,11 @@ var ExpressionSearchChrome = { spacer.style.flex = '1 2000 auto'; } } - + let resultsLabel = document.getElementById("qfb-results-label"); if ( resultsLabel ) { if ( typeof(resultsLabel._saved_minWidth) == 'undefined' ) resultsLabel._saved_minWidth = resultsLabel.getAttribute('minwidth') || 1; - let layout = Services.prefs.getIntPref("mail.pane_config.dynamic"); + let layout = Services.prefs.getIntPref("mail.pane_config.dynamic"); let minWidth = ( this.options.results_label_size == 2 || ( this.options.results_label_size == 0 && this.options.move2bar == 0 && layout == win.kVerticalMailLayout ) ) ? 0 : resultsLabel._saved_minWidth; resultsLabel.setAttribute('minwidth', minWidth); if ( minWidth == 0 ) delete resultsLabel.style.width; @@ -382,14 +393,14 @@ var ExpressionSearchChrome = { QuickFilterBarMuxer._minExpandedBarWidth = 0; // let it re-calculate the min expanded bar width because we changed the layout QuickFilterBarMuxer.onWindowResize.apply(QuickFilterBarMuxer); } else { - let quickFilterBarBox = document.getElementById("quick-filter-bar-main-bar"); + let quickFilterBarBox = document.getElementById("quick-filter-bar-main-bar"); if ( quickFilterBarBox && quickFilterBarBox.clientWidth < quickFilterBarBox.scrollWidth ) { QuickFilterBarMuxer.onOverflow.apply(QuickFilterBarMuxer); } } } } - + let menu = document.getElementById(contextMenuID); if ( menu ) { for (let i = 0; i < menu.childNodes.length; i++ ) { @@ -399,13 +410,13 @@ var ExpressionSearchChrome = { }; } }, - + hideUpsellPanel: function(win) { let panel = win.document.getElementById("qfb-text-search-upsell"); if ( panel.state == "open") panel.hidePopup(); }, - + helpTimer: 0, showHideHelp: function(win, show, line1, line2, line3, line4) { @@ -436,7 +447,7 @@ var ExpressionSearchChrome = { this.helpTimer = setTimeout( function(){ tooltip.hidePopup(); }, time2hide ); } }, - + onTokenChange: function(event) { let searchValue = this.value; let start = searchValue.lastIndexOf(' ', this.selectionEnd > 0 ? this.selectionEnd - 1 : 0); // selectionEnd is index of the character after the selection @@ -448,7 +459,7 @@ var ExpressionSearchChrome = { let win = ExpressionSearchChrome.getWinFromEvent(event); ExpressionSearchChrome.showHideHelp(win, 1, help.alias, help.info, help.matchString, term); }, - + delayedOnSearchKeyPress: function(event) { let me = ExpressionSearchChrome; let win = ExpressionSearchChrome.getWinFromEvent(event); @@ -489,20 +500,20 @@ var ExpressionSearchChrome = { // me.back2OriginalFolder(win); else me.onTokenChange.apply(this, [event]); }, - + onSearchKeyPress: function(event){ let self = this; // defer the call or this.value is still the old value, not updated with event.char yet setTimeout( function(){ ExpressionSearchChrome.delayedOnSearchKeyPress.call(self,event); }, 0); }, - + onSearchBarBlur: function(event) { let win = ExpressionSearchChrome.getWinFromEvent(event); ExpressionSearchChrome.hideUpsellPanel(win); ExpressionSearchChrome.isFocus = false; ExpressionSearchChrome.showHideHelp(win, false); }, - + getWinFromEvent: function(event) { try { return event.view || event.currentTarget.ownerDocument.defaultView; @@ -510,7 +521,7 @@ var ExpressionSearchChrome = { ExpressionSearchLog.logException(err); } }, - + onSearchBarFocus: function(event) { let win = ExpressionSearchChrome.getWinFromEvent(event); let aNode = win.document.getElementById(ExpressionSearchChrome.textBoxDomId); @@ -542,7 +553,7 @@ var ExpressionSearchChrome = { aNode.setAttribute("minwidth", 280); oldTextbox.parentNode.insertBefore(aNode, oldTextbox.nextSibling); win._expression_search.createdElements.push(aNode); - + aNode.addEventListener("keypress", this.onSearchKeyPress, true); // false will be after onComand, too late //aNode.addEventListener("input", this.onTokenChange, true); // input can't get arrow key change but can get update when click2search aNode.addEventListener("click", this.onTokenChange, true); // to track selectEnd change @@ -550,14 +561,14 @@ var ExpressionSearchChrome = { aNode.addEventListener("focus", this.onSearchBarFocus, true); this.setSearchTimeout(win); }, - + setSearchTimeout: function(win) { let doc = win.document; let aNode = doc.getElementById(this.textBoxDomId); if ( !aNode ) return; aNode.timeout = this.options.search_timeout || 1000000000; }, - + back2OriginalFolder: function(win) { try { if ( typeof(win._expression_search.originalURI) == 'undefined' ) return; @@ -565,7 +576,7 @@ var ExpressionSearchChrome = { } catch (err) { } }, - + // not works well for complex searchTerms. But it's for all folders. createQuickFolder: function(win, searchTerms) { const nsMsgFolderFlags = Ci.nsMsgFolderFlags; @@ -587,7 +598,7 @@ var ExpressionSearchChrome = { return; } let QSFolderURI = targetFolderParent.URI + "/" + QSFolderName; - + if ( !targetFolderParent.containsChildNamed(QSFolderName) || ! this.options.reuse_existing_folder ) { for (let folder of fixIterator(rootFolder.descendants, Ci.nsIMsgFolder)) { // only add non-virtual non-news folders @@ -665,7 +676,7 @@ var ExpressionSearchChrome = { } ExpressionSearchChrome.isEnter = false; }, - + calculateResult: function(e) { if (e.kind == 'op') { if (e.tok == '+' || (e.right != undefined && e.tok == '-') || e.tok == '*' || e.tok == '/') { @@ -713,7 +724,7 @@ var ExpressionSearchChrome = { aNode.value = lhs + " = " + rhs; aNode.setSelectionRange(lhs.length, lhs.length + rhs.length + 3); // TODO: not work? }, - + //Check conditions for search: corresponding modifier is hold on or middle button is pressed CheckClickSearchEvent: function( event ) { // event.button: 0:left, 1:middle, 2:right @@ -722,8 +733,8 @@ var ExpressionSearchChrome = { if ( ExpressionSearchChrome.options.c2s_enableShift && event.shiftKey ) return true; return false; }, - - //Replace string using user-defined regexp. If not match, return original strings. + + //Replace string using user-defined regexp. If not match, return original strings. //If multiple matches, return all replaces, concatinated with OR operator RegexpReplaceString : function( str ) { if ( ExpressionSearchChrome.options.c2s_regexpMatch.length == 0 ) return str; @@ -842,7 +853,7 @@ var ExpressionSearchChrome = { aNode._fireCommand(aNode); return; }, - + firstRunAction: function() { let anchor = ''; if ( this.options.installed_version != "0.1" ) anchor = '#version_history'; // this is an update @@ -944,7 +955,7 @@ var ExpressionSearchChrome = { win._expression_search.createdElements.push(statusbarPanel); } }, - + loadInto3pane: function(win) { let me = ExpressionSearchChrome; try { @@ -1014,7 +1025,7 @@ var ExpressionSearchChrome = { aWindow.removeEventListener("unload", ExpressionSearchChrome.onUnLoad, false); ExpressionSearchChrome.unLoad(aWindow); }, - + setFocus: function(win) { if ( ExpressionSearchChrome.options.move2bar==0 && !QuickFilterBarMuxer.activeFilterer.visible ) QuickFilterBarMuxer._showFilterBar(true); @@ -1052,7 +1063,7 @@ var ExpressionSearchChrome = { let menupopup = doc.createElementNS(XULNS, "menupopup"); let menuGroupName = 'expression_search-status_menu'; menupopup.id = contextMenuID; - [ + [ ["about:config", "", function(){ ExpressionSearchCommon.loadURL('about:config'); }], ["about:crashes", "", function(){ ExpressionSearchCommon.loadTab('about:crashes'); }], ["about:memory", "", function(){ ExpressionSearchCommon.loadURL('about:memory?verbose'); }], diff --git a/content/help.html b/content/help.html index e4fd28c..065cf58 100644 --- a/content/help.html +++ b/content/help.html @@ -54,7 +54,7 @@

Search expressions and quick search key

Here are some examples:
  1. weekend plans

    -

    This expression searches all messages in the current folder or view for +

    This expression searches all messages in the current folder or view for 'weekend plans' in the from, to, cc, or subject fields.

    If "Act as normal filter" enabled, the "Sender", "Recipients", "Subject" and "Body" buttons will @@ -91,7 +91,7 @@

    Search expressions and quick search key

    subject:electric bill or s:electric bill

    -

    This expression searches all messages in the current folder or view for 'electric bill' +

    This expression searches all messages in the current folder or view for 'electric bill' in the subject fields of the message. Case insensitive.

  2. @@ -136,7 +136,7 @@

    Search expressions and quick search key

    attachment:yes or a:yes

    This expression searches all messages in the current folder or view for an attachment, -Notice that it does not search for attachments named "yes". You can also use "y" or "1" for +Notice that it does not search for attachments named "yes". You can also use "y" or "1" for "yes". You can use "no", "n", or "0" to search for messages without attachments.

  3. @@ -161,7 +161,7 @@

    Search expressions and quick search key

    before:07:12:00 or be:5:9 or after:03:07:05 or af:(3:0 -4:0)

    This expression searches all messages in the current folder or view within the time range. -af:(3:0 -4:0) will search for messages in current view that date between 3am to 4am EVERY day. +af:(3:0 -4:0) will search for messages in current view that date between 3am to 4am EVERY day.

  4. date:2011/01 or date:2011/01/03 or d:" 03:" or in zh-CN locale d:2011年3月 @@ -184,10 +184,10 @@

    Search expressions and quick search key

    body:electric bill

    -

    This expression searches all messages in the current folder or view for 'electric bill' -in the body of the message. On large or remote folders it may take some time. Also, if you -combine this with other search operators like "from:", "subject:" or "to:" this will speed -things up considerably. +

    This expression searches all messages in the current folder or view for 'electric bill' +in the body of the message. On large or remote folders it may take some time. Also, if you +combine this with other search operators like "from:", "subject:" or "to:" this will speed +things up considerably.

  5. bodyre:/hello.*world/i or br:test @@ -235,7 +235,7 @@

    Hot Key

    you will be able to type.

    Expression Search add one additional hot key "Ctrl+B".

    Once you are typing in your search query, and you hit enter or otherwise let -it begin searching, your cursor will remain inside of the query box to allow you +it begin searching, your cursor will remain inside of the query box to allow you to modify the query. However, if you'd rather go back to browsing your messages, instead of clicking on the message headers in your search results, you can just press 'ESC' to to clear the search criteria, and press 'ESC' again to refocus back

    @@ -260,7 +260,7 @@

    Quick Search Virtual Folder

    current account.

    The resulting virtual folder 'ExpressionSearch' can then be modified by editing properties, or can be renamed to make it a permanent virtual search folder. -If you do not rename the folder, the next time you use ctrl-enter the ExpressionSearch +If you do not rename the folder, the next time you use ctrl-enter the ExpressionSearch virtual folder is reused to show your new quick search result.

    @@ -338,6 +338,7 @@

    Click 2 Search

    Version history

    • Version 1.4:
        +
      • 1.4.2: Works with TB 68, fixed by R Roth see RR TB Addons/li>
      • Works with TB 63 nightly, drop support for TB older than 60
      • Change from legacy XUL overly addon to restartless addon
      @@ -481,9 +482,9 @@

      Known Issues of this extension or Thunderbird

    • Bug 474730 - should search newest first - searching returns messages in bad order, making searches very time-consuming and irrelevant for large databases
    • -Bug 564328 - Keyboard shortcut Ctrl+F conflict and cmd_find ambiguity, used for both Find in This Message and Quick Filter +Bug 564328 - Keyboard shortcut Ctrl+F conflict and cmd_find ambiguity, used for both Find in This Message and Quick Filter
    • -Bug 600140 - 'Unread' quick filter hides some unread messages (the beginning of a thread) +Bug 600140 - 'Unread' quick filter hides some unread messages (the beginning of a thread)
    • Bug 607295 - Provide UI for new archive granularity and folder structure options
    • diff --git a/locale/de-DE/ExpressionSearch.dtd b/locale/de-DE/ExpressionSearch.dtd index 7e06b3c..9a6ea38 100644 --- a/locale/de-DE/ExpressionSearch.dtd +++ b/locale/de-DE/ExpressionSearch.dtd @@ -1,58 +1,58 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/locale/de-DE/ExpressionSearch.properties b/locale/de-DE/ExpressionSearch.properties index 32b5694..a96d25d 100644 --- a/locale/de-DE/ExpressionSearch.properties +++ b/locale/de-DE/ExpressionSearch.properties @@ -1,72 +1,72 @@ -# for customer search terms -Bcc=Bcc -toSomebodyOnly=To Somebody Only -subjectRegex=Subject (RegEx) -subjectSimple=Subject (Long) -headerRegex=Header (RegEx) -fromRegex=From (RegEx) -toRegex=Recipients (To/Cc/Bcc RegEx) -dayTime=Time (Every Day) -dateMatch=Date Match (2011/01/01) -attachmentNameOrType=Attachment Name/Type -bodyRegex=Body (RegEx) - -# for input -textbox.emptyText.base=Expression Search... #1 -focusSearch.key=b -focusSearch.mod=accel -back2folder.keycode=VK_LEFT -back2folder.mod=accel alt - -# for context menu -about.about=About -dialog.settings=Settings -option.help=Help -donate.label=Donate -donate.image=chrome://expressionsearch/content/paypal.ico -donate.pay=paypal - -# for tooltip information -info.helpLine1=You can disable this tooltip in option dialog -info.helpLine2=Please type keyword to search -info.disable=You can disable this tooltip in option dialog -info.blank=Please type keywords to search, click this line for help -info.after=after:Mar 10, 2011\naf:(2011/03/01 -2011/03/09)\nafter:Mon, 25 Dec 1995 13:30:00 GMT\naf:(3:0 -4:0) will search for messages in current view that date between 3am to 4am EVERY day -info.all=search message within from, to, cc, or subject fields, and the body -info.attachment=attachment:yes or a:yes or a:no -info.bcc=BCC field contains -info.before=before:2011/03/09 07:12:00\nbe:09 Mar 2011 05:00:00 -info.body=Body contains -info.bodyre=bodyre:/hello.*world/i\nBody match\nWarning! May crash your Thunderbird -info.cc=CC field contains -info.date=date:yyyy/mm/dd hh:mm:ss\ndate:2011/01\ndate:2011/01/03 -info.days=age:3 or older_than:today or days:(3 -5)\ntoday means -1, week means 7 and month means 30 -info.filename=filename:foo.doc or fi:image or fn:msword or file:html\nsearches for an attachment name or type -info.from=from:(Alice or Bob)\nSearches From field -info.fromto=fromto:(Alice)\nFrom, To, CC or BCC field contains -info.fromre=fromre:/^[a-d].*[m-z]$/i\nSearches From field using regular expression -info.tore=tore:/^[a-d].*[m-z]$/i\nSearches recipients(To/Cc/Bcc) field using regular expression -info.newer_than=n:8 or nt:7week or newer_than:1year -info.only=only:tom\ntom should be the only recipients in to field -info.regex=regex:/^begin/i or re:end$ or r:/\d+\s*\d+/\nSubject matches -info.headerre=headerre:List-Id=/all-test/i or h:list-id or hr:header~/^value/ -info.simple=simple:hello'\nSubject field contains, support special characters -info.status=is:replied or i:UnRead or status:Forwarded or status:F\nThe status can be one of Replied, Read, Marked/Star, Forwarded, UnRead, New, ImapDeleted or Attachment. -info.subject=subject:(Hello -World!)\nSearches Subject to Contains Hello but not World! -info.tag=tag:Important\nTag contains\ntag:NA means no tag -info.to=To or CC field contains -info.tonocc=To fileld contains -info.size=size:10 or size:1.4M\nMessage Size big than -info.smaller=smaller:1G or sm:1024\nMessage Size less than -info.gloda=Trigger gloda search if enabled - -# for virtual folder select -virtualfolder.selectall=Select All -virtualfolder.clearall=Clear All -virtualfolder.modelabel=When click change: -virtualfolder.modesingle=Current Only -virtualfolder.modechild=Current & Children -virtualfolder.modedescendants=Current & Descendants - -# If you can localize the help document, please change "content" to "locale" below and put localized document under locale dir -expressionsearch.helpfile=chrome://expressionsearch/content/help.html +# for customer search terms +Bcc=Bcc +toSomebodyOnly=To Somebody Only +subjectRegex=Subject (RegEx) +subjectSimple=Subject (Long) +headerRegex=Header (RegEx) +fromRegex=From (RegEx) +toRegex=Recipients (To/Cc/Bcc RegEx) +dayTime=Time (Every Day) +dateMatch=Date Match (2011/01/01) +attachmentNameOrType=Attachment Name/Type +bodyRegex=Body (RegEx) + +# for input +textbox.emptyText.base=Expression Search... #1 +focusSearch.key=b +focusSearch.mod=accel +back2folder.keycode=VK_LEFT +back2folder.mod=accel alt + +# for context menu +about.about=About +dialog.settings=Settings +option.help=Help +donate.label=Donate +donate.image=chrome://expressionsearch/content/paypal.ico +donate.pay=paypal + +# for tooltip information +info.helpLine1=You can disable this tooltip in option dialog +info.helpLine2=Please type keyword to search +info.disable=You can disable this tooltip in option dialog +info.blank=Please type keywords to search, click this line for help +info.after=after:Mar 10, 2011\naf:(2011/03/01 -2011/03/09)\nafter:Mon, 25 Dec 1995 13:30:00 GMT\naf:(3:0 -4:0) will search for messages in current view that date between 3am to 4am EVERY day +info.all=search message within from, to, cc, or subject fields, and the body +info.attachment=attachment:yes or a:yes or a:no +info.bcc=BCC field contains +info.before=before:2011/03/09 07:12:00\nbe:09 Mar 2011 05:00:00 +info.body=Body contains +info.bodyre=bodyre:/hello.*world/i\nBody match\nWarning! May crash your Thunderbird +info.cc=CC field contains +info.date=date:yyyy/mm/dd hh:mm:ss\ndate:2011/01\ndate:2011/01/03 +info.days=age:3 or older_than:today or days:(3 -5)\ntoday means -1, week means 7 and month means 30 +info.filename=filename:foo.doc or fi:image or fn:msword or file:html\nsearches for an attachment name or type +info.from=from:(Alice or Bob)\nSearches From field +info.fromto=fromto:(Alice)\nFrom, To, CC or BCC field contains +info.fromre=fromre:/^[a-d].*[m-z]$/i\nSearches From field using regular expression +info.tore=tore:/^[a-d].*[m-z]$/i\nSearches recipients(To/Cc/Bcc) field using regular expression +info.newer_than=n:8 or nt:7week or newer_than:1year +info.only=only:tom\ntom should be the only recipients in to field +info.regex=regex:/^begin/i or re:end$ or r:/\d+\s*\d+/\nSubject matches +info.headerre=headerre:List-Id=/all-test/i or h:list-id or hr:header~/^value/ +info.simple=simple:hello'\nSubject field contains, support special characters +info.status=is:replied or i:UnRead or status:Forwarded or status:F\nThe status can be one of Replied, Read, Marked/Star, Forwarded, UnRead, New, ImapDeleted or Attachment. +info.subject=subject:(Hello -World!)\nSearches Subject to Contains Hello but not World! +info.tag=tag:Important\nTag contains\ntag:NA means no tag +info.to=To or CC field contains +info.tonocc=To fileld contains +info.size=size:10 or size:1.4M\nMessage Size big than +info.smaller=smaller:1G or sm:1024\nMessage Size less than +info.gloda=Trigger gloda search if enabled + +# for virtual folder select +virtualfolder.selectall=Select All +virtualfolder.clearall=Clear All +virtualfolder.modelabel=When click change: +virtualfolder.modesingle=Current Only +virtualfolder.modechild=Current & Children +virtualfolder.modedescendants=Current & Descendants + +# If you can localize the help document, please change "content" to "locale" below and put localized document under locale dir +expressionsearch.helpfile=chrome://expressionsearch/content/help.html diff --git a/manifest.json b/manifest.json index 0a59e26..660ce07 100644 --- a/manifest.json +++ b/manifest.json @@ -6,17 +6,17 @@ "strict_max_version": "68.9" } }, - "version": "1.4beta", + "version": "1.4.2", "manifest_version": 2, "name": "Expression Search / Google Mail UI", "description": "Type 'from:fred to:tom' to see all messages from Fred to Tom in the current view.", - "author": "Opera Wang", + "author": "Opera Wang V68 by Rich Roth - http://www.tnrglobal.com/2020/05/thunderbird-addons/", "homepage_url": "https://github.com/wangvisual/expression-search", "legacy": { "type": "bootstrap", "options": { "page": "chrome://expressionsearch/content/esPrefDialog.xul", - "open_in_tab": false + "open_in_tab": true } }, "icons": { From bc0de4f670b46e59209512cb7b8c3c130bf7c863 Mon Sep 17 00:00:00 2001 From: Till Riedel Date: Wed, 8 Jul 2020 00:31:16 +0200 Subject: [PATCH 2/4] revert some unnecessary changes --- bootstrap.js | 8 +- content/es.js | 111 +++++++++-------- content/help.html | 24 ++-- locale/de-DE/ExpressionSearch.dtd | 116 +++++++++--------- locale/de-DE/ExpressionSearch.properties | 144 +++++++++++------------ 5 files changed, 199 insertions(+), 204 deletions(-) diff --git a/bootstrap.js b/bootstrap.js index 3f0a795..f79a313 100644 --- a/bootstrap.js +++ b/bootstrap.js @@ -14,14 +14,12 @@ function loadIntoWindow(window) { if ( !window ) return; // windows is the global host context let document = window.document; // XULDocument let type = document.documentElement.getAttribute('windowtype'); // documentElement maybe 'messengerWindow' / 'addressbookWindow' - if ( targetWindows.indexOf(type) < 0 ) return; - Services.console.logStringMessage("Expression Search: loading ExpressionSearchChrome"); ExpressionSearchChrome.init(); // will and add my filter, and TB want the domID exists when filter registered, so only called when have window ready ExpressionSearchChrome.Load(window); } - + var windowListener = { onOpenWindow: function(aWindow) { let onLoadWindow = function() { @@ -56,7 +54,7 @@ function startup(aData, aReason) { // validator warnings on the below line, ignore it if ( !sss.sheetRegistered(userCSS, sss.USER_SHEET) ) sss.loadAndRegisterSheet(userCSS, sss.USER_SHEET); // will be unregister when shutdown } - + function shutdown(aData, aReason) { // When the application is shutting down we normally don't have to clean up any UI changes made //** if (aReason == APP_SHUTDOWN) return; @@ -64,7 +62,7 @@ function shutdown(aData, aReason) { try { if ( sss.sheetRegistered(userCSS, sss.USER_SHEET) ) sss.unregisterSheet(userCSS, sss.USER_SHEET); } catch (err) {Cu.reportError(err);} - + try { Services.obs.removeObserver(windowListener, observeEvent); // Unload from any existing windows diff --git a/content/es.js b/content/es.js index 9e34121..a10bbad 100644 --- a/content/es.js +++ b/content/es.js @@ -22,31 +22,28 @@ var ExpressionSearchChrome = { isEnter: 0, hookedGlobalFunctions: [], three_panes: [], // 3pane windows - + needMoveId: "quick-filter-bar-main-bar", originalFilterId: "qfb-qs-textbox", textBoxDomId: "expression-search-textbox", strBundle: Services.strings.createBundle('chrome://expressionsearch/locale/ExpressionSearch.properties'), - + prefs: null, // preference object options: {}, // preference strings loaded: 0, init: function() { Cu.import("chrome://expressionsearch/content/log.js"); // load log first - //ChomeUtils.import("chrome://expressionsearch/content/log.js"); // load log first if ( this.loaded ) { - - try { - ExpressionSearchLog.log("Expression Search: init...1", false, true); - this.importModules(); - this.initPerf(); - } catch (err) { - ExpressionSearchLog.logException(err); - } - + try { + ExpressionSearchLog.log("Expression Search: init...1", false, true); + this.importModules(); + this.initPerf(); + } catch (err) { + ExpressionSearchLog.logException(err); + } if ( !this.prefs && ExpressionSearchLog ) { - ExpressionSearchLog.log("Expression Search is now restartless!", 1); + ExpressionSearchLog.log("Expression Search is NOT restartless! Please restart Thunderbird!", 1); } else return; } this.loaded = 1; @@ -58,19 +55,19 @@ var ExpressionSearchChrome = { ExpressionSearchLog.logException(err); } }, - + importModules: function() { /* https://bugzilla.mozilla.org/show_bug.cgi?id=1383215#c24 There are two ways that we currently support packaging omnijar: 1) Separate JAR files for toolkit (GRE) content and app-specific content. 2) One JAR file containing both app-specific and toolkit content. - + Firefox uses the former (but used to use the latter), and Thunderbird uses the latter. In case 2, resource:/// and resource://gre/ point to the same place, so it's technically possible to refer to app or toolkit content by two separate URLs, and it's easy to carelessly use the wrong one. We had a bunch of these issues (especially with add-ons) when we switched layouts. - + But the code that's using resource://gre/ URLs for app content, or vice versa, is still technically wrong. */ - + Cu.import("chrome://expressionsearch/content/gmailuiParse.js"); Cu.import("chrome://expressionsearch/content/aop.js"); Cu.import("chrome://expressionsearch/content/common.js"); @@ -98,12 +95,12 @@ var ExpressionSearchChrome = { //Cu.import("resource:///modules/gloda/msg_search.js"); Cu.import("chrome://expressionsearch/content/ExpressionSearchFilter.js"); }, - + // https://bugzilla.mozilla.org/show_bug.cgi?id=1415567 Remove {get,set}ComplexValue use of nsISupportsString in Thunderbird oldAPI_58: Services.vc.compare(Services.appinfo.platformVersion, '58') < 0, complexPrefs: ["c2s_regexpMatch", "c2s_regexpReplace", "installed_version", "virtual_folder_path"], mozIJSSubScriptLoader: Components.classes["@mozilla.org/moz/jssubscript-loader;1"].getService(Ci.mozIJSSubScriptLoader), - + // https://bugzilla.mozilla.org/show_bug.cgi?id=1413413 Remove support for extensions having their own prefs file setDefaultPrefs: function () { let branch = Services.prefs.getDefaultBranch(""); @@ -129,7 +126,7 @@ var ExpressionSearchChrome = { ExpressionSearchLog.logException(err); } }, - + initPerf: function() { this.setDefaultPrefs(); this.prefs = Services.prefs.getBranch("extensions.expressionsearch."); @@ -145,7 +142,7 @@ var ExpressionSearchChrome = { } }); }, - + // get called when event occurs with our perf branch observe: function(subject, topic, data) { if (topic != "nsPref:changed") { @@ -200,7 +197,7 @@ var ExpressionSearchChrome = { if ( !show && !aFilterer.visible && hasFilter ) aFilterer.visible = true; return invocation.proceed(); })[0] ); - + // onMakeActive && onTabSwitched: show or hide the buttons & search box win._expression_search.hookedFunctions.push( ExpressionSearchaop.around( {target: win.QuickFilterBarMuxer, method: 'onMakeActive'}, function(invocation) { let aFolderDisplay = invocation.arguments[0]; @@ -210,7 +207,7 @@ var ExpressionSearchChrome = { win.document.getElementById("qfb-results-label").style.visibility = appropriate ? 'visible': 'hidden'; return invocation.proceed(); })[0] ); - + win._expression_search.hookedFunctions.push( ExpressionSearchaop.before( {target: win.QuickFilterBarMuxer, method: 'onTabSwitched'}, function() { let filterer = this.maybeActiveFilterer; // filterer means if the tab can use quick filter @@ -218,7 +215,7 @@ var ExpressionSearchChrome = { win.document.getElementById(ExpressionSearchChrome.needMoveId).style.visibility = filterer /*&& filterer.visible*/ ? 'visible': 'hidden'; win.document.getElementById("qfb-results-label").style.visibility = filterer /*&& filterer.visible*/ ? 'visible': 'hidden'; })[0] ); - + // hook _flattenGroupifyTerms to avoid being flatten if ( !ExpressionSearchChrome.hookedGlobalFunctions.length ) { ExpressionSearchChrome.hookedGlobalFunctions.push( ExpressionSearchaop.around( {target: SearchSpec.prototype, method: '_flattenGroupifyTerms'}, function(invocation) { @@ -249,7 +246,7 @@ var ExpressionSearchChrome = { return outTerms; })[0] ); } - + // for results label to show correct colour by copy filterActive attribute from quick-filter-bar to qfb-results-label, and set colour in overlay.css win._expression_search.hookedFunctions.push( ExpressionSearchaop.after( {target: win.QuickFilterBarMuxer, method: 'reflectFiltererResults'}, function(result) { let qfb = win.document.getElementById("quick-filter-bar"); @@ -259,9 +256,9 @@ var ExpressionSearchChrome = { } return result; })[0] ); - + }, - + registerCallback(win) { this.three_panes.push(win); }, @@ -291,20 +288,20 @@ var ExpressionSearchChrome = { delete win._expression_search; delete win.ExpressionSearchChrome; }, - + cleanup: function() { this.prefs.removeObserver("", ExpressionSearchChrome); delete this.prefs; this.hookedGlobalFunctions.forEach( hooked => hooked.unweave() ); ExpressionSearchLog.info("Expression Search: cleanup done"); }, - + refreshFilterBar: function(win) { let document = win.document; let QuickFilterBarMuxer = win.QuickFilterBarMuxer; //thunderbird-private-tabmail-buttons // qfb-show-filter-bar : document.getElementById("qfb-show-filter-bar").checked = aFilterer.visible; - + //quick-filter-bar // quick-filter-bar-main-bar // qfb-sticky qfb-filter-label [quick-filter-bar-collapsible-buttons] [100 results] [search filter] @@ -312,7 +309,7 @@ var ExpressionSearchChrome = { // quick-filter-bar-tab-bar : it's taG bar // quick-filter-bar-filter-text-bar.collapsed=(aFilterValue.text == null); //QuickFilterState.visible - + //QuickFilterBarMuxer // onMakeActive for qfb-show-filter-bar visiable // reflectFiltererState for qfb-show-filter-bar checked @@ -360,11 +357,11 @@ var ExpressionSearchChrome = { spacer.style.flex = '1 2000 auto'; } } - + let resultsLabel = document.getElementById("qfb-results-label"); if ( resultsLabel ) { if ( typeof(resultsLabel._saved_minWidth) == 'undefined' ) resultsLabel._saved_minWidth = resultsLabel.getAttribute('minwidth') || 1; - let layout = Services.prefs.getIntPref("mail.pane_config.dynamic"); + let layout = Services.prefs.getIntPref("mail.pane_config.dynamic"); let minWidth = ( this.options.results_label_size == 2 || ( this.options.results_label_size == 0 && this.options.move2bar == 0 && layout == win.kVerticalMailLayout ) ) ? 0 : resultsLabel._saved_minWidth; resultsLabel.setAttribute('minwidth', minWidth); if ( minWidth == 0 ) delete resultsLabel.style.width; @@ -393,14 +390,14 @@ var ExpressionSearchChrome = { QuickFilterBarMuxer._minExpandedBarWidth = 0; // let it re-calculate the min expanded bar width because we changed the layout QuickFilterBarMuxer.onWindowResize.apply(QuickFilterBarMuxer); } else { - let quickFilterBarBox = document.getElementById("quick-filter-bar-main-bar"); + let quickFilterBarBox = document.getElementById("quick-filter-bar-main-bar"); if ( quickFilterBarBox && quickFilterBarBox.clientWidth < quickFilterBarBox.scrollWidth ) { QuickFilterBarMuxer.onOverflow.apply(QuickFilterBarMuxer); } } } } - + let menu = document.getElementById(contextMenuID); if ( menu ) { for (let i = 0; i < menu.childNodes.length; i++ ) { @@ -410,13 +407,13 @@ var ExpressionSearchChrome = { }; } }, - + hideUpsellPanel: function(win) { let panel = win.document.getElementById("qfb-text-search-upsell"); if ( panel.state == "open") panel.hidePopup(); }, - + helpTimer: 0, showHideHelp: function(win, show, line1, line2, line3, line4) { @@ -447,7 +444,7 @@ var ExpressionSearchChrome = { this.helpTimer = setTimeout( function(){ tooltip.hidePopup(); }, time2hide ); } }, - + onTokenChange: function(event) { let searchValue = this.value; let start = searchValue.lastIndexOf(' ', this.selectionEnd > 0 ? this.selectionEnd - 1 : 0); // selectionEnd is index of the character after the selection @@ -459,7 +456,7 @@ var ExpressionSearchChrome = { let win = ExpressionSearchChrome.getWinFromEvent(event); ExpressionSearchChrome.showHideHelp(win, 1, help.alias, help.info, help.matchString, term); }, - + delayedOnSearchKeyPress: function(event) { let me = ExpressionSearchChrome; let win = ExpressionSearchChrome.getWinFromEvent(event); @@ -500,20 +497,20 @@ var ExpressionSearchChrome = { // me.back2OriginalFolder(win); else me.onTokenChange.apply(this, [event]); }, - + onSearchKeyPress: function(event){ let self = this; // defer the call or this.value is still the old value, not updated with event.char yet setTimeout( function(){ ExpressionSearchChrome.delayedOnSearchKeyPress.call(self,event); }, 0); }, - + onSearchBarBlur: function(event) { let win = ExpressionSearchChrome.getWinFromEvent(event); ExpressionSearchChrome.hideUpsellPanel(win); ExpressionSearchChrome.isFocus = false; ExpressionSearchChrome.showHideHelp(win, false); }, - + getWinFromEvent: function(event) { try { return event.view || event.currentTarget.ownerDocument.defaultView; @@ -521,7 +518,7 @@ var ExpressionSearchChrome = { ExpressionSearchLog.logException(err); } }, - + onSearchBarFocus: function(event) { let win = ExpressionSearchChrome.getWinFromEvent(event); let aNode = win.document.getElementById(ExpressionSearchChrome.textBoxDomId); @@ -553,7 +550,7 @@ var ExpressionSearchChrome = { aNode.setAttribute("minwidth", 280); oldTextbox.parentNode.insertBefore(aNode, oldTextbox.nextSibling); win._expression_search.createdElements.push(aNode); - + aNode.addEventListener("keypress", this.onSearchKeyPress, true); // false will be after onComand, too late //aNode.addEventListener("input", this.onTokenChange, true); // input can't get arrow key change but can get update when click2search aNode.addEventListener("click", this.onTokenChange, true); // to track selectEnd change @@ -561,14 +558,14 @@ var ExpressionSearchChrome = { aNode.addEventListener("focus", this.onSearchBarFocus, true); this.setSearchTimeout(win); }, - + setSearchTimeout: function(win) { let doc = win.document; let aNode = doc.getElementById(this.textBoxDomId); if ( !aNode ) return; aNode.timeout = this.options.search_timeout || 1000000000; }, - + back2OriginalFolder: function(win) { try { if ( typeof(win._expression_search.originalURI) == 'undefined' ) return; @@ -576,7 +573,7 @@ var ExpressionSearchChrome = { } catch (err) { } }, - + // not works well for complex searchTerms. But it's for all folders. createQuickFolder: function(win, searchTerms) { const nsMsgFolderFlags = Ci.nsMsgFolderFlags; @@ -598,7 +595,7 @@ var ExpressionSearchChrome = { return; } let QSFolderURI = targetFolderParent.URI + "/" + QSFolderName; - + if ( !targetFolderParent.containsChildNamed(QSFolderName) || ! this.options.reuse_existing_folder ) { for (let folder of fixIterator(rootFolder.descendants, Ci.nsIMsgFolder)) { // only add non-virtual non-news folders @@ -676,7 +673,7 @@ var ExpressionSearchChrome = { } ExpressionSearchChrome.isEnter = false; }, - + calculateResult: function(e) { if (e.kind == 'op') { if (e.tok == '+' || (e.right != undefined && e.tok == '-') || e.tok == '*' || e.tok == '/') { @@ -724,7 +721,7 @@ var ExpressionSearchChrome = { aNode.value = lhs + " = " + rhs; aNode.setSelectionRange(lhs.length, lhs.length + rhs.length + 3); // TODO: not work? }, - + //Check conditions for search: corresponding modifier is hold on or middle button is pressed CheckClickSearchEvent: function( event ) { // event.button: 0:left, 1:middle, 2:right @@ -733,8 +730,8 @@ var ExpressionSearchChrome = { if ( ExpressionSearchChrome.options.c2s_enableShift && event.shiftKey ) return true; return false; }, - - //Replace string using user-defined regexp. If not match, return original strings. + + //Replace string using user-defined regexp. If not match, return original strings. //If multiple matches, return all replaces, concatinated with OR operator RegexpReplaceString : function( str ) { if ( ExpressionSearchChrome.options.c2s_regexpMatch.length == 0 ) return str; @@ -853,7 +850,7 @@ var ExpressionSearchChrome = { aNode._fireCommand(aNode); return; }, - + firstRunAction: function() { let anchor = ''; if ( this.options.installed_version != "0.1" ) anchor = '#version_history'; // this is an update @@ -955,7 +952,7 @@ var ExpressionSearchChrome = { win._expression_search.createdElements.push(statusbarPanel); } }, - + loadInto3pane: function(win) { let me = ExpressionSearchChrome; try { @@ -1025,7 +1022,7 @@ var ExpressionSearchChrome = { aWindow.removeEventListener("unload", ExpressionSearchChrome.onUnLoad, false); ExpressionSearchChrome.unLoad(aWindow); }, - + setFocus: function(win) { if ( ExpressionSearchChrome.options.move2bar==0 && !QuickFilterBarMuxer.activeFilterer.visible ) QuickFilterBarMuxer._showFilterBar(true); @@ -1063,7 +1060,7 @@ var ExpressionSearchChrome = { let menupopup = doc.createElementNS(XULNS, "menupopup"); let menuGroupName = 'expression_search-status_menu'; menupopup.id = contextMenuID; - [ + [ ["about:config", "", function(){ ExpressionSearchCommon.loadURL('about:config'); }], ["about:crashes", "", function(){ ExpressionSearchCommon.loadTab('about:crashes'); }], ["about:memory", "", function(){ ExpressionSearchCommon.loadURL('about:memory?verbose'); }], @@ -1191,4 +1188,4 @@ var ExpressionSearchChrome = { } }, -}; \ No newline at end of file +}; diff --git a/content/help.html b/content/help.html index 065cf58..b86c38e 100644 --- a/content/help.html +++ b/content/help.html @@ -54,7 +54,7 @@

      Search expressions and quick search key

      Here are some examples:
      1. weekend plans

        -

        This expression searches all messages in the current folder or view for +

        This expression searches all messages in the current folder or view for 'weekend plans' in the from, to, cc, or subject fields.

        If "Act as normal filter" enabled, the "Sender", "Recipients", "Subject" and "Body" buttons will @@ -91,7 +91,7 @@

        Search expressions and quick search key

        subject:electric bill or s:electric bill

        -

        This expression searches all messages in the current folder or view for 'electric bill' +

        This expression searches all messages in the current folder or view for 'electric bill' in the subject fields of the message. Case insensitive.

      2. @@ -136,7 +136,7 @@

        Search expressions and quick search key

        attachment:yes or a:yes

        This expression searches all messages in the current folder or view for an attachment, -Notice that it does not search for attachments named "yes". You can also use "y" or "1" for +Notice that it does not search for attachments named "yes". You can also use "y" or "1" for "yes". You can use "no", "n", or "0" to search for messages without attachments.

      3. @@ -161,7 +161,7 @@

        Search expressions and quick search key

        before:07:12:00 or be:5:9 or after:03:07:05 or af:(3:0 -4:0)

        This expression searches all messages in the current folder or view within the time range. -af:(3:0 -4:0) will search for messages in current view that date between 3am to 4am EVERY day. +af:(3:0 -4:0) will search for messages in current view that date between 3am to 4am EVERY day.

      4. date:2011/01 or date:2011/01/03 or d:" 03:" or in zh-CN locale d:2011年3月 @@ -184,10 +184,10 @@

        Search expressions and quick search key

        body:electric bill

        -

        This expression searches all messages in the current folder or view for 'electric bill' -in the body of the message. On large or remote folders it may take some time. Also, if you -combine this with other search operators like "from:", "subject:" or "to:" this will speed -things up considerably. +

        This expression searches all messages in the current folder or view for 'electric bill' +in the body of the message. On large or remote folders it may take some time. Also, if you +combine this with other search operators like "from:", "subject:" or "to:" this will speed +things up considerably.

      5. bodyre:/hello.*world/i or br:test @@ -235,7 +235,7 @@

        Hot Key

        you will be able to type.

        Expression Search add one additional hot key "Ctrl+B".

        Once you are typing in your search query, and you hit enter or otherwise let -it begin searching, your cursor will remain inside of the query box to allow you +it begin searching, your cursor will remain inside of the query box to allow you to modify the query. However, if you'd rather go back to browsing your messages, instead of clicking on the message headers in your search results, you can just press 'ESC' to to clear the search criteria, and press 'ESC' again to refocus back

        @@ -260,7 +260,7 @@

        Quick Search Virtual Folder

        current account.

        The resulting virtual folder 'ExpressionSearch' can then be modified by editing properties, or can be renamed to make it a permanent virtual search folder. -If you do not rename the folder, the next time you use ctrl-enter the ExpressionSearch +If you do not rename the folder, the next time you use ctrl-enter the ExpressionSearch virtual folder is reused to show your new quick search result.

        @@ -482,9 +482,9 @@

        Known Issues of this extension or Thunderbird

      6. Bug 474730 - should search newest first - searching returns messages in bad order, making searches very time-consuming and irrelevant for large databases
      7. -Bug 564328 - Keyboard shortcut Ctrl+F conflict and cmd_find ambiguity, used for both Find in This Message and Quick Filter +Bug 564328 - Keyboard shortcut Ctrl+F conflict and cmd_find ambiguity, used for both Find in This Message and Quick Filter
      8. -Bug 600140 - 'Unread' quick filter hides some unread messages (the beginning of a thread) +Bug 600140 - 'Unread' quick filter hides some unread messages (the beginning of a thread)
      9. Bug 607295 - Provide UI for new archive granularity and folder structure options
      10. diff --git a/locale/de-DE/ExpressionSearch.dtd b/locale/de-DE/ExpressionSearch.dtd index 9a6ea38..7e06b3c 100644 --- a/locale/de-DE/ExpressionSearch.dtd +++ b/locale/de-DE/ExpressionSearch.dtd @@ -1,58 +1,58 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/locale/de-DE/ExpressionSearch.properties b/locale/de-DE/ExpressionSearch.properties index a96d25d..32b5694 100644 --- a/locale/de-DE/ExpressionSearch.properties +++ b/locale/de-DE/ExpressionSearch.properties @@ -1,72 +1,72 @@ -# for customer search terms -Bcc=Bcc -toSomebodyOnly=To Somebody Only -subjectRegex=Subject (RegEx) -subjectSimple=Subject (Long) -headerRegex=Header (RegEx) -fromRegex=From (RegEx) -toRegex=Recipients (To/Cc/Bcc RegEx) -dayTime=Time (Every Day) -dateMatch=Date Match (2011/01/01) -attachmentNameOrType=Attachment Name/Type -bodyRegex=Body (RegEx) - -# for input -textbox.emptyText.base=Expression Search... #1 -focusSearch.key=b -focusSearch.mod=accel -back2folder.keycode=VK_LEFT -back2folder.mod=accel alt - -# for context menu -about.about=About -dialog.settings=Settings -option.help=Help -donate.label=Donate -donate.image=chrome://expressionsearch/content/paypal.ico -donate.pay=paypal - -# for tooltip information -info.helpLine1=You can disable this tooltip in option dialog -info.helpLine2=Please type keyword to search -info.disable=You can disable this tooltip in option dialog -info.blank=Please type keywords to search, click this line for help -info.after=after:Mar 10, 2011\naf:(2011/03/01 -2011/03/09)\nafter:Mon, 25 Dec 1995 13:30:00 GMT\naf:(3:0 -4:0) will search for messages in current view that date between 3am to 4am EVERY day -info.all=search message within from, to, cc, or subject fields, and the body -info.attachment=attachment:yes or a:yes or a:no -info.bcc=BCC field contains -info.before=before:2011/03/09 07:12:00\nbe:09 Mar 2011 05:00:00 -info.body=Body contains -info.bodyre=bodyre:/hello.*world/i\nBody match\nWarning! May crash your Thunderbird -info.cc=CC field contains -info.date=date:yyyy/mm/dd hh:mm:ss\ndate:2011/01\ndate:2011/01/03 -info.days=age:3 or older_than:today or days:(3 -5)\ntoday means -1, week means 7 and month means 30 -info.filename=filename:foo.doc or fi:image or fn:msword or file:html\nsearches for an attachment name or type -info.from=from:(Alice or Bob)\nSearches From field -info.fromto=fromto:(Alice)\nFrom, To, CC or BCC field contains -info.fromre=fromre:/^[a-d].*[m-z]$/i\nSearches From field using regular expression -info.tore=tore:/^[a-d].*[m-z]$/i\nSearches recipients(To/Cc/Bcc) field using regular expression -info.newer_than=n:8 or nt:7week or newer_than:1year -info.only=only:tom\ntom should be the only recipients in to field -info.regex=regex:/^begin/i or re:end$ or r:/\d+\s*\d+/\nSubject matches -info.headerre=headerre:List-Id=/all-test/i or h:list-id or hr:header~/^value/ -info.simple=simple:hello'\nSubject field contains, support special characters -info.status=is:replied or i:UnRead or status:Forwarded or status:F\nThe status can be one of Replied, Read, Marked/Star, Forwarded, UnRead, New, ImapDeleted or Attachment. -info.subject=subject:(Hello -World!)\nSearches Subject to Contains Hello but not World! -info.tag=tag:Important\nTag contains\ntag:NA means no tag -info.to=To or CC field contains -info.tonocc=To fileld contains -info.size=size:10 or size:1.4M\nMessage Size big than -info.smaller=smaller:1G or sm:1024\nMessage Size less than -info.gloda=Trigger gloda search if enabled - -# for virtual folder select -virtualfolder.selectall=Select All -virtualfolder.clearall=Clear All -virtualfolder.modelabel=When click change: -virtualfolder.modesingle=Current Only -virtualfolder.modechild=Current & Children -virtualfolder.modedescendants=Current & Descendants - -# If you can localize the help document, please change "content" to "locale" below and put localized document under locale dir -expressionsearch.helpfile=chrome://expressionsearch/content/help.html +# for customer search terms +Bcc=Bcc +toSomebodyOnly=To Somebody Only +subjectRegex=Subject (RegEx) +subjectSimple=Subject (Long) +headerRegex=Header (RegEx) +fromRegex=From (RegEx) +toRegex=Recipients (To/Cc/Bcc RegEx) +dayTime=Time (Every Day) +dateMatch=Date Match (2011/01/01) +attachmentNameOrType=Attachment Name/Type +bodyRegex=Body (RegEx) + +# for input +textbox.emptyText.base=Expression Search... #1 +focusSearch.key=b +focusSearch.mod=accel +back2folder.keycode=VK_LEFT +back2folder.mod=accel alt + +# for context menu +about.about=About +dialog.settings=Settings +option.help=Help +donate.label=Donate +donate.image=chrome://expressionsearch/content/paypal.ico +donate.pay=paypal + +# for tooltip information +info.helpLine1=You can disable this tooltip in option dialog +info.helpLine2=Please type keyword to search +info.disable=You can disable this tooltip in option dialog +info.blank=Please type keywords to search, click this line for help +info.after=after:Mar 10, 2011\naf:(2011/03/01 -2011/03/09)\nafter:Mon, 25 Dec 1995 13:30:00 GMT\naf:(3:0 -4:0) will search for messages in current view that date between 3am to 4am EVERY day +info.all=search message within from, to, cc, or subject fields, and the body +info.attachment=attachment:yes or a:yes or a:no +info.bcc=BCC field contains +info.before=before:2011/03/09 07:12:00\nbe:09 Mar 2011 05:00:00 +info.body=Body contains +info.bodyre=bodyre:/hello.*world/i\nBody match\nWarning! May crash your Thunderbird +info.cc=CC field contains +info.date=date:yyyy/mm/dd hh:mm:ss\ndate:2011/01\ndate:2011/01/03 +info.days=age:3 or older_than:today or days:(3 -5)\ntoday means -1, week means 7 and month means 30 +info.filename=filename:foo.doc or fi:image or fn:msword or file:html\nsearches for an attachment name or type +info.from=from:(Alice or Bob)\nSearches From field +info.fromto=fromto:(Alice)\nFrom, To, CC or BCC field contains +info.fromre=fromre:/^[a-d].*[m-z]$/i\nSearches From field using regular expression +info.tore=tore:/^[a-d].*[m-z]$/i\nSearches recipients(To/Cc/Bcc) field using regular expression +info.newer_than=n:8 or nt:7week or newer_than:1year +info.only=only:tom\ntom should be the only recipients in to field +info.regex=regex:/^begin/i or re:end$ or r:/\d+\s*\d+/\nSubject matches +info.headerre=headerre:List-Id=/all-test/i or h:list-id or hr:header~/^value/ +info.simple=simple:hello'\nSubject field contains, support special characters +info.status=is:replied or i:UnRead or status:Forwarded or status:F\nThe status can be one of Replied, Read, Marked/Star, Forwarded, UnRead, New, ImapDeleted or Attachment. +info.subject=subject:(Hello -World!)\nSearches Subject to Contains Hello but not World! +info.tag=tag:Important\nTag contains\ntag:NA means no tag +info.to=To or CC field contains +info.tonocc=To fileld contains +info.size=size:10 or size:1.4M\nMessage Size big than +info.smaller=smaller:1G or sm:1024\nMessage Size less than +info.gloda=Trigger gloda search if enabled + +# for virtual folder select +virtualfolder.selectall=Select All +virtualfolder.clearall=Clear All +virtualfolder.modelabel=When click change: +virtualfolder.modesingle=Current Only +virtualfolder.modechild=Current & Children +virtualfolder.modedescendants=Current & Descendants + +# If you can localize the help document, please change "content" to "locale" below and put localized document under locale dir +expressionsearch.helpfile=chrome://expressionsearch/content/help.html From 0d3bc522661b563f654d520ced7bd25a60251ab8 Mon Sep 17 00:00:00 2001 From: Till Riedel Date: Wed, 8 Jul 2020 00:42:38 +0200 Subject: [PATCH 3/4] looser max version string --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 660ce07..20a5486 100644 --- a/manifest.json +++ b/manifest.json @@ -3,7 +3,7 @@ "gecko": { "id": "{03EF8A6E-C972-488f-92FA-98ABC2C9F8B9}", "strict_min_version": "68.0", - "strict_max_version": "68.9" + "strict_max_version": "68.*" } }, "version": "1.4.2", From 1fd64d168b0d2dfcef155bf510e472e34fc3d0ac Mon Sep 17 00:00:00 2001 From: Till Riedel Date: Wed, 8 Jul 2020 00:53:25 +0200 Subject: [PATCH 4/4] add release into repo (strange but...) --- .../gmailui-1.4.2-tb.xpi | Bin 109376 -> 134060 bytes 1 file changed, 0 insertions(+), 0 deletions(-) rename beta/gmailui-1.4-tb.xpi => releases/gmailui-1.4.2-tb.xpi (59%) diff --git a/beta/gmailui-1.4-tb.xpi b/releases/gmailui-1.4.2-tb.xpi similarity index 59% rename from beta/gmailui-1.4-tb.xpi rename to releases/gmailui-1.4.2-tb.xpi index 69bf779e38320b8c6bf3d469a6086421a56a03ba..2486d033e6034a25e5d3db903f57c1c636063a6f 100644 GIT binary patch delta 45355 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 delta 23481 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