import path from "path";
import fs from "fs-extra";
Languages are stored in JSON in the file resources/languages.json
.
Each item maps the file extension to the name of the language and the
symbol
that indicates a line comment. To add support for a new programming
language to Docco, just add it to the file.
const unparsedLanguages = JSON.parse(fs.readFileSync(path.join(__dirname, "../resources", "languages.json")));
Build out the appropriate matchers and delimiters for each language.
const buildMatchers = function(languages) {
return Object.entries(languages).reduce((acc, [extension, lang]) => {
Does the line begin with a comment?
lang.commentMatcher = new RegExp(`^\\s*${lang.symbol}\\s?`);
Ignore Shebangs/Hashbangs and interpolations
lang.commentFilter = /(^#![/]|^\s*#\{)/;
acc[extension] = lang;
return acc;
}, {});
};
export const languages = buildMatchers(unparsedLanguages);
A function to get the current language we’re documenting, based on the
file extension. Detect and tag “literate” .ext.md
variants.
export const getLanguage = function(source, config) {
const ext = config.extension || path.extname(source) || path.basename(source);
const langList = Object.keys(config.languages).length ? config.languages : languages;
const lang = langList[ext];
if (lang && lang.name === "markdown") {
const codeExt = path.extname(path.basename(source, ext));
const codeLang = langList[codeExt];
if (codeExt && codeLang) {
return {
...codeLang,
literate: true
};
}
}
return lang;
};