Documentation
Publisher lets you build safely under `/...` and then promote those pages to the live tree by copying them without the `/Development` prefix. During a publish run, every text attachment is rewritten, optional per-page translators run, and the target page is refreshed so editors see the new content immediately.
Use practice mode any time you want to dry-run the release process—the same checks execute, but no files are copied until you run a real publish.
Publishing workflow
- Select the `/...` page you want to promote and use Check for Page Differences to see what changed since the last release.
- Run Publish Page (practice) to generate release notes, confirm that path replacements and translation scripts behave as expected, and review the deletions script that will be produced.
- If everything looks correct, run Publish Page (for real) to copy files, rewrite `/` references, refresh the live page, and append any deletions to `process-deletions.sjs`.
- Review `release-notes.html.fragment` (kept under the dev page) and keep `process-deletions.sjs` for auditing before you execute the deletions script manually.
Action buttons and services
| Action | Description | |
| Check for Page Differences | Walks the dev and live trees, showing files whose timestamps or MD5 hashes differ so you can review pending changes before publishing. | |
| Publish Page (practice) | Runs the full pipeline (copy log, path replacement, translation, TODO/service scans, deletions calculation) but does not touch the live tree. | |
| Publish Page (for real) | Copies attachments to the live location, rewrites `/` references, ensures a template link is set, refreshes the page, and produces release notes. | |
| Reverse Publish | Copies the live page back into `/...` so you can bring hotfixes or emergency edits under source control. | |
File translation and rewriting
- Text-based attachments (`.content`, `.js`, `.sjs`, `.html`, `.json`, etc.) have `/` segments removed automatically before being saved to the live page.
- If `development-translation.sjs` exists in the dev page, it is executed once per text file, receiving the file contents as `data` and returning the transformed string.
- Binary files are copied as-is, while derived files (`page.html`, `page.html.fragment`) are regenerated on the live side instead of copied.
Special files and configuration
- publish-config.json – Extends the exclusion list with `excludedFiles` and can hold future toggles; place it alongside the dev page you publish.
- development-translation.sjs – Optional per-page hook to perform extra string replacements or localization steps.
- do-not-release.txt – Acts as a guardrail; publishing aborts with its message until the file is removed.
- release-notes.html.fragment – Stores the accordion-formatted log of each publish run under the dev page; great for audits.
- process-deletions.sjs – Autogenerated commands to remove files that no longer exist in dev; keep it under version control and run manually once reviewed.
Deletions pipeline
Publisher never deletes files immediately. Instead it compares the live attachments with the dev set, and everything that disappears is appended as `file.deleteAttachmentNoBackup(...)` statements inside `process-deletions.sjs`. This gives you a chance to run the deletions in a maintenance window and provides a paper trail of removals.
Troubleshooting tips
- Ensure references inside your content point to the post-publish path (e.g. `/OpenForum/Documentation/...`) rather than `/...` so inserts resolve after deployment.
- If release notes mention missing services, publish those service pages as well or adjust the calls to non-development paths.
- Use Reverse Publish when an emergency live edit occurs so you can pull it back into `/Development` before the next release.
- When translation scripts produce unexpected output, re-run practice mode and inspect the logged "Applying transform script" entries to see which file caused the issue.
Service definition
/OpenForum/AddOn/Publisher Sevice API Version 1.1.1
Get Actions
Action publish
Parameters
| Name | Description |
| pageName (required=true) | {{parameter.description}} |
| practice (required=true) | {{parameter.description}} |
| debug (required=false) | {{parameter.description}} |
Example Get Request
/OpenForum/AddOn/Publisher?action=publish
Example Response
Example Error Response