This is an automated email from the ASF dual-hosted git repository.
jamesbognar pushed a commit to branch docs
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/docs by this push:
new 50cf2433d1 Document Markdown view rendering; rename
juneau-secret-keychain to juneau-secret-macos-keychain
50cf2433d1 is described below
commit 50cf2433d1b4b5401d476a7586d63eb04a5f26b0
Author: James Bognar <[email protected]>
AuthorDate: Wed Aug 19 13:12:24 2026 -0400
Document Markdown view rendering; rename juneau-secret-keychain to
juneau-secret-macos-keychain
- Add new topic page 10.65.MarkdownViewRendering, wired into sidebars.ts.
- Rename juneau-secret-keychain -> juneau-secret-macos-keychain across
artifact-paths.json, the 10.0.0 release notes, JuneauCommonsSettings docs,
and about.md to match the module's new name.
---
artifact-paths.json | 5 +-
pages/release-notes/10.0.0.md | 4 +-
pages/topics/02.06.JuneauCommonsSettings.md | 4 +-
pages/topics/10.65.MarkdownViewRendering.md | 108 ++++++++++++++++++++++++++++
sidebars.ts | 5 ++
src/pages/about.md | 4 +-
6 files changed, 123 insertions(+), 7 deletions(-)
diff --git a/artifact-paths.json b/artifact-paths.json
index b4de8e0bca..f66361c2e9 100644
--- a/artifact-paths.json
+++ b/artifact-paths.json
@@ -59,6 +59,9 @@
"juneau-rest-server-auth-oauth": "juneau-rest/juneau-rest-server-auth-oauth",
"juneau-rest-server-auth-oidc-rp":
"juneau-rest/juneau-rest-server-auth-oidc-rp",
"juneau-rest-server-auth-saml": "juneau-rest/juneau-rest-server-auth-saml",
+ "juneau-rest-server-console-ui": "juneau-rest/juneau-rest-server-console-ui",
+ "juneau-rest-server-console-ui-freemarker":
"juneau-rest/juneau-rest-server-console-ui-freemarker",
+ "juneau-rest-server-console-ui-freemarker-datatables":
"juneau-rest/juneau-rest-server-console-ui-freemarker-datatables",
"juneau-rest-server-datatables": "juneau-rest/juneau-rest-server-datatables",
"juneau-rest-server-management-logging":
"juneau-rest/juneau-rest-server-management-logging",
"juneau-rest-server-mcp": "juneau-rest/juneau-rest-server-mcp",
@@ -76,7 +79,7 @@
"juneau-rest-server-view-thymeleaf":
"juneau-rest/juneau-rest-server-view-thymeleaf",
"juneau-sc": "juneau-sc",
"juneau-sc-server": "juneau-sc/juneau-sc-server",
- "juneau-secret-keychain": "juneau-secret-keychain",
+ "juneau-secret-macos-keychain": "juneau-secret-macos-keychain",
"juneau-shaded": "juneau-shaded",
"juneau-shaded-all": "juneau-shaded/juneau-shaded-all",
"juneau-shaded-core": "juneau-shaded/juneau-shaded-core",
diff --git a/pages/release-notes/10.0.0.md b/pages/release-notes/10.0.0.md
index f44772365f..5706c81163 100644
--- a/pages/release-notes/10.0.0.md
+++ b/pages/release-notes/10.0.0.md
@@ -143,7 +143,7 @@ See the new [`@ConfigProperties` Annotation
Basics](/docs/topics/ConfigPropertie
[RestContext](/docs/topics/RestContext#restcontextproperties--env-driven-defaults-via-configproperties-1000)
topic
page for the pilot.
-### juneau-commons / juneau-secret-keychain
+### juneau-commons / juneau-secret-macos-keychain
### `SecretStore` SPI — the secure, mutable sibling of `PropertySource`
@@ -161,7 +161,7 @@ storing and retrieving secrets by key — `store` / `find` /
`exists` / `delete`
- **Opt-in Settings bridge** — `SecretStorePropertySource` exposes a chosen
store as a `PropertySource` only where a
consumer deliberately wires it, and implements the `SensitivePropertySource`
marker so dump/log/`toString()` paths
redact bridged values. Secrets stay out of the general config/`$P{...}`/SVL
namespace by default.
-- **New opt-in module `juneau-secret-keychain`** — a `KeychainSecretStore`
backed by the macOS `security` keychain
+- **New opt-in module `juneau-secret-macos-keychain`** — a
`KeychainSecretStore` backed by the macOS `security` keychain
CLI, honoring a `ReplayCache`-style `FailMode` (fail-open/fail-closed) for
backend-unavailable behavior. It lives
outside `juneau-commons` because it shells out to an OS process.
diff --git a/pages/topics/02.06.JuneauCommonsSettings.md
b/pages/topics/02.06.JuneauCommonsSettings.md
index b0e5e7945b..fc01dcebeb 100644
--- a/pages/topics/02.06.JuneauCommonsSettings.md
+++ b/pages/topics/02.06.JuneauCommonsSettings.md
@@ -273,8 +273,8 @@ a marker that dump/log/`toString()` paths honor to redact
bridged values.
### OS keychain-backed store
-The opt-in `juneau-secret-keychain` module ships a
-<java-class><a
href="/site/apidocs/org/apache/juneau/secret/keychain/KeychainSecretStore.html"
target="_blank">KeychainSecretStore</a></java-class>
+The opt-in `juneau-secret-macos-keychain` module ships a
+<java-class><a
href="/site/apidocs/org/apache/juneau/secret/macos/keychain/KeychainSecretStore.html"
target="_blank">KeychainSecretStore</a></java-class>
backed by the macOS `security` keychain CLI. Because it shells out to an
external OS process, it lives outside
`juneau-commons` (which holds the line on zero-runtime-deps /
no-OS-integration). It honors a
<java-class><a
href="/site/apidocs/org/apache/juneau/commons/secret/FailMode.html"
target="_blank">FailMode</a></java-class>
diff --git a/pages/topics/10.65.MarkdownViewRendering.md
b/pages/topics/10.65.MarkdownViewRendering.md
new file mode 100644
index 0000000000..805e62296d
--- /dev/null
+++ b/pages/topics/10.65.MarkdownViewRendering.md
@@ -0,0 +1,108 @@
+---
+title: "Markdown View Rendering (juneau-rest-server-views-markdown)"
+slug: MarkdownViewRendering
+---
+
+`juneau-rest-server-views` renders data tables and
`juneau-rest-server-console-ui` renders chrome — neither
+has any concept of a rendered *document*. The optional
`juneau-rest-server-views-markdown` module fills that gap:
+hand it a markdown string, get back an HTML fragment, the same way a `ViewDef`
turns a list of beans into a themed
+table.
+
+Because it is a separate, opt-in module, consumers that don't need markdown
pay nothing — no markdown parser is
+dragged into `juneau-rest-server` or the views toolkit by default.
+
+```xml
+<dependency>
+ <groupId>org.apache.juneau</groupId>
+ <artifactId>juneau-rest-server-views-markdown</artifactId>
+ <version>${juneau.version}</version>
+</dependency>
+```
+
+## The `MarkdownRenderer` SPI
+
+The module's single extension point is the library-neutral
+<a
href="/site/apidocs/org/apache/juneau/rest/server/views/markdown/MarkdownRenderer.html"
target="_blank">MarkdownRenderer</a>
+interface — one method, `String toHtml(String markdown)`, so any parser can
sit behind it:
+
+```java
+MarkdownRenderer renderer = MarkdownRenderer.resolve();
+String html = renderer.toHtml("# Runbook\n\nStep one.");
+```
+
+`MarkdownRenderer.resolve()` selects the active renderer via the standard
`java.util.ServiceLoader` mechanism:
+
+- If a consumer registers their own provider (a
`META-INF/services/org.apache.juneau.rest.server.views.markdown.MarkdownRenderer`
+ file naming their implementation class), that provider wins.
+- Otherwise the built-in commonmark-java default is used.
+
+The default is intentionally **not** registered as a service, so a single
consumer-supplied provider is always
+unambiguous.
+
+## The default: commonmark-java with GFM tables
+
+The shipped default,
+<a
href="/site/apidocs/org/apache/juneau/rest/server/views/markdown/CommonmarkMarkdownRenderer.html"
target="_blank">CommonmarkMarkdownRenderer</a>,
+wraps [commonmark-java](https://github.com/commonmark/commonmark-java)
(BSD-2-Clause) with the
+[GFM tables extension](https://github.github.com/gfm/#tables-extension-)
enabled out of the box. GFM tables are on
+by default because real documents (runbooks, onboarding guides) routinely use
pipe tables, and core CommonMark
+renders them as paragraphs of literal pipes.
+
+```java
+CommonmarkMarkdownRenderer renderer = new CommonmarkMarkdownRenderer();
+
+// A GFM pipe table renders as a real <table>, not literal pipes.
+String html = renderer.toHtml("""
+ | Name | Role |
+ | --- | --- |
+ | Alice | Admin |
+ """);
+```
+
+commonmark-java's parser and renderer are immutable and thread-safe once
built, so a single renderer instance is
+safe to share across threads and reuse for every render.
+
+## Swapping the parser
+
+To use a different parser (or a differently-configured commonmark instance),
implement `MarkdownRenderer` and
+register it as a service:
+
+```java
+public class MyMarkdownRenderer implements MarkdownRenderer {
+ @Override
+ public String toHtml(String markdown) {
+ // ... your parser here ...
+ }
+}
+```
+
+`META-INF/services/org.apache.juneau.rest.server.views.markdown.MarkdownRenderer`:
+
+```
+com.example.MyMarkdownRenderer
+```
+
+`MarkdownRenderer.resolve()` will now return your implementation instead of
the commonmark default.
+
+## Styling the output
+
+The rendered HTML is meant to be dropped inside a `.jc-prose` container so it
inherits the console's prose
+typography (heading scale, list rhythm, `pre`/`code`, blockquote, and a
static-table rule):
+
+```html
+<div class="jc-prose">
+ <!-- MarkdownRenderer.resolve().toHtml(...) output here -->
+</div>
+```
+
+See [Admin-Console Chrome](/docs/topics/AdminConsoleChrome) for the
`.jc-prose` contract.
+
+## Panel wiring
+
+Wiring rendered markdown into a `Tab`/`Subtab` panel's content property is a
deferred follow-on integration point,
+not part of this module — this module ships the renderer SPI and the
commonmark-java default only.
+
+## See Also
+
+- [MarkdownRenderer
Javadoc](/site/apidocs/org/apache/juneau/rest/server/views/markdown/package-summary.html)
+- [commonmark-java](https://github.com/commonmark/commonmark-java)
diff --git a/sidebars.ts b/sidebars.ts
index adf2179954..8f813ef85c 100644
--- a/sidebars.ts
+++ b/sidebars.ts
@@ -1777,6 +1777,11 @@ const sidebars: SidebarsConfig = {
id:
'topics/10.64.AdminConsoleChrome',
label: '10.64.
Admin-Console Chrome (juneau-rest-server-console-ui)',
},
+ {
+ type: 'doc',
+ id:
'topics/10.65.MarkdownViewRendering',
+ label: '10.65. Markdown
View Rendering (juneau-rest-server-views-markdown)',
+ },
],
link: {
type: 'doc',
diff --git a/src/pages/about.md b/src/pages/about.md
index c40478a0db..8273d77786 100644
--- a/src/pages/about.md
+++ b/src/pages/about.md
@@ -91,8 +91,8 @@ The Juneau ecosystem consists of the following parts. A few
rows are **grouped f
| [juneau-microservice-tomcat](/docs/topics/JuneauMicroserviceTomcat) |
Tomcat-embedded microservice launcher. |
| **juneau-sc** | |
| [juneau-sc-server](/docs/topics/ScServerOverview) | Centralized
configuration server exposing juneau-config files over REST. |
-| **juneau-secret-keychain** | |
-|
[juneau-secret-keychain](/docs/topics/JuneauCommonsSettings#os-keychain-backed-store)
| Opt-in module providing a macOS `security`-CLI-backed `KeychainSecretStore`
implementation of the `SecretStore` SPI. |
+| **juneau-secret-macos-keychain** | |
+|
[juneau-secret-macos-keychain](/docs/topics/JuneauCommonsSettings#os-keychain-backed-store)
| Opt-in module providing a macOS `security`-CLI-backed `KeychainSecretStore`
implementation of the `SecretStore` SPI. |
| **juneau-shaded** | |
| [juneau-shaded-core](/docs/topics/JuneauShadedCore) | Shaded uber-jar of the
juneau-core modules for zero-conflict dependency management. |
| [juneau-shaded-rest-client](/docs/topics/JuneauShadedRestClient) | Shaded
uber-jar of juneau-rest-client and its dependencies. |