License: LGPL-2.1
License: LGPL-2.1
diff -Nru xnote-4.1.12/debian/dpb.conf xnote-4.5.48/debian/dpb.conf
--- xnote-4.1.12/debian/dpb.conf 1970-01-01 00:00:00.000000000 +0000
+++ xnote-4.5.48/debian/dpb.conf 2025-09-25 07:56:32.000000000 +0000
@@ -0,0 +1,18 @@
+#!/bin/bash
+# debian/dpb.conf
+# ConfigFile for XNotePP
+# This file is used by the scripts from
+# debian-package-scripts
+## General parameters
+SourceName=xnote
+PackName=webext-xnotepp
+SalsaName=webext-team/xnote
+RecentBranch=debian/trixie
+RecentUpstreamSuffix=xpi
+## Parameters for Java packages
+JavaFlag=0
+## Parameters for Webext packages
+WebextFlag=1
+## Parameters for Python3 packages
+PythonFlag=0
+RecentBranchD=unstable
diff -Nru xnote-4.1.12/debian/gbp.conf xnote-4.5.48/debian/gbp.conf
--- xnote-4.1.12/debian/gbp.conf 1970-01-01 00:00:00.000000000 +0000
+++ xnote-4.5.48/debian/gbp.conf 2025-09-25 07:56:32.000000000 +0000
@@ -0,0 +1,21 @@
+# Configuration file for git-buildpackage and friends
+
+[DEFAULT]
+# use pristine-tar:
+pristine-tar = True
+# generate gz compressed orig file
+compression = gz
+debian-branch = debian/trixie
+upstream-branch = upstream
+
+[pq]
+patch-numbers = False
+
+[dch]
+id-length = 7
+
+[import-orig]
+# filter out unwanted files/dirs from upstream
+filter = [ '.cvsignore', '.gitignore', '.github', '.hgtags', '.hgignore', '*.orig', '*.rej' ]
+# filter the files out of the tarball passed to pristine-tar
+filter-pristine-tar = True
diff -Nru xnote-4.1.12/debian/upstream/metadata xnote-4.5.48/debian/upstream/metadata
--- xnote-4.1.12/debian/upstream/metadata 2023-09-03 09:17:55.000000000 +0000
+++ xnote-4.5.48/debian/upstream/metadata 2025-08-23 13:36:08.000000000 +0000
@@ -6,3 +6,4 @@
Documentation: https://github.com/xnotepp/xnote/wiki
Repository: https://github.com/xnotepp/xnote.git
Repository-Browse: https://github.com/xnotepp/xnote
+Reference: https://addons.thunderbird.net/en-US/thunderbird/addon/xnotepp/versions/
diff -Nru xnote-4.1.12/debian/watch xnote-4.5.48/debian/watch
--- xnote-4.1.12/debian/watch 2023-09-03 09:17:55.000000000 +0000
+++ xnote-4.5.48/debian/watch 2025-08-23 13:04:48.000000000 +0000
@@ -3,4 +3,4 @@
repack,compression=xz,\
uversionmangle=s/-?([^\d.]+)/~$1/;tr/A-Z/a-z/,\
filenamemangle=s/.+\/v?(\d\S+)\.*/$1/,
-https://addons.thunderbird.net/en-US/thunderbird/addon/xnotepp/versions/ (\d.\d.\d)
+https://addons.thunderbird.net/en-US/thunderbird/addon/xnotepp/versions/ (\d[\d\.]+)*
diff -Nru xnote-4.1.12/experiment-apis/LegacyPrefs/legacyprefs.js xnote-4.5.48/experiment-apis/LegacyPrefs/legacyprefs.js
--- xnote-4.1.12/experiment-apis/LegacyPrefs/legacyprefs.js 2023-10-01 18:59:06.000000000 +0000
+++ xnote-4.5.48/experiment-apis/LegacyPrefs/legacyprefs.js 2025-03-11 09:28:10.000000000 +0000
@@ -1,8 +1,11 @@
/* eslint-disable object-shorthand */
-var { ExtensionCommon } = ChromeUtils.import("resource://gre/modules/ExtensionCommon.jsm");
+var { ExtensionCommon } = ChromeUtils.import ? ChromeUtils.import("resource://gre/modules/ExtensionCommon.jsm")
+: ChromeUtils.importESModule(
+ "resource://gre/modules/ExtensionCommon.sys.mjs"
+);
//var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
-var Services = globalThis.Services || ChromeUtils.import("resource://gre/modules/Services.jsm").Services;
+//var Services = globalThis.Services || ChromeUtils.import("resource://gre/modules/Services.jsm").Services;
var LegacyPrefs = class extends ExtensionCommon.ExtensionAPI {
getAPI(context) {
diff -Nru xnote-4.1.12/experiment-apis/NotifyTools/implementation.js xnote-4.5.48/experiment-apis/NotifyTools/implementation.js
--- xnote-4.1.12/experiment-apis/NotifyTools/implementation.js 2023-09-22 20:00:30.000000000 +0000
+++ xnote-4.5.48/experiment-apis/NotifyTools/implementation.js 2025-03-11 09:28:26.000000000 +0000
@@ -15,10 +15,16 @@
*/
// Get various parts of the WebExtension framework that we need.
-var { ExtensionCommon } = ChromeUtils.import("resource://gre/modules/ExtensionCommon.jsm");
-var { ExtensionSupport } = ChromeUtils.import("resource:///modules/ExtensionSupport.jsm");
+var { ExtensionCommon } = ChromeUtils.import ? ChromeUtils.import("resource://gre/modules/ExtensionCommon.jsm")
+: ChromeUtils.importESModule(
+ "resource://gre/modules/ExtensionCommon.sys.mjs"
+);
+var { ExtensionSupport } = ChromeUtils.import ? ChromeUtils.import("resource:///modules/ExtensionSupport.jsm")
+: ChromeUtils.importESModule(
+ "resource:///modules/ExtensionSupport.sys.mjs"
+);
//var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
-var Services = globalThis.Services || ChromeUtils.import("resource://gre/modules/Services.jsm").Services;
+//var Services = globalThis.Services || ChromeUtils.import("resource://gre/modules/Services.jsm").Services;
var NotifyTools = class extends ExtensionCommon.ExtensionAPI {
getAPI(context) {
diff -Nru xnote-4.1.12/experiment-apis/WindowListener/implementation.js xnote-4.5.48/experiment-apis/WindowListener/implementation.js
--- xnote-4.1.12/experiment-apis/WindowListener/implementation.js 2023-11-01 21:24:38.000000000 +0000
+++ xnote-4.5.48/experiment-apis/WindowListener/implementation.js 2025-03-11 09:20:08.000000000 +0000
@@ -2,9 +2,9 @@
* This file is provided by the addon-developer-support repository at
* https://github.com/thundernest/addon-developer-support
*
- * Version 1.62
+ * Version 1.62a
*
- * Author: John Bieling (john@thunderbird.net)
+ * Author: John Bieling (john@thunderbird.net), some fixes by opto/Klaus Buecher
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -12,14 +12,16 @@
*/
// Import some things we need.
-var { ExtensionCommon } = ChromeUtils.import(
- "resource://gre/modules/ExtensionCommon.jsm"
+var { ExtensionCommon } = ChromeUtils.import ? ChromeUtils.import("resource://gre/modules/ExtensionCommon.jsm")
+: ChromeUtils.importESModule(
+ "resource://gre/modules/ExtensionCommon.sys.mjs"
);
-var { ExtensionSupport } = ChromeUtils.import(
- "resource:///modules/ExtensionSupport.jsm"
+var { ExtensionSupport } = ChromeUtils.import ? ChromeUtils.import("resource:///modules/ExtensionSupport.jsm")
+: ChromeUtils.importESModule(
+ "resource:///modules/ExtensionSupport.sys.mjs"
);
-var Services = globalThis.Services ||
- ChromeUtils.import("resource://gre/modules/Services.jsm").Services;
+//var Services = globalThis.Services || ChromeUtils.import(
+// "resource://gre/modules/Services.jsm").Services;
function getThunderbirdVersion() {
let parts = Services.appinfo.version.split(".");
@@ -280,11 +282,11 @@
for (let api of apis) {
switch (api) {
case "storage":
- XPCOMUtils.defineLazyGetter(messenger, "storage", () => getStorage());
+ ChromeUtils.defineLazyGetter(messenger, "storage", () => getStorage());
break;
default:
- XPCOMUtils.defineLazyGetter(messenger, api, () =>
+ ChromeUtils.defineLazyGetter(messenger, api, () =>
context.apiCan.findAPIPath(api)
);
}
@@ -430,7 +432,7 @@
Services.scriptloader.loadSubScript(url, prefsObj, "UTF-8");
},
- registerChromeUrl(data) {
+ async registerChromeUrl(data) {
let chromeData = [];
let resourceData = [];
for (let entry of data) {
@@ -462,7 +464,7 @@
uri,
resProto.ALLOW_CONTENT_ACCESS
);
- }
+ }
self.chromeData = chromeData;
self.resourceData = resourceData;
@@ -1322,11 +1324,11 @@
for (let api of apis) {
switch (api) {
case "storage":
- XPCOMUtils.defineLazyGetter(messenger, "storage", () => getStorage());
+ ChromeUtils.defineLazyGetter(messenger, "storage", () => getStorage());
break;
default:
- XPCOMUtils.defineLazyGetter(messenger, api, () =>
+ ChromeUtils.defineLazyGetter(messenger, api, () =>
context.apiCan.findAPIPath(api)
);
}
@@ -1478,8 +1480,8 @@
let url = context.extension.rootURI.resolve(defaultUrl);
let prefsObj = {};
- prefsObj.Services = globalThis.Services||
- ChromeUtils.import("resource://gre/modules/Services.jsm").Services;
+ prefsObj.Services = Services;//globalThis.Services||
+ // ChromeUtils.import("resource://gre/modules/Services.jsm").Services;
prefsObj.pref = function (aName, aDefault) {
let defaults = Services.prefs.getDefaultBranch("");
switch (typeof aDefault) {
@@ -1537,7 +1539,8 @@
uri,
resProto.ALLOW_CONTENT_ACCESS
);
- }
+ console.log("set resource url", uri);
+ }
self.chromeData = chromeData;
self.resourceData = resourceData;
diff -Nru xnote-4.1.12/experiment-apis/WindowListener/schema.json xnote-4.5.48/experiment-apis/WindowListener/schema.json
--- xnote-4.1.12/experiment-apis/WindowListener/schema.json 2023-09-22 20:00:30.000000000 +0000
+++ xnote-4.5.48/experiment-apis/WindowListener/schema.json 2024-10-07 13:09:24.000000000 +0000
@@ -32,6 +32,7 @@
{
"name": "data",
"type": "array",
+ "async": true,
"items": {
"type": "array",
"items": {
diff -Nru xnote-4.1.12/experiment-apis/customColumn/implementation.js xnote-4.5.48/experiment-apis/customColumn/implementation.js
--- xnote-4.1.12/experiment-apis/customColumn/implementation.js 1970-01-01 00:00:00.000000000 +0000
+++ xnote-4.5.48/experiment-apis/customColumn/implementation.js 2025-03-11 09:20:32.000000000 +0000
@@ -0,0 +1,98 @@
+var { ExtensionCommon } = ChromeUtils.import ? ChromeUtils.import("resource://gre/modules/ExtensionCommon.jsm")
+: ChromeUtils.importESModule(
+ "resource://gre/modules/ExtensionCommon.sys.mjs"
+);
+var { ExtensionSupport } = ChromeUtils.import ? ChromeUtils.import("resource:///modules/ExtensionSupport.jsm")
+: ChromeUtils.importESModule(
+ "resource:///modules/ExtensionSupport.sys.mjs"
+);
+
+var ThreadPaneColumns;
+try {
+ ({ ThreadPaneColumns } = ChromeUtils.importESModule("chrome://messenger/content/thread-pane-columns.mjs"));
+}
+catch (err) {
+ ({ ThreadPaneColumns } = ChromeUtils.importESModule("chrome://messenger/content/ThreadPaneColumns.mjs"));
+}
+
+
+var customColumnIds = [];
+var test = {};
+
+var customColumn = class extends ExtensionCommon.ExtensionAPI {
+ getAPI(context) {
+ context.callOnClose(this);
+ return {
+ customColumn: {
+ async refreshColumn(id) {
+ ThreadPaneColumns.refreshCustomColumn(id);
+ },
+
+ async add(id) {
+ var { xnote } = ChromeUtils.import ? ChromeUtils.import("resource://xnote/modules/xnote.jsm")
+ : ChromeUtils.importESModule("resource://xnote/modules/xnote.sys.mjs");
+ let customColumn = ThreadPaneColumns.getCustomColumns().find(
+ c => c.id == id
+ );
+ if (!customColumn) {
+ customColumnIds.push(id);
+
+ function getXNote(message) {
+ let xnotePrefs = xnote.ns.Commons.xnotePrefs;
+ let ic = '\u{1F4D2}';
+ let note = new xnote.ns.Note(message.messageId);
+ if (note.exists()) {
+ if (xnotePrefs.show_first_x_chars_in_col > 0) {
+
+ return ic + " " + note.text.substr(0, xnotePrefs.show_first_x_chars_in_col);//ic + " " +
+ } else {
+ return ic;
+ }
+ }
+ else {
+ return "";
+ }
+ }
+
+ if (typeof ThreadPaneColumns !== "undefined") {
+ ThreadPaneColumns.addCustomColumn(id, {
+ name: '\u{1F4D2}' + "XNote",
+ hidden: false,
+ // iconCallback: getImageSrc,
+ icon: false,
+ // iconHeaderUrl: "resource://xnote/skin/xnote_context.png",
+ resizable: true,
+ sortable: true,
+ textCallback: getXNote,
+ });
+ } else {
+ console.error("ThreadPaneColumns is not defined.");
+ };
+ };
+ },
+
+ async remove(id) {
+ const customColumn = ThreadPaneColumns.getCustomColumns().find(
+ c => c.id == id
+ );
+ if (customColumn) {
+ if (typeof ThreadPaneColumns !== "undefined") {
+ ThreadPaneColumns.removeCustomColumn(id);
+ }
+ customColumnIds = customColumnIds.filter(e => e !== id);
+ };
+ },
+ },
+ };
+ }
+
+ close() {
+ for (const id of customColumnIds) {
+ try {
+ ThreadPaneColumns.removeCustomColumn(id);
+ } catch (e) {
+ console.error(e);
+ }
+ }
+ }
+};
diff -Nru xnote-4.1.12/experiment-apis/customColumn/schema.json xnote-4.5.48/experiment-apis/customColumn/schema.json
--- xnote-4.1.12/experiment-apis/customColumn/schema.json 1970-01-01 00:00:00.000000000 +0000
+++ xnote-4.5.48/experiment-apis/customColumn/schema.json 2025-01-03 23:14:32.000000000 +0000
@@ -0,0 +1,39 @@
+[
+ {
+ "namespace": "customColumn",
+ "functions": [
+ {
+ "name": "add",
+ "type": "function",
+ "async": true,
+ "parameters": [
+ {
+ "type": "string",
+ "name": "id"
+ } ]
+ },
+ {
+ "name": "remove",
+ "type": "function",
+ "async": true,
+ "parameters": [
+ {
+ "type": "string",
+ "name": "id"
+ }
+ ]
+ },
+ {
+ "name": "refreshColumn",
+ "type": "function",
+ "async": true,
+ "parameters": [
+ {
+ "type": "string",
+ "name": "id"
+ }
+ ]
+ }
+ ]
+ }
+]
diff -Nru xnote-4.1.12/experiment-apis/files/files-api.js xnote-4.5.48/experiment-apis/files/files-api.js
--- xnote-4.1.12/experiment-apis/files/files-api.js 2023-09-22 20:00:30.000000000 +0000
+++ xnote-4.5.48/experiment-apis/files/files-api.js 2025-03-11 09:27:56.000000000 +0000
@@ -1,4 +1,7 @@
-var { ExtensionCommon } = ChromeUtils.import("resource://gre/modules/ExtensionCommon.jsm");//,
+var { ExtensionCommon } = ChromeUtils.import ? ChromeUtils.import("resource://gre/modules/ExtensionCommon.jsm")
+: ChromeUtils.importESModule(
+ "resource://gre/modules/ExtensionCommon.sys.mjs"
+);
// { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm"),
var Services = globalThis.Services || ChromeUtils.import("resource://gre/modules/Services.jsm").Services;
win = Services.wm.getMostRecentWindow("mail:3pane");
@@ -12,13 +15,15 @@
selectDirectory: async function (window, startDirectory, title) {
let domWindow = window;
if (domWindow == null) {
- domWindow = Services.wm.getMostRecentWindow(null);
+ domWindow = Services.wm.getMostRecentWindow("mail:3pane");
}
let fp = Components.classes["@mozilla.org/filepicker;1"]
.createInstance(Components.interfaces.nsIFilePicker);
- fp.init(domWindow, title, fp.modeGetFolder);
- let FileUtils = ChromeUtils.import("resource://gre/modules/FileUtils.jsm").FileUtils;
- let startDir = new FileUtils.File(startDirectory);
+ fp.init(domWindow.browsingContext, title, fp.modeGetFolder);
+// let FileUtils = ChromeUtils.import("resource://gre/modules/FileUtils.jsm").FileUtils;
+ let { FileUtils } = ChromeUtils.import ? ChromeUtils.import("resource://gre/modules/FileUtils.jsm")
+ : ChromeUtils.importESModule("resource://gre/modules/FileUtils.sys.mjs");
+ let startDir = new FileUtils.File(startDirectory);
fp.displayDirectory = startDir;
return new Promise(function (resolve, reject) {
fp.open(rv => {
@@ -38,7 +43,8 @@
},
appendRelativePath: async function (path, extension) {
- let FileUtils = ChromeUtils.import("resource://gre/modules/FileUtils.jsm").FileUtils;
+ let { FileUtils } = ChromeUtils.import ? ChromeUtils.import("resource://gre/modules/FileUtils.jsm")
+ : ChromeUtils.importESModule("resource://gre/modules/FileUtils.sys.mjs");
var result = new FileUtils.File(path);
result.appendRelativePath(extension);
// console.debug(result);
diff -Nru xnote-4.1.12/experiment-apis/xnote/xnote-experiments.js xnote-4.5.48/experiment-apis/xnote/xnote-experiments.js
--- xnote-4.1.12/experiment-apis/xnote/xnote-experiments.js 2024-01-09 20:06:10.000000000 +0000
+++ xnote-4.5.48/experiment-apis/xnote/xnote-experiments.js 2025-03-27 14:12:28.000000000 +0000
@@ -1,14 +1,76 @@
-var { ExtensionCommon } = ChromeUtils.import("resource://gre/modules/ExtensionCommon.jsm"),
- // { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm"),
- { TagUtils } = ChromeUtils.import("resource:///modules/TagUtils.jsm");//,
-var Services = globalThis.Services || ChromeUtils.import("resource://gre/modules/Services.jsm").Services;
+var { ExtensionCommon } = ChromeUtils.import ? ChromeUtils.import("resource://gre/modules/ExtensionCommon.jsm")
+: ChromeUtils.importESModule(
+ "resource://gre/modules/ExtensionCommon.sys.mjs"
+);
+var { TagUtils } = ChromeUtils.import ? ChromeUtils.import("resource:///modules/TagUtils.jsm")
+: ChromeUtils.importESModule("resource:///modules/TagUtils.sys.mjs");
+//var Services = globalThis.Services || ChromeUtils.import("resource://gre/modules/Services.jsm").Services;
var win = Services.wm.getMostRecentWindow("mail:3pane");
//var { FileUtils } = ChromeUtils.importESModule("resource://gre/modules/FileUtils.sys.mjs");
-var { FileUtils } = ChromeUtils.import("resource://gre/modules/FileUtils.jsm");
+//var { FileUtils } = ChromeUtils.import("resource://gre/modules/FileUtils.jsm");
+var { FileUtils } = ChromeUtils.import ? ChromeUtils.import("resource://gre/modules/FileUtils.jsm")
+: ChromeUtils.importESModule("resource://gre/modules/FileUtils.sys.mjs");
+
+
+async function wait(t) {
+ // let t = 5000;
+ await new Promise(resolve => win.setTimeout(resolve, t));
+ // console.log("waited in exp");
+}
+
+var resProto = Cc[
+ "@mozilla.org/network/protocol;1?name=resource"
+].getService(Ci.nsISubstitutingProtocolHandler);
+
+
+function waitForResourceUrl() {
+ let res = false;
+ let i = 0;
+
+ for (let i = 0; i < 5000; i++) {
+ //do {
+ try {
+ res = resProto.hasSubstitution("xnote");
+ }
+
+ catch (ev) { };
+ i++;
+ // console.log("res url exists", i, res);
+ if (res) break;
+ // await wait (100);
+ // } while (!res);
+ };
+};
+
+
+
+async function waitForResourceUrlA() {
+ let res = false;
+ let i = 0;
+
+ for (let i = 0; i < 5000; i++) {
+ //do {
+ try {
+ res = resProto.hasSubstitution("xnote");
+ }
+
+ catch (ev) { };
+ i++;
+ // console.log("res url exists", i, res);
+ if (res) break;
+ await wait(100);
+ // } while (!res);
+ };
+};
+
+
+//waitForResourceUrl();
+//var { xnote } = ChromeUtils.import("resource://xnote/modules/xnote.jsm");
+var xnote;
+
-var { xnote } = ChromeUtils.import("resource://xnote/modules/xnote.jsm");
const XNOTE_BASE_PREF_NAME = "extensions.xnote.";
@@ -76,7 +138,21 @@
getAPI(context) {
return {
xnoteapi: {
+
+
+ async loadXNoteJSM() {
+ // await waitForResourceUrlA();
+ let xnoteloc = ChromeUtils.import ? ChromeUtils.import("resource://xnote/modules/xnote.jsm")
+ : ChromeUtils.importESModule("resource://xnote/modules/xnote.sys.mjs");
+ await wait(2000);
+ // console.log("xnote", xnoteloc);
+ xnote = xnoteloc.xnote;
+
+ },
+
+
async init() {
+
xnote.ns.Commons.init();
// console.log("context", context );
xnote.ns.Commons.context = context;
@@ -112,7 +188,7 @@
"chrome,dialog=no,all,screenX=" + left + ",screenY=" + upper + ",height=200,width=200");
- console.log("xnotewnd-exp", window.xnoteOverlayObj.xnoteWindow, window);
+ // console.log("xnotewnd-exp", window.xnoteOverlayObj.xnoteWindow, window);
// debugger;
@@ -125,7 +201,7 @@
let msgHdr = context.extension.messageManager.get(messageId);
wnd.xnoteOverlayObj.closeNote();
wnd.xnoteOverlayObj.note = new xnote.ns.Note(msgHdr.messageId); // we could pass in the headerMessageId directly
- wnd.xnoteOverlayObj.msgHdr = msgHdr;
+ wnd.xnoteOverlayObj.msgHdr = msgHdr;
let note = wnd.xnoteOverlayObj.note;
// This uses a core function to update the currently selected message, bad, get rid of it
@@ -133,12 +209,13 @@
//now done in onload window.xnoteOverlayObj.updateTag(note.text);
let xnotePrefs = xnote.ns.Commons.xnotePrefs;
+ //console.log("open note", xnotePrefs.show_on_select, forceShowing, note.text != '', note.text);
if (
(xnotePrefs.show_on_select && note.text != '') ||
forceShowing
) {
- // console.log("shownote", note.text);
- wnd.xnoteOverlayObj.context_createNote(true);
+ // console.log("shownote", note.text);
+ wnd.xnoteOverlayObj.context_createNote(true,msgHdr.messageId); //parameter currently unused
/* */
/*
window.xnoteOverlayObj.xnoteWindow = window.openDialog(
@@ -212,6 +289,9 @@
window?.xnoteOverlayObj?.closeNote();
},
+ async isExperimentReady() {
+ return true;
+ },
async getAllXNoteKeys() {
@@ -222,53 +302,57 @@
// let fileDir = FileUtils.getFile("ProfD", ["XNote"]);
//_storageDir.clone();
//console.log("stordir", xnote.ns.Storage.noteStorageDir);
- let fileDir = xnote.ns.Storage.noteStorageDir;//Services.dirsvc.get(xnote.ns.Storage.noteStorageDir, Ci.nsIFile);
- let filename;
- // console.log("fi", fileDir, fileDir.directoryEntries);
- for (let dd of fileDir.directoryEntries) {
- // console.log("fn", dd.leafName);
- if (
- !dd.isFile() ||
- !dd.isReadable() ||
- !dd.leafName.endsWith(".xnote")
- ) {
- continue;
- };
- let jsNote = {};
-
-
-
-
+ try {
+ let fileDir = xnote.ns.Storage.noteStorageDir;//Services.dirsvc.get(xnote.ns.Storage.noteStorageDir, Ci.nsIFile);
+ let filename;
+// console.log("fi", fileDir, fileDir.directoryEntries, fileDir.directoryEntries.length);
+ for (let dd of fileDir.directoryEntries) {
+ // console.log("fn", dd.leafName);
+ if (
+ !dd.isFile() ||
+ !dd.isReadable() ||
+ !dd.leafName.endsWith(".xnote")
+ ) {
+ continue;
+ };
+ let jsNote = {};
- if (dd.isFile()) {
- try {
- filename = dd.leafName;
- keys_orig.push(filename);
- //name is: notesFile.append(escape(messageId).replace(/\//g, "%2F") + '.xnote');
- let convertedKey = filename.replace("/%2F/g", "/");
- convertedKey = unescape(filename);
- //console.log("converted fn", convertedKey);
- let hdrId = convertedKey.substring(0, convertedKey.length - 6);
- keys.push(hdrId);
- //let note = xnote.ns.Note(convertedKey.substring(0, convertedKey.length - 6));
- // console.log("legnote", note);
- //let jsn = JSON.stringify(note);
- //let jsNote1 = JSON.parse(jsn);
- // console.log("old note", filename, jsn,jsNote1);
- // note.saveNoteToLocalStorage(hdrId, jsNote1);
- // jsNote = [hdrId, jsNote1];
- // jsAll.push(jsNote);
- }
- catch (ex) {
- console.error("cannot convert xnote file", dd, ex);
+ if (dd.isFile()) {
+ try {
+
+
+ filename = dd.leafName;
+
+ keys_orig.push(filename);
+ //name is: notesFile.append(escape(messageId).replace(/\//g, "%2F") + '.xnote');
+
+ let convertedKey = filename.replace("/%2F/g", "/");
+ convertedKey = unescape(filename);
+ //console.log("converted fn", convertedKey);
+ let hdrId = convertedKey.substring(0, convertedKey.length - 6);
+ keys.push(hdrId);
+ //let note = xnote.ns.Note(convertedKey.substring(0, convertedKey.length - 6));
+ // console.log("legnote", note);
+ //let jsn = JSON.stringify(note);
+ //let jsNote1 = JSON.parse(jsn);
+ // console.log("old note", filename, jsn,jsNote1);
+ // note.saveNoteToLocalStorage(hdrId, jsNote1);
+ // jsNote = [hdrId, jsNote1];
+ // jsAll.push(jsNote);
+ }
+ catch (ex) {
+ console.error("cannot convert xnote file", dd, ex);
+ }
+ ;
}
- ;
- }
- };
+ };
+ } catch (ex) {
+ console.error("no directory entries for xnotes");
+ }
return { keys: keys, keys_orig: keys_orig };
},
@@ -359,6 +443,30 @@
return { text: note.text, date: note.modificationDate };
},
+ async syncXNote(msgKey, XNote) {
+ //not sending back to replicate after save
+ // debugger;
+ let note = new xnote.ns.Note(msgKey);
+ note.x = XNote.x;
+ note.y = XNote.y;
+ note.width = XNote.width;
+ note.height = XNote.height;
+ note.text = XNote.text;
+ note.modificationDate = XNote.modificationDate;
+ note.saveNote(false); //not sending back to replicate after save
+
+
+ },
+
+
+ async deleteXNoteFromMsgKey(msgKey) {
+ let note = new xnote.ns.Note(msgKey);
+ note.deleteNote(false); //not sending back to replicate after delete
+
+ },
+
+
+
async getXNoteFromMsgKey(msgKey) {
let note = {};
try {
@@ -376,7 +484,7 @@
} catch (ex) {
console.error(`Could not get TB mesg`);
}
- if (note == null) return false; else return JSON.parse(JSON.stringify(note));
+ if (note == null) return false; else return { note: JSON.parse(JSON.stringify(note)) };
},
@@ -386,7 +494,7 @@
async setPreferences(prefs) {
xnote.ns.Commons.xnotePrefs = prefs;
- // console.debug({"XnotePrefs" : xnote.ns.Commons.xnotePrefs});
+ // console.debug({"XnotePrefs" : xnote.ns.Commons.xnotePrefs});
xnote.ns.Storage.updateStoragePath();
xnote.ns.Commons.checkXNoteTag();
},
@@ -454,15 +562,15 @@
// console.debug(`onShutdown: isAppShutdown=${isAppShutdown}`);
if (isAppShutdown) return;
- Components.utils.unload("resource://xnote/modules/dateformat.jsm");
- Components.utils.unload("resource://xnote/modules/commons.jsm");
- Components.utils.unload("resource://xnote/modules/xnote.jsm");
+ if (Components.utils.unload) Components.utils.unload("resource://xnote/modules/dateformat.jsm");
+ if (Components.utils.unload) Components.utils.unload("resource://xnote/modules/commons.jsm");
+ if (Components.utils.unload) Components.utils.unload("resource://xnote/modules/xnote.jsm");
// invalidate the startup cache, such that after updating the addon the old
// version is no longer cached
Services.obs.notifyObservers(null, "startupcache-invalidate");
Services.obs.notifyObservers(null, "chrome-flush-caches", null);
- // console.log("end onShutdown in xn-exp")
+ // console.log("end onShutdown in xn-exp")
}
}
diff -Nru xnote-4.1.12/experiment-apis/xnote/xnote-experiments.json xnote-4.5.48/experiment-apis/xnote/xnote-experiments.json
--- xnote-4.1.12/experiment-apis/xnote/xnote-experiments.json 2023-11-02 12:52:56.000000000 +0000
+++ xnote-4.5.48/experiment-apis/xnote/xnote-experiments.json 2024-09-17 20:41:50.000000000 +0000
@@ -3,14 +3,20 @@
"namespace": "xnoteapi",
"functions": [
{
- "name": "init",
+ "name": "loadXNoteJSM",
"type": "function",
"async": true,
"parameters": []
},
+ {
+ "name": "init",
+ "type": "function",
+ "async": true,
+ "parameters": []
+ },
-
+
{
"name": "hasOpenNoteWindow",
@@ -92,6 +98,44 @@
]
},
+
+
+
+ {
+ "name": "deleteXNoteFromMsgKey",
+ "type": "function",
+ "async": true,
+ "parameters": [
+ {
+ "name": "msgKey",
+ "type": "any",
+ "description": "legacy message key"
+ }
+ ]
+ },
+
+
+
+ {
+ "name": "syncXNote",
+ "type": "function",
+ "async": true,
+ "parameters": [
+ {
+ "name": "msgKey",
+ "type": "any",
+ "description": "legacy message key"
+ },
+ {
+ "name": "XNote",
+ "type": "any",
+ "description": "XNote object"
+ }
+
+ ]
+ },
+
+
{
"name": "getXNoteFromMsgKey",
"type": "function",
@@ -107,6 +151,15 @@
{
+ "name": "isExperimentReady",
+ "type": "function",
+ "async": true,
+ "parameters": [ ]
+ },
+
+
+
+ {
"name": "getAllXNoteKeys",
"type": "function",
"async": true,
diff -Nru xnote-4.1.12/mDisplay.js xnote-4.5.48/mDisplay.js
--- xnote-4.1.12/mDisplay.js 2023-11-03 11:43:40.000000000 +0000
+++ xnote-4.5.48/mDisplay.js 2024-10-07 13:07:58.000000000 +0000
@@ -81,11 +81,15 @@
let btn = document.getElementById("chgSize");
btn.addEventListener("click", showAll, false);
//debugger;
- if (message.show_full_in_messageDisplay) showAll();
+ if (message.show_full_in_messageDisplay) {
+ //make sure it shows full, needs to be set to short for that
+ btnState = 0;
+ showAll();
+ };
}
}
function showAll() {
- // console.log("all", xnoteOrig);
+// console.log("all", xnoteOrig);
let img = document.getElementById("aa");
img.src = messenger.runtime.getURL("icons/iconfinder_minimize-2_2561246MIT16.png");
// btn.textContent = "Compact";
diff -Nru xnote-4.1.12/manifest.json xnote-4.5.48/manifest.json
--- xnote-4.1.12/manifest.json 2024-01-09 20:34:52.000000000 +0000
+++ xnote-4.5.48/manifest.json 2025-05-05 07:42:22.000000000 +0000
@@ -2,14 +2,14 @@
"manifest_version": 2,
"name": "__MSG_extensionName__",
"description": "__MSG_extensionDescription__",
- "version": "4.1.12",
+ "version": "4.5.48",
"author": "Lorenz Froihofer: support for TB >= 3.0, since Dec. 2009, Klaus Bücher since TB 78",
"homepage_url": "https://github.com/xnotepp/xnote/wiki",
- "applications": {
+ "browser_specific_settings": {
"gecko": {
"id": "xnote@froihofer.net",
"strict_min_version": "115.0",
- "strict_max_version": "115.*"
+ "strict_max_version": "138.*"
}
},
"default_locale" : "en_US",
@@ -45,7 +45,8 @@
},
- "permissions": ["activeTab", "tabs", "storage", "unlimitedStorage", "messagesRead", "messagesModify", "clipboardWrite", "accountsRead"],
+ "permissions": ["activeTab", "tabs", "storage", "unlimitedStorage", "messagesRead", "messagesModify",
+ "messagesUpdate", "clipboardWrite", "accountsRead", "notifications"],
"background": {
"scripts": ["xn-background.js"]
@@ -86,6 +87,24 @@
"paths": [["xnotefiles"]],
"script": "experiment-apis/files/files-api.js"
}
- }
+ },
+
+
+
+ "customColumn": {
+ "schema": "experiment-apis/customColumn/schema.json",
+ "parent": {
+ "scopes": [
+ "addon_parent"
+ ],
+ "paths": [
+ [
+ "customColumn"
+ ]
+ ],
+ "script": "experiment-apis/customColumn/implementation.js"
+ }
+ }
+
}
}
diff -Nru xnote-4.1.12/options/options.html xnote-4.5.48/options/options.html
--- xnote-4.1.12/options/options.html 2024-01-08 19:39:54.000000000 +0000
+++ xnote-4.5.48/options/options.html 2024-10-05 21:45:10.000000000 +0000
@@ -57,11 +57,13 @@
-
+
+
-
+
+
diff -Nru xnote-4.1.12/options/options.js xnote-4.5.48/options/options.js
--- xnote-4.1.12/options/options.js 2023-11-02 16:48:12.000000000 +0000
+++ xnote-4.5.48/options/options.js 2024-06-21 20:44:26.000000000 +0000
@@ -3,6 +3,7 @@
//The object only works if retrieved through chrome.extension, but not
//through browser.extension or messenger.extension
var bgPage = chrome.extension.getBackgroundPage();
+if (bgPage== null) console.error("no bgr page is found in options.js");
var prefs = bgPage.getPreferences();
diff -Nru xnote-4.1.12/popup/ExprSearch.html xnote-4.5.48/popup/ExprSearch.html
--- xnote-4.1.12/popup/ExprSearch.html 2023-10-30 21:09:50.000000000 +0000
+++ xnote-4.5.48/popup/ExprSearch.html 2025-01-18 18:28:10.000000000 +0000
@@ -13,7 +13,13 @@
It is now possible to search text in XNotes. This is done by using the addon Expression Search NG. You can add
- it from addons.thunderbird.net:
+ it from addons.thunderbird.net:
+
+ https://addons.thunderbird.net/thunderbird/addon/expression-search-ng/
+
+
You can search for XNotes in the current folder, and you can use general search to find XNotes over all folders.
To search in the current folder, enter xnote:text (or xn:text) into the Expression Search searchbox to search for emails having
@@ -23,5 +29,21 @@
as well as searching for XNotes not containing text or emails not having XNotes.
+
Examples for XNote search queries:
+
+ - xn:subtext
- list only emails containing subtext, anywhere in a XNote
+ - xn:subt
- list emails containing subtext, anywhere in a XNote. Other words with subt (e.g. subtle) might be
+ found as well.
+ - -xn:subtext
- list only emails not containing subtext in a XNote (but having a XNote)
+ - xn:*
- list all messages with a XNote
+ - -xn:*
- list all messages without XNotes
+ - ^xn:opto
- list all messages starting with my nickname, "opto" (all employees, here, start their notes with their name)
+ - ^xn:opto xn:contract
- list all messages starting with opto and containing the word contract
+ - ^xn:opto xn:contract f:companyname
- list all messages from companyname, which start with opto (written by
+ myself) and the XNote contains the word contract
+ - ^xn:opto age:60 xn:contract f:companyname
- as above, but list only emails from the last 60 days.
+
+
+