Skip to content
/ Moon Public

A (Linux compatible) Swift library for server-side syntax highlighting using Prism.js

License

Notifications You must be signed in to change notification settings

loopwerk/Moon

Repository files navigation

Moon logo

A (Linux compatible) Swift library for server-side syntax highlighting using Prism.js.

Features

  • Server-side syntax highlighting for 290+ languages
  • Process entire HTML documents
  • Support for custom Prism.js bundles and plugins
  • Cross-platform: macOS, iOS, and Linux

Installation

Add Moon to your Package.swift:

dependencies: [
  .package(url: "https://github.com/loopwerk/Moon", from: "1.0.0"),
]

Then add it to your target:

.target(
  name: "YourTarget",
  dependencies: ["Moon"]
)

Usage

Basic Usage

import Moon

// Process an entire HTML document
let html = """
<pre><code class="language-python">def hello():
  print("Hello, World!")
</code></pre>
"""

let highlighted = Moon.shared.highlightCodeBlocks(in: html)

Additional Plugins

Moon includes a Prism.js bundle with all standard languages, and it preserves HTML markup within code blocks, like the Keep Markup plugin. For languages not included (like Svelte), you can load additional plugins:

let moon = try Moon(additionalPlugins: ["prism-svelte.js"])

The plugin files must be included in your target's resources:

.target(
  name: "YourTarget",
  dependencies: ["Moon"],
  resources: [
    .copy("Resources/prism-svelte.js"),
  ]
)

Custom Prism.js Bundle

To use a custom Prism.js bundle, create one at prismjs.com/download.html and save it as prism.js in your target's resources:

.target(
  name: "YourTarget",
  dependencies: ["Moon"],
  resources: [
    .copy("Resources/prism.js"),
  ]
)

How It Works

Moon embeds Prism.js and executes it via JavaScriptCore (using JXKit). This provides 100% Prism.js compatibility with all its language definitions.

The highlightCodeBlocks(in:) method finds all <code class="language-xxx"> blocks in HTML and applies syntax highlighting, returning the modified HTML with Prism's token classes applied.

Output Format

Moon outputs HTML with Prism.js CSS classes:

<code class="language-python">
  <span class="token keyword">def</span>
  <span class="token function">hello</span>
  <span class="token punctuation">(</span>
  <span class="token punctuation">)</span>
  <span class="token punctuation">:</span>
  ...
</code>

Use any Prism.js theme to style the output.

Requirements

  • Swift 5.5+
  • macOS 12+ / iOS 15+ / Linux

On Linux, you need to install WebKit GTK development libraries:

# Ubuntu/Debian
$ sudo apt install libjavascriptcoregtk-4.1-dev

# Fedora
$ sudo dnf install webkit2gtk4.1-devel

License

Moon is available under the MIT license. See the LICENSE file for more info.

Prism.js is available under the MIT license. You can find the LICENSE file here.

About

A (Linux compatible) Swift library for server-side syntax highlighting using Prism.js

Topics

Resources

License

Stars

Watchers

Forks

Sponsor this project

  •  

Contributors