Tinderbox Forum

Is tinderbox the tool for the job?

Greetings everyone,

I am new to TB and the forum.

As I wrote on my profile, I am a phd student in ancient greek philosophy, so this means I have a large corpora of texts which I have to deal with, making notes, comments, getting references and so forth.

So far, I had been using voodoo pad’s auto linking system in order to turn this corpora of greek texts into a hypertext. In this software, if I create a page named, let us say, σωφροσύνη (sophrosyne), and add aliases for different forms of the word, such as σωφροσύνην / σωφροσύνης / σωφροσύνῃ (and so forth) all the occurrences of this word (and marked forms) automatically turn into a hyperlink to the aforementioned page.

This is very useful to me, but unfortunately voodoo pad cannot locate and indicate to me where all of these occurrences are so that I can store them in the concept page adding a back-link to each of them.

My questions is… is there a way for me to achieve this using tinderbox?

Also, has anyone tried using it for adding scholia (commentary and notes) to classical texts and can perhaps indicate some of the best possible practices in this direction? These are texts I will still be reading 20 yrs from now and I would be interesting having all my notes on different sections of the text neatly organized and available to aid comprehension and further insights into the matter. So far, what I could gather is that dealing with, and splitting, large texts on tb is a lot of work (but perhaps I am not tackling it in the best possible way).

Thanks in advanced,

locate and indicate to me where all of these occurrences are

If you represent the connection with links, then Roadmap will do what you want.

Another approach would be to add a set of $Tags for notable terms like σωφροσύνη. Add this tag to all notes where the term or a synonym appears, or where you think it’s pertinent; then an agent can quickly list all those notes.

I’d resist the impulse to leap in and represent entire texts and scholia in Tinderbox. You can, but it’s a lot of work — and that work might not be your most pressing task.

Splitting up texts in Tinderbox is really quite easy. Simple copy/paste can deal with quite a lot of text in an hour or two. Explode can do wonders, (Much depends on “large” — I’ve seen Tinderboxers store entire monographs in a note, but typical Tinderbox applications have a few thousand notes, each of which might run to a few hundred or a few thousand words. If you’re thinking orders of magnitude larger, then your only viable approach may be a database.)

1 Like

Thank you for the swift reply, Mark (@eastgate).

Would this involve manually finding and linking all these occurrences to a single page? Or is there a way to implement a auto link system based on the note name (+aliases)? (I could not find a way to add synonyms/aliases to a note - when I create a alias, it is tight to the original note so I can’t change anything)(For some reason, nor could I make wiki words works.)

Again, is there a way to automatize this? Also, will the link lead to the whole note (or the specific word within the note?) This can make quite a big difference.

That is, indeed, sound advice. Thank you.

I finished my doctoral thesis three months ago and I worked a lot with Tinderbox, either for brainstorming or taking notes or analysing datas such as parts of speeches. If you have to deal often with words, concepts, notions, and so on, Tinderbox will be particularly useful to search, as you give an example, for the multiple occurrences of a term. For instance, if you search for the word philosophia in Aristotle’s Metaphysics, or phronesis in his Nicomachean ethics, you could use the Attribute Browser in order to gather every occurrence of that term in the first book of his Physics, then, in the second book, and so on. To do this, you have to take notes while reading from an index card you’ll have built ad hoc. You’ll find an example of that index card on the screenshot below. Tinderbox is a great tool. Try it.

That is really good to know @dominiquerenauld. I am watching tutorials and slowly figuring out the software. Please forgive my ignorance and shamelessness, but could you briefly describe to me how would this look like? I am trying to query for a specific word using a simple search but if the word occurs more than once within a single note it displays only the first occurrence.

Let us assume I have a container named Corpus Aristotelicum with several child containers named Ethica Nicomachea, Physica, De Anima and so forth. Within each of these, the texts are divided by chapter (each note being a whole chapter of text).

Should I want to locate all occurrences of, let us say, the verb πάσχειν, I would set up an agent to query $Text==“πάσχειν” or perhaps $ Text.contains(πάσχειν)? (I tried both of them without success. It displayed only the first occurrence.)

I also tried splitting the text up to the level of single lines (De Anima, for instance, had around 2000 notes/lines). This time, for some reason, I got no results from the query.

1 Like

If you want to insert into each note “a whole chapter of text”, you’ll have to use the set attribute “Tags” and write down some tags into the field of this attribute: for instance, if a chapter contains the word πάσχειν, you’ll have to enter the word πάσχειν as a tag attribute. Then, using the Attribute Browser, you’ll be able to see the tags you already entered for each chapter. On this subject, take a look at this thread.

Try this operator


As in this example file (see the $Rule in the parent and in each child). The method can be applied to an agent, too, with some adjustment in the logic.

countOccurrences Example 20181219.tbx (64.4 KB)

It’s a useful exercise to become familiar with the contents of this aTbRef section: Operators

1 Like

Two slightly nerdy points… Firstly (and I know the forum software does change quote types, but action code uses ‘straight’ quotes—paired single or double). So, this doesn’t work (as code)


But instead query:


However, what that tests is that query is true if the entire contents of $Text is the string πάσχειν, which is unlikely.

Secondly, the .contains() operator takes a quoted string. So thus we query:


This will return true if the string exists anywhere (1 or more times) in $Text. Actually the output is a number, coercing to true/false as it is in fact the offset of the beginning of the first match +1 in the tested attribute, i.e. here $Text (the ‘+1’ part is explained here).

More broadly, String.countOccurrencesOf("string") has already been mentioned above. If we assume:

  • (a) your notes of interest all lie within one branch of the outline separated from all your templates, prototypes, and other notes, and…
  • (b) you use a discrete prototype for the notes you’re trying to test…

…then in attribute view, set the scope of the view (‘Container’ pop-up) to the root container of your annotations. and then set the view agent to $Prototype=="pAnnotation" & $Text.contains("πάσχειν") this now filters the notes descended from the container firstly for only those notes of the correct prototype and then only those with $Text using the word or phrase of interest. To change the tested term, simply change the agent query replacing πάσχειν with another string.

@dominiquerenauld, I forgot to mention that I saw elsewhere that you were reading Montaigne, one of my favorite philosophers. Also, Aristotle is exactly the philosopher I am currently working with. Thank you for your input (and also for you videos).

@PaulWalters, thank you for bringing this to my attention and for providing an exemple. I managed to get it working on my project. It will be very helpful.

@mwra, I really appreciate you pointing this subtleties to me. I found that, at first, the reason I was getting no results for the query was the presence of non-standard unicode characters in my greek text (namely the vowels with acute accents: ά έ ή ί ό ύ ώ). Now I am getting the proper results, but having some issues with the software crashing. I don’t know if this is something on my end or some bug/error I was lucky enough to find. Be it was it may, I already forwarded the crash log to Mark Bernstein. I hope to get it working as I am excited to dive into it. By the way, do you have any advice as to how should one oil the machine, so to speak, to get tinderbox working at its best?

Crashes with Tinderbox are actually rare, but as with any app if you find a crash condition and keep repeating it then of course the appear frequent. Eastgate are pretty attentive to crash reports and you’ve done the helpful thing of sending in the crash report(s). Until a fix is in place, likely you’ll at least know what no to do in the interim. As to oiling the wheels…

Thinking back over past threads I’d suggest leveraging Tinderbox’s support for incremental formalisation. IOW, (re-)building the document structure as it emerges rather than, as is more normal with software, being forced to map out the structure before you know what it is. To that end:

  • Get comfortable with prototypes and inheritance.
  • Learn and experiment with new action code ideas in small test documents rather than in your main work document(s). It may seem like extra work to build the necessary test data but it’s much easier to see how the code works and to de-bug unexpected effects. Then, when you are happy the technique works you can add a cleaned up/working copy of the code (and any necessary new attributes, templates, prototypes, etc.) to your main document. This stops the build up of cruft.
  • Learn to build efficient queries so you test as few notes as possible, e.g. for a prototype value AND some test rather than just some test.
  • if possible keep your data/notes under a separate root level folder, especially if using map view. This makes it much easier to simply exclude all your prototypes, templates, utility agents in queries if you only query notes descended from your root’ level ‘data’ container (the name of that container doesn’t matter, except it should be unique within the document)
  • If you keep looking for values in $Text using .contains(), consider extracting some of those strands of data into user attributes. Doing this:
    ** makes it easier to display such data via key attributes
    ** makes it easier to test for values. Testing $SomeAttribute=="value" is less computationally expensive than$Text.contains("value")
    ** makes it easier to use the Attribute Browser view
  • Learn to use the Attribute Browser view.

…a few things to get you started.

You probably want to scrub such text into correct Unicode before importing**. In the past non-Roman alphabet characters got botched onto the screen in all sorts of ways so they rendered/printed. In that context that was all the was needed. But, if you want to start doing text analysis - rather than just view text on screen, if your digital text has inappropriate data in it its entirely likely it will misbehave in some contexts. Garbage in, garbage out—as I’ve learned from past experience. In this context it’s not entirely surprising some queries failed and you had some crashes.

** I’m not expert as to what this practically means for ancient texts in exact terms. However, I’m sure forums related to working with such text might give some ideas for appropriate tools/processes for cleaning. Bear in mind less common forms of script/alphabet will have inevitably been less used and thus less widely mass-tested. No getting around that (again, learned from experience even if not with Tinderbox).

Edit: typos