- Add devbox.json pinning Flutter 3.35.7, Android SDK (Nix flake), openjdk17, just, openssl - Add android/nix-android-sdk/ Nix flake + flake.lock + Android Studio config script - Add justfile with build/get/upgrade/icons/analyze/rebuild recipes - flutter pub upgrade --major-versions: file_picker ^11, google_fonts ^8, permission_handler ^12, share_plus ^12, flutter_lints ^6 (+71 transitive) - Fix file_picker v11 API: FilePicker.platform → FilePicker.getDirectoryPath() - Fix all 37 analyzer issues: deprecated APIs (window, WillPopScope, Share, SvgPicture color), async BuildContext guards, key constructors, private createState() return types, unused locals, print → debugPrint, etc. - Hook _handleCommand into onSubmitted for : prefix commands - Android: Gradle 8.3→8.11.1, AGP 8.2.2→8.9.1, KGP 1.8.22→2.2.20, compileSdk/targetSdk 34→36, namespace auto-derivation for library modules, kotlin.compiler.execution.strategy=in-process Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
238 lines
5.7 KiB
Dart
Executable file
238 lines
5.7 KiB
Dart
Executable file
import 'package:highlight/highlight.dart';
|
|
|
|
final markdown = Mode(
|
|
refs: {},
|
|
aliases: [
|
|
"md",
|
|
"mkdown",
|
|
"mkd"
|
|
],
|
|
contains: [
|
|
// Headers (with distinct classes for each level)
|
|
Mode(
|
|
className: "header",
|
|
variants: [
|
|
// Level 1 header (#)
|
|
Mode(
|
|
className: "header-h1",
|
|
begin: "^#\\s+",
|
|
end: "\$"
|
|
),
|
|
// Level 2 header (##)
|
|
Mode(
|
|
className: "header-h2",
|
|
begin: "^##\\s+",
|
|
end: "\$"
|
|
),
|
|
// Level 3 header (###)
|
|
Mode(
|
|
className: "header-h3",
|
|
begin: "^###\\s+",
|
|
end: "\$"
|
|
),
|
|
// Level 4 header (####)
|
|
Mode(
|
|
className: "header-h4",
|
|
begin: "^####\\s+",
|
|
end: "\$"
|
|
),
|
|
// Level 5 header (#####)
|
|
Mode(
|
|
className: "header-h5",
|
|
begin: "^#####\\s+",
|
|
end: "\$"
|
|
),
|
|
// Level 6 header (######)
|
|
Mode(
|
|
className: "header-h6",
|
|
begin: "^######\\s+",
|
|
end: "\$"
|
|
),
|
|
// Underlined headers (=== and ---)
|
|
Mode(
|
|
className: "header-underline",
|
|
begin: "^.+?\\n[=-]{2,}\$"
|
|
)
|
|
]
|
|
),
|
|
|
|
// HTML tags
|
|
Mode(
|
|
begin: "<",
|
|
end: ">",
|
|
subLanguage: ["xml"],
|
|
relevance: 0
|
|
),
|
|
|
|
// Lists
|
|
Mode(
|
|
className: "list",
|
|
begin: "^\\s*([*+-]|(\\d+\\.))\\s+"
|
|
),
|
|
|
|
// Bold text
|
|
Mode(
|
|
className: "bold",
|
|
begin: "[*_]{2}.+?[*_]{2}"
|
|
),
|
|
|
|
// Italic text
|
|
Mode(
|
|
className: "italic",
|
|
variants: [
|
|
Mode(begin: "\\*.+?\\*"),
|
|
Mode(begin: "_.+?_", relevance: 0)
|
|
]
|
|
),
|
|
|
|
// Blockquotes
|
|
Mode(
|
|
className: "blockquote",
|
|
begin: "^>\\s+",
|
|
end: "\$"
|
|
),
|
|
|
|
// Code blocks and inline code
|
|
Mode(
|
|
className: "code",
|
|
variants: [
|
|
Mode(begin: "^```\\w*\\s*\$", end: "^```[ ]*\$"), // Fenced code blocks
|
|
Mode(begin: "`.+?`"), // Inline code
|
|
Mode(begin: "^( {4}|\\t)", end: "\$", relevance: 0) // Indented code blocks
|
|
]
|
|
),
|
|
|
|
// Horizontal rules
|
|
Mode(
|
|
className: "horizontal-rule",
|
|
begin: "^[-\\*]{3,}",
|
|
end: "\$"
|
|
),
|
|
|
|
// Links and images
|
|
Mode(
|
|
begin: "\\[.+?\\][\\(\\[].*?[\\)\\]]",
|
|
returnBegin: true,
|
|
contains: [
|
|
Mode(
|
|
className: "link-text",
|
|
begin: "\\[",
|
|
end: "\\]",
|
|
excludeBegin: true,
|
|
returnEnd: true,
|
|
relevance: 0
|
|
),
|
|
Mode(
|
|
className: "link-url",
|
|
begin: "\\]\\(",
|
|
end: "\\)",
|
|
excludeBegin: true,
|
|
excludeEnd: true
|
|
),
|
|
Mode(
|
|
className: "link-reference",
|
|
begin: "\\]\\[",
|
|
end: "\\]",
|
|
excludeBegin: true,
|
|
excludeEnd: true
|
|
)
|
|
],
|
|
relevance: 10
|
|
),
|
|
|
|
// Reference-style links
|
|
Mode(
|
|
begin: "^\\[[^\\n]+\\]:",
|
|
returnBegin: true,
|
|
contains: [
|
|
Mode(
|
|
className: "link-reference",
|
|
begin: "\\[",
|
|
end: "\\]",
|
|
excludeBegin: true,
|
|
excludeEnd: true
|
|
),
|
|
Mode(
|
|
className: "link-url",
|
|
begin: ":\\s*",
|
|
end: "\$",
|
|
excludeBegin: true
|
|
)
|
|
]
|
|
),
|
|
|
|
// Strikethrough text
|
|
Mode(
|
|
className: "strikethrough",
|
|
begin: "~~.+?~~"
|
|
),
|
|
|
|
// Tables
|
|
Mode(
|
|
className: "table",
|
|
begin: "^\\|.+?\\|",
|
|
end: "\$",
|
|
contains: [
|
|
Mode(
|
|
className: "table-header",
|
|
begin: "^\\|",
|
|
end: "\\|",
|
|
contains: [
|
|
Mode(
|
|
className: "table-cell",
|
|
begin: "[^|]+",
|
|
end: "\$"
|
|
)
|
|
]
|
|
),
|
|
Mode(
|
|
className: "table-row",
|
|
begin: "^\\|",
|
|
end: "\\|",
|
|
contains: [
|
|
Mode(
|
|
className: "table-cell",
|
|
begin: "[^|]+",
|
|
end: "\$"
|
|
)
|
|
]
|
|
)
|
|
]
|
|
),
|
|
|
|
// Task lists
|
|
Mode(
|
|
className: "task-list",
|
|
begin: "^\\s*-\\s*\\[\\s*[xX ]?\\s*\\]\\s+"
|
|
),
|
|
|
|
Mode(
|
|
className: "link-reference",
|
|
begin: "\\[",
|
|
end: "\\]",
|
|
excludeBegin: true,
|
|
excludeEnd: true
|
|
),
|
|
|
|
// Custom Tag Highlighting
|
|
Mode(
|
|
className: "tag-hash",
|
|
begin: "(?<=\\s|^)#[a-zA-Z0-9_]+",
|
|
relevance: 10), // Magenta
|
|
Mode(
|
|
className: "tag-plus",
|
|
begin: "(?<=\\s|^)\\+[a-zA-Z0-9_]+",
|
|
relevance: 10), // Cyan
|
|
Mode(
|
|
className: "tag-at",
|
|
begin: "(?<=\\s|^)@[a-zA-Z0-9_]+",
|
|
relevance: 10), // Yellow
|
|
Mode(
|
|
className: "command",
|
|
begin: "(?<=\\s|^):[a-zA-Z0-9_]+",
|
|
relevance: 10),
|
|
Mode(
|
|
className: "link-url",
|
|
begin: "(?<=\\s|^)/[a-zA-Z0-9_/]+",
|
|
relevance: 10), // Yellow
|
|
]);
|