monaco-latex
Version:
LaTeX language support for Monaco Editor
108 lines (107 loc) • 3.52 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createHoverProvider = exports.LaTeXHoverProvider = void 0;
const data_1 = require("./commands/data");
class LaTeXHoverProvider {
constructor(monaco) {
this.monaco = monaco;
}
provideHover(model, position, token) {
const word = model.getWordAtPosition(position);
if (!word)
return null;
const lineContent = model.getLineContent(position.lineNumber);
const beforeWord = lineContent.substring(0, word.startColumn - 1);
// Check if this is a LaTeX command (preceded by backslash)
if (beforeWord.endsWith('\\')) {
const command = data_1.COMMAND_MAP.get(word.word);
if (command) {
return this.createCommandHover(command, {
startLineNumber: position.lineNumber,
startColumn: word.startColumn - 1,
endLineNumber: position.lineNumber,
endColumn: word.endColumn,
});
}
}
// Check if it's an environment name inside \begin{} or \end{}
const envMatch = lineContent.match(/\\(begin|end)\{(\w+\*?)\}/);
if (envMatch && word.word === envMatch[2]) {
const env = data_1.ENVIRONMENT_MAP.get(envMatch[2]);
if (env) {
return this.createEnvironmentHover(env, {
startLineNumber: position.lineNumber,
startColumn: word.startColumn,
endLineNumber: position.lineNumber,
endColumn: word.endColumn,
});
}
}
return null;
}
createCommandHover(cmd, range) {
const contents = [];
// Command signature
if (cmd.signature) {
contents.push({
value: `\`\\${cmd.name}${cmd.signature}\``,
});
}
else {
contents.push({
value: `\`\\${cmd.name}\``,
});
}
// Description
contents.push({
value: cmd.description,
});
// Category
contents.push({
value: `*Category:* ${cmd.category}`,
});
// Package requirement
if (cmd.package) {
contents.push({
value: `*Requires:* \`\\usepackage{${cmd.package}}\``,
});
}
// Example
if (cmd.example) {
contents.push({
value: `**Example:**\n\`\`\`latex\n${cmd.example}\n\`\`\``,
});
}
return { contents, range };
}
createEnvironmentHover(env, range) {
const contents = [];
// Environment name
contents.push({
value: `\`\\begin{${env.name}}...\\end{${env.name}}\``,
});
// Description
contents.push({
value: env.description,
});
// Category
contents.push({
value: `*Category:* ${env.category}`,
});
// Package requirement
if (env.package) {
contents.push({
value: `*Requires:* \`\\usepackage{${env.package}}\``,
});
}
return { contents, range };
}
}
exports.LaTeXHoverProvider = LaTeXHoverProvider;
/**
* Creates a hover provider for LaTeX.
*/
function createHoverProvider(monaco) {
return new LaTeXHoverProvider(monaco);
}
exports.createHoverProvider = createHoverProvider;