From 4f49b16079b27d7ce633619e4cddfdf2bffbc952 Mon Sep 17 00:00:00 2001 From: cashmere Date: Fri, 4 Sep 2026 09:05:24 +0200 Subject: initial commit --- www/json-api/api-wiki.md | 277 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 277 insertions(+) create mode 100644 www/json-api/api-wiki.md (limited to 'www/json-api/api-wiki.md') diff --git a/www/json-api/api-wiki.md b/www/json-api/api-wiki.md new file mode 100644 index 0000000..7e1899f --- /dev/null +++ b/www/json-api/api-wiki.md @@ -0,0 +1,277 @@ +# JSON API: /wiki +([⬑JSON API Index](index.md)) + +Jump to: + +* [Page List](#list) +* [Fetch a Page](#get) +* [Create or Save Page](#create-save) +* [Wiki Diffs](#diffs) +* [Preview](#preview) +* [Notes and TODOs](#todo) + +--- + + +# Page List + +Returns a list of all pages, not including their content (which can be +arbitrarily large). + +**Status:** implemented 201109xx + +**Required privileges:** "j" or "o" + +**Request:** `/json/wiki/list` + +**Options:** + +- `bool verbose` (=false) Changes the results to return much more + information. Added 20120219. +- `glob=wildcard` string (default=`*`). If set, only page names + matching the given wildcard are returned. Added 20120325.\ + CLI: `--glob|-g STRING` +- `like=SQL LIKE string` (default=`%`). If set, only page names matching + the given SQL LIKE string are returned. Note that this match is + case-INsensitive. If both glob and like are given then only one will + work and which one takes precedence is unspecified. Added 20120325.\ + CLI: `--like|-l STRING` +- `invert=bool` (default=false). If set to a true value, the glob/like + filter has a reverse meaning (pages *not* matching the wildcard are + returned). Added 20120329.\ + CLI: `-i/--invert` + +**Response payload: format depends on "verbose" option** + +Non-verbose mode: + +```json +["PageName1",..."PageNameN"] +``` + +In verbose mode: + +```json +[{ +"name":"Apache On Windows XP", +"uuid":"a7e68df71b95d35321b9d9aeec3c8068f991926c", +"user":"jeffrimko", +"timestamp":1310227825, +"size":793 /* in bytes */ +},...] +``` + +The verbose-mode output is the same as the [`/json/wiki/get`](#get) output, but +without the content. The size property of each reflects the *byte* +length of the raw (non-HTMLized) page content. + +**Potential TODOs:** + +- Allow specifying (in the request) a list/array of names, as opposed + to listing all pages. The page count is rarely very high, though, so + an "overload" is very unlikely. (i have one wiki with about 47 pages + in it.) + + +# Fetch a Page + +Fetches a single wiki page, including content and significant metadata. + +**Status:** implemented 20110922, but response format may change. + +**Required privileges:** "j" or "o" + +**Request:** + +- GET: `/json/wiki/get?name=PageName` +- GET: `/json/wiki/get/PageName` +- POST: `/json/wiki/get` with page name as `POST.payload` or + `POST.payload.name`. + +**Response payload example:** + +```json +{ +"name": "Fossil", +"uuid": "...hex string...", +"parent": "uuid of parent (not set for first version of page)", +"user": "anonymous", +"timestamp": 1286143975, +"size": 1906, /* In bytes, not UTF8 characters! + Affected by format option! */ +"content": "..." +} +``` + +**FIXME:** it's missing the mimetype (that support was added to fossil +after this was implemented). + +If given no page to load, or if asked to get a page which does not +exist, an error response is generated (a usage- or resource-not-found +error, respectively). + +**Options (via CLI/GET/`POST.payload`):** + +- `name=string`. The page to fetch. The latest version is fetched +unless the uuid paramter is supplied (in which case name is ignored). \ +CLI: `--name|-n string`\ +Optionally, the name may be the 4th positional argument/request path element. +- `uuid=string`. Fetches a specific version. The name parameter is +ignored when this is specified.\ +CLI: `--uid|-u string` +- `format=string ("raw"|"html"|"none")` (default="raw"). Specifies the +format of the "content" payload value.\ +CLI: `--format|-f string` \ +The "none" format means to return no content. In that case the size +refers to the same size as the "raw" format. + +**TODOs:** + +- Support passing an array of names in the request (and change + response to return an array). + + +# Create or Save Page + +**Status:** implemented 20110922. + +**Required privileges:** "k" (save) or "f" (create) + +**Request:** + +- `/json/wiki/create` +- `/json/wiki/save` + +These work only in HTTP mode, not CLI mode. (FIXME: now that we can +simulate POST from a file, these could be used in CLI mode.) + +The semantic differences between save and create are: + +- Save will fail if the page doesn't already exist whereas create will + fail if it does. The createIfNotExists option (described below) can + be used to create new pages using the save operation. +- The content property is optional for the create request, whereas it + is required to be a string for save requests (but it *may* be an + empty string). This requirement for save is *almost* arbitrary, and + is intended to prevent accidental erasing of existing page content + via API misuse. + +**Response payload example:** + +The same as for [`/json/wiki/get`](#get) but the page content is not +included in the response (only the metadata). + +**Request options** (via GET or `POST.payload` object): + +- `name=string` specifies the page name. +- `content=string` is the body text.\ + Content is required for save (unless `createIfNotExists` is true *and* + the page does not exist), optional for create. It *may* be an empty + string. +- `mimetype=string` specifies the mimetype for the body, noting any any + unrecognized/unsupported mimetype is silently treated as + `text/x-fossil-wiki`. +- Save (not create) supports a `createIfNotExists` boolean option which + makes it a functional superset of the create/save features. i.e. it + will create if needed, else it will update. If createIfNotExists is + false (the default) then save will fail if given a page name which + does not refer to an existing page. +- **TODO:** add `commitMessage` string property. The fossil internals + don't have a way to do this at the moment (they can as of late 2019). + Since fossil wiki commits have always had the same default commit message, this is not a + high-priority addition. See:\ + [](/doc/trunk/www/fileformat.wiki#wikichng) +- **Potential TODO:** we *could* optionally also support + multi-page saving using an array of pages in the request payload:\ + `[… page objects … ]` + + + + +# Wiki Diffs + +**Status:** implemented 20120304 + +**Required privileges:** "h" + +**Request:** + +- `/json/wiki/diff[/version1_UUID/version2_UUID]` + +**Response payload example:** + +```json +{ + "v1":"e32ccdcda59e930c77c1e01cebace5d71253f621", + "v2":"e15992f475760cdf3a9564d8f88cacb659ab4b07", + "diff":"@@ -1,4 +1,9 @@......" +} +``` + +**Options:** + +- `v1=uuid` and `v2=uuid` specify the two versions to diff, and are + required parameters. They may optionally be specified as the two + URL/CLI parameters following the "diff" sub-command/path. + +This command does not verify that both UUIDs actually refer to the same +page name, but do verify that they refer to wiki content. + +Trivia: passing the same UUIDs to the `/json/diff` command will produce +very different results - that one diffs the manifests of the commits. + +**TODOs:** + +- Add options for changing the format of the diff, e.g. side-by-side + and enabling the HTML markup supported by the main fossil HTML GUI. +- Potentially do a name comparison to verify that the diff is against + the same page. That said, when "renaming" pages it might be useful + to diff two different pages. + + +# Preview + +**Status:** implemented 20120310 + +**Required privileges:** "k" (to limit its use to only those who can +edit wiki pages). This limitation is up for debate/reconsideration. + +**Request:** + +- `/json/wiki/preview` + +This command wiki-processes arbitrary text sent from the client. To help +curb potential abuse, its use is restricted to those with "k" access +rights. + +The `POST.payload` property must be either: + +1) A string containing Fossil wiki markup. + +2) An Object with a `body` property holding the text to render and a + `mimetype` property describing the wiki format: + `text/x-fossil-wiki` (the default), `text/x-markdown`, or + `text/plain`. Any unknown type is treated as `text/x-fossil-wiki`. + +The response payload is a string containing the rendered page. Whether +or not "all HTML" is allowed depends on site-level configuration +options, and that changes how the input is processed. + +Note that the links in the generated page are for the HTML interface, +and will not work as-is for arbitrary JSON clients. In order to +integrate the parsed content with JSON-based clients the HTML will +probably need to be post-processed, e.g. using jQuery to fish out the +links and re-map wiki page links to a JSON-capable page handler. + + + +# Notes and TODOs + +- When server-parsing the wiki content, the generated + intra-wiki/intra-site links will only be useful in the context of + the original fossil UI (or a work-alike), not arbitrary JSON + client apps. + +Potential TODOs: + +- `/wiki/history` analog to the [](/whistory) page. -- cgit v1.3.1