summaryrefslogtreecommitdiff
path: root/doc/todo/structured_page_data.mdwn
blob: bb23cfaa8c643f608bcf8b99b58b2e8b9eb70a39 (plain)

This is an idea from [[JoshTriplett]]. --[[Joey]]

Some uses of ikiwiki, such as for a bug-tracking system (BTS), move a bit away from the wiki end of the spectrum, and toward storing structured data about a page or instead of a page.

For example, in a bug report you might want to choose a severity from a list, enter a version number, and have a bug submitter or owner recorded, etc. When editing online, it would be nice if these were separate fields on the form, rather than the data being edited in the big edit form.

There's a tension here between remaining a wiki with human-editable source files, containing freeform markup, and more structured data storage. I think that it would be best to include the structured data in the page, using a directive. Something like:

part of page content
\[[data yaml="<arbitrary yaml here>"]]
rest of page content 

As long as the position of the directive is not significant, it could be stripped out when web editing, the yaml used to generate/populate form fields, and then on save, the directive regenerated and inserted at top/bottom of the page.

Josh thinks that yaml is probably a good choice, but the source could be a .yaml file that contains no directives, and just yaml. An addition complication in this scenario is, if the yaml included wiki page formatted content, ikiwiki would have to guess or be told what markup language it used.

Either way, the yaml on the page would encode fields and their current content. Information about data types would be encoded elsewhere, probably on a parent page (using a separate directive). That way, all child pages could be forced to have the same fields.

There would be some simple types like select, boolean, multiselect, string, wiki markup. Probably lists of these (ie, list of strings). Possibly more complex data structures.

It should also be possible for plugins to define new types, and the type definitions should include validation of entered data, and how to prompt the user for the data.

This seems conceptually straightforward, if possibly quite internally complex to handle the more complicated types and validation.

One implementation wrinkle is how to build the html form. The editpage.tmpl currently overrides the standard [[cpan CGI::FormBuilder]] generated form, which was done to make the edit page be laid out in a nice way. This, however, means that new fields cannot be easily added to it using [[cpan CGI::FormBuilder]]. The attachment plugin uses the hack of bouilding up html by hand and dumping it into the form via a template variable.

It would be nice if the type implementation code could just use FormBuilder, since its automatic form generation, and nice field validation model is a perfect match for structured data. But this problem with editpage.tmpl would have to be sorted out to allow that.

Additional tie-ins:

  • Pagespecs that can select pages with a field with a given value, etc. This should use a pagespec function like field(fieldname, value). The semantics of this will depend on the type of the field; text fields will match value against the text, and link fields will check for a link matching the pagespec value.
  • The search plugin could allow searching for specific fields with specific content. (xapian term search is a good fit).

See also:

[[tracking_bugs_with_dependencies]]