remark plugin to support interlinear glossing for linguistics in Markdown.
:::gloss
| Chinese coverbs
我 **坐** 飞机 **从** 上海 **到** 北京 去。
/ wǒ **zuò** fēijī **cóng** Shànghǎi **dào** Běijīng qù.
= I **sit** airplane **from** Shanghai **arrive.at** Beijing go
| 'I'll go from Shanghai to Beijing by plane.'
:::This package is a unified (remark) plugin to add support for linguistic interlinear glossing via remark-directive.
This project is useful for Markdown documents that include interlinear glossed text, such as linguistics papers and language documentation. Because it uses remark-directive, keep in mind that it won't be portable to other Markdown renderers. On your own site it can be great!
This package is ESM only. In Node.js (version 16+), install with npm:
npm install remark-interlinear-glossIn Deno with esm.sh:
import remarkInterlinearGloss from "https://esm.sh/remark-interlinear-gloss@1";In browsers with esm.sh:
<link rel="stylesheet" href="https://esm.sh/remark-interlinear-gloss@1/styles.css">
<script type="module">
import remarkInterlinearGloss from "https://esm.sh/remark-interlinear-gloss@1?bundle";
</script>Say our document example.md contains the following. (Note that \: is used because remark-directive would otherwise interpret :237 as an empty text directive.)
## Rule 1: Word-by-word alignment
Interlinear glosses are left-aligned vertically, word by word, with the example. E.g.
:::gloss
| Indonesian (Sneddon 1996\:237)
Mereka di Jakarta sekarang.
= they in Jakarta now
| 'They are in Jakarta now.'
:::…and our module example.js contains:
import rehypeStringify from "rehype-stringify";
import remarkDirective from "remark-directive";
import remarkInterlinearGloss from "remark-interlinear-gloss";
import remarkParse from "remark-parse";
import remarkRehype from "remark-rehype";
import { read } from "to-vfile";
import { unified } from "unified";
const file = await unified()
.use(remarkParse)
.use(remarkDirective)
.use(remarkInterlinearGloss)
.use(remarkRehype)
.use(rehypeStringify)
.process(await read("example.md"));
console.log(String(file));…then running node example.js yields:
<h2>Rule 1: Word-by-word alignment</h2>
<p>Interlinear glosses are left-aligned vertically, word by word, with the example. E.g.</p>
<figure class="gloss">
<figcaption class="gloss-header">Indonesian (Sneddon 1996:237)</figcaption>
<ol class="gloss-body">
<li>
<ol class="gloss-column">
<li class="gloss-word gloss-word-text">Mereka</li>
<li class="gloss-word gloss-word-gloss">they</li>
</ol>
</li>
<li>
<ol class="gloss-column">
<li class="gloss-word gloss-word-text">di</li>
<li class="gloss-word gloss-word-gloss">in</li>
</ol>
</li>
<li>
<ol class="gloss-column">
<li class="gloss-word gloss-word-text">Jakarta</li>
<li class="gloss-word gloss-word-gloss">Jakarta</li>
</ol>
</li>
<li>
<ol class="gloss-column">
<li class="gloss-word gloss-word-text">sekarang.</li>
<li class="gloss-word gloss-word-gloss">now</li>
</ol>
</li>
</ol>
<p class="gloss-footer">'They are in Jakarta now.'</p>
</figure>When the base styles are imported from "remark-interlinear-gloss/styles.css", the output is as follows:
Inside a :::gloss directive, each line is parsed as follows:
| Prefix | Meaning | CSS class |
|---|---|---|
| (none) | Source text | gloss-word-text |
/ |
Transliteration | gloss-word-transliteration |
= |
Gloss | gloss-word-gloss |
| |
Header/footer metadata | gloss-header / gloss-footer |
Lines prefixed with | at the beginning or end of the block become headers or footers respectively. Outside of headers and footers, all words are automatically divided into columns. Additional Markdown styles may be used at any point in the gloss, as shown below.
:::gloss
| Chinese
你 写 **书**
/ ní xiě **shū**
= 2SG write **book**
| 'You write a **book**.'
:::This package includes optional base styles. Import them in your project:
import "remark-interlinear-gloss/styles.css";Or with esm.sh:
<link rel="stylesheet" href="https://esm.sh/remark-interlinear-gloss@1/styles.css" />Or write your own styles targeting these classes:
.gloss— the outer<figure>.gloss-header— the<figcaption>for header lines.gloss-body— the<ol>containing all columns.gloss-column— the<ol>containing words in one column.gloss-word— the<li>for each word.gloss-word-text— source text words.gloss-word-transliteration— transliterated words.gloss-word-gloss— glossed words.gloss-footer— the<p>for footer lines
This package exports no identifiers. The default export is remarkInterlinearGloss.
Add support for interlinear glossing. remark-directive must be used before remark-interlinear-gloss.
No parameters. Returns undefined.
This package is fully typed with TypeScript.
Use of remark-interlinear-gloss does not involve rehype (hast) or user content so there are no openings for cross-site scripting (XSS) attacks.
remark-directive— required for directive syntax

