mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-11-15 22:34:51 +00:00
Merge branch 'master' into confetti-plugin
This commit is contained in:
commit
b8fdb320dc
@ -26,10 +26,10 @@ caption: {{$:/language/ControlPanel/Basics/Caption}}
|
||||
|<$link to="$:/SiteSubtitle"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler="$:/SiteSubtitle" default="" tag="input"/> |
|
||||
|<$link to="$:/status/UserName"><<lingo Username/Prompt>></$link> |<$edit-text tiddler="$:/status/UserName" default="" tag="input"/> |
|
||||
|<$link to="$:/config/AnimationDuration"><<lingo AnimDuration/Prompt>></$link> |<$edit-text tiddler="$:/config/AnimationDuration" default="" tag="input"/> |
|
||||
|<$link to="$:/DefaultTiddlers"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit class="tc-edit-texteditor" tiddler="$:/DefaultTiddlers"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |
|
||||
|<$link to="$:/DefaultTiddlers"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit class="tc-edit-texteditor" tiddler="$:/DefaultTiddlers" autoHeight="yes"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |
|
||||
|<$link to="$:/language/DefaultNewTiddlerTitle"><<lingo NewTiddler/Title/Prompt>></$link> |<$edit-text tiddler="$:/language/DefaultNewTiddlerTitle" default="" tag="input"/> |
|
||||
|<$link to="$:/config/NewJournal/Title"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler="$:/config/NewJournal/Title" default="" tag="input"/> |
|
||||
|<$link to="$:/config/NewJournal/Text"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler="$:/config/NewJournal/Text" class="tc-edit-texteditor" default=""/> |
|
||||
|<$link to="$:/config/NewJournal/Text"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler="$:/config/NewJournal/Text" class="tc-edit-texteditor" default="" autoHeight="yes"/> |
|
||||
|<$link to="$:/config/NewTiddler/Tags"><<lingo NewTiddler/Tags/Prompt>></$link> |<$vars currentTiddler="$:/config/NewTiddler/Tags" tagField="text">{{||$:/core/ui/EditTemplate/tags}}<$list filter="[<currentTiddler>tags[]] +[limit[1]]" variable="ignore"><$button tooltip={{$:/language/ControlPanel/Basics/RemoveTags/Hint}}><<lingo RemoveTags>><$action-listops $tiddler=<<currentTiddler>> $field="text" $subfilter={{{ [<currentTiddler>get[tags]] }}}/><$action-setfield $tiddler=<<currentTiddler>> tags=""/></$button></$list></$vars> |
|
||||
|<$link to="$:/config/NewJournal/Tags"><<lingo NewJournal/Tags/Prompt>></$link> |<$vars currentTiddler="$:/config/NewJournal/Tags" tagField="text">{{||$:/core/ui/EditTemplate/tags}}<$list filter="[<currentTiddler>tags[]] +[limit[1]]" variable="ignore"><$button tooltip={{$:/language/ControlPanel/Basics/RemoveTags/Hint}}><<lingo RemoveTags>><$action-listops $tiddler=<<currentTiddler>> $field="text" $subfilter={{{ [<currentTiddler>get[tags]] }}}/><$action-setfield $tiddler=<<currentTiddler>> tags=""/></$button></$list></$vars> |
|
||||
|<$link to="$:/config/AutoFocus"><<lingo AutoFocus/Prompt>></$link> |{{$:/snippets/minifocusswitcher}} |
|
||||
|
@ -1,6 +1,6 @@
|
||||
caption: 5.3.2
|
||||
created: 20230820114855583
|
||||
modified: 20230820114855583
|
||||
created: 20231016122502955
|
||||
modified: 20231016122502955
|
||||
tags: ReleaseNotes
|
||||
title: Release 5.3.2
|
||||
type: text/vnd.tiddlywiki
|
||||
@ -8,6 +8,47 @@ description: Under development
|
||||
|
||||
//[[See GitHub for detailed change history of this release|https://github.com/Jermolene/TiddlyWiki5/compare/v5.3.1...master]]//
|
||||
|
||||
! Major Improvements
|
||||
|
||||
!! Conditional Shortcut Syntax
|
||||
|
||||
<<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/7710">> a new [[shortcut syntax|Conditional Shortcut Syntax]] for concisely expressing if-then-else logic. For example:
|
||||
|
||||
```
|
||||
<% if [<animal>match[Elephant]] %>
|
||||
It is an elephant
|
||||
<% else %>
|
||||
<% if [<animal>match[Giraffe]] %>
|
||||
It is a giraffe
|
||||
<% else %>
|
||||
It is completely unknown
|
||||
<% endif %>
|
||||
<% endif %>
|
||||
```
|
||||
|
||||
!! Explicit Templates for the ListWidget
|
||||
|
||||
<<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/7784">> support for `<$list-template>` and `<$list-empty>` as immediate children of the <<.wid "ListWidget">> widget to specify the list item template and/or the empty template. Note that the <<.attr "emptyMessage">> and <<.attr "template">> attributes take precedence if they are present. For example:
|
||||
|
||||
```
|
||||
<$list filter=<<filter>>>
|
||||
<$list-template>
|
||||
<$text text=<<currentTiddler>>/>
|
||||
</$list-template>
|
||||
<$list-empty>
|
||||
None!
|
||||
</$list-empty>
|
||||
</$list>
|
||||
```
|
||||
|
||||
!! jsonset operator
|
||||
|
||||
<<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/7742">> [[jsonset Operator]] for setting values within JSON objects
|
||||
|
||||
!! QR Code Reader
|
||||
|
||||
<<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/7746">> QR Code plugin to be able to read QR codes and a number of other bar code formats
|
||||
|
||||
! Translation improvement
|
||||
|
||||
Improvements to the following translations:
|
||||
@ -18,7 +59,8 @@ Improvements to the following translations:
|
||||
|
||||
! Plugin Improvements
|
||||
|
||||
* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/1be8f0a9336952d4745d2bd4f2327e353580a272">> comments plugin to use predefined palette colours
|
||||
* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/1be8f0a9336952d4745d2bd4f2327e353580a272">> Comments Plugin to use predefined palette colours
|
||||
* <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/pull/7785">> Evernote Importer Plugin to support images and other attachments
|
||||
|
||||
! Widget Improvements
|
||||
|
||||
@ -43,6 +85,8 @@ Improvements to the following translations:
|
||||
* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/7749">> editor "type" dropdown state tiddlers
|
||||
* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/7712">> handling of "counter-last" variable when appending items with the ListWidget
|
||||
* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/6088">> upgrade download link in Firefox
|
||||
* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/7698">> refreshing of transcluded functions
|
||||
* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/7789">> resizing of height of textareas in control panel
|
||||
|
||||
! Node.js Improvements
|
||||
|
||||
|
@ -15,6 +15,7 @@ For details see: https://blog.evernote.com/tech/2013/08/08/evernote-export-forma
|
||||
"use strict";
|
||||
|
||||
// DOMParser = require("$:/plugins/tiddlywiki/xmldom/dom-parser").DOMParser;
|
||||
var illegalFilenameCharacters = /[\[\]<>;\:\"\/\\\|\?\*\^\?\$\(\)\s~]/g;
|
||||
|
||||
/*
|
||||
Parse an ENEX file into tiddlers
|
||||
@ -23,10 +24,13 @@ exports["application/enex+xml"] = function(text,fields) {
|
||||
// Collect output tiddlers in an array
|
||||
var results = [];
|
||||
// Parse the XML document
|
||||
var parser = new DOMParser(),
|
||||
doc = parser.parseFromString(text,"application/xml");
|
||||
var doc = new DOMParser().parseFromString(text,"application/xml");
|
||||
// Output a report tiddler with information about the import
|
||||
var enex = doc.querySelector("en-export");
|
||||
if(!enex) {
|
||||
// Firefox's DOMParser have problem in some cases.
|
||||
throw new Error('Failed to parse ENEX file, no "en-export" node found, try use Chrome/Edge to export again.');
|
||||
}
|
||||
results.push({
|
||||
title: "Evernote Import Report",
|
||||
text: "Evernote file imported on " + enex.getAttribute("export-date") + " from " + enex.getAttribute("application") + " (" + enex.getAttribute("version") + ")"
|
||||
@ -34,47 +38,102 @@ exports["application/enex+xml"] = function(text,fields) {
|
||||
// Get all the "note" nodes
|
||||
var noteNodes = doc.querySelectorAll("note");
|
||||
$tw.utils.each(noteNodes,function(noteNode) {
|
||||
var result = {
|
||||
title: getTextContent(noteNode,"title"),
|
||||
type: "text/html",
|
||||
var noteTitle = getTextContent(noteNode,"title");
|
||||
// get real note content node
|
||||
var contentNode = noteNode.querySelector("content")
|
||||
var contentText = (contentNode.textContent || "").replace(/ /g, ' ').trim();
|
||||
if(contentText) {
|
||||
// The final content will be HTML instead of xml. And we will save it as wikitext, to make wiki syntax work, and remaining HTML will also work.
|
||||
try {
|
||||
// may error if content is not valid XML
|
||||
contentNode = new DOMParser().parseFromString(contentText,"application/xml").querySelector("en-note") || contentNode;
|
||||
} catch(e) {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
// process main content and metadata, and save as wikitext tiddler.
|
||||
var noteResult = {
|
||||
title: noteTitle.replace(illegalFilenameCharacters,"_"),
|
||||
tags: [],
|
||||
text: getTextContent(noteNode,"content"),
|
||||
modified: convertDate(getTextContent(noteNode,"created")),
|
||||
created: convertDate(getTextContent(noteNode,"created"))
|
||||
|
||||
modified: convertDate(getTextContent(noteNode,"updated") || getTextContent(noteNode,"created")),
|
||||
modifier: getTextContent(noteNode,"author"),
|
||||
created: convertDate(getTextContent(noteNode,"created")),
|
||||
creator: getTextContent(noteNode,"author")
|
||||
};
|
||||
// process resources (images, PDFs, etc.)
|
||||
$tw.utils.each(noteNode.querySelectorAll("resource"),function(resourceNode) {
|
||||
// hash generated by applying https://github.com/vzhd1701/evernote-backup/pull/54
|
||||
var hash = resourceNode.querySelector("data").getAttribute("hash");
|
||||
var text = getTextContent(resourceNode,"data");
|
||||
var mimeType = getTextContent(resourceNode,"mime");
|
||||
var contentTypeInfo = $tw.config.contentTypeInfo[mimeType] || {extension:""};
|
||||
var title = getTextContent(resourceNode,"resource-attributes>file-name")
|
||||
// a few resources don't have title, use hash as fallback
|
||||
title = title || (hash + contentTypeInfo.extension);
|
||||
// replace all system reserved characters in title
|
||||
title = title.replace(illegalFilenameCharacters,"_");
|
||||
// prefix image title with note title, to avoid name conflicts which is quite common in web-clipped content
|
||||
title = noteResult.title + "/" + title;
|
||||
results.push({
|
||||
title: title,
|
||||
type: mimeType,
|
||||
width: getTextContent(resourceNode,"width"),
|
||||
height: getTextContent(resourceNode,"height"),
|
||||
text: text,
|
||||
// give image same modified and modifier as the note, so they can be grouped together in the "Recent"
|
||||
modified: noteResult.modified,
|
||||
modifier: noteResult.modifier,
|
||||
created: noteResult.created,
|
||||
creator: noteResult.creator
|
||||
});
|
||||
if(hash) {
|
||||
fixAttachmentReference(contentNode, hash, mimeType, title);
|
||||
}
|
||||
});
|
||||
// export mixed content of wikitext and HTML
|
||||
noteResult.text = contentNode.innerHTML;
|
||||
// remove all ` xmlns="http://www.w3.org/1999/xhtml"` attributes to save some space
|
||||
noteResult.text = noteResult.text.replace(/ xmlns="http:\/\/www.w3.org\/1999\/xhtml"/g, "");
|
||||
$tw.utils.each(noteNode.querySelectorAll("tag"),function(tagNode) {
|
||||
result.tags.push(tagNode.textContent);
|
||||
noteResult.tags.push(tagNode.textContent);
|
||||
});
|
||||
// If there's an update date, set modifiy date accordingly
|
||||
var update = getTextContent(noteNode,"updated");
|
||||
if(update) {
|
||||
result.modified = convertDate(update);
|
||||
noteResult.modified = convertDate(update);
|
||||
}
|
||||
$tw.utils.each(noteNode.querySelectorAll("note-attributes>*"),function(attrNode) {
|
||||
result[attrNode.tagName] = attrNode.textContent;
|
||||
});
|
||||
results.push(result);
|
||||
$tw.utils.each(noteNode.querySelectorAll("resource"),function(resourceNode) {
|
||||
results.push({
|
||||
title: getTextContent(resourceNode,"resource-attributes>file-name"),
|
||||
type: getTextContent(resourceNode,"mime"),
|
||||
width: getTextContent(resourceNode,"width"),
|
||||
height: getTextContent(resourceNode,"height"),
|
||||
text: getTextContent(resourceNode,"data")
|
||||
});
|
||||
noteResult[attrNode.tagName] = attrNode.textContent;
|
||||
});
|
||||
results.push(noteResult);
|
||||
});
|
||||
// Return the output tiddlers
|
||||
return results;
|
||||
};
|
||||
|
||||
function getTextContent(node,selector) {
|
||||
return (node.querySelector(selector) || {}).textContent;
|
||||
return (node.querySelector(selector) || {}).textContent || "";
|
||||
}
|
||||
|
||||
function convertDate(isoDate) {
|
||||
return (isoDate || "").replace("T","").replace("Z","") + "000"
|
||||
}
|
||||
|
||||
function fixAttachmentReference(contentNode, md5Hash, mimeType, name) {
|
||||
if(!contentNode) return;
|
||||
var mediaNode = contentNode.querySelector('en-media[hash="' + md5Hash + '"]');
|
||||
if(!name) {
|
||||
throw new Error("name is empty for resource hash" + md5Hash);
|
||||
}
|
||||
if(!mediaNode) return;
|
||||
if(mimeType.indexOf("image/") === 0) {
|
||||
// find en-media node, replace with image syntax
|
||||
mediaNode.parentNode.replaceChild($tw.utils.domMaker("p", {text: "[img["+ name + "]]"}), mediaNode);
|
||||
} else {
|
||||
// For other than image attachments, we make a link to the tiddler
|
||||
mediaNode.parentNode.replaceChild($tw.utils.domMaker("p", {text: "[["+ name + "]]"}), mediaNode);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
})();
|
||||
|
@ -5,6 +5,7 @@ This plugin contains tool to assist migration of content from Evernote ENEX file
|
||||
!! Instructions
|
||||
|
||||
# Download or save your ENEX file from Evernote
|
||||
## Use [ext[evernote-backup|https://github.com/vzhd1701/evernote-backup]] to export ENEX file with resource hash, so images can be linked in the note
|
||||
# Rename the file to have an `.enex` extension
|
||||
# Drag the file into the TiddlyWiki browser window
|
||||
## Alternatively, click the "Import" button in the "Tools" sidebar tab
|
||||
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user