I am working on my Atom feed exporter, with the hope of eventually making 
it a plugin. Right now it works using the *rendertiddler *command under 
node, and in fact is depending on a node library (crypto) being in place. 
This is because the Atom spec <http://www.ietf.org/rfc/rfc4287.txt> 
requires an "id" (a GUID) for each article (tiddler) in the feed:

4.2.6.  The "atom:id" Element

   The "atom:id" element conveys a permanent, universally unique
   identifier for an entry or feed.

...

   When an Atom Document is relocated, migrated, syndicated,
   republished, exported, or imported, the content of its atom:id
   element MUST NOT change.  Put another way, an atom:id element
   pertains to all instantiations of a particular Atom entry or feed;
   revisions retain the same content in their atom:id elements.  It is
   suggested that the atom:id element be stored along with the
   associated resource.

   The content of an atom:id element MUST be created in a way that
   assures uniqueness.


I decided to use an MD5 hash of each tiddler's title to generate a 128-bit 
hash, which I then format into a GUID. It works quite well, and I think for 
most foreseeable cases satisfies the spec. I did some research and then 
decided to use node's crypto package, since it had an implementation of MD5 
with an easy API. All is good.

However, when I *browse *to my TW (the original, not the generated static 
output or feed) as opposed to running *commands *on it under node, it gives 
an error at start-up in my module which ultimately I traced down to the 
require("crypto") statement because node's crypto package is not available 
when running in the browser (which makes sense). I could probably do some 
work in my module to try and detect whether it's running in the browser or 
under node and just export an empty *run *method when in the browser 
environment, but that would invalidate one of Jeremy's wishes, which is 
ultimately to be able to generate a feed under a browser-only TW.

So, I see a few possibilities, and want to ask which way is the TW way? 
Jeremy, I'm especially looking from feedback from you on this. I have this 
specific use-case, but am also interested in general to the TW approach to 
external dependencies and libraries.

1. Figure out another way to reliably generate those GUIDs in a repeatable 
manner (same tiddler always gets the same id). Definitely doable, but I 
hate reinventing wheels.

Pros: Eliminates external dependencies.
Cons: Reinvents wheel.

2. Copy in the appropriate pieces of the node code or someone else's open 
source implementation (with an OSS license that explicitly allows that - 
node's seems to), presumably into TW's crypto module.

Pros: Wheel already invented, TW's crypto module probably needs some 
expansion over time anyway.
Cons: Still maintaining another copy of code, "cut & paste" programming at 
its worse, with all that implies, including maintenance in case of bugs 
upstream, etc.

3. Build TW with the node crypto module included somehow - waving arms here 
a bit.

Pros: Wheel already invented.
Cons: Requires node, but that's already a requirement, anyway?

4. ???Something else??? I note that the *utils *module has a *hashString 
*function 
exported, but it's only a simple 32-bit hash with high possibility of 
collisions. It looks like TW2 had SHA1 hashing code, but (a) that appears 
to be unused except for creating a "classic TW" edition, and (b) that's a 
160-bit hash, not the 128-bits I would need. Other possibilities? Something 
I'm missing (likely)?

Comments and discussion appreciated.

-- 
You received this message because you are subscribed to the Google Groups 
"TiddlyWiki" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/tiddlywiki.
For more options, visit https://groups.google.com/d/optout.

Reply via email to