Embedding tiddler title in image URL

175 views
Skip to first unread message

cjec...@gmail.com

unread,
Jun 22, 2021, 10:45:51 PM6/22/21
to TiddlyWiki
Long time lurker, first time poster.

I've a wiki with a couple of hundred tiddlers all of the same format, just different content, so I'm trying to develop a tiddler template.

Each tiddler displays an image specific to that tiddler. I've a directory in which all the images are kept, each with the same name as the tiddler {{!!title}} field. E.g.:

images/Tiddler1.jpg
images/Tiddler2.jpg
images/Tiddler3.jpg

They idea is to then embed the tiddler title in the url, i.e.:

[img[images/{{!!title}}.jpg]]

But of course that just gets read literally. I've also tried using a variable with the same result:

<$set name="image" value="images/{{!!title}}.jpg">
[image[<<image>>]]
</$set>

How can I do this?

--Nathanael

Darth Mole

unread,
Jun 22, 2021, 11:14:15 PM6/22/21
to TiddlyWiki
I think this is what you're looking for? There may be a better way to do it, but it seems to function based on my tests. Thanks to everyone over the last two weeks that have helped me so much! I wouldn't have been able to answer someone's question like this otherwise.

\define linkcreation()
[img[images/{{!!title}}.jpg]]
\end

<<linkcreation>>

cjec...@gmail.com

unread,
Jun 23, 2021, 12:24:32 AM6/23/21
to TiddlyWiki
Thanks for the quick reply, and for the code.

Unfortunately, it's not working for me. Here's what I've done.

1. Download a fresh copy of Tiddlywiki
2. Create a tiddler called "Test".
3. Copy/paste your code into "Test" and save.

I end up with a broken image icon. When I right click and choose "open image in new tab", I get the link:


It's still interpreting {{!!title}} literally.

 --Nathanael

Eric Shulman

unread,
Jun 23, 2021, 12:51:52 AM6/23/21
to TiddlyWiki
On Tuesday, June 22, 2021 at 7:45:51 PM UTC-7 cjec...@gmail.com wrote:
...embed the tiddler title in the url, i.e.:
[img[images/{{!!title}}.jpg]]
But of course that just gets read literally. I've also tried using a variable with the same result:
<$set name="image" value="images/{{!!title}}.jpg">
[image[<<image>>]]
</$set>

The problem is that you can't directly mix field transclusion syntax, e.g., {{!!fieldname}}, within other wiki syntax, e.g., [img[...]]

The solution is to define a macro that constructs the desired wiki image syntax, like this:
\define showImage() [img[images/$(currentTiddler)$.jpg]]
Then, invoke it like this:
<<showImage>>

Notes:
* By default, within each tiddler, the variable "currentTiddler" holds the name of the tiddler
* In normal tiddler content, you can use either {{!!title}} or <<currentTiddler>> to display the name of the tiddler
* Within the macro definition, $(...)$ does a text substitution of the indicated variable, where the variable is defined outside the macro
* After variable substitutions are done, the resulting macro content is "returned" for rendering
* Thus, if the above macro is invoked within a tiddler named "Tiddler1", the macro content returned by <<showImage>> will be: [img[images/Tiddler1.jpg]], which is the syntax you want.
* To use <<showImage>> in multiple tiddlers, just place the showImage() macro definition in a tiddler by itself (e.g., "ShowImageMacro"), and then tag that tiddler with $:/tags/Macro.

Also, as an alternative to using a macro definition to construct the desired syntax, you could use the <$image> widget with a parameter value that is assembled using "filtered transclusion", like this:
   <$image source={{{ [[images/]addsuffix<currentTiddler>addsuffix[.jpg]] }}} />
However, this syntax is obviously more complex to produce the exact same result.

enjoy,
-e

Darth Mole

unread,
Jun 23, 2021, 12:52:34 AM6/23/21
to TiddlyWiki
wow, I'm really sorry. If you remove the enclosing [ and ] on the img tag code and save it, at least on mine, it displays the tiddler title. So when it was a broken img after I added the [ ] on either end I didn't think to check to see if it was still working. Sorry about that. Also it seems that while I was close, I think, it didn't work out too well.

Darth Mole

unread,
Jun 23, 2021, 12:55:06 AM6/23/21
to TiddlyWiki
Ok so I was kind of close lol. I didn't use the $(...)$ because I thought the vars that created that in the code I had seen was specific to the buttons. I also didn't realize that with core variables they didn't need to be set if you were using the same name. Thanks Eric!

cjec...@gmail.com

unread,
Jun 23, 2021, 3:17:46 AM6/23/21
to TiddlyWiki
Hey, cool! The $(..)$ syntax was the key. It also works within tiddler transclusion, e.g., {{$(currentTiddler)$ Discussion}}, which allowed me to finished the template. My main tiddlers now just have the single line <<myTemplate>> and everything works.

Mini-rant: all these different syntaxes are just a tad confusing :) Sometimes {{..}}, sometimes {{{..}}}, sometimes <<..>>, sometimes $(..)$, probably others I haven't stumbled on yet. Hard to keep track.

Thanks to both of you for your help!

--nathanael

PMario

unread,
Jun 23, 2021, 3:58:14 AM6/23/21
to TiddlyWiki
On Wednesday, June 23, 2021 at 9:17:46 AM UTC+2 cjec...@gmail.com wrote:

Mini-rant: all these different syntaxes are just a tad confusing :) Sometimes {{..}}, sometimes {{{..}}}, sometimes <<..>>, sometimes $(..)$, probably others I haven't stumbled on yet. Hard to keep track.

We do have to do different things, that doesn't work with the same syntax. The parser needs differences to decide what to do.

{{title}} ... is the convenience shortcut for <$transclude tiddler=title /> and it produces the exact same output.

{{{ [[filter string]] }}} is the shortcut for  <$list filter="[[filter string]]"><$link /></$list>

-----------------

<<macro-name>>  is the syntax to call a macro that has to be defined with:

\define macro-name() some text

macros do only 1 thing. They substitute text.

-----------------

\define build-url(title) https://tiddlywiki.com/#$title$

<<build-url title:"HelloThere">>

With this example the parameter that is given to the macro call, will replace the string $title$. Then the macro output is used.

--------------------

\define build-url(title:Plugins) [[https://tiddlywiki.com/#:$(currentTiddler)$ $(a)$ $(b)$ $title$]]

<$vars a=Learning b=Features>
<$tiddler tiddler="HelloThere">
<<build-url>>
</$tiddler>
</$vars>

The code above does a similar thing. It replaces $(currentTiddler)$ with the variable currentTiddler, that is defined by the tiddler-widget. The same is true for "a" and "b" ... title is from the first example

The outer [[]] is needed, to be able to uses spaces between the elements. .. If you don't have the braces the link would need to look like this.


Hope that helps a bit
-mario

PMario

unread,
Jun 23, 2021, 4:02:30 AM6/23/21
to TiddlyWiki
Hi,
The docs can be found at: https://tiddlywiki.com/#Transclusion%20in%20WikiText  Also click the links at the end of the tiddler!!
-m

Reply all
Reply to author
Forward
0 new messages