<!DOCTYPE html>
<html lang="en" data-accent-color="teal" data-content_root="../">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Contributing - snapper 0.1.0 documentation</title><link rel="shortcut icon" href="../_static/favicon.ico"/><link rel="index" title="Index" href="../genindex.html" /><link rel="search" title="Search" href="../search.html" /><link rel="next" title="FAQ" href="../faq/index.html" /><link rel="prev" title="Configuration" href="../reference/config.html" />
<link rel="canonical" href="https://snapper.turtletech.us/docs/contributing/" /><script>
function setColorMode(t){let e=document.documentElement;e.setAttribute("data-color-mode",t);let a=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches,s=t;"auto"===t&&(s=a?"dark":"light"),"light"===s?(e.classList.remove("dark"),e.classList.add("light")):(e.classList.remove("light"),e.classList.add("dark"))}
setColorMode(localStorage._theme||"auto");
</script><link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=e1a1ceaf" />
<link rel="stylesheet" type="text/css" href="../_static/shibuya.css?v=44020203" />
<link media="print" rel="stylesheet" type="text/css" href="../_static/print.css?v=20ff2c19" />
<link rel="stylesheet" type="text/css" href="../_static/custom.css?v=ae410d03" />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
:root {
--sy-f-text: "Inter", var(--sy-f-sys), var(--sy-f-cjk), sans-serif;
--sy-f-heading: "Inter", var(--sy-f-sys), var(--sy-f-cjk), sans-serif;
}
</style>
<meta property="og:type" content="website"/>
<meta property="og:url" content="https://snapper.turtletech.us/docs/contributing/"/>
<meta property="og:title" content="Contributing"/>
<meta name="twitter:card" content="summary"/>
<link rel="alternate" hreflang="is" href="/docs/is/contributing/" />
<link rel="alternate" hreflang="pl" href="/docs/pl/contributing/" />
<!-- Umami injection -->
<script
defer
data-website-id="af8c1286-06aa-414b-958c-e015bed1e569"
src="https://analytics.turtletech.us/script.js"
></script>
<script>
window.umami = window.umami || { track: function () {} };
document.addEventListener("click", function (e) {
var link = e.target.closest("a");
if (link && link.hostname !== location.hostname) {
umami.track("Outbound Link", { url: link.href });
}
});
</script></head>
<body><div class="sy-head">
<div class="sy-head-blur"></div>
<div class="sy-head-inner sy-container mx-auto">
<a class="sy-head-brand" href="../index.html">
<img class="light-logo" src="../_static/snapper_logo.png" alt="snapper" height="28" loading="lazy" />
<img class="dark-logo" src="../_static/snapper_logo.png" alt="snapper" height="28" loading="lazy" />
<strong>snapper</strong>
</a>
<div class="sy-head-nav" id="head-nav">
<nav class="sy-head-links"></nav>
<div class="sy-head-extra flex items-center print:hidden"><form class="searchbox flex items-center" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search" />
<kbd>/</kbd>
</form><div class="nav-languages">
<button type="button">
<span class="md:hidden">Translations</span>
<iconify-icon icon="lucide:languages"></iconify-icon>
</button>
<div class="nav-languages-choices">
<ul><li><a href="/docs/contributing/">English</a></li><li><a href="/docs/is/contributing/">Islenska</a></li><li><a href="/docs/pl/contributing/">Polski</a></li></ul>
</div>
</div><div class="sy-head-socials">
<a href="https://github.com/TurtleTech-ehf/snapper" aria-label="GitHub">
<iconify-icon icon="simple-icons:github"></iconify-icon>
</a></div></div>
</div>
<div class="sy-head-actions flex items-center shrink-0 print:hidden"><button class="js-theme theme-switch flex items-center"
data-aria-auto="Switch to light color mode"
data-aria-light="Switch to dark color mode"
data-aria-dark="Switch to auto color mode">
<i class="i-lucide theme-icon"></i>
</button><button class="md:hidden flex items-center js-menu" aria-label="Menu" type="button" aria-controls="head-nav" aria-expanded="false">
<div class="hamburger">
<span class="hamburger_1"></span>
<span class="hamburger_2"></span>
<span class="hamburger_3"></span>
</div>
</button>
</div>
</div>
</div>
<div class="sy-page sy-container flex mx-auto">
<aside id="lside" class="sy-lside md:w-72 md:shrink-0 print:hidden">
<div class="sy-lside-inner md:sticky">
<div class="sy-scrollbar p-6">
<div class="globaltoc" data-expand-depth="2"><p class="caption" role="heading" aria-level="3"><span class="caption-text">Tutorials</span></p>
<ul>
<li class="toctree-l1 _expand"><a class="reference internal" href="../tutorials/quickstart.html">Quickstart</a></li>
</ul>
<p class="caption" role="heading" aria-level="3"><span class="caption-text">How-to guides</span></p>
<ul>
<li class="toctree-l1 _expand"><a class="reference internal" href="../howto/editor-integration.html">Editor Integration</a></li>
<li class="toctree-l1 _expand"><a class="reference internal" href="../howto/ci-enforcement.html">CI Enforcement</a></li>
<li class="toctree-l1 _expand"><a class="reference internal" href="../howto/git-filter.html">Git Smudge/Clean Filter</a></li>
<li class="toctree-l1 _expand"><a class="reference internal" href="../howto/vale-integration.html">Vale Integration</a></li>
<li class="toctree-l1 _expand"><a class="reference internal" href="../howto/neural-detection.html">Neural Sentence Detection</a></li>
<li class="toctree-l1 _expand"><a class="reference internal" href="../howto/pragmas.html">Skip Regions with Pragmas</a></li>
<li class="toctree-l1 _expand"><a class="reference internal" href="../howto/pandoc-backend.html">Pandoc Backend</a></li>
</ul>
<p class="caption" role="heading" aria-level="3"><span class="caption-text">Reference</span></p>
<ul>
<li class="toctree-l1 _expand"><a class="reference internal" href="../reference/cli.html">CLI Reference</a></li>
<li class="toctree-l1 _expand"><a class="reference internal" href="../reference/formats.html">Supported Formats</a></li>
<li class="toctree-l1 _expand"><a class="reference internal" href="../reference/abbreviations.html">Abbreviation Handling</a></li>
<li class="toctree-l1 _expand"><a class="reference internal" href="../reference/config.html">Configuration</a></li>
</ul>
<p class="caption" role="heading" aria-level="3"><span class="caption-text">Development</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">Contributing</a></li>
<li class="toctree-l1 _expand"><a class="reference internal" href="../faq/index.html">FAQ</a></li>
<li class="toctree-l1 _expand"><a class="reference internal" href="../changelog.html">Changelog</a></li>
</ul>
</div>
</div>
</div>
</aside>
<div class="lside-overlay js-menu" role="button" aria-label="Close left sidebar" aria-controls="lside" aria-expanded="false"></div>
<aside id="rside" class="sy-rside pb-3 w-64 shrink-0 order-last">
<button class="rside-close js-menu xl:hidden" aria-label="Close Table of Contents" type="button" aria-controls="rside" aria-expanded="false">
<i class="i-lucide close"></i>
</button>
<div class="sy-scrollbar sy-rside-inner px-6 xl:top-16 xl:sticky xl:pl-0 pt-6 pb-4"><div class="localtoc"><h3>On this page</h3><ul>
<li><a class="reference internal" href="#development-setup">Development setup</a></li>
<li><a class="reference internal" href="#running-checks">Running checks</a></li>
<li><a class="reference internal" href="#project-structure">Project structure</a></li>
<li><a class="reference internal" href="#commit-conventions">Commit conventions</a></li>
<li><a class="reference internal" href="#building-documentation">Building documentation</a></li>
<li><a class="reference internal" href="#adding-a-new-format-parser">Adding a new format parser</a></li>
</ul>
</div><a class="js-repo-stats repo-stats flex items-center" href="https://github.com/TurtleTech-ehf/snapper"
data-type="github" data-user="TurtleTech-ehf" data-repo="snapper">
<span class="w-8 flex items-center justify-around shrink-0 text-3xl">
<iconify-icon icon="simple-icons:github"></iconify-icon>
</span>
<span class="flex-grow px-2 break-all">
<span>snapper</span>
<span class="flex text-sm repo-stats-count">
<span class="flex items-center pr-3">
<iconify-icon icon="lucide:star"></iconify-icon>
<strong class="js-repo-stars ml-1">0</strong>
</span>
<span class="flex items-center">
<iconify-icon icon="lucide:git-fork"></iconify-icon>
<strong class="js-repo-forks ml-1">0</strong>
</span>
</span>
</span>
</a><div class="edit-this-page">
<a href="https://github.com/TurtleTech-ehf/snapper/blob/main/docs/source/contributing/index.rst">Edit this page</a>
</div><div id="ethical-ad-placement" data-ea-publisher="readthedocs"></div></div>
</aside>
<div class="rside-overlay js-menu" role="button" aria-label="Close Table of Contents" aria-controls="rside" aria-expanded="false"></div>
<main class="sy-main w-full max-sm:max-w-full print:pt-6">
<div class="sy-breadcrumbs" role="navigation">
<div class="sy-breadcrumbs-inner flex items-center">
<div class="md:hidden mr-3">
<button class="js-menu" aria-label="Menu" type="button" aria-controls="lside" aria-expanded="false">
<i class="i-lucide menu"></i>
</button>
</div>
<ol class="flex-1" itemscope itemtype="https://schema.org/BreadcrumbList"><li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a itemprop="item" href="../index.html"><span itemprop="name">snapper</span></a>
<span>/</span>
<meta itemprop="position" content="1" />
</li><li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<strong itemprop="name">Contributing</strong>
<meta itemprop="position" content="2" />
</li></ol>
<div class="xl:hidden ml-1">
<button class="js-menu" aria-label="Show table of contents" type="button" aria-controls="rside"
aria-expanded="false">
<i class="i-lucide outdent"></i>
</button>
</div>
</div>
</div><div class="flex flex-col break-words justify-between">
<div class="relative min-w-0 max-w-6xl px-6 pb-6 pt-8 xl:px-12">
<div class="copy-page-wrapper relative pb-4 lg:absolute lg:top-8 lg:right-6 xl:right-12">
<div id="copy-page-trigger">
<button
type="button"
class="js-copy px-3 py-1 inline-flex items-center gap-1"
data-url="https://snapper.turtletech.us/docs/_sources/contributing/index.rst.txt"
>
<i class="i-lucide" data-icon="copy"></i>
<span>Copy page</span>
</button>
<button class="js-menu px-2 py-1" type="button" aria-label="More actions"
aria-haspopup="menu" aria-expanded="false" aria-controls="copy-page-content">
<i class="i-lucide chevron-down"></i>
</button>
</div>
<div id="copy-page-content" role="menu" aria-orientation="vertical" aria-hidden="true">
<div role="presentation">
<div class="flex flex-col" role="group">
<button class="js-copy" type="button" role="menuitem"
data-url="https://snapper.turtletech.us/docs/_sources/contributing/index.rst.txt">
<span class="iconify-icon">
<i class="i-lucide" data-icon="copy"></i>
</span>
<span>Copy page</span>
</button>
<a role="menuitem" href="https://snapper.turtletech.us/docs/_sources/contributing/index.rst.txt" target="_blank" rel="nofollow"><iconify-icon icon="bi:code-slash"></iconify-icon>
<span>View Source</span></a><a role="menuitem" href="https://chatgpt.com/?hints=search&q=Read%20https%3A//snapper.turtletech.us/docs/_sources/contributing/index.rst.txt%20so%20I%20can%20ask%20questions%20about%20it." target="_blank" rel="nofollow">
<iconify-icon icon="bi:openai"></iconify-icon>
<span>Open in ChatGPT</span>
</a><a role="menuitem" href="https://claude.ai/new?q=Read%20https%3A//snapper.turtletech.us/docs/_sources/contributing/index.rst.txt%20so%20I%20can%20ask%20questions%20about%20it." target="_blank" rel="nofollow">
<iconify-icon icon="bi:claude"></iconify-icon>
<span>Open in Claude</span>
</a></div>
</div>
</div>
</div><article class="yue dark-code" role="main">
<section id="contributing">
<h1>Contributing<a class="headerlink" href="#contributing" title="Link to this heading">¶</a></h1>
<blockquote>
<div><dl class="field-list simple">
<dt class="field-odd">Author<span class="colon">:</span></dt>
<dd class="field-odd"><p>Rohit Goswami</p>
</dd>
</dl>
</div></blockquote>
<section id="development-setup">
<h2>Development setup<a class="headerlink" href="#development-setup" title="Link to this heading">¶</a></h2>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span data-line="1">git<span class="w"> </span>clone<span class="w"> </span>https://github.com/TurtleTech-ehf/snapper
</span><span data-line="2"><span class="nb">cd</span><span class="w"> </span>snapper
</span><span data-line="3">cargo<span class="w"> </span>build
</span><span data-line="4">cargo<span class="w"> </span><span class="nb">test</span>
</span></pre></div>
</div>
<p>With pixi:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span data-line="1">pixi<span class="w"> </span>run<span class="w"> </span>-e<span class="w"> </span>dev<span class="w"> </span>check
</span></pre></div>
</div>
</section>
<section id="running-checks">
<h2>Running checks<a class="headerlink" href="#running-checks" title="Link to this heading">¶</a></h2>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span data-line="1">cargo<span class="w"> </span>fmt<span class="w"> </span>--check
</span><span data-line="2">cargo<span class="w"> </span>clippy<span class="w"> </span>--<span class="w"> </span>-D<span class="w"> </span>warnings
</span><span data-line="3">cargo<span class="w"> </span><span class="nb">test</span>
</span></pre></div>
</div>
<p>Dogfood check (verify all docs pass formatting):</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span data-line="1">pixi<span class="w"> </span>run<span class="w"> </span>-e<span class="w"> </span>dev<span class="w"> </span>dogfood
</span></pre></div>
</div>
</section>
<section id="project-structure">
<h2>Project structure<a class="headerlink" href="#project-structure" title="Link to this heading">¶</a></h2>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span data-line="1"><span class="n">src</span><span class="o">/</span>
</span><span data-line="2"> <span class="n">main</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">Entry</span> <span class="n">point</span><span class="p">,</span> <span class="n">CLI</span> <span class="n">dispatch</span><span class="p">,</span> <span class="n">subcommand</span> <span class="n">routing</span>
</span><span data-line="3"> <span class="n">lib</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">Public</span> <span class="n">API</span><span class="p">:</span> <span class="n">format_text</span><span class="p">(),</span> <span class="n">FormatConfig</span><span class="p">,</span> <span class="n">build_splitter</span><span class="p">()</span>
</span><span data-line="4"> <span class="n">cli</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">Clap</span> <span class="n">derive</span> <span class="n">CLI</span> <span class="o">+</span> <span class="n">subcommands</span> <span class="p">(</span><span class="n">init</span><span class="p">,</span> <span class="n">sdiff</span><span class="p">,</span> <span class="n">git</span><span class="o">-</span><span class="n">diff</span><span class="p">,</span> <span class="n">watch</span><span class="p">,</span> <span class="n">lsp</span><span class="p">)</span>
</span><span data-line="5"> <span class="n">config</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="o">.</span><span class="n">snapperrc</span><span class="o">.</span><span class="n">toml</span> <span class="n">serde</span><span class="o">-</span><span class="n">based</span> <span class="n">config</span> <span class="k">with</span> <span class="n">per</span><span class="o">-</span><span class="nb">format</span> <span class="n">sections</span>
</span><span data-line="6"> <span class="nb">format</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">Format</span> <span class="n">enum</span> <span class="o">+</span> <span class="n">auto</span><span class="o">-</span><span class="n">detection</span> <span class="kn">from</span><span class="w"> </span><span class="nn">extension</span>
</span><span data-line="7"> <span class="n">diff</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">Unified</span> <span class="n">diff</span> <span class="n">output</span> <span class="k">for</span> <span class="o">--</span><span class="n">diff</span> <span class="n">mode</span>
</span><span data-line="8"> <span class="n">sdiff</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">Sentence</span><span class="o">-</span><span class="n">level</span> <span class="n">diff</span> <span class="p">(</span><span class="n">snapper</span> <span class="n">sdiff</span><span class="p">)</span>
</span><span data-line="9"> <span class="n">git_diff</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">Git</span><span class="o">-</span><span class="n">aware</span> <span class="n">sentence</span> <span class="n">diff</span> <span class="p">(</span><span class="n">snapper</span> <span class="n">git</span><span class="o">-</span><span class="n">diff</span><span class="p">)</span>
</span><span data-line="10"> <span class="n">init</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">Project</span> <span class="n">initialization</span> <span class="p">(</span><span class="n">snapper</span> <span class="n">init</span><span class="p">)</span>
</span><span data-line="11"> <span class="n">lsp</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">LSP</span> <span class="n">server</span> <span class="p">(</span><span class="n">snapper</span> <span class="n">lsp</span><span class="p">)</span> <span class="n">via</span> <span class="n">tower</span><span class="o">-</span><span class="n">lsp</span>
</span><span data-line="12"> <span class="n">watch</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">File</span> <span class="n">watcher</span> <span class="p">(</span><span class="n">snapper</span> <span class="n">watch</span><span class="p">)</span> <span class="n">via</span> <span class="n">notify</span>
</span><span data-line="13"> <span class="n">output</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">JSON</span><span class="o">/</span><span class="n">SARIF</span> <span class="n">output</span> <span class="k">for</span> <span class="o">--</span><span class="n">check</span> <span class="n">mode</span>
</span><span data-line="14"> <span class="n">abbreviations</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">Multi</span><span class="o">-</span><span class="n">language</span> <span class="n">abbreviation</span> <span class="n">lists</span> <span class="p">(</span><span class="n">en</span><span class="p">,</span> <span class="n">de</span><span class="p">,</span> <span class="n">fr</span><span class="p">,</span> <span class="ow">is</span><span class="p">,</span> <span class="n">pl</span><span class="p">)</span>
</span><span data-line="15"> <span class="n">reflow</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">Core</span> <span class="n">reflow</span> <span class="n">engine</span> <span class="p">(</span><span class="n">regions</span> <span class="o">+</span> <span class="n">splitter</span> <span class="o">-></span> <span class="n">output</span><span class="p">)</span>
</span><span data-line="16"> <span class="n">files</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">File</span><span class="o">-</span><span class="n">level</span> <span class="n">formatting</span> <span class="n">utilities</span>
</span><span data-line="17"> <span class="n">sentence</span><span class="o">/</span>
</span><span data-line="18"> <span class="n">mod</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">SentenceSplitter</span> <span class="n">trait</span>
</span><span data-line="19"> <span class="n">unicode</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">UAX</span> <span class="c1">#29 + abbreviation merge + placeholder system</span>
</span><span data-line="20"> <span class="n">neural</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">nnsplit</span> <span class="n">LSTM</span> <span class="n">sentence</span> <span class="n">detection</span> <span class="p">(</span><span class="mi">9</span> <span class="n">languages</span><span class="p">)</span>
</span><span data-line="21"> <span class="n">parser</span><span class="o">/</span>
</span><span data-line="22"> <span class="n">mod</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">Region</span> <span class="n">enum</span><span class="p">,</span> <span class="n">FormatParser</span> <span class="n">trait</span><span class="p">,</span> <span class="n">pragma</span> <span class="n">support</span>
</span><span data-line="23"> <span class="n">org</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">Org</span><span class="o">-</span><span class="n">mode</span> <span class="n">parser</span>
</span><span data-line="24"> <span class="n">latex</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">LaTeX</span> <span class="n">parser</span>
</span><span data-line="25"> <span class="n">markdown</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">Markdown</span> <span class="n">parser</span>
</span><span data-line="26"> <span class="n">rst</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">reStructuredText</span> <span class="n">parser</span>
</span><span data-line="27"> <span class="n">plaintext</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">Plaintext</span> <span class="n">parser</span> <span class="p">(</span><span class="n">everything</span> <span class="ow">is</span> <span class="n">prose</span><span class="p">)</span>
</span><span data-line="28"><span class="n">editors</span><span class="o">/</span>
</span><span data-line="29"> <span class="n">vscode</span><span class="o">/</span> <span class="o">--</span> <span class="n">VS</span> <span class="n">Code</span> <span class="n">extension</span> <span class="p">(</span><span class="n">LSP</span> <span class="n">client</span><span class="p">)</span>
</span><span data-line="30"><span class="n">tests</span><span class="o">/</span>
</span><span data-line="31"> <span class="n">integration</span><span class="o">.</span><span class="n">rs</span> <span class="o">--</span> <span class="n">Integration</span> <span class="n">tests</span> <span class="p">(</span><span class="nb">format</span><span class="p">,</span> <span class="n">check</span><span class="p">,</span> <span class="n">idempotency</span><span class="p">,</span> <span class="n">stdin</span><span class="p">)</span>
</span><span data-line="32"> <span class="n">fixtures</span><span class="o">/</span> <span class="o">--</span> <span class="n">Sample</span> <span class="nb">input</span><span class="o">/</span><span class="n">expected</span> <span class="n">output</span> <span class="n">pairs</span> <span class="n">per</span> <span class="nb">format</span>
</span><span data-line="33"><span class="n">vale</span><span class="o">/</span>
</span><span data-line="34"> <span class="n">snapper</span><span class="o">/</span> <span class="o">--</span> <span class="n">Vale</span> <span class="n">style</span> <span class="n">rules</span> <span class="k">for</span> <span class="n">editor</span> <span class="n">hints</span>
</span><span data-line="35"><span class="n">site</span><span class="o">/</span> <span class="o">--</span> <span class="n">Landing</span> <span class="n">page</span> <span class="p">(</span><span class="n">static</span> <span class="n">HTML</span><span class="p">)</span>
</span><span data-line="36"><span class="n">docs</span><span class="o">/</span>
</span><span data-line="37"> <span class="n">orgmode</span><span class="o">/</span> <span class="o">--</span> <span class="n">Documentation</span> <span class="n">source</span> <span class="p">(</span><span class="n">org</span><span class="o">-</span><span class="n">mode</span><span class="p">)</span>
</span><span data-line="38"> <span class="n">source</span><span class="o">/</span> <span class="o">--</span> <span class="n">Sphinx</span> <span class="n">config</span> <span class="o">+</span> <span class="n">templates</span>
</span><span data-line="39"> <span class="n">export</span><span class="o">.</span><span class="n">el</span> <span class="o">--</span> <span class="n">Batch</span> <span class="n">org</span> <span class="o">-></span> <span class="n">RST</span> <span class="n">exporter</span>
</span></pre></div>
</div>
</section>
<section id="commit-conventions">
<h2>Commit conventions<a class="headerlink" href="#commit-conventions" title="Link to this heading">¶</a></h2>
<p>Commits follow conventional commits, managed by <code class="docutils literal notranslate"><span class="pre">cocogitto</span></code> (<code class="docutils literal notranslate"><span class="pre">cog</span></code>):</p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">feat:</span></code></dt><dd><p>new features</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">fix:</span></code></dt><dd><p>bug fixes</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">doc:</span></code></dt><dd><p>documentation changes</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">chore:</span></code></dt><dd><p>maintenance, dependency bumps</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">tst:</span></code></dt><dd><p>test changes</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">bld:</span></code></dt><dd><p>build system changes</p>
</dd>
</dl>
</section>
<section id="building-documentation">
<h2>Building documentation<a class="headerlink" href="#building-documentation" title="Link to this heading">¶</a></h2>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span data-line="1">pixi<span class="w"> </span>run<span class="w"> </span>-e<span class="w"> </span>docs<span class="w"> </span>docbld
</span></pre></div>
</div>
<p>Or manually:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span data-line="1">emacs<span class="w"> </span>--batch<span class="w"> </span>-l<span class="w"> </span>docs/export.el
</span><span data-line="2">sphinx-build<span class="w"> </span>docs/source<span class="w"> </span>docs/build<span class="w"> </span>-b<span class="w"> </span>html
</span></pre></div>
</div>
</section>
<section id="adding-a-new-format-parser">
<h2>Adding a new format parser<a class="headerlink" href="#adding-a-new-format-parser" title="Link to this heading">¶</a></h2>
<ol class="arabic simple">
<li><p>Create <code class="docutils literal notranslate"><span class="pre">src/parser/yourformat.rs</span></code> implementing the <code class="docutils literal notranslate"><span class="pre">FormatParser</span></code> trait</p></li>
<li><p>Add the variant to <code class="docutils literal notranslate"><span class="pre">Format</span></code> enum in <code class="docutils literal notranslate"><span class="pre">src/format.rs</span></code></p></li>
<li><p>Wire it into <code class="docutils literal notranslate"><span class="pre">format_text()</span></code> in <code class="docutils literal notranslate"><span class="pre">src/lib.rs</span></code></p></li>
<li><p>Add extension mapping in <code class="docutils literal notranslate"><span class="pre">Format::from_path()</span></code></p></li>
<li><p>Add fixture pair in <code class="docutils literal notranslate"><span class="pre">tests/fixtures/</span></code> (<code class="docutils literal notranslate"><span class="pre">sample.fmt</span></code> + <code class="docutils literal notranslate"><span class="pre">expected.fmt</span></code>)</p></li>
<li><p>Add integration tests in <code class="docutils literal notranslate"><span class="pre">tests/integration.rs</span></code></p></li>
<li><p>Document in <code class="docutils literal notranslate"><span class="pre">docs/orgmode/reference/formats.org</span></code></p></li>
</ol>
</section>
</section>
</article><button class="back-to-top" type="button">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
</svg>
<span>Back to top</span>
</button><div class="navigation flex print:hidden"><div class="navigation-prev">
<a href="../reference/config.html">
<i class="i-lucide chevron-left"></i>
<div class="page-info">
<span>Previous</span><div class="title">Configuration</div></div>
</a>
</div><div class="navigation-next">
<a href="../faq/index.html">
<div class="page-info">
<span>Next</span>
<div class="title">FAQ</div>
</div>
<i class="i-lucide chevron-right"></i>
</a>
</div></div></div>
</div>
</main>
</div>
<footer class="sy-foot">
<div class="sy-foot-inner sy-container mx-auto">
<div
style="
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 0.5rem;
margin-bottom: 1.5rem;
color: var(--sy-c-text-weak);
font-size: 0.9em;
"
>
<div
style="
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 1rem;
align-items: center;
"
>
<span style="display: inline-flex; align-items: center; gap: 0.3em">
<svg
xmlns="http://www.w3.org/2000/svg"
width="1em"
height="1em"
viewBox="0 0 24 24"
fill="currentColor"
aria-hidden="true"
>
<path d="M7,20H4V4h3V20z M14,20h-3V12h3V20z M21,20h-3V8h3V20z" />
</svg>
<span
>Analytics by
<a
href="https://umami.is/"
target="_blank"
rel="noopener noreferrer"
style="color: inherit; text-decoration: underline"
>Umami</a
></span
>
</span>
<span style="display: inline-flex; align-items: center; gap: 0.3em">
<span>provided by</span>
<span style="display: inline-flex; align-items: center; gap: 0.3em">
<svg xmlns="http://www.w3.org/2000/svg" width="1.4em" height="1.4em" viewBox="0 0 64 64" aria-hidden="true"><g fill-rule="evenodd"><ellipse cx="32" cy="11" fill="#80D25B" rx="7" ry="9"/><path fill="#80D25B" d="M20.3,46c0,0-3.2,9.9.3,13.8c3.5,3.9 6.1,3.4 6.1-6C26.8,44.3 20.3,46 20.3,46Z"/><path fill="#80D25B" d="M38.3,46c0,0-3.2,9.9.4,13.8c3.5,3.9 6.1,3.4 6.1-6C44.8,44.3 38.3,46 38.3,46Z" transform="matrix(-1 0 0 1 81.8 0)"/><path fill="#80D25B" d="M20.6,21.2c0,0-6.7-5.8-10.5-5.2C6.2,16.7 6,22.2 6,24c0,1.8 1.8,13.3 3.8,12.5c2-0.8 4-8.5 4-8.5c1.9,2.3 4.8,2.5 4.8,2.5L20.6,21.2Z"/><path fill="#80D25B" d="M57.6,21.2c0,0-6.6-5.8-10.5-5.2C43.2,16.7 43,22.2 43,24c0,1.8 1.8,13.3 3.8,12.5c2-0.8 4-8.5 4-8.5c1.9,2.3 4.8,2.5 4.8,2.5L57.6,21.2Z" transform="matrix(-1 0 0 1 100.623 0)"/><path fill="#BD7575" stroke="#595959" stroke-linecap="round" stroke-width="2" d="M32,53C40.8,53 48,44.5 48,34C48,23.5 46.7,17 32,17C17.3,17 16,23.5 16,34C16,44.5 23.2,53 32,53Z"/><polygon fill="#BD7575" stroke="#595959" stroke-linecap="round" stroke-width="2" points="32 22 38.9 26 38.9 34 32 38 25.1 34 25.1 26"/><path stroke="#595959" stroke-linecap="round" stroke-width="2" d="M30,8C28.9,8 28,8.9 28,10"/><path stroke="#595959" stroke-linecap="round" stroke-width="2" d="M36,8C34.9,8 34,8.9 34,10" transform="matrix(-1 0 0 1 70 0)"/><path stroke="#595959" stroke-linecap="round" stroke-width="2" d="M32.1,38.2L32.1,52.4M32,21.7L32,17M25.2,26L17.7,23.1M25.1,34.2L16.8,38.9"/><path stroke="#595959" stroke-linecap="round" stroke-width="2" d="M46.2,26L38.7,23.1" transform="matrix(-1 0 0 1 84.951 0)"/><path stroke="#595959" stroke-linecap="round" stroke-width="2" d="M47.1,34.2L38.8,38.9" transform="matrix(-1 0 0 1 85.891 0)"/></g></svg>
<a
href="https://turtletech.us/"
target="_blank"
rel="noopener noreferrer"
style="color: inherit; text-decoration: underline"
>TurtleTech ehf</a
>
</span>
</span>
</div>
</div>
<div class="sy-foot-reserved md:flex justify-between items-center">
<div class="sy-foot-copyright"><p>2026--present, <a href="https://rgoswami.me">Rohit Goswami</a></p>
<p>
Made with
<a href="https://www.sphinx-doc.org/">Sphinx</a> and
<a href="https://shibuya.lepture.com">Shibuya theme</a>.
</p>
</div> <div class="sy-foot-socials">
<a href="https://github.com/TurtleTech-ehf/snapper" aria-label="GitHub">
<iconify-icon icon="simple-icons:github"></iconify-icon>
</a></div>
</div>
</div>
</footer>
<script src="../_static/documentation_options.js?v=01f34227"></script>
<script src="../_static/doctools.js?v=fd6eb6e6"></script>
<script src="../_static/sphinx_highlight.js?v=6ffebe34"></script>
<script src="../_static/shibuya.js?v=cac61aee"></script></body>
</html>