sobjornstad / tiddlyremember Goto Github PK
View Code? Open in Web Editor NEWEmbed Anki notes in your TiddlyWiki
Home Page: https://sobjornstad.github.io/TiddlyRemember/
License: MIT License
Embed Anki notes in your TiddlyWiki
Home Page: https://sobjornstad.github.io/TiddlyRemember/
License: MIT License
This will allow decks and tags to be assigned on a per-note basis rather than only on the tiddler in which the note is found (which may be rather unhelpful if using a workflow that involves aggregating a bunch of notes in a single tiddler).
I don't know if this is something that others would find useful but I thought I'd suggest it anyhow.
It would be cool if there was a macro that allowed you to define which Anki note-type you want to sync to, and then accepted parameters for whatever fields you want.
So for example say I have a note-type in Anki called "Book" with the fields "title", "author" and "year", it might look something like this:
<<remembercustom "20200731024148369"
note-type:"Book"
title:"The Hobbit"
author:"Tolkien"
year:"1937"
>>
Thanks for the great plugin!
Hi,
Error message received when syncing Anki to a TiddlyStudy wiki:
`Error
An error occurred. Please start Anki while holding down the shift key, which will temporarily disable the add-ons you have installed.
If the issue only occurs when add-ons are enabled, please use the Tools>Add-ons menu item to disable some add-ons and restart Anki, repeat until you discover the add-on that is causing the problem.
When you've discovered the add-on that is causing the problem, please report the issue on the add-ons section of our support site.
Debug info:
Anki 2.1.49 (dc80804a) Python 3.8.1 Qt 5.15.1 PyQt 5.15.1
Platform: Linux
Flags: frz=True ao=True sv=2
Add-ons, last update check: 2021-12-10 13:16:18
Add-ons possibly involved: TiddlyRemember
Caught exception:
Traceback (most recent call last):
File "/home/user/.local/share/Anki2/addons21/60456529/twimport.py", line 71, in _invoke_tw_command
proc = subprocess.run(cmd, cwd=wiki_path, stdout=subprocess.PIPE,
File "subprocess.py", line 512, in run
subprocess.CalledProcessError: Command '['tiddlywiki', '--verbose', '--output', '/tmp/tmpst82akfo/render', '--render', '[type[text/vnd.tiddlywiki]] [type[]] +[!is[system]]', '[encodeuricomponent[]addsuffix[.html]]', 'text/html', '$:/plugins/sobjornstad/TiddlyRemember/templates/TiddlyRememberParseable']' returned non-zero exit status 1.
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/user/.local/share/Anki2/addons21/60456529/importer.py", line 185, in join_thread
if self.handle_thread_exception():
File "/home/user/.local/share/Anki2/addons21/60456529/importer.py", line 173, in handle_thread_exception
raise exc
File "/home/user/.local/share/Anki2/addons21/60456529/importer.py", line 57, in run
self.notes = twimport.find_notes(
File "/home/user/.local/share/Anki2/addons21/60456529/twimport.py", line 247, in find_notes
render_wiki(tw_binary, wiki_folder, render_location, filter)
File "/home/user/.local/share/Anki2/addons21/60456529/twimport.py", line 175, in _render_wiki
_invoke_tw_command(cmd, wiki_path, "render wiki")
File "/home/user/.local/share/Anki2/addons21/60456529/twimport.py", line 86, in _invoke_tw_command
f"Failed to {description}: return code {proc.returncode}.\n{extra}"
UnboundLocalError: local variable 'extra' referenced before assignment`
Should extra
variable superfluous?
Thanks.
Hi, this plugin/add-on is great, thanks.
I know it's doable by tinkering in the plugin tiddlers/css, and I'll probably do it once I have some time, but could you consider having a setting that allows hiding Q/A's from the rendered tiddlers (or just showing a small icon showing that an Anki question is present at that point? At the moment, the Q/A take up a lot of space, and are kind of redundant (as I will typically have the information as part of the Tiddler's text, and then the Q/A below it).
If you point me to where and how you'd like to see this implemented, I could probably whip up a pull request t some point.
While this seems a natural fit for the front or back of a card in most cases, it imposes some limitations on what content can go there. It may be better to switch over to a <div>
element.
We'll need to preserve backwards compatibility in some way here; proving that we haven't messed up anybody's cards may be a challenge, so it might be better to save this for a major release.
Hello,
I followed the installation instructions on the TiddlyRemember wiki (so I dragged the plugin from there) and I got this error when trying to sync with my file:
Debug info:
Anki 2.1.35 (84dcaa86) Python 3.8.0 Qt 5.14.2 PyQt 5.14.2
Platform: Windows 10
Flags: frz=True ao=True sv=1
Add-ons, last update check: 2020-10-09 04:35:39
Caught exception:
Traceback (most recent call last):
File "C:\Users\Aqua8\AppData\Roaming\Anki2\addons21\60456529\twimport.py", line 58, in _invoke_tw_command
proc = subprocess.run(cmd, cwd=wiki_path, stdout=subprocess.PIPE,
File "subprocess.py", line 512, in run
subprocess.CalledProcessError: Command '['C:\Users\Aqua8\AppData\Roaming\npm\tiddlywiki.cmd', '--output', 'C:\Users\Aqua8\AppData\Local\Temp\tmp5v0mhgnd\render', '--render', '[type[text/vnd.tiddlywiki]] [type[]] +[!is[system]]', '[encodeuricomponent[]addsuffix[.html]]', 'text/html', '$:/plugins/sobjornstad/TiddlyRemember/templates/TiddlyRememberParseable']' returned non-zero exit status 1.
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Users\Aqua8\AppData\Roaming\Anki2\addons21\60456529_init_.py", line 142, in join_thread
raise self.extract_thread.exception
File "C:\Users\Aqua8\AppData\Roaming\Anki2\addons21\60456529_init_.py", line 60, in run
self.notes = twimport.find_notes(
File "C:\Users\Aqua8\AppData\Roaming\Anki2\addons21\60456529\twimport.py", line 188, in find_notes
render_wiki(tw_binary, wiki_folder, render_location, filter)
File "C:\Users\Aqua8\AppData\Roaming\Anki2\addons21\60456529\twimport.py", line 145, in _render_wiki
_invoke_tw_command(cmd, wiki_path, "render wiki")
File "C:\Users\Aqua8\AppData\Roaming\Anki2\addons21\60456529\twimport.py", line 69, in _invoke_tw_command
raise Exception(f"Failed to {description}: return code {proc.returncode}.\n"
Exception: Failed to render wiki: return code 1.
$ C:\Users\Aqua8\AppData\Roaming\npm\tiddlywiki.cmd --output C:\Users\Aqua8\AppData\Local\Temp\tmp5v0mhgnd\render --render [type[text/vnd.tiddlywiki]] [type[]] +[!is[system]] [encodeuricomponent[]addsuffix[.html]] text/html $:/plugins/sobjornstad/TiddlyRemember/templates/TiddlyRememberParseable
undefined:1
I saw TiddlyRememberParseable in the first error and checked it out. The content says "Recursive transclusion error in transclude widget." I have tried installing TiddlyRemember in an empty wiki and the error is still there. Can you fix this or is it a problem on my end?
Hi, just recently I came around your plugin, thanks for it! It's the perfect choice to extend notes in TiddlyWiki as stated in these articles.
I'd like to ask, if it's possible to add a new note type which would behave like basic reversed type?
It would be a great addition to my workflow, but I don't know if it's something that's needed to be integrated into add-on or I can setup it manually in my Anki configuration.
Thanks.
Hey,
I get this error when attempting to sync.
Debug info:
Anki 2.1.38 (355e4cd5) Python 3.8.6 Qt 5.14.2 PyQt 5.14.2
Platform: Windows 10
Flags: frz=True ao=True sv=1
Add-ons, last update check: 2021-04-23 12:06:35
Caught exception:
Traceback (most recent call last):
File "C:\Users\yaren\AppData\Roaming\Anki2\addons21\60456529\__init__.py", line 187, in join_thread
if self.handle_thread_exception():
File "C:\Users\yaren\AppData\Roaming\Anki2\addons21\60456529\__init__.py", line 175, in handle_thread_exception
raise exc
File "C:\Users\yaren\AppData\Roaming\Anki2\addons21\60456529\__init__.py", line 62, in run
self.notes = twimport.find_notes(
File "C:\Users\yaren\AppData\Roaming\Anki2\addons21\60456529\twimport.py", line 202, in find_notes
notes = _notes_from_paths(
File "tempfile.py", line 827, in __exit__
File "tempfile.py", line 831, in cleanup
File "tempfile.py", line 813, in _rmtree
File "shutil.py", line 737, in rmtree
File "shutil.py", line 610, in _rmtree_unsafe
File "shutil.py", line 610, in _rmtree_unsafe
File "shutil.py", line 619, in _rmtree_unsafe
File "shutil.py", line 617, in _rmtree_unsafe
OSError: [WinError 145] The directory is not empty: 'C:\\Users\\yaren\\AppData\\Local\\Temp\\tmp6a1eapcz\\wikifolder\\tiddlers'
I've attempted to remove the temporary folder & re-run, but the issue remains.
I've tried moving the wiki to a different different directory (like download) but no luck.
Thanks 😇
As of 1.2, it will be possible to include images on TiddlyRemember notes, but it will only work properly if they are external to the wiki and the URL is accessible both from the link and from all devices you review from. We should be able to import the media into Anki's media collection on sync, so that it will follow the collection – ideally, including if the image is embedded in the TiddlyWiki.
First of all, I want to thank you for creating this plugin. I think it's an amazing idea to bridge tiddlywiki and Anki and I'm eager to try it.
However, I get this error when trying to syncronize:
Error
An error occurred. Please start Anki while holding down the shift key, which will temporarily disable the add-ons you have installed.
If the issue only occurs when add-ons are enabled, please use the Tools > Add-ons menu item to disable some add-ons and restart Anki, repeating until you discover the add-on that is causing the problem.
When you've discovered the add-on that is causing the problem, please report the issue on the add-on support site.
Debug info:
Anki 2.1.24 (359b9f5c) Python 3.8.0 Qt 5.13.1 PyQt 5.14.1
Platform: Mac 10.15.4
Flags: frz=True ao=True sv=2
Add-ons, last update check: 2020-05-28 20:46:42
Add-ons possibly involved: TiddlyRemember
Caught exception:
Traceback (most recent call last):
File "/Users/sortega/Library/Application Support/Anki2/addons21/60456529/twimport.py", line 57, in _invoke_tw_command
proc = subprocess.run(cmd, cwd=wiki_path, stdout=subprocess.PIPE,
File "subprocess.py", line 512, in run
subprocess.CalledProcessError: Command '['/Users/sortega/opt/tiddlywiki/node_modules/.bin/tiddlywiki', '--output', '/var/folders/s3/9dx35k0d15z32c5hm51hwr980000gn/T/tmpvzlti1ox/render', '--render', '[type[text/vnd.tiddlywiki]] [type[]] +[!is[system]]', '[encodeuricomponent[]addsuffix[.html]]', 'text/html', '$:/plugins/sobjornstad/TiddlyRemember/templates/TiddlyRememberParseable']' returned non-zero exit status 7.
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/sortega/Library/Application Support/Anki2/addons21/60456529/__init__.py", line 141, in join_thread
raise self.extract_thread.exception
File "/Users/sortega/Library/Application Support/Anki2/addons21/60456529/__init__.py", line 59, in run
self.notes = twimport.find_notes(
File "/Users/sortega/Library/Application Support/Anki2/addons21/60456529/twimport.py", line 186, in find_notes
_render_wiki(tw_binary, wiki_folder, render_location, filter_)
File "/Users/sortega/Library/Application Support/Anki2/addons21/60456529/twimport.py", line 143, in _render_wiki
_invoke_tw_command(cmd, wiki_path, "render wiki")
File "/Users/sortega/Library/Application Support/Anki2/addons21/60456529/twimport.py", line 68, in _invoke_tw_command
raise Exception(f"Failed to {description}: return code {proc.returncode}.\n"
Exception: Failed to render wiki: return code 7.
$ /Users/sortega/opt/tiddlywiki/node_modules/.bin/tiddlywiki --output /var/folders/s3/9dx35k0d15z32c5hm51hwr980000gn/T/tmpvzlti1ox/render --render [type[text/vnd.tiddlywiki]] [type[]] +[!is[system]] [encodeuricomponent[]addsuffix[.html]] text/html $:/plugins/sobjornstad/TiddlyRemember/templates/TiddlyRememberParseable
$:/plugins/chanilino/viz/lite.render.js:7
var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module["ENVIRONMENT"]){if(Module["ENVIRONMENT"]==="WEB"){ENVIRONMENT_IS_WEB=true}else if(Module["ENVIRONMENT"]==="WORKER"){ENVIRONMENT_IS_WORKER=true}else if(Module["ENVIRONMENT"]==="NODE"){ENVIRONMENT_IS_NODE=true}else if(Module["ENVIRONMENT"]==="SHELL"){ENVIRONMENT_IS_SHELL=true}else{throw new Error("Module['ENVIRONMENT'] value is not valid. must be one of: WEB|WORKER|NODE|SHELL.")}}else{ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="
ReferenceError: document is not defined
at Object.$tw.utils.domMaker (/Users/sortega/opt/tiddlywiki/node_modules/tiddlywiki/boot/boot.js:160:32)
at VizWidget.create ($:/plugins/chanilino/viz/vizWidget.js:55:33)
at VizWidget.render ($:/plugins/chanilino/viz/vizWidget.js:19:28)
at ElementWidget.Widget.renderChildren ($:/core/modules/widgets/widget.js:390:15)
at ElementWidget.render ($:/core/modules/widgets/element.js:49:7)
at TranscludeWidget.Widget.renderChildren ($:/core/modules/widgets/widget.js:390:15)
at TranscludeWidget.render ($:/core/modules/widgets/transclude.js:33:7)
at ImportVariablesWidget.Widget.renderChildren ($:/core/modules/widgets/widget.js:390:15)
at ImportVariablesWidget.render ($:/core/modules/widgets/importvariables.js:33:7)
at SetWidget.Widget.renderChildren ($:/core/modules/widgets/widget.js:390:15)
It happens regardless of where the wiki is (either in an URL, or as local file). I've tried to run the render command myself and I get the same error:
/Users/sortega/opt/tiddlywiki/node_modules/.bin/tiddlywiki --output /tmp/render1 --render '[type[text/vnd.tiddlywiki]] [type[]] +[!is[system]] [encodeuricomponent[]addsuffix[.html]]' text/html '$:/plugins/sobjornstad/TiddlyRemember/templates/TiddlyRememberParseable'
$:/plugins/chanilino/viz/lite.render.js:7
var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module["ENVIRONMENT"]){if(Module["ENVIRONMENT"]==="WEB"){ENVIRONMENT_IS_WEB=true}else if(Module["ENVIRONMENT"]==="WORKER"){ENVIRONMENT_IS_WORKER=true}else if(Module["ENVIRONMENT"]==="NODE"){ENVIRONMENT_IS_NODE=true}else if(Module["ENVIRONMENT"]==="SHELL"){ENVIRONMENT_IS_SHELL=true}else{throw new Error("Module['ENVIRONMENT'] value is not valid. must be one of: WEB|WORKER|NODE|SHELL.")}}else{ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="
Any idea?
2dead65 realized that URL-encoding filenames was not quite as perfect and easy a fix as it seemed. Another potential future problem -- URL encoding can cause name lengths to blow up since it uses 3 characters per byte, so this might put the maximum tiddler title length quite low if your OS, like most, has a limit of 255 characters on a filename. Even lower on Windows if the 259-character max path length is in effect.
Investigate this to see if there are better ways to fix the issue.
An exception dialog appears and says that the path to the wiki is invalid. This is not a great experience for new users!
Hi Soren.
A cloze card like the following causes a sync error, presumably because of the open curly bracket:
<<remembercz "20210710114236368"
"""
''CSS: ID selector syntax''
<br><br>
{`#`}`id-name {...`
"""
>>
In my opinion TiddlyRemember should ignore curly braces contained within a code block. It seems reasonable to assume that there are many cases where a user might want include a curly bracket in a cloze card without also invoking a new cloze element.
Thanks for the great plugin.
Due to the path handling code trying to relativize paths to work with _canonical_uri
, it's currently impossible in 1.3.0 to sync embedded images from a file or URI wiki. Folder wikis work fine, as do images which use _canonical_uri
in file/URL wikis; my test cases didn't cover this combination due to an oversight.
The condition on line 643 in twnote.py
just needs to be changed to exclude URIs that start with data:
to correct this problem.
Will have to think about where/how/if this information should be stored. Should be relatively straightforward though -- as Si points out there's a command for this.
How can I change the content that goes to the "Reference" field in Anki?
By default it's "Tiddler title/ID" but I want to change it to another format, what lines of code should I change to achieve this?
Not sure if this makes sense for other users, but I think to better organize your generated cards in Anki and maybe use Filtered Decks it would be interesting to copy automatically the tiddler tags into the generated Anki notes tags.
Maybe it shouldn't be a default behavior, but something the user can enable optionally.
Today I tried syncing my wiki with anki and got the following error:
Debug info:
Anki 2.1.29 (bbff62bf) Python 3.8.0 Qt 5.15.0 PyQt 5.15.0
Platform: Mac 10.14.6
Flags: frz=True ao=True sv=1
Add-ons, last update check: 2020-10-20 14:54:16
Add-ons possibly involved: TiddlyRemember
Caught exception:
Traceback (most recent call last):
File "/Users/kebi/Library/Application Support/Anki2/addons21/60456529/__init__.py", line 142, in join_thread
raise self.extract_thread.exception
File "/Users/kebi/Library/Application Support/Anki2/addons21/60456529/__init__.py", line 60, in run
self.notes = twimport.find_notes(
File "/Users/kebi/Library/Application Support/Anki2/addons21/60456529/twimport.py", line 189, in find_notes
notes = _notes_from_paths(
File "/Users/kebi/Library/Application Support/Anki2/addons21/60456529/twimport.py", line 91, in _notes_from_paths
notes.update(_notes_from_tiddler(tid_text, wiki_name, tid_name))
File "/Users/kebi/Library/Application Support/Anki2/addons21/60456529/twimport.py", line 113, in _notes_from_tiddler
return TwNote.notes_from_soup(soup, wiki_name, tiddler_name)
File "/Users/kebi/Library/Application Support/Anki2/addons21/60456529/twnote.py", line 73, in notes_from_soup
notes.update(subclass.parse_html(soup, wiki_name,
File "/Users/kebi/Library/Application Support/Anki2/addons21/60456529/twnote.py", line 328, in parse_html
parsed_text = ankify_clozes(text)
File "/Users/kebi/Library/Application Support/Anki2/addons21/60456529/clozeparse.py", line 128, in ankify_clozes
return placeholder_text.format(*(i.anki_occlusion for i in occlusions))
ValueError: Single '}' encountered in format string
Does this mean that there is a closing curly bracket without its opening curly bracket somewhere in my tiddlers?
If so, is there a way to debug the plugin and see where it gets stuck?
I receive the warning below when I try to Sync from TiddlyWiki.
*** 1 warning: ***
Image 'https://thedailyshot.com/wp-content/uploads/EQ-Holding-period2109240432.png' in tiddler
'Test note' could not be retrieved at sync time: 404 Not Found.
Although it does not prevent the image to be embedded in the Anki card, it stops the sync process asking for confirmation before continuing.
Steps to reproduce:
Download an empty TW
Add the TiddlyRemember plugin
Install TR in Anki
Create a new note with the question below
<<rememberq "20211116114723852"
"Test image."
"[img[https://thedailyshot.com/wp-content/uploads/EQ-Holding-period2109240432.png]]">>
Sync the wiki in Anki app
Result: a warning is displayed
I am not sure if this is a problem or not because the image ends up in the Anki card despite the warning.
It might be useful to support a wiki identifier that could be added to unique IDs, to avoid possible conflicts; if multiple users are working on and sharing content, they could plausibly (though very rarely) end up creating conflicting IDs by starting new items at the same millisecond.
I have a very large wiki that contains all my notes from several years of university. Currently, syncing to Anki takes around 3-5 minutes, and sends my laptop fan spinning like crazy.
Would it be possible to add a setting that allows only syncing tiddlers that have been modified since the last sync, as well as new tiddlers? This should dramatically reduce the amount of tiddlers that need to be rendered (and thus improve performance)
Keep up the great work, this plugin has tremendously improved my learning experience !
My wiki setup with a wiki password protected with auth basic is no longer working with the new release. This is the relevant error snippet with my password redacted:
Caught exception:
Traceback (most recent call last):
File "http/client.py", line 871, in _get_hostport
ValueError: invalid literal for int() with base 10: '*******************@tiddlywiki.refeed.org'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/sortega/Library/Application Support/Anki2/addons21/60456529/importer.py", line 185, in join_thread
if self.handle_thread_exception():
File "/Users/sortega/Library/Application Support/Anki2/addons21/60456529/importer.py", line 173, in handle_thread_exception
raise exc
File "/Users/sortega/Library/Application Support/Anki2/addons21/60456529/importer.py", line 57, in run
self.notes = twimport.find_notes(
File "/Users/sortega/Library/Application Support/Anki2/addons21/60456529/twimport.py", line 248, in find_notes
notes = _notes_from_paths(
File "/Users/sortega/Library/Application Support/Anki2/addons21/60456529/twimport.py", line 110, in _notes_from_paths
notes.update(_notes_from_tiddler(tid_text, wiki, tid_name, warnings))
File "/Users/sortega/Library/Application Support/Anki2/addons21/60456529/twimport.py", line 134, in _notes_from_tiddler
return TwNote.notes_from_soup(soup, wiki, tiddler_name, warnings)
File "/Users/sortega/Library/Application Support/Anki2/addons21/60456529/twnote.py", line 147, in notes_from_soup
notes.update(subclass.parse_html(
File "/Users/sortega/Library/Application Support/Anki2/addons21/60456529/twnote.py", line 321, in parse_html
pair = extract_media(media, pair, wiki, tiddler_name, warnings)
File "/Users/sortega/Library/Application Support/Anki2/addons21/60456529/twnote.py", line 659, in extract_media
with urlopen(open_src) as response:
File "urllib/request.py", line 222, in urlopen
File "urllib/request.py", line 525, in open
File "urllib/request.py", line 542, in _open
File "urllib/request.py", line 502, in _call_chain
File "urllib/request.py", line 1393, in https_open
File "urllib/request.py", line 1319, in do_open
File "http/client.py", line 1382, in __init__
File "http/client.py", line 833, in __init__
File "http/client.py", line 876, in _get_hostport
http.client.InvalidURL: nonnumeric port: '*********@tiddlywiki.refeed.org'
I have non-alphanumeric characters in there just in case it's useful.
Steps to reproduce:
The next sync will fail since it's trying to find a wiki with no path, and it's nearly impossible to see what's wrong in the interface
since the empty entry has no name and is consequently invisible in the list box.
Proposed fix:
Hi,
First of all, many thanks for coding this plugin, it has been very helpful.
I've run into the below error when I tried to use TiddlyRemember and the datepicker plugin (https://github.com/kixam/TW5-datePicker) together. If I disable the datepicker plugin before to synchronize, the error disappears.
Regards,
Sammy
Anki 2.1.38 (355e4cd5) Python 3.8.1 Qt 5.15.1 PyQt 5.15.1
Platform: Linux
Flags: frz=True ao=True sv=1
Add-ons, last update check: 2021-01-24 02:14:22
Add-ons possibly involved: TiddlyRemember
Caught exception:
Traceback (most recent call last):
File "/home/scarbajali/.local/share/Anki2/addons21/60456529/twimport.py", line 61, in _invoke_tw_command
proc = subprocess.run(cmd, cwd=wiki_path, stdout=subprocess.PIPE,
File "subprocess.py", line 512, in run
subprocess.CalledProcessError: Command '['/usr/local/bin/tiddlywiki', '--output', '/tmp/tmpsnzwgbu6/render', '--render', '[type[text/vnd.tiddlywiki]] [type[]] +[!is[system]!tag[tmap]]', '[encodeuricomponent[]addsuffix[.html]]', 'text/html', '$:/plugins/sobjornstad/TiddlyRemember/templates/TiddlyRememberParseable']' returned non-zero exit status 1.
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/home/scarbajali/.local/share/Anki2/addons21/60456529/__init__.py", line 187, in join_thread
if self.handle_thread_exception():
File "/home/scarbajali/.local/share/Anki2/addons21/60456529/__init__.py", line 175, in handle_thread_exception
raise exc
File "/home/scarbajali/.local/share/Anki2/addons21/60456529/__init__.py", line 62, in run
self.notes = twimport.find_notes(
File "/home/scarbajali/.local/share/Anki2/addons21/60456529/twimport.py", line 201, in find_notes
_render_wiki(tw_binary, wiki_folder, render_location, filter_)
File "/home/scarbajali/.local/share/Anki2/addons21/60456529/twimport.py", line 158, in _render_wiki
_invoke_tw_command(cmd, wiki_path, "render wiki")
File "/home/scarbajali/.local/share/Anki2/addons21/60456529/twimport.py", line 72, in _invoke_tw_command
raise RenderingError(
60456529.oops.RenderingError: Failed to render wiki: return code 1.
$ /usr/local/bin/tiddlywiki --output /tmp/tmpsnzwgbu6/render --render [type[text/vnd.tiddlywiki]] [type[]] +[!is[system]!tag[tmap]] [encodeuricomponent[]addsuffix[.html]] text/html $:/plugins/sobjornstad/TiddlyRemember/templates/TiddlyRememberParseable
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': Unrecognized Unicode character "−" (8722) [unknownSymbol]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
LaTeX-incompatible input and strict mode is set to 'warn': In LaTeX, \\ or \newline does nothing in display mode [newLineInDisplayMode]
/usr/local/lib/node_modules/tiddlywiki/boot/boot.js:160
var doc = options.document || document;
^
ReferenceError: document is not defined
at Object.$tw.utils.domMaker (/usr/local/lib/node_modules/tiddlywiki/boot/boot.js:160:32)
at DatePickerWidget.render ($:/plugins/kixam/datepicker/widget.datepicker.js:51:29)
at VarsWidget.Widget.renderChildren ($:/core/modules/widgets/widget.js:393:15)
at VarsWidget.render ($:/core/modules/widgets/vars.js:43:7)
at MacroCallWidget.Widget.renderChildren ($:/core/modules/widgets/widget.js:393:15)
at MacroCallWidget.render ($:/core/modules/widgets/macrocall.js:33:7)
at SetWidget.Widget.renderChildren ($:/core/modules/widgets/widget.js:393:15)
at SetWidget.render ($:/core/modules/widgets/set.js:33:7)
at SetWidget.Widget.renderChildren ($:/core/modules/widgets/widget.js:393:15)
at SetWidget.render ($:/core/modules/widgets/set.js:33:7)
Currently, link inside QA won't be discover by the backlink filter, so won't showup in any double link plugin. Is this addressable?
Hello sobjornstad,
thanks a lot for this cool project!
However, when I am trying to execute the sync, I get the following error from the Anki Plugin:
Debuginformationen:
Anki 2.1.22 (0ecc189a) Python 3.8.1 Qt 5.14.1 PyQt 5.14.1
Platform: Linux
Flags: frz=True ao=True sv=1
Add-ons, last update check: 2020-06-01 14:55:24
Möglicherweise beteiligte Erweiterungen: TiddlyRemember
Caught exception:
Traceback (most recent call last):
File "/home/hel/.local/share/Anki2/addons21/60456529/__init__.py", line 166, in join_thread
return self.sync()
File "/home/hel/.local/share/Anki2/addons21/60456529/__init__.py", line 176, in sync
userlog = ankisync.sync(self.notes, self.mw, self.conf)
File "/home/hel/.local/share/Anki2/addons21/60456529/ankisync.py", line 104, in sync
for nid in mw.col.find_notes(model_search))
AttributeError: '_Collection' object has no attribute 'find_notes'
I printed the mw.col object as a dir:
[ '__annotations__',
'__class__',
'__delattr__',
'__dict__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__le__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__',
'_closeLog',
'_debugLog',
'_dueForDid',
'_fieldData',
'_lastSave',
'_loadScheduler',
'_logHnd',
'_logRem',
'_markOp',
'_newCard',
'_normalize_tags',
'_openLog',
'_remNotes',
'_tmplsFromOrds',
'_undo',
'_undoOp',
'_undoReview',
'_usn',
'addNote',
'autosave',
'backend',
'basicCheck',
'beforeUpload',
'cardCount',
'cardStats',
'changeSchedulerVer',
'clearUndo',
'close',
'conf',
'crt',
'db',
'decks',
'dty',
'emptyCardReport',
'emptyCids',
'findCards',
'findDupes',
'findNotes',
'findReplace',
'findTemplates',
'fixIntegrity',
'flush',
'genCards',
'getCard',
'getNote',
'isEmpty',
'load',
'localOffset',
'lock',
'log',
'ls',
'markReview',
'media',
'mod',
'modSchema',
'models',
'name',
'newNote',
'nextID',
'noteCount',
'optimize',
'path',
'previewCards',
'remCards',
'remNotes',
'reopen',
'reset',
'rollback',
'save',
'sched',
'schedVer',
'schemaChanged',
'scm',
'server',
'setMod',
'setUserFlag',
'startTimebox',
'stats',
'supportedSchedulerVersions',
'tags',
'timeboxReached',
'tr',
'undo',
'undoName',
'updateFieldCache',
'usn',
'weakref']
So, there exists a "findNotes" but not "find_notes". I dont know how this could have happend, because in the source-code I only find a "find_notes"-definition (but that seems to be something different).
When I change it to "findNotes" it works. Maybe "aqt.mw" is different in my version of Anki?
There may be some cases in which we don't want to edit notes that have already been synced to Anki, or don't want to update particular fields (someone wanted the ability to pull audio from AwesomeTTS after importing, for instance). We should have more options for choosing whether to update or delete existing notes.
The box is subtly off and can occasionally cause weird display artifacts or just ugly rendering when a paragraph comes after it.
I foolishly updated to the latest Tiddlywiki 5.2 and discovered that upon upgrade it appears that things have broken on Tiddlyremember. I'm using Nodejs on the server side and version 2.1.44 on the client-side (M1 Mac). I had no problems until I upgraded, but as far as I can tell nothing else but Tiddlyremember broke; which is terrible since this is the plugin I use daily.
Here's the error I get on the client-side:
Error
An error occurred. Please start Anki while holding down the shift key, which will temporarily disable the add-ons you have installed.
If the issue only occurs when add-ons are enabled, please use the Tools > Add-ons menu item to disable some add-ons and restart Anki, repeating until you discover the add-on that is causing the problem.
When you've discovered the add-on that is causing the problem, please report the issue on the add-on support site.
Debug info:
Anki 2.1.44 (b2b3275f) Python 3.8.6 Qt 5.14.2 PyQt 5.14.2
Platform: Mac 10.16
Flags: frz=True ao=True sv=2
Add-ons, last update check: 2021-10-26 12:10:20
Add-ons possibly involved: TiddlyRemember
Caught exception:
Traceback (most recent call last):
File "/Users/hyuan/Library/Application Support/Anki2/addons21/60456529/twimport.py", line 61, in _invoke_tw_command
proc = subprocess.run(cmd, cwd=wiki_path, stdout=subprocess.PIPE,
File "subprocess.py", line 512, in run
subprocess.CalledProcessError: Command '['/usr/local/bin/tiddlyremember', '--load', '/var/folders/36/rgts6_wd0559_p1z444ngh600000gn/T/tmp_lkbeydl/wiki.html', '--savewikifolder', '/var/folders/36/rgts6_wd0559_p1z444ngh600000gn/T/tmp_lkbeydl/wikifolder']' returned non-zero exit status 1.
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/Users/hyuan/Library/Application Support/Anki2/addons21/60456529/__init__.py", line 187, in join_thread
if self.handle_thread_exception():
File "/Users/hyuan/Library/Application Support/Anki2/addons21/60456529/__init__.py", line 175, in handle_thread_exception
raise exc
File "/Users/hyuan/Library/Application Support/Anki2/addons21/60456529/__init__.py", line 62, in run
self.notes = twimport.find_notes(
File "/Users/hyuan/Library/Application Support/Anki2/addons21/60456529/twimport.py", line 195, in find_notes
_folderify_wiki(tw_binary, downloaded_file, wiki_folder)
File "/Users/hyuan/Library/Application Support/Anki2/addons21/60456529/twimport.py", line 52, in _folderify_wiki
_invoke_tw_command(cmd, None, "folderify wiki")
File "/Users/hyuan/Library/Application Support/Anki2/addons21/60456529/twimport.py", line 72, in _invoke_tw_command
raise RenderingError(
60456529.oops.RenderingError: Failed to folderify wiki: return code 1.
$ /usr/local/bin/tiddlyremember --load /var/folders/36/rgts6_wd0559_p1z444ngh600000gn/T/tmp_lkbeydl/wiki.html --savewikifolder /var/folders/36/rgts6_wd0559_p1z444ngh600000gn/T/tmp_lkbeydl/wikifolder
�[1;31mError: No tiddlers found in file "/var/folders/36/rgts6_wd0559_p1z444ngh600000gn/T/tmp_lkbeydl/wiki.html"�[0m
This will make it much easier to figure out the problem when there are syntax errors or badly written TiddlyWiki plugins causing problems.
If a wiki is temporarily not available for some reason (e.g., it's on the web and we're offline), it would be nice to be able to disable syncing to it temporarily without removing it, so that we aren't unable to sync other wikis in the meantime.
This is technically difficult because the "wiki" field on notes is not guaranteed to be correct: the user could change the name of a wiki and then disable it, and then we would have no idea which notes we should avoid removing.
Hi,
To add the "Extra" field to the "TiddlyRemember Cloze v1" note type similar to the default Anki's "Cloze" note type would be very useful to add extra information to the cards.
Thanks,
This makes the URI invalid, resulting in nothing happening when the link is clicked.
The permalink that is created and displayed within Anki only links to the originating file (file:///my/file/is/here.html), not to the full permalink address (e.g. file:///my/file/is/here.html#mytiddler) .
Saw this reposted to r/Anki, and wanted to share my thoughts. Feel free to close this and/or redirect me to where I should have posted this.
Get out of my brain, I was gonna make this 😉 Very nice stuff, I am glad to see a connection between two of my favourite applications. Thanks for your efforts!
Do you get use out of it? I am curious how many cards you manage using this method. For myself the unidirectional sync, and lack of support for custom note types makes me unable to use this properly.
What exactly is the use of the TiddlyWiki plugin? Just to setup the macro? Did you consider creating each Anki note as a Tiddler and search for them by tag using the TiddlyWiki API?
This is how I was planning (and still do) to implement TiddlyWiki as a import/export type in my weekend project Brain Brew. I probably won't get round to that for a month or so, as I have other tasks to do first, but the benefits would be bi-directional syncing, using any note type, into/from Csv or CrowdAnki. No direct Anki add-on though, but it is possible.
Anyways mate, good work 👍 I hope you and others get good use out of it. Hit me up if you want to chat Anki / TiddlyWiki syncing to death.
I was wondering whether mathjax is supported or might be trivially implemented by for instance simply installing a mathjax tiddlywiki plugin. I couldn't find anything about this in the documentation.
Inline cloze deletions are terribly useful and I've been using them abundantly over the past months. I've tweaked a few things using shadow tiddlers and believe these changes could actually be useful for others:
self-id
of the inline cloze deletions as the display becomes quite unseemly when having more than one inline cloze deletions in a paragraph. This is easily done by changing the CSS with a display: none
associated to the tr-selfidentification
class though I guess there may be some trade-offs to this or you wouldn't have wanted this information displayed in the first place.I'd gladly prepare a pull request for any or all of these if you believe they could make sense for a larger user base.
Hi,
I thought you'd be interested because I was also looking into MathJax and saw a recent reply of yours. This formatting isn't exactly an issue in TiddlyRemember but I'm not sure where else to put it. Simply installing the online version of the MathJax plugin into the empty wiki file (not on Node JS) worked because the formatting showed, although there was one internal Javascript error:
Uncaught TypeError: Failed to execute 'observe' on 'MutationObserver': parameter 1 is not of type 'Node'.
I used a blank wiki file (not Node JS) and installed the plugin by dragging it in. I used another blank file without the MathJax plugin installed and it synced with Anki. Upon installing it and not using MathJax formatting, I got this error:
Anki 2.1.35 (84dcaa86) Python 3.8.0 Qt 5.14.2 PyQt 5.14.2
Platform: Windows 10
Flags: frz=True ao=True sv=1
Add-ons, last update check: 2020-10-10 21:45:18
Caught exception:
Traceback (most recent call last):
File "C:\Users\Aqua8\AppData\Roaming\Anki2\addons21\60456529\twimport.py", line 58, in _invoke_tw_command
proc = subprocess.run(cmd, cwd=wiki_path, stdout=subprocess.PIPE,
File "subprocess.py", line 512, in run
subprocess.CalledProcessError: Command '['C:\Users\Aqua8\AppData\Roaming\npm\tiddlywiki.cmd', '--output', 'C:\Users\Aqua8\AppData\Local\Temp\tmpihl0183i\render', '--render', '[tag[Anki]]', '[encodeuricomponent[]addsuffix[.html]]', 'text/html', '$:/plugins/sobjornstad/TiddlyRemember/templates/TiddlyRememberParseable']' returned non-zero exit status 1.
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Users\Aqua8\AppData\Roaming\Anki2\addons21\60456529_init_.py", line 142, in join_thread
raise self.extract_thread.exception
File "C:\Users\Aqua8\AppData\Roaming\Anki2\addons21\60456529_init_.py", line 60, in run
self.notes = twimport.find_notes(
File "C:\Users\Aqua8\AppData\Roaming\Anki2\addons21\60456529\twimport.py", line 188, in find_notes
render_wiki(tw_binary, wiki_folder, render_location, filter)
File "C:\Users\Aqua8\AppData\Roaming\Anki2\addons21\60456529\twimport.py", line 145, in _render_wiki
_invoke_tw_command(cmd, wiki_path, "render wiki")
File "C:\Users\Aqua8\AppData\Roaming\Anki2\addons21\60456529\twimport.py", line 69, in _invoke_tw_command
raise Exception(f"Failed to {description}: return code {proc.returncode}.\n"
Exception: Failed to render wiki: return code 1.
$ C:\Users\Aqua8\AppData\Roaming\npm\tiddlywiki.cmd --output C:\Users\Aqua8\AppData\Local\Temp\tmpihl0183i\render --render [tag[Anki]] [encodeuricomponent[]addsuffix[.html]] text/html $:/plugins/sobjornstad/TiddlyRemember/templates/TiddlyRememberParseable
�[1;31mError executing boot module $:/plugins/kantorsite/mathjax/init.js: {}
$:/plugins/kantorsite/mathjax/init.js:1
(function(){function e(e,t,n){var r=document.getElementsByTagName('head')[0]||document.documentElement;var i=document.createElement('script');if(typeof e=='function'){i[window.opera?'innerHTML':'text']='('+e.toString()+')()'}else if(typeof e=='string'){i.src=e}if(t){for(var s in t){if(t.hasOwnProperty(s)){i[s]=t[s]}}}var o=false;i.onload=i.onreadystatechange=function(){if(!o&&(!this.readyState||this.readyState=='loaded'||this.readyState=='complete')){o=true;i.onload=i.onreadystatechange=null;if(r&&i.parentNode){r.removeChild(i)}if(typeof n=='function'){n()}}};r.insertBefore(i,r.firstChild);return i}e(function(){MathJax.Hub.Config({tex2jax:{inlineMath:[['$','$'],['\(','\)']]}})},{type:'text/x-mathjax-config'});e('http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML',null,function(){e(function(){var e=window.MutationObserver||window.WebKitMutationObserver;if(!e){alert('MathJax plugin for TW5: Sorry, but current version of your browser is not supported!')}else{var t=new e(function(e,t){MathJax.Hub.Queue(['Typeset',MathJax.Hub])});var n=document.getElementsByClassName('story-river')[0];t.observe(n,{subtree:false,attributes:true,childList:true})}})})})()
^
ReferenceError: document is not defined
at e ($:/plugins/kantorsite/mathjax/init.js:1:37)
at $:/plugins/kantorsite/mathjax/init.js:1:607
at $:/plugins/kantorsite/mathjax/init.js:1:1193
at Script.runInContext (vm.js:130:18)
at Script.runInNewContext (vm.js:135:17)
at Object.runInNewContext (vm.js:302:38)
at Object.$tw.utils.evalSandboxed (C:\Users\Aqua8\AppData\Roaming\npm\node_modules\tiddlywiki\boot\boot.js:530:5)
at Object.$tw.modules.execute (C:\Users\Aqua8\AppData\Roaming\npm\node_modules\tiddlywiki\boot\boot.js:806:15)
at C:\Users\Aqua8\AppData\Roaming\npm\node_modules\tiddlywiki\boot\boot.js:846:30
at Object.$tw.utils.each (C:\Users\Aqua8\AppData\Roaming\npm\node_modules\tiddlywiki\boot\boot.js:135:12)�[0m
The latest snapshot from the Wayback Machine: https://web.archive.org/web/20200221224233/http://mathjax-tw5.kantorsite.net/
Also, I tried just leaving the filter as the default and there was still a sync error. Not sure if it was the same one though.
We currently strip all HTML within macro parameters, but Anki supports HTML on cards, so this is not necessary, and the ability to preserve some formatting would be nice. The challenge will be stripping or updating things like internal links so that the Anki notes are not full of unusable junk.
I skimmed the closed issues, but not sure if it was mentioned that a "." in the title causes a 'invalid "" name error' when syncing
e.g, for those using their TW's as a website (blah.com, blah.io, etc. etc.) and use the name in the config section of TiddlyRemember
Syncing is not working for inline cloze deletion with multiple occlusions defined, like in this example:
<<remembercz "20200906204435482"
"Platformy zdieľanej ekonomiky znižujú transakčné náklady na {c1::dohľadávanie}, {c2::dohadovanie} a {c3::dodržanie dohody}." inline>>
Without inline
attribute, syncing works properly and three cards are created.
The TW add-on should report its version in the template, so the Anki add-on can ensure that syncing is supported. Not a big issue yet but could become one if there are breaking changes in the future.
In TiddlyWiki the official KaTeX plugin allows you to write Latex equations by surrounding them with the delimiter $$
.
Anki uses the delimiters \(
and \)
to indicate MathJax, so I wonder if it would work to convert the delimiters on sync? This would mean that you could display math equations properly in both TW and Anki.
I have no idea if this is possible or appropriate, but I thought I'd suggest it.
In _save_wiki_values()
, we figure out what fields to save based on the current .keys()
of the wiki config. This doesn't work correctly if we've added a new field to the schema since the config file was created, as the new fields in the config dialog will be skipped.
Better approach: extract the logic that builds the prototype in add_wiki()
to a separate function and call said function to obtain the keys; this will ensure that any added values get created. Or get rid of using a prototype at all; I did this initially because the fields are already defined in config.json
and I figured this should be kept DRY, but it might be less confusing / more reliable to leave the dictionary blank in config.json
and define the structure in code, if there are going to be changes to the schema with any regularity at all.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.