kramdown-syntax_tree_sitter 0.4.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -9,8 +9,8 @@ crate-type = ["cdylib"]
9
9
 
10
10
  [dependencies]
11
11
  anyhow = "*"
12
+ magnus = { version = "*", features = ["embed"] }
12
13
  tree-sitter = "*"
13
14
  tree-sitter-cli = "*"
14
15
  tree-sitter-highlight = "*"
15
16
  tree-sitter-loader = "*"
16
- rutie = "*"
@@ -1,69 +1,19 @@
1
- #[macro_use]
2
- extern crate rutie;
3
-
4
- use rutie::{AnyException, Boolean, Class, Exception, Object, RString, VM};
1
+ use magnus::{exception, function, Error, Ruby};
5
2
 
6
3
  mod tree_sitter_adapter;
7
4
 
8
- class!(TreeSitterAdapter);
9
-
10
- #[rustfmt::skip]
11
- methods!(
12
- TreeSitterAdapter,
13
- _rtself,
14
- fn pub_highlight(
15
- raw_code: RString,
16
- raw_parsers_dir: RString,
17
- raw_scope: RString,
18
- css_classes: Boolean
19
- ) -> RString {
20
- VM::unwrap_or_raise_ex(
21
- tree_sitter_adapter::highlight(
22
- &raw_code.unwrap().to_string(),
23
- &raw_parsers_dir.unwrap().to_string(),
24
- &raw_scope.unwrap().to_string(),
25
- css_classes.unwrap().to_bool(),
26
- )
27
- .as_ref()
28
- .map(String::as_str)
29
- .map(RString::new_utf8)
30
- .map_err(String::as_str)
31
- .map_err(AnyException::new_runtime_error),
32
- )
33
- }
34
- );
35
-
36
- #[no_mangle]
37
- pub extern "C" fn Init_tree_sitter_adapter() {
38
- Class::new("TreeSitterAdapter", None).define(|class_| {
39
- class_.def_self("highlight", pub_highlight);
40
- });
41
- }
42
-
43
- pub trait VMExt {
44
- fn unwrap_or_raise_ex<T, E>(x: Result<T, E>) -> T
45
- where
46
- E: Into<AnyException>;
47
- }
48
-
49
- impl VMExt for VM {
50
- fn unwrap_or_raise_ex<T, E>(result: Result<T, E>) -> T
51
- where
52
- E: Into<AnyException>,
53
- {
54
- result.unwrap_or_else(|e| {
55
- VM::raise_ex(e);
56
- unreachable!();
57
- })
58
- }
59
- }
60
-
61
- pub trait AnyExceptionExt {
62
- fn new_runtime_error(message: &str) -> Self;
5
+ fn pub_highlight(
6
+ code: String,
7
+ parsers_dir: String,
8
+ scope: String,
9
+ css_classes: bool,
10
+ ) -> Result<String, Error> {
11
+ tree_sitter_adapter::highlight(&code, &parsers_dir, &scope, css_classes)
12
+ .map_err(|message| Error::new(exception::runtime_error(), message))
63
13
  }
64
14
 
65
- impl AnyExceptionExt for AnyException {
66
- fn new_runtime_error(message: &str) -> Self {
67
- AnyException::new("RuntimeError", Some(message))
68
- }
15
+ #[magnus::init]
16
+ fn init(ruby: &Ruby) -> Result<(), Error> {
17
+ ruby.define_module("TreeSitterAdapter")?
18
+ .define_module_function("highlight", function!(pub_highlight, 4))
69
19
  }
@@ -9,6 +9,8 @@ use tree_sitter_highlight::{Error as TSError, HighlightEvent};
9
9
  use tree_sitter_highlight::{Highlight, HighlightConfiguration, Highlighter, HtmlRenderer};
10
10
  use tree_sitter_loader::{Config, LanguageConfiguration, Loader};
11
11
 
12
+ use std::collections::HashSet;
13
+
12
14
  const LOADER_ERROR_MSG: &str = "Error loading Tree-sitter parsers from directory";
13
15
  const NO_LANGUAGE_ERROR_MSG: &str = "Error retrieving language configuration for scope";
14
16
  const NO_HIGHLIGHT_ERROR_MSG: &str = "Error retrieving highlight configuration for scope";
@@ -58,7 +60,7 @@ fn highlight_configuration<'a>(
58
60
  scope: &'a str,
59
61
  ) -> Result<&'a HighlightConfiguration> {
60
62
  config
61
- .highlight_config(language)
63
+ .highlight_config(language, None)
62
64
  .transpose()
63
65
  .with_context(|| format!("{NO_HIGHLIGHT_ERROR_MSG} '{scope}'"))
64
66
  .flatten_()
@@ -105,10 +107,26 @@ fn render_html(
105
107
  Ok(renderer.lines().collect())
106
108
  }
107
109
 
108
- fn highlight_names(scope: &str, loader: &Loader) -> Result<Vec<String>> {
110
+ fn highlight_names_for_language(scope: &str, loader: &Loader) -> Result<Vec<String>> {
109
111
  let (language, config) = language_and_configuration(loader, scope)?;
110
112
  let highlight_config = highlight_configuration(language, config, scope)?;
111
- Ok(highlight_config.names().iter().map(String::from).collect())
113
+ Ok(highlight_config
114
+ .names()
115
+ .iter()
116
+ .map(ToString::to_string)
117
+ .collect())
118
+ }
119
+
120
+ fn highlight_names(parser_directory: PathBuf) -> Result<Vec<String>> {
121
+ let loader = loader(parser_directory)?;
122
+ let highlight_names = loader
123
+ .get_all_language_configurations()
124
+ .into_iter()
125
+ .flat_map(|(config, _)| config.scope.clone())
126
+ .flat_map(|scope| highlight_names_for_language(&scope, &loader))
127
+ .flat_map(Vec::into_iter)
128
+ .collect::<HashSet<_>>();
129
+ Ok(highlight_names.into_iter().collect())
112
130
  }
113
131
 
114
132
  fn highlight_name_styles() -> HashMap<String, Style> {
@@ -116,7 +134,7 @@ fn highlight_name_styles() -> HashMap<String, Style> {
116
134
  theme
117
135
  .highlight_names
118
136
  .into_iter()
119
- .zip(theme.styles.into_iter())
137
+ .zip(theme.styles)
120
138
  .collect()
121
139
  }
122
140
 
@@ -146,8 +164,8 @@ fn highlight_adapter(
146
164
  css_classes: bool,
147
165
  ) -> Result<String> {
148
166
  let parsers_dir = PathBuf::from(parsers_dir);
149
- let mut loader = loader(parsers_dir)?;
150
- let highlight_names = highlight_names(scope, &loader)?;
167
+ let mut loader = loader(parsers_dir.clone())?;
168
+ let highlight_names = highlight_names(parsers_dir)?;
151
169
  loader.configure_highlights(&highlight_names);
152
170
  let (language, config) = language_and_configuration(&loader, scope)?;
153
171
  let highlight_config = highlight_configuration(language, config, scope)?;
@@ -45,7 +45,7 @@ module Kramdown
45
45
  'source.toml' => %w[toml],
46
46
  'source.ts' => %w[ts typescript],
47
47
  'source.vhd' => %w[vhdl],
48
- 'text.html.basic' => %w[html],
48
+ 'source.html' => %w[html],
49
49
  'text.html.erb' => %w[erb eruby rhtml]
50
50
  }
51
51
  .map { |scope, aliases| aliases.map { |alias_| [alias_, scope] } }
@@ -5,7 +5,7 @@ module Kramdown
5
5
  module SyntaxHighlighter
6
6
  module TreeSitter
7
7
  # Version of kramdown-syntax_tree_sitter gem
8
- VERSION = '0.4.0'
8
+ VERSION = '0.6.0'
9
9
  end
10
10
  end
11
11
  end
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # Even though this project uses Magnus to handle interoperabilty between Ruby and Rust,
4
+ # the Ruby support library for Rutie still happens to work very well for initializing
5
+ # the internal Rust extension for use by this Ruby library
3
6
  require 'rutie'
4
7
 
5
8
  Rutie.new(:tree_sitter_adapter).init(
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kramdown-syntax_tree_sitter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew T. Biehl
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-15 00:00:00.000000000 Z
11
+ date: 2024-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: kramdown
@@ -52,77 +52,10 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 0.0.4
55
- - !ruby/object:Gem::Dependency
56
- name: minitest
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - '='
60
- - !ruby/object:Gem::Version
61
- version: 5.18.0
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - '='
67
- - !ruby/object:Gem::Version
68
- version: 5.18.0
69
- - !ruby/object:Gem::Dependency
70
- name: rouge
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - '='
74
- - !ruby/object:Gem::Version
75
- version: 4.1.0
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - '='
81
- - !ruby/object:Gem::Version
82
- version: 4.1.0
83
- - !ruby/object:Gem::Dependency
84
- name: rubocop
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - '='
88
- - !ruby/object:Gem::Version
89
- version: 1.50.0
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - '='
95
- - !ruby/object:Gem::Version
96
- version: 1.50.0
97
- - !ruby/object:Gem::Dependency
98
- name: rubocop-minitest
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - '='
102
- - !ruby/object:Gem::Version
103
- version: 0.30.0
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - '='
109
- - !ruby/object:Gem::Version
110
- version: 0.30.0
111
- - !ruby/object:Gem::Dependency
112
- name: rubocop-rake
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - '='
116
- - !ruby/object:Gem::Version
117
- version: 0.6.0
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - '='
123
- - !ruby/object:Gem::Version
124
- version: 0.6.0
125
- description:
55
+ description: |-
56
+ This is a syntax highlighter plugin for Kramdown that leverages Tree-sitter's native syntax highlighter to highlight code blocks (and spans) when rendering HTML.
57
+
58
+ Tree-sitter is a modern, general-purpose parsing library that outclasses many existing tools at the task of syntax highlighting. This plugin adapts Tree-sitter's native highlighter for Kramdown, so that Tree-sitter's superior highlighting capabilities can be easily leveraged in the context of rendering Markdown.
126
59
  email:
127
60
  executables: []
128
61
  extensions:
@@ -147,6 +80,11 @@ licenses:
147
80
  - MIT
148
81
  metadata:
149
82
  rubygems_mfa_required: 'true'
83
+ homepage_uri: https://github.com/andrewtbiehl/kramdown-syntax_tree_sitter
84
+ source_code_uri: https://github.com/andrewtbiehl/kramdown-syntax_tree_sitter
85
+ documentation_uri: https://github.com/andrewtbiehl/kramdown-syntax_tree_sitter/blob/main/README.md
86
+ changelog_uri: https://github.com/andrewtbiehl/kramdown-syntax_tree_sitter/blob/main/CHANGELOG.md
87
+ bug_tracker_uri: https://github.com/andrewtbiehl/kramdown-syntax_tree_sitter/issues
150
88
  post_install_message:
151
89
  rdoc_options: []
152
90
  require_paths:
@@ -155,14 +93,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
155
93
  requirements:
156
94
  - - ">="
157
95
  - !ruby/object:Gem::Version
158
- version: '2.7'
96
+ version: '3.0'
159
97
  required_rubygems_version: !ruby/object:Gem::Requirement
160
98
  requirements:
161
99
  - - ">="
162
100
  - !ruby/object:Gem::Version
163
101
  version: '0'
164
- requirements: []
165
- rubygems_version: 3.4.1
102
+ requirements:
103
+ - |-
104
+ This plugin is essentially an adapter for the Tree-sitter highlight library and hence requires a compatible Rust installation to function. It is officially compatible with the following environments:
105
+
106
+ - Rust: 1.75, 1.76, 1.77, 1.78
107
+ - Platforms: MacOS, Linux
108
+ rubygems_version: 3.5.9
166
109
  signing_key:
167
110
  specification_version: 4
168
111
  summary: Syntax highlight code with Tree-sitter via Kramdown.