Files
VoiletMark/src/CodeHighlight.h
T
liyepan 0b32ccaaf3 feat: v0.8.1 —— 代码框左上角加语言下拉菜单
- 编辑模式下每个代码框左上角显示当前语言(纯文本 / C++ / Python …),
  点开是一个带勾选标记的语言菜单
- 选中后改写围栏上的语言标记(例如 ```cpp → ```python),
  高亮立即跟着变;选「纯文本」则去掉语言标记
- 下拉与复制按钮都是画在编辑器视口里的,跟着滚动重算,源码模式下都不显示
- 「纯文本」加入中英文翻译
- 截图与 README 同步
2026-10-22 18:16:14 +08:00

56 lines
1.3 KiB
C++

#pragma once
#include <QString>
#include <QVector>
/// 围栏代码块里的轻量语法高亮。
///
/// 不依赖任何第三方库,按语言给出一组关键字 + 注释 / 字符串规则,
/// 逐行扫描出 token,由 MarkdownHighlighter 上色。
namespace CodeHighlight {
enum class Language {
None = 0,
C,
Cpp,
Python,
JavaScript,
TypeScript,
Java,
Rust,
Go,
Json,
Bash,
Sql,
Yaml,
Count
};
enum class Token { Keyword, Type, String, Number, Comment, Preprocessor };
struct Span {
int start = 0;
int length = 0;
Token token = Token::Keyword;
};
struct LanguageEntry {
Language language;
QString info; // 写进围栏里的标记,例如 cpp
QString name; // 显示名,例如 C++
};
/// 供语言下拉菜单使用(顺序即菜单顺序)。
const QVector<LanguageEntry> &languageEntries();
QString displayName(Language language);
/// 从 ```cpp 这类 info string 里识别语言(大小写不敏感)。
Language fromInfoString(const QString &info);
/// 扫描一行,返回需要着色的区间;inBlockComment 传入 / 传出跨行注释状态。
QVector<Span> tokenize(const QString &text, Language language, bool inBlockComment,
bool *newBlockComment);
} // namespace CodeHighlight