22 Commits

Author SHA1 Message Date
Soren I. Bjornstad
3e9ecd4b70 work around ReadTheDocs bug 2022-03-27 15:22:31 -05:00
Soren I. Bjornstad
7be018ea3f pull ZK updates and bump version 2022-03-27 15:19:41 -05:00
Soren I. Bjornstad
8fb496bbfe Merge branch 'new-private-person-replacement-logic' into march-tweaks 2022-03-27 15:14:41 -05:00
dcac80c5ac Replace link text of private person
It is possible that a private person is linked to in a tiddler with the
syntax `[[Jane|MsJaneDoe]]`.

Up to now, the text of the link was not redacted, which could lead to
unintentional privacy leaks.

Therefore, a new parameter `replace_link_text` is introduced for the
`replace_private_people` builder.

When that is set to True, then the link text is also replaced with the
initials.

Signed-off-by: Jacob Kiers <code@kiers.eu>
2022-03-22 23:34:32 +01:00
Soren I. Bjornstad
4875f7c1f5 avoid incrementing iterator when not appropriate
By chance, this hasn't caused any problems yet.
2022-03-16 12:33:20 -05:00
Soren I. Bjornstad
f0bd41f65a implement more robust private-person replacer
The previous method occasionally gave incorrect results because it
performed replacements on an entire line, rather than on individual
instances of the text to replace. This usually worked fine, but in rare
cases could create wrong/ugly output, and with future improvements to
what can be replaced could end up causing leaks.

This was a royal PITA to get working, but I'm fairly sure it's correct
now due to all the doctests. Please add more if you find any regressions
or think of cases that aren't covered.
2022-03-16 09:19:49 -05:00
Soren Bjornstad
d3f6216837 Merge pull request #4 from jacobkiers/allow-specifying-listening-host
Allow setting the host parameter
2022-03-14 21:01:35 -05:00
Soren I. Bjornstad
e14709be40 update copyright notice 2022-03-14 20:59:57 -05:00
bdeaac5d03 Specify listen_host as an option in the config file
Signed-off-by: Jacob Kiers <code@kiers.eu>
2022-03-14 18:22:07 +01:00
Soren I. Bjornstad
4acff2731a remove debug print mistakenly left in 2022-03-11 20:14:30 -06:00
3b1f91bcb0 Allow setting the host parameter
In order to run in a Docker container, it is necessary to listen on all interfaces (`0.0.0.0`).
So make it possible to set the host.

Fixes #1

Signed-off-by: Jacob Kiers <code@kiers.eu>
2022-03-12 02:31:57 +01:00
Soren I. Bjornstad
572c3d0316 bump version and allow use of --version to see it 2022-01-23 17:28:19 -06:00
Soren I. Bjornstad
4a6e4e7bc0 don't crash if tzk is used without arguments 2022-01-23 17:22:45 -06:00
Soren I. Bjornstad
35ca2b896e regular update 2022-01-03 15:31:14 -06:00
Soren I. Bjornstad
0705c55e77 fix only one PrivatePerson replacement working per line
Because the 'line' variable was already bound in the outer loop, changes
to the line in the inner loop were lost in subsequent inner-loop
iterations, if required. Change to always indexing the array (which is
defined outside the scope of the loops) directly on every reference.

(This is why it's usually best not to modify things while looping over
them. Maybe a refactor could be in order.)
2021-11-29 21:47:21 -06:00
Soren I. Bjornstad
f8edb70065 bump version 2021-09-22 11:34:02 -05:00
Soren I. Bjornstad
218705bdc9 add walkthrough video link 2021-09-22 11:33:19 -05:00
Soren I. Bjornstad
48a8789c4d activate venv before trying publish
Was planning to do this myself, but I forgot so many times I'm just
adding it...
2021-09-22 11:29:05 -05:00
Soren Bjornstad
48ab7f9514 add walkthrough video to README 2021-09-22 11:28:36 -05:00
Soren I. Bjornstad
f2d9a2abe6 bump version 2021-09-22 10:58:25 -05:00
Soren I. Bjornstad
cb55a967d0 remove build folder prior to building wheels
Otherwise files that have been removed will still show up in the wheel
-- but not in the source distribution -- which is super confusing and
wrong. No idea why Python doesn't check this itself.
2021-09-22 10:57:18 -05:00
Soren I. Bjornstad
52c0daedbb fix tray 2021-09-22 10:54:06 -05:00
58 changed files with 1249 additions and 19445 deletions

View File

@@ -1,4 +1,4 @@
Copyright © 2021 Soren Bjornstad.
Copyright © 2021-2022 Soren Bjornstad and the tzk community.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

View File

@@ -19,7 +19,7 @@ Some basic knowledge of [TiddlyWiki](https://tiddlywiki.com)
Documentation / Installation
============================
----------------------------
Find a live version of the edition on the web with further instructions
at https://sobjornstad.github.io/tzk/.
@@ -28,3 +28,14 @@ You can find the documentation for the CLI
versioning with Git,
and creating public and other derivative versions of the wiki)
at https://tzk.readthedocs.io/en/latest/.
Video walkthrough
-----------------
Since tzk is still in an alpha state,
general instructions on how to use it are somewhat lacking at the moment.
To fill in the gap in the meantime,
I recorded an hour-long walkthrough showing how you might take notes using tzk;
you can select individual sections to watch if that's longer than you want.
[Watch the video on YouTube](https://www.youtube.com/watch?v=9X_T-DVie8o).

View File

@@ -18,9 +18,9 @@ copyright = '2021 Soren Bjornstad'
author = 'Soren Bjornstad'
# The short X.Y version
version = "0.1.2"
version = "0.2.0"
# The full version, including alpha/beta/rc tags
release = "0.1.2"
release = "0.2.0"
# -- General configuration ---------------------------------------------------

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,8 @@
#!/bin/bash
set -e
. venv/bin/activate
rm -rf build/
rm -f dist/*
mkdir -p dist
python setup.py sdist bdist_wheel

View File

@@ -4,6 +4,7 @@
# docs
sphinx==3.5.4 # newer versions display function names in the wrong color?
sphinx_rtd_theme==0.5.2
Jinja2<3.1 # https://github.com/readthedocs/readthedocs.org/issues/9038
# dev tools
build

View File

@@ -9,7 +9,7 @@ with open("README.md", "r") as fh:
setuptools.setup(
name="tzk",
version="0.1.2",
version="0.2.0",
author="Soren I. Bjornstad",
author_email="zettelkasten@sorenbjornstad.com",
description="Build tool for TiddlyWiki Zettelkasten",

View File

@@ -13,6 +13,8 @@ from tzk import tw
from tzk.util import (BuildError, fail, numerize, require_dependencies, pushd,
TZK_VERSION)
VERSION_INFO = f"tzk version {TZK_VERSION}"
class CliCommand(ABC):
"""
@@ -83,6 +85,12 @@ class ListenCommand(CliCommand):
@classmethod
def setup_arguments(cls, parser: argparse.ArgumentParser) -> None:
parser.add_argument(
"--host",
metavar="HOST",
help="Host to listen on.",
default=str(cm().listen_host or "127.0.0.1"),
)
parser.add_argument(
"-p", "--port",
metavar="PORT",
@@ -109,6 +117,7 @@ class ListenCommand(CliCommand):
tw.exec(
[
("listen",
f"host={args.host}",
f"port={args.port}",
f"username={args.username}",
f"password={args.password}")
@@ -180,7 +189,7 @@ class VersionCommand(CliCommand):
pass
def execute(self, args: argparse.Namespace) -> None:
print(f"tzk version {TZK_VERSION}")
print(VERSION_INFO)
class BuildCommand(CliCommand):
@@ -385,6 +394,7 @@ def launch():
# go there before doing anything else.
if (not os.path.exists("tzk_config.py")
and os.environ.get('TZK_DIRECTORY')
and len(sys.argv) > 1
and sys.argv[1] != "init"): # we can't init an existing TZK_DIRECTORY
try:
os.chdir(os.environ['TZK_DIRECTORY'])
@@ -401,11 +411,17 @@ def launch():
parser = argparse.ArgumentParser(
description=f"TiddlyZettelKasten {TZK_VERSION} CLI\n"
f"Copyright (c) 2021 Soren Bjornstad.\n"
f"Copyright (c) 2021-2022 Soren Bjornstad and the tzk community.\n"
f"MIT license; see https://github.com/sobjornstad/tzk/blob/master/LICENSE for details.",
epilog="For full documentation, see https://tzk.readthedocs.io/en/latest/.",
formatter_class=argparse.RawDescriptionHelpFormatter
)
parser.add_argument(
"--version",
action="version",
version=VERSION_INFO,
help=VersionCommand.help
)
subparsers = parser.add_subparsers()
for command in sorted(CliCommand.__subclasses__(), key=lambda i: i.__name__):

View File

@@ -19,7 +19,7 @@ import re
import shutil
import subprocess
import tempfile
from typing import Callable, Dict, List, Optional, Set, Sequence, Tuple
from typing import Callable, Dict, Generator, List, Optional, Set, Sequence, Tuple
from tzk import git
from tzk import tw
@@ -359,8 +359,159 @@ def _private_people_replacement_table(
}
def _privatize_line(line: str, replacement_table: Dict[str, str],
replace_link_text: bool = False) -> Optional[str]:
"""
Given a line and a table of replacements to make, replace all instances
of all private people defined in the replacement table.
Basics:
>>> _privatize_line("MsAlice is a test person.", {'MsAlice': 'A.'})
'<<privateperson "A.">> is a test person.'
>>> _privatize_line("This woman, known as MsAlice, is a test person.", \
{'MsAlice': 'A.'})
'This woman, known as <<privateperson "A.">>, is a test person.'
>>> _privatize_line("[[MsAlice]] is a test person.", {'MsAlice': 'A.'})
'[[A.|PrivatePerson]] is a test person.'
>>> _privatize_line("When we talk about [[MsAlice]] in the middle of a " \
"sentence, that's fine too.", {'MsAlice': 'A.'})
"When we talk about [[A.|PrivatePerson]] in the middle of a sentence, that's fine too."
Links with different text and target:
>>> _privatize_line("We can talk about [[Alice|MsAlice]] " \
"with different text.", {'MsAlice': 'A.'})
'We can talk about [[Alice|PrivatePerson]] with different text.'
Multiple replacements with different people:
>>> _privatize_line("We can have [[MsAlice]] and MrBob talk to each other " \
"in the same line.", {'MsAlice': 'A.', 'MrBob': 'B.'})
'We can have [[A.|PrivatePerson]] and <<privateperson "B.">> talk to each other in the same line.'
Multiple replacements with the same person:
>>> _privatize_line("We can have MsAlice talk to herself (MsAlice) " \
"in the same line.", {'MsAlice': 'A.'})
'We can have <<privateperson "A.">> talk to herself (<<privateperson "A.">>) in the same line.'
>>> _privatize_line("Likewise [[MsAlice]] can do it with brackets " \
"([[MsAlice]]).", {'MsAlice': 'A.'})
'Likewise [[A.|PrivatePerson]] can do it with brackets ([[A.|PrivatePerson]]).'
>>> _privatize_line('We can talk about [[Alice|MsAlice]] lots of ways, ' \
'like MsAlice and [[MsAlice]].', {'MsAlice': 'A.'})
'We can talk about [[Alice|PrivatePerson]] lots of ways, like <<privateperson "A.">> and [[A.|PrivatePerson]].'
Replacements with alternate link text:
>>> _privatize_line('We can talk about [[Alice|MsAlice]] and [[Bob|MrBob]] as well', \
{'MsAlice': 'A.', 'MrBob': 'B.'}, replace_link_text=True)
'We can talk about [[A.|PrivatePerson]] and [[B.|PrivatePerson]] as well'
We don't want to replace places where a CamelCase match is a substring of another
word. This is expected to yield no output because there's nothing to replace:
>>> _privatize_line("But an EmbeddedCamelWithMsAliceInIt isn't her.", \
{'MsAlice': 'A.'})
"""
def iteroccurrences(needle: str) -> Generator[int, int, None]:
"""
Iterate over the start indices of occurrences of substring
``needle`` in the line /line/ in outer scope.
(We have to use outer scope because it can be changed while we're iterating
and the generator is only bound to arguments once.)
"""
idx = -1
while True:
idx = line.find(needle, idx + 1)
if idx == -1:
return
else:
additional_increments = yield idx
if additional_increments is not None:
idx += additional_increments
def anchored_at_one_end(start_index: int, end_index: int) -> bool:
return start_index == 0 or end_index == len(line)
def is_camelcase_link(start_index: int, end_index: int) -> bool:
return (anchored_at_one_end(start_index, end_index)
or (line[start_index-1] != '[' and line[end_index] != ']'))
def is_bare_bracketed_link(start_index: int, end_index: int) -> bool:
return (not anchored_at_one_end(start_index, end_index)
and line[start_index-2:start_index] == '[['
and line[end_index:end_index+2] == ']]')
def is_textual_bracketed_link(start_index: int, end_index: int) -> bool:
return (not anchored_at_one_end(start_index, end_index)
and line[start_index-1] == '|'
and line[end_index:end_index+2] == ']]')
dirty = False
increment_iterator_by = 0
for replace_person, replace_initials in replacement_table.items():
iterator = iteroccurrences(replace_person)
try:
while True:
# NOTE: the "end" index is one after the last index in the string,
# as is needed for slice notation.
if increment_iterator_by:
start_idx = iterator.send(increment_iterator_by)
increment_iterator_by = 0
else:
start_idx = next(iterator)
end_idx = start_idx + len(replace_person)
new_line = None
if is_camelcase_link(start_idx, end_idx):
# camel-case link or unlinked reference in text
def is_spurious_substring():
# If there's not a non-alphanumeric character on both sides of
# the "link", we may be making a clbuttic replacement.
# <https://en.wikipedia.org/wiki/Scunthorpe_problem>
start_ok = start_idx == 0 or not line[start_idx-1].isalnum()
end_ok = end_idx == len(line) or not line[end_idx].isalnum()
return not (start_ok and end_ok)
if not is_spurious_substring():
new_line = (line[0:start_idx]
+ f'<<privateperson "{replace_initials}">>'
+ line[end_idx:])
elif is_bare_bracketed_link(start_idx, end_idx):
# link with the person as the target and text
replacement = replace_initials + '|PrivatePerson'
new_line = line[0:start_idx] + replacement + line[end_idx:]
elif is_textual_bracketed_link(start_idx, end_idx):
# link with the person as the target only;
# beware that you might have put something private in the text
if replace_link_text:
start_of_link = line[0:start_idx].rfind('[[', 0, start_idx) + 2
new_line = line[0:start_of_link] + f"{replace_initials}|PrivatePerson" + line[end_idx:]
else:
new_line = line[0:start_idx] + 'PrivatePerson' + line[end_idx:]
else:
link = line[start_idx:end_idx]
raise ValueError("Unknown type of link '{link}'.")
if new_line:
line = new_line
dirty = True
# If we changed the length of the string by modifying it,
# we need to update our stored position within the string.
increment_iterator_by = len(new_line) - len(line)
except StopIteration:
pass
if dirty:
return line
else:
return None
@tzk_builder
def replace_private_people(initialer: Callable[[str], str] = None) -> None:
def replace_private_people(initialer: Callable[[str], str] = None, replace_link_text: bool = False) -> None:
"""
Replace the names of people who are not marked Public with their initials.
@@ -384,6 +535,20 @@ def replace_private_people(initialer: Callable[[str], str] = None) -> None:
that takes one string argument
(a tiddler filename without the full path, e.g., ``MsJaneDoe.tid``)
and returns a string to be considered the "initials" of that person.
:param replace_link_text: If you have links in the form
``So then [[John said|MrJohnDoe]] something about this``,
then enabling this option ensures that the link is fully
replaced with
``So then [[J.D.|PrivatePerson]] something about this``.
This means that when using this feature, having the
link text also be meaningful after redaction is important.
.. warning ::
Using this link replacement feature does not redact everything, just the link
(and the link text with `replace_link_text` enabled). So *do not* rely on it
for redacting everything. Making a tiddler public still needs consideration and
tooling is there to help, not to replace your own judgment.
"""
assert 'public_wiki_folder' in build_state
@@ -394,26 +559,10 @@ def replace_private_people(initialer: Callable[[str], str] = None) -> None:
dirty = False
with tiddler.open() as f:
lines = f.readlines()
for idx, line in enumerate(lines):
for replace_person, replace_initials in replacement_table.items():
if replace_person in line:
if '|' + replace_person + ']]' in line:
# link with the person as the target only;
# beware that you might have put something private in the text
lines[idx] = line.replace(replace_person,
'PrivatePerson')
elif '[[' + replace_person + ']]' in line:
# link with the person as the target and text
lines[idx] = line.replace(replace_person,
replace_initials + '|PrivatePerson')
else:
# camel-case link or unlinked reference in text;
# or spurious substring, so rule that out with the '\b' search
lines[idx] = re.sub(
r"\b" + re.escape(replace_person) + r"\b",
f'<<privateperson "{replace_initials}">>',
line
)
for i in range(len(lines)):
private_line = _privatize_line(lines[i], replacement_table, replace_link_text)
if private_line is not None:
lines[i] = private_line
dirty = True
if dirty:
with tiddler.open("w") as f:

View File

@@ -35,6 +35,10 @@ commit_remote = ""
# http://localhost:8080 in your browser.
listen_port = 8080
# Host to listen on. If you specify "0.0.0.0" it will listen to all network interfaces.
# This is useful for allowing the wiki to be exposed to the network through a container.
listen_host = "127.0.0.1"
# Uncomment if you want to require HTTP basic authentication when serving your wiki.
# **WARNING**: this is NOT secure for use over the open Internet or all but the
# simplest local networks, as the password is sent in the clear. For good

View File

@@ -0,0 +1,5 @@
created: 20210925145600000
modified: 20210925145600000
tags:
title: $:/config/TiddlyRemember/DefaultClasses
type: text/vnd.tiddlywiki

View File

@@ -0,0 +1,7 @@
created: 20210929144900000
modified: 20210929144900000
tags:
title: $:/config/TiddlyRemember/snippets/remembercz
<<remembercz "%NOTE_ID%"
"Cloze">>

View File

@@ -0,0 +1,8 @@
created: 20210929144900000
modified: 20210929144900000
tags:
title: $:/config/TiddlyRemember/snippets/rememberq
<<rememberq "%NOTE_ID%"
"Q"
"A">>

View File

@@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2020 Soren Bjornstad.
Copyright (c) 2020-2021 Soren Bjornstad and the TiddlyRemember community.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -0,0 +1,20 @@
created: 20210929144300000
modified: 20210929144300000
tags: $:/tags/Macro
title: $:/plugins/sobjornstad/TiddlyRemember/macros/insert-snippet
type: text/vnd.tiddlywiki
\define tr-insert-note(snippet)
<$vars
thetime=<<now "[UTC]YYYY0MM0DD0hh0mm0ss0XXX">>
theprefix={{$:/config/TiddlyRemember/IdPrefix}}>
<$vars
noteid={{{ [<theprefix>addsuffix<thetime>] }}}
editingtid={{{ [<storyTiddler>get[draft.of]] }}}>
<$action-sendmessage
$message="tm-edit-text-operation"
$param="replace-selection"
text={{{ [<__snippet__>search-replace[%NOTE_ID%],<noteid>search-replace[%EDITING_TIDDLER%],<editingtid>] }}}/>
</$vars>
</$vars>
\end

View File

@@ -1,10 +1,10 @@
created: 20200510004110231
modified: 20200730205800000
modified: 20200925141800000
tags: $:/tags/Macro
title: $:/plugins/sobjornstad/TiddlyRemember/macros/remember
type: text/vnd.tiddlywiki
\define remembertwo(id, reference)
\define remembertwo(id, reference, sched)
<div class="tr-selfidentification">
<$set name="selfid" filter="""[enlist[$reference$]]""" value="""[<$link to="$reference$">$reference$</$link>: $id$]""" emptyValue="[$id$]">
<<selfid>>
@@ -16,10 +16,13 @@ type: text/vnd.tiddlywiki
<div class="tr-reference">
<$text text=<<__reference__>>/>
</div>
<div class="tr-sched">
<$text text=<<__sched__>>/>
</div>
\end
\define rememberq(id, question, answer, reference: "")
<div class="rememberq remembertwo">
\define rememberq(id, question, answer, reference: "", sched: "", class:"")
<div class={{{ [[rememberq remembertwo ]addsuffix<__class__>addsuffix[ ]addsuffix{$:/config/TiddlyRemember/DefaultClasses}] }}}>
<div class="rquestion tr-ritem">
<div>Q:</div>
<p>$question$</p>
@@ -28,12 +31,12 @@ type: text/vnd.tiddlywiki
<div>A:</div>
<p>$answer$</p>
</div>
<$macrocall $name=remembertwo id=<<__id__>> reference=<<__reference__>>/>
<$macrocall $name=remembertwo id=<<__id__>> reference=<<__reference__>> sched=<<__sched__>>/>
</div>
\end
\define rememberp(id, first, second, reference: "")
<div class="rememberp remembertwo">
\define rememberp(id, first, second, reference: "", sched: "", class: "")
<div class={{{ [[rememberp remembertwo ]addsuffix<__class__>addsuffix[ ]addsuffix{$:/config/TiddlyRemember/DefaultClasses}] }}}>
<div class="rfirst tr-ritem">
<div>1:</div>
<p>$first$</p>
@@ -42,23 +45,20 @@ type: text/vnd.tiddlywiki
<div>2:</div>
<p>$second$</p>
</div>
<$macrocall $name=remembertwo id=<<__id__>> reference=<<__reference__>>/>
<$macrocall $name=remembertwo id=<<__id__>> reference=<<__reference__>> sched=<<__sched__>>/>
</div>
\end
\define remembercz(id, text, mode: "block", reference: "")
<$list filter="[[$mode$]match[inline]]">
<$macrocall $name=twRememberClozeInline id=<<__id__>> text=<<__text__>> reference=<<__reference__>>/>
\define remembercz(id, text, mode: "block", reference: "", sched: "", class: "")
<$list filter="[[$mode$]match[inline]]" variable=_>
<$macrocall $name=twRememberClozeInline id=<<__id__>> text=<<__text__>> reference=<<__reference__>> sched=<<__sched__>> class=<<__class__>>/>
</$list>
<$list filter="[[$mode$]!match[inline]]">
<$macrocall $name=twRememberClozeBlock id=<<__id__>> text=<<__text__>> reference=<<__reference__>>/>
<$list filter="[[$mode$]!match[inline]]" variable=_>
<$macrocall $name=twRememberClozeBlock id=<<__id__>> text=<<__text__>> reference=<<__reference__>> sched=<<__sched__>> class=<<__class__>>/>
</$list>
\end
\define twRememberClozeBlock(id, text, reference)
<div class="remembercz">
<span class="cloze-identifier">cloze: </span>
<span class="cloze-text">$text$</span>
\define twRememberMetadata(id, reference, sched)
<div class="tr-selfidentification">
<$set name="selfid" filter="""[enlist[$reference$]]""" value="""[<$link to="$reference$">$reference$</$link>: $id$]""" emptyValue="[$id$]">
<<selfid>>
@@ -70,24 +70,26 @@ type: text/vnd.tiddlywiki
<div class="tr-reference">
<$text text=<<__reference__>>/>
</div>
<div class="tr-sched">
<$text text=<<__sched__>>/>
</div>
\end
\define twRememberClozeInline(id, text, reference)
<span class="remembercz">
<span class="cloze-identifier">{cloze: </span>
\define twRememberClozeBlock(id, text, reference, sched, class)
<div class={{{ [[remembercz ]addsuffix<__class__>addsuffix[ ]addsuffix{$:/config/TiddlyRemember/DefaultClasses}] }}}>
<span class="cloze-identifier"><span class="tr-name-cloze">cloze: </span></span>
<span class="cloze-display"><$set name="unescape" value={{{ [<__text__>search-replace:g[\{],[{]search-replace:g[\}],[}]] }}}><<unescape>></$set></span>
<span class="cloze-text">$text$</span>
<$macrocall $name="twRememberMetadata" id=<<__id__>> reference=<<__reference__>> sched=<<__sched__>>/>
</div>
\end
\define twRememberClozeInline(id, text, reference, sched, class)
<span class={{{ [[remembercz ]addsuffix<__class__>addsuffix[ ]addsuffix{$:/config/TiddlyRemember/DefaultClasses}] }}}>
<span class="cloze-identifier">{<span class="tr-name-cloze">cloze: </span></span>
<span class="cloze-display"><$set name="unescape" value={{{ [<__text__>search-replace:g[\{],[{]search-replace:g[\}],[}]] }}}><<unescape>></$set></span>
<span class="cloze-identifier">}</span>
<div class="tr-selfidentification">
<$set name="selfid" filter="""[enlist[$reference$]]""" value="""[<$link to="$reference$">$reference$</$link>: $id$]""" emptyValue="[$id$]">
<<selfid>>
</$set>
</div>
<div class="rid">
[$id$]
</div>
<div class="tr-reference">
<$text text=<<__reference__>>/>
</div>
<span class="cloze-text">$text$</span>
<$macrocall $name="twRememberMetadata" id=<<__id__>> reference=<<__reference__>> sched=<<__sched__>>/>
</span>
\end

View File

@@ -43,7 +43,8 @@ div.remembercz {
color: <<colour muted-foreground>>;
}
/* the separate reference and ID fields are only for TR's benefit */
/* these separate fields are only read by the TR parser */
div.remembertwo div.tr-reference, .remembercz div.tr-reference {
display: none;
}
@@ -51,3 +52,28 @@ div.remembertwo div.tr-reference, .remembercz div.tr-reference {
div.remembertwo div.rid, .remembercz div.rid {
display: none;
}
div.remembertwo div.tr-sched, .remembercz div.tr-sched {
display: none;
}
.remembercz > span.cloze-text {
display: none;
}
/***** Built-in classes for common format customizations; apply to the class: parameter to macros *****/
/* Hide the ID field */
.tr-hide-id div.tr-selfidentification {
display: none;
}
/* Hide the ID only if it's an inline cloze */
span.remembercz.tr-hide-inline-cloze-id div.tr-selfidentification {
display: none;
}
/* Hide the word "cloze" on inline clozes */
span.remembercz.tr-hide-inline-cloze-name span.cloze-identifier span.tr-name-cloze {
display: none;
}

View File

@@ -6,9 +6,13 @@ type: text/vnd.tiddlywiki
\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]
<span id="tr-version">1.2.2</span>
<$set name="tr-rendering" value="yes">
<span id="tr-version">1.3.3</span>
{{||$:/plugins/sobjornstad/TiddlyRemember/templates/AnkiDecks}}
{{||$:/plugins/sobjornstad/TiddlyRemember/templates/AnkiTags}}
<$transclude mode="block" />
</$set>

View File

@@ -10,21 +10,4 @@ tags: $:/tags/EditorToolbar
title: $:/plugins/sobjornstad/TiddlyRemember/toolbar/remembercz
type: text/vnd.tiddlywiki
\define getMacro()
<<remembercz "$(clozeid)$"
"Cloze">>
\end
\define prefixId() $(theprefix)$$(thetime)$
<$set name=thetime value=<<now "[UTC]YYYY0MM0DD0hh0mm0ss0XXX">> >
<$set name=theprefix value={{$:/config/TiddlyRemember/IdPrefix}}>
<$set name=clozeid value=<<prefixId>> >
<$action-sendmessage
$message="tm-edit-text-operation"
$param="replace-selection"
text=<<getMacro>>
/>
</$set>
</$set>
</$set>
<$macrocall $name=tr-insert-note snippet={{$:/config/TiddlyRemember/snippets/remembercz}}>

View File

@@ -9,22 +9,4 @@ tags: $:/tags/EditorToolbar
title: $:/plugins/sobjornstad/TiddlyRemember/toolbar/rememberq
type: text/vnd.tiddlywiki
\define getMacro()
<<rememberq "$(questionid)$"
"Q"
"A">>
\end
\define prefixId() $(theprefix)$$(thetime)$
<$set name=thetime value=<<now "[UTC]YYYY0MM0DD0hh0mm0ss0XXX">> >
<$set name=theprefix value={{$:/config/TiddlyRemember/IdPrefix}}>
<$set name=questionid value=<<prefixId>> >
<$action-sendmessage
$message="tm-edit-text-operation"
$param="replace-selection"
text=<<getMacro>>
/>
</$set>
</$set>
</$set>
<$macrocall $name=tr-insert-note snippet={{$:/config/TiddlyRemember/snippets/rememberq}}>

View File

@@ -2,7 +2,7 @@
"title": "$:/plugins/sobjornstad/TiddlyRemember",
"description": "TiddlyRemember: Embed Anki notes in your TiddlyWiki",
"author": "Soren Bjornstad",
"version": "1.2.2",
"version": "1.3.3",
"core-version": ">=5.1.21",
"source": "https://github.com/sobjornstad/TiddlyRemember",
"list": "readme license",

View File

@@ -0,0 +1,68 @@
caption: Shuffle Operator
title: $:/plugins/mklauber/shuffle/readme
|!purpose|Randomize the order of the input list|
|!input|a selection of titles|
|!parameter|a random string to be used to create consistent random ordering|
|!output|The input titles, rearranged in a random order|
This plugin implements a new filter operator called Shuffle. This operator takes the input list and randomizes the order of the list. If no parameter is provided, the list order is random every time.
!!!Example:
```
<$list filter="1 2 3 4 5 +[shuffle[]]">
</$list>
```
<$button popup="$:/state/shuffle/reveal1">Run Demo</$button>
<$reveal type="popup" state="$:/state/shuffle/reveal1">
<div class="tc-drop-down">
<$list filter="1 2 3 4 5 +[shuffle[]]">
</$list>
</div>
</$reveal>
Combining this operator with the first operator allows you to choose 1 or more titles randomly from a list.
!!!Example:
```
<$list filter="1 2 3 4 5 +[shuffle[]first[2]]">
</$list>
```
<$button popup="$:/state/shuffle/reveal2">Run Demo</$button>
<$reveal type="popup" state="$:/state/shuffle/reveal2">
<div class="tc-drop-down">
<$list filter="1 2 3 4 5 +[shuffle[]first[2]]">
</$list>
</div>
</$reveal>
If a parameter is provided the list will be ordered identically every time it is rendered. This can be useful in conjunction a button that updates a state tiddler. Set the parameter of this operator to reference that state tiddler, and create a button that updates that tiddler, and now the ordering of the random operators only changes when the button is pressed.
!!!Example:
```
<$button>
<$action-setfield $tiddler="$:/temp/shuffle/example" $field="state" $value=<<now "0hh:0mm:0ss">>/>
Change Order
</$button>
<$list filter="1 2 3 4 5 +[shuffle{$:/temp/shuffle/example!!state}]">
</$list>
```
<$button>
<$action-setfield $tiddler="$:/temp/shuffle/example" $field="state" $value=<<now "0hh:0mm:0ss">>/>
Update
</$button>
<$list filter="1 2 3 4 5 +[shuffle{$:/temp/shuffle/example!!state}]">
</$list>

View File

@@ -0,0 +1 @@
!function(a,b){function c(c,j,k){var n=[];j=1==j?{entropy:!0}:j||{};var s=g(f(j.entropy?[c,i(a)]:null==c?h():c,3),n),t=new d(n),u=function(){for(var a=t.g(m),b=p,c=0;a<q;)a=(a+c)*l,b*=l,c=t.g(1);for(;a>=r;)a/=2,b/=2,c>>>=1;return(a+c)/b};return u.int32=function(){return 0|t.g(4)},u.quick=function(){return t.g(4)/4294967296},u.double=u,g(i(t.S),a),(j.pass||k||function(a,c,d,f){return f&&(f.S&&e(f,t),a.state=function(){return e(t,{})}),d?(b[o]=a,c):a})(u,s,"global"in j?j.global:this==b,j.state)}function d(a){var b,c=a.length,d=this,e=0,f=d.i=d.j=0,g=d.S=[];for(c||(a=[c++]);e<l;)g[e]=e++;for(e=0;e<l;e++)g[e]=g[f=s&f+a[e%c]+(b=g[e])],g[f]=b;(d.g=function(a){for(var b,c=0,e=d.i,f=d.j,g=d.S;a--;)b=g[e=s&e+1],c=c*l+g[s&(g[e]=g[f=s&f+b])+(g[f]=b)];return d.i=e,d.j=f,c})(l)}function e(a,b){return b.i=a.i,b.j=a.j,b.S=a.S.slice(),b}function f(a,b){var c,d=[],e=typeof a;if(b&&"object"==e)for(c in a)try{d.push(f(a[c],b-1))}catch(a){}return d.length?d:"string"==e?a:a+"\0"}function g(a,b){for(var c,d=a+"",e=0;e<d.length;)b[s&e]=s&(c^=19*b[s&e])+d.charCodeAt(e++);return i(b)}function h(){try{var b;return j&&(b=j.randomBytes)?b=b(l):(b=new Uint8Array(l),(k.crypto||k.msCrypto).getRandomValues(b)),i(b)}catch(b){var c=k.navigator,d=c&&c.plugins;return[+new Date,k,d,k.screen,i(a)]}}function i(a){return String.fromCharCode.apply(0,a)}var j,k=this,l=256,m=6,n=52,o="random",p=b.pow(l,m),q=b.pow(2,n),r=2*q,s=l-1;if(b["seed"+o]=c,g(b.random(),a),"object"==typeof module&&module.exports){module.exports=c;try{j=require("crypto")}catch(a){}}else"function"==typeof define&&define.amd&&define(function(){return c})}([],Math);

View File

@@ -0,0 +1,6 @@
created: 20180220123939614
modified: 20180220125617309
module-type: library
tags:
title: $:/plugins/mklauber/shuffle/seedrandom.js
type: application/javascript

View File

@@ -0,0 +1,53 @@
(function(){
"use strict";
var hash = function(str) {
var hash = 0, i, chr, len;
if (str.length === 0) return hash;
for (i = 0, len = str.length; i < len; i++) {
chr = str.charCodeAt(i);
hash = ((hash << 5) - hash) + chr;
hash |= 0; // Convert to 32bit integer
}
return hash;
}
var shuffle = function(array, seed) {
var currentIndex = array.length, temporaryValue, randomIndex ;
Math.seedrandom(seed)
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// And swap it with the current element.
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}
var prepare_results = function (source) {
var results = [];
source(function(tiddler,title) {
results.push(title);
});
return results;
};
exports.shuffle = function(source, operator, options) {
var results = prepare_results(source);
if (operator['operand'] == "") {
shuffle(results);
} else {
shuffle(results, hash(operator['operand']));
}
return results;
}
})();

View File

@@ -0,0 +1,6 @@
caption: A filter Operator to randomize the order of the list passed to it.
created: 20150811171933696
modified: 20180220125039203
module-type: filteroperator
title: $:/plugins/mklauber/shuffle/shuffle.js
type: application/javascript

View File

@@ -0,0 +1,5 @@
exports.name = "shuffle"
exports.before = ["render"]
exports.startup = function() {
$tw.modules.execute('$:/plugins/mklauber/shuffle/seedrandom.js');
}

View File

@@ -0,0 +1,6 @@
created: 20180220133753576
modified: 20180220133920300
module-type: startup
tags:
title: $:/plugins/mklauber/shuffle/startup.js
type: application/javascript

View File

@@ -0,0 +1,13 @@
{
"author": "Matthew Lauber",
"core-version": ">=5.0.0",
"created": "20210105134918257",
"dependents": "",
"description": "A Shuffle filter operator",
"list": "readme",
"modified": "20211107172616237",
"plugin-type": "plugin",
"source": "https://github.com/mklauber/tiddly-shuffle",
"title": "$:/plugins/mklauber/shuffle",
"version": "1.0.2"
}

View File

@@ -0,0 +1,8 @@
created: 20210928031215487
creator: soren
modified: 20210928031216652
modifier: soren
title: $:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/do-thing
type: text/vnd.tiddlywiki
show

View File

@@ -1,5 +1,7 @@
created: 20200516190911842
modified: 20210308030709436
creator: soren
modified: 20220302210205566
modifier: soren
tags:
title: $:/config/TiddlyRemember/TagMapping
type: text/vnd.tiddlywiki

View File

@@ -1,6 +1,6 @@
created: 20200118003731285
creator: soren
modified: 20200118003737882
modified: 20220215235820508
modifier: soren
title: $:/config/Toolbar/ButtonClass
type: text/vnd.tiddlywiki

View File

@@ -2,9 +2,9 @@ caption: Sidebar info links
created: 20210623014408947
creator: soren
description: Show navigation links to the most important parts of the wiki underneath the subtitle.
modified: 20210825145449987
modified: 20211107173557802
modifier: soren
private: no
private: yes
public: no
tags:
title: $:/config/zettelkasten/FeatureFlags/SidebarInfoLinks

View File

@@ -2,7 +2,7 @@ caption: Spoiler banner
created: 20210622003118415
creator: soren
description: Display a warning banner on fiction tiddlers (any tiddler with a non-empty `universe` field) noting that we don't try to hide spoilers.
modified: 20210909130158483
modified: 20220201042246695
modifier: soren
private: no
public: no

View File

@@ -0,0 +1,19 @@
caption: {{$:/language/Buttons/Linkify/Caption}}
condition: [<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]
created: 20210928031136147
creator: soren
description: {{$:/language/Buttons/Linkify/Hint}}
icon: $:/core/images/linkify
modified: 20210928031136215
modifier: soren
shortcuts: ((linkify))
tags: $:/tags/EditorToolbar
title: $:/core/ui/EditorToolbar/linkify
type: text/vnd.tiddlywiki
<$action-sendmessage
$message="tm-edit-text-operation"
$param="wrap-selection"
prefix="[["
suffix="]]"
/>

View File

@@ -0,0 +1,19 @@
caption: {{$:/language/Buttons/Transcludify/Caption}}
condition: [<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]
created: 20210928031136147
creator: soren
description: {{$:/language/Buttons/Transcludify/Hint}}
icon: $:/core/images/transcludify
modified: 20210928031136239
modifier: soren
shortcuts: ((transcludify))
tags: $:/tags/EditorToolbar
title: $:/core/ui/EditorToolbar/transcludify
type: text/vnd.tiddlywiki
<$action-sendmessage
$message="tm-edit-text-operation"
$param="wrap-selection"
prefix="{{"
suffix="}}"
/>

View File

@@ -0,0 +1,52 @@
/*\
title: $:/inmysocks/macros/day-diff.js
type: application/javascript
module-type: macro
Takes two dates and returns their difference in days
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
Information about this macro
*/
exports.name = "day-diff";
exports.params = [
{name: "year1"},
{name: "month1"},
{name: "day1"},
{name: "year2"},
{name: "month2"},
{name: "day2"}
];
/*
Run the macro
*/
exports.run = function(year1, month1, day1, year2, month2, day2) {
//Make each date object.
var date1 = new Date(year1, Number(month1)+Number(1), day1);
var date2 = new Date(year2, Number(month2)+Number(1), day2);
//Find difference in milliseconds.
var elapsed = date2.getTime()-date1.getTime();
//Number of milliseconds in a day.
var dayMS = 86400000;
//Convert milliseconds to year months and days
var days_diff = Math.floor(elapsed/dayMS);
var result = days_diff;
return result;
};
})();

View File

@@ -0,0 +1,6 @@
created: 20150225185218583
modified: 20211204021739668
module-type: macro
tags:
title: $:/inmysocks/macros/day-diff.js
type: application/javascript

View File

@@ -0,0 +1,31 @@
caption: RememberCz
condition: [<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]
created: 20200517155905263
creator: soren
description: Remember Cloze Deletion
icon: $:/plugins/sobjornstad/TiddlyRemember/icons/lightbulb-black.svg
modified: 20211113234933532
modifier: soren
shortcuts: ((remembercz))
tags: $:/tags/EditorToolbar
title: $:/plugins/sobjornstad/TiddlyRemember/toolbar/remembercz
type: text/vnd.tiddlywiki
\define getMacro()
<<remembercz "$(clozeid)$"
"Cloze">>
\end
\define prefixId() $(theprefix)$$(thetime)$
<$set name=thetime value=<<now "[UTC]YYYY0MM0DD0hh0mm0ss0XXX">> >
<$set name=theprefix value={{$:/config/TiddlyRemember/IdPrefix}}>
<$set name=clozeid value=<<prefixId>> >
<$action-sendmessage
$message="tm-edit-text-operation"
$param="replace-selection"
text=<<getMacro>>
/>
</$set>
</$set>
</$set>

View File

@@ -3,7 +3,7 @@ created: 20200419143537510
creator: soren
description: Copy the name of this tiddler to the clipboard
list-after: $:/core/ui/Buttons/info
modified: 20210922125723154
modified: 20220215235957457
modifier: soren
tags: $:/tags/ViewToolbar
title: $:/sib/Buttons/CopyTitleReference

View File

@@ -1,10 +1,11 @@
caption: Excise private chunk
condition: [<targetTiddler>type[]] [<targetTiddler>type[text/vnd.tiddlywiki]] +[first[]]
created: 20210522034413324
creator: soren
description: Create a new private chunk from the selection
icon: $:/core/images/locked-padlock
list-after: $:/core/ui/EditorToolbar/excise
modified: 20210522034828757
modified: 20210928031136154
modifier: soren
shortcuts: ((excise-private-chunk))
tags: $:/tags/EditorToolbar
title: $:/sib/Buttons/excise-private-chunk

View File

@@ -1,11 +1,13 @@
caption: possible
color: lightblue
created: 20210508225155649
modified: 20210508230813020
creator: soren
modified: 20211229142954562
modifier: soren
section: main
stackorder: 30
tags:
title: $:/sib/EpistemicStatus/possible
type: text/vnd.tiddlywiki
I [[withhold judgment|OpinionsRequireCounterarguments]] on the idea; I am merely reporting it.
I [[withhold judgment|NoOpinion]] on the idea; I am merely reporting it.

View File

@@ -1,7 +1,7 @@
caption: Next steps
created: 20210828133924602
creator: soren
modified: 20210828134435065
modified: 20210922163144199
modifier: soren
tags:
title: $:/sib/GettingStarted/NextSteps
@@ -13,6 +13,8 @@ I recommend starting by ''adding some notes''! Add a couple of tiddlers for the
Once you've gotten a few notes into the system, you will be in a good place to ''decide what elements of this edition you like and what things you'll want to change''. If you want to get into customizing the wiki and you don't have much experience with TiddlyWiki, check out [[Grok TiddlyWiki|https://groktiddlywiki.com/read]], a complete textbook and reference designed for learning how this stuff works from the ground up.
At any time, you can watch [[an hour-long walkthrough video|https://www.youtube.com/watch?v=9X_T-DVie8o]] showing the most important features of tzk.
At any time, you can click the ''tools button {{$:/core/images/theme-button}}'' on the page toolbar (upper-right corner of the wiki, right under the title) to access a wide variety of tools, settings, and documentation related to the Zettelkasten edition.
If you have questions, comments, or suggestions, please feel free to get in touch at `zettelkasten@sorenbjornstad.com`.

View File

@@ -1,14 +1,19 @@
created: 20210623014041787
creator: soren
list-after: $:/core/ui/SideBarSegments/site-subtitle
modified: 20210623014719347
modified: 20211107173606954
modifier: soren
tags: $:/tags/SideBarSegment
title: $:/sib/SideBar/InfoLinks
type: text/vnd.tiddlywiki
\define go-random-action() <$action-navigate $to={{{[tag[Idea]!tag[PrivateChunk]!regexp[/]!tag[Stub]shuffle[]first[]]}}}/>
<$list filter=<<ff SidebarInfoLinks>> variable=_>
[[about|PublicHomepage]]&nbsp;·
[[reading|RecentlyRead]]&nbsp;·
[[favorites|Favorites]]
[[favorites|Favorites]]&nbsp;·
<$button class="tc-tiddlylink tc-btn-invisible" actions=<<go-random-action>>>random idea</$button>
<style>
.gtw-sidebar-links a, .gtw-sidebar-links button {

View File

@@ -1,10 +1,12 @@
caption: Stubs
created: 20200516155336361
creator: soren
list-after: $:/core/ui/MoreSideBar/Missing
modified: 20210522014721028
modified: 20211204001205484
modifier: soren
title: $:/sib/SideBar/Write/Stub
type: text/vnd.tiddlywiki
<$list filter="[tag[Stub]sort[]]" emptyMessage="No stubs right now! You're awesome!">
<$list filter="[tag[Stub]sort[]] -[[$:/TagSaver]]" emptyMessage="No stubs right now! You're awesome!">
<$link to=<<currentTiddler>>><<currentTiddler>></$link><br/>
</$list>

View File

@@ -1,10 +1,12 @@
created: 20201204132021892
modified: 20210522014049552
creator: soren
modified: 20211027125509141
modifier: soren
tags: $:/tags/EditTemplate
title: $:/sib/Templates/Automatic/MissingTiddlerCreationNotification
type: text/vnd.tiddlywiki
<$list filter="[all[current]get[draft.of]prefix[New Tiddler]]" variable="draftof">
<$list filter="[all[current]get[draft.of]prefix[New ]]" variable="draftof">
<$list filter="[all[current]get[draft.title]backlinks[]first[]]" variable=_>
Creating missing tiddler <$link to={{!!draft.title}}/>. The following tiddlers will link here when you save:
<<list-links "[all[current]get[draft.title]backlinks[]]">>

View File

@@ -0,0 +1,36 @@
created: 20211120164840100
creator: soren
description: Navigate to the parent or a sibling of the current subtiddler. Subtiddler names are separated from that of their supertiddlers by a / (and are not system tiddlers).
modified: 20220202173655863
modifier: soren
tags: $:/tags/ViewTemplate
title: $:/sib/Templates/Automatic/Subtiddler
transcludedin: All tiddlers whose titles contain a slash and are not system tiddlers.
type: text/vnd.tiddlywiki
\define expand-siblings() <$action-setfield $tiddler="$:/temp/ShowSiblings" $index=<<currentTiddler>> $value="yes" />
\define contract-siblings() <$action-setfield $tiddler="$:/temp/ShowSiblings" $index=<<currentTiddler>> $value="no" />
\define siblings-filter() [prefix<parentTiddlerPlusSlash>!match<currentTiddler>]
<$list filter="[all[current]!is[system]regexp:title[/]]" variable=_>
<$set name="parentTiddler" value={{{ [all[current]split[/]butlast[]join[/]] }}}>
<$set name="parentTiddlerPlusSlash" value={{{ [<parentTiddler>addsuffix[/]] }}}>
<div style="text-align: center;">
This is a subtiddler of <$link to=<<parentTiddler>>/>.<br>
<$reveal stateTitle="$:/temp/ShowSiblings" stateIndex=<<currentTiddler>> type="nomatch" text="yes">
<$list filter="[prefix<parentTiddlerPlusSlash>!match<currentTiddler>first[]]" variable=_ emptyMessage="This is the only subtiddler.">
<$button class="tc-btn-invisible tc-tiddlylink" actions=<<expand-siblings>>>{{$:/core/images/right-arrow}} Siblings of this subtiddler</$button> (<$count filter=<<siblings-filter>>/>)
</$list>
</$reveal>
<$reveal stateTitle="$:/temp/ShowSiblings" stateIndex=<<currentTiddler>> type="match" text="yes">
<$button class="tc-btn-invisible tc-tiddlylink" actions=<<contract-siblings>>>{{$:/core/images/down-arrow}} Siblings of this subtiddler:</$button><br>
<$list filter=<<siblings-filter>>>
<$link to=<<currentTiddler>>><$text text={{{ [<currentTiddler>removeprefix<parentTiddlerPlusSlash>] }}}/></$link><br>
</$list>
</$reveal>
</div>
</$set>
</$set>
</$list>

View File

@@ -0,0 +1,22 @@
created: 20211120170347843
creator: soren
description: Show a warning on tiddlers that don't have a type selected.
modified: 20211221014011578
modifier: soren
tags: $:/tags/ViewTemplate
title: $:/sib/Templates/Automatic/TypeTagChecker
transcludedin: All tiddlers that exist, aren't system tiddlers or subtiddlers, and don't have at least one tag of the color #ff0000.
type: text/vnd.tiddlywiki
<!-- System tiddlers, missing tiddlers, and subtiddlers are exempt from the warning. -->
<$list filter="[all[current]!is[system]!is[missing]!regexp[/]]">
<$list filter="[all[current]tags[]color[#ff0000]] ~[[Oops]] +[match[Oops]]" variable=_>
<div style="display: inline-block; vertical-align: center; margin-top: 6px; margin-left: 1em; fill: yellow;">
<span style="height: 44px">{{$:/core/images/warning}}</span>
</div>
<div style="display: inline-block; margin-left: 1em; color: yellow; font-weight: bold;">
This tiddler does not have a type tag (type tags appear in red). You should probably attach one.<br>
See [[ZettelkastenCardType]] for details on the available options.
</div>
</$list>
</$list>

View File

@@ -0,0 +1,15 @@
caption: Tray
created: 20210701023215046
creator: soren
description: Items we're currently working on but don't need to leave open. Drag and drop a link to a tiddler to add it.
list:
modified: 20211026030511257
modifier: soren
tags: Meta Tool
title: $:/sib/Tools/Tray
tooltype: aggregator
type: text/vnd.tiddlywiki
Stuff I'm working on but don't need to keep open:
<<list-links-draggable "$:/sib/Tools/Tray" itemTemplate:"$:/sib/Tools/Tray/Template">>

View File

@@ -1,6 +1,6 @@
created: 20210410004529968
creator: soren
modified: 20210825162735756
modified: 20210924153927403
modifier: soren
tags:
title: $:/sib/indite/InditeChildren
@@ -50,11 +50,14 @@ copy <<copy-me>> · <<copy-rendered>>
$viewBlock$
</div>
</$list>
<$list filter="[<tr-rendering>!match[yes]]" variable=_>
<$list filter="[all[current]editmode[edit]] [all[current]editmode[both]]">
<div class={{{ [[indite-sbs-editor]addsuffix[ ]addsuffix<thewidth>] }}}>
<$transclude tiddler="$:/core/ui/EditTemplate/body/editor"/>
</div>
</$list>
</$list>
</$set>
\end

View File

@@ -1,7 +1,9 @@
caption: Indite view template
created: 20210410004824597
creator: soren
description: Tiddlers that are part of the Indite writing system (under development) hide the normal view template via CSS and use this one instead.
modified: 20210523143848140
modified: 20210924153731019
modifier: soren
tags: $:/tags/ViewTemplate
title: $:/sib/indite/ViewTemplate
transcludedin: All tiddlers tagged <<tag Indite>>.

View File

@@ -2,7 +2,7 @@ caption: Subtiddlers
condition: [all[tiddlers]prefix<storyTiddler>!field:title<storyTiddler>sort[]]
created: 20201206210345097
creator: soren
modified: 20210920161045390
modified: 20211227155615108
modifier: soren
tags: $:/tags/ReferenceExplorerTab
title: $:/sib/refexplorer/Subtiddlers

View File

@@ -1,5 +1,7 @@
created: 20210719234124096
modified: 20210719235343017
creator: soren
modified: 20211025140658570
modifier: soren
tags: $:/tags/Stylesheet
title: $:/sib/styles/footnote
type: text/vnd.tiddlywiki
@@ -26,8 +28,10 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
.refnotes-footnote:after {
content: counter(fnote-count);
font-size:small;
vertical-align: super;
line-height: 1.5;
vertical-align: top;
font-size: 0.8em;
/*vertical-align: super;
line-height: 1.5;*/
margin-left: 0em;
color: yellow;
}

View File

@@ -1,5 +1,7 @@
created: 20210624125244567
modified: 20210629025407566
creator: soren
modified: 20211025010048942
modifier: soren
tags: $:/tags/Stylesheet
title: $:/sib/styles/hr
type: text/vnd.tiddlywiki
@@ -7,7 +9,7 @@ type: text/vnd.tiddlywiki
/* Based on: Flaired edges, by Tomas Theunissen
https://css-tricks.com/examples/hrs/ */
.tc-tiddler-body hr, .tc-tiddler-preview-preview hr {
.tc-tiddler-body > hr, .tc-tiddler-preview-preview > hr {
overflow: visible; /* For IE */
height: 30px;
border-style: solid;

View File

@@ -0,0 +1,7 @@
created: 20210928031136148
creator: soren
list: $:/core/ui/EditorToolbar/do-thing $:/core/ui/EditorToolbar/paint $:/core/ui/EditorToolbar/opacity $:/core/ui/EditorToolbar/line-width $:/core/ui/EditorToolbar/rotate-left $:/core/ui/EditorToolbar/clear $:/core/ui/EditorToolbar/bold $:/core/ui/EditorToolbar/italic $:/core/ui/EditorToolbar/strikethrough $:/core/ui/EditorToolbar/underline $:/core/ui/EditorToolbar/superscript $:/core/ui/EditorToolbar/subscript $:/core/ui/EditorToolbar/mono-line $:/core/ui/EditorToolbar/linkify $:/core/ui/EditorToolbar/transcludify $:/core/ui/EditorToolbar/mono-block $:/core/ui/EditorToolbar/quote $:/core/ui/EditorToolbar/list-bullet $:/core/ui/EditorToolbar/list-number $:/core/ui/EditorToolbar/heading-1 $:/core/ui/EditorToolbar/heading-2 $:/core/ui/EditorToolbar/heading-3 $:/core/ui/EditorToolbar/heading-4 $:/core/ui/EditorToolbar/heading-5 $:/core/ui/EditorToolbar/heading-6 $:/core/ui/EditorToolbar/link $:/core/ui/EditorToolbar/excise $:/sib/Buttons/excise-private-chunk $:/core/ui/EditorToolbar/picture $:/core/ui/EditorToolbar/stamp $:/core/ui/EditorToolbar/size $:/core/ui/EditorToolbar/editor-height $:/core/ui/EditorToolbar/more $:/core/ui/EditorToolbar/preview $:/core/ui/EditorToolbar/preview-type $:/plugins/sobjornstad/TiddlyRemember/toolbar/rememberq $:/plugins/sobjornstad/TiddlyRemember/toolbar/remembercz $:/plugins/tiddlywiki/katex/ui/EditorToolbar/katex
modified: 20210928031142401
modifier: soren
title: $:/tags/EditorToolbar
type: text/vnd.tiddlywiki

View File

@@ -1,5 +1,7 @@
created: 20201129183705439
list: $:/core/ui/ViewTemplate/title $:/core/ui/ViewTemplate/unfold $:/core/ui/ViewTemplate/subtitle $:/sib/EpistemicStatus/Display $:/sib/MediaRating/Display $:/core/ui/ViewTemplate/tags $:/core/ui/ViewTemplate/classic $:/sib/Templates/Automatic/SpoilerBanner $:/sib/Templates/Automatic/Untitled $:/sib/Templates/Automatic/PrivateChunkParentNotice $:/sib/Templates/Automatic/Source $:/sib/Templates/Topical/MinnesotaStateParkInfo $:/sib/Templates/Automatic/MacroDescription $:/core/ui/ViewTemplate/body $:/sib/indite/ViewTemplate $:/sib/Reviewer/SchedulableTemplate $:/sib/gis/MappingTools $:/sib/Templates/Topical/SabbaticalUpdates/DateNavigation $:/sib/Templates/Automatic/Publicity/ViewerPublicLine $:/core/ui/ViewTemplate/import $:/core/ui/ViewTemplate/plugin $:/plugins/danielo515/2click2edit/ui/ViewTemplate $:/sib/refexplorer/ReferenceExplorer $:/sib/Templates/Automatic/ViewTemplateDescription $:/sib/Templates/Automatic/ReaderActions $:/plugins/kookma/refnotes/viewtemplates/main
modified: 20210807194815491
creator: soren
list: $:/core/ui/ViewTemplate/title $:/core/ui/ViewTemplate/unfold $:/core/ui/ViewTemplate/subtitle $:/sib/EpistemicStatus/Display $:/sib/MediaRating/Display $:/core/ui/ViewTemplate/tags $:/core/ui/ViewTemplate/classic $:/sib/Templates/Automatic/Subtiddler $:/sib/Templates/Automatic/TypeTagChecker $:/sib/Templates/Automatic/SpoilerBanner $:/sib/Templates/Automatic/Untitled $:/sib/Templates/Automatic/PrivateChunkParentNotice $:/sib/Templates/Automatic/Source $:/sib/Templates/Topical/MinnesotaStateParkInfo $:/sib/Templates/Automatic/MacroDescription $:/core/ui/ViewTemplate/body $:/sib/indite/ViewTemplate $:/sib/Reviewer/SchedulableTemplate $:/sib/gis/MappingTools $:/sib/Templates/Topical/SabbaticalUpdates/DateNavigation $:/sib/Templates/Automatic/Publicity/ViewerPublicLine $:/core/ui/ViewTemplate/import $:/core/ui/ViewTemplate/plugin $:/plugins/danielo515/2click2edit/ui/ViewTemplate $:/sib/refexplorer/ReferenceExplorer $:/sib/Templates/Automatic/ViewTemplateDescription $:/sib/Templates/Automatic/ReaderActions
modified: 20211120171147065
modifier: soren
title: $:/tags/ViewTemplate
type: text/vnd.tiddlywiki

View File

@@ -1,6 +1,8 @@
created: 20200507143136944
creator: soren
list: PublicHomepage/Navigating PublicHomepage/Organization [[PublicHomepage/Points of Interest]] [[PublicHomepage/No Warranty]] PublicHomepage/Copyright PublicHomepage/Contact [[PublicHomepage/Video Tour]]
modified: 20210720015457472
modified: 20211007181213586
modifier: soren
tags: Public Meta
title: PublicHomepage
type: text/vnd.tiddlywiki

View File

@@ -10,7 +10,7 @@ import sys
from typing import Any, Callable, Dict, NoReturn
TZK_VERSION = "0.1.2"
TZK_VERSION = "0.2.0"
class BuildError(Exception):