typst 0.13.5 → 0.14.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +4 -8
- data/ext/typst/Cargo.toml +15 -17
- data/ext/typst/src/compiler.rs +6 -5
- data/ext/typst/src/lib.rs +39 -35
- data/ext/typst/src/query.rs +5 -2
- data/ext/typst/src/world.rs +23 -6
- data/lib/typst/typst.bundle +0 -0
- metadata +16 -14
- data/ext/typst/src/compiler-new.rs +0 -771
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 77a2b80d3ddc7e3b8a2fd44c365b3a7c9464383894bb3a61e869d87085baa8a2
|
|
4
|
+
data.tar.gz: ce2e709afe2b9b76f73292ec13df74815ac0ff7dc7fc4636a58d73b7122ad391
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b0e845ea82c232ed88b4dd6c159b814aad54199ff85829a7edb18a42346abf887e138345efca9e1ab1a2ca8b379b161bda3448162cd128f811b342815a7f0b85
|
|
7
|
+
data.tar.gz: 73c99e328ea7aa5ba58d574b7b7770b86355f97787e2df6de4a4578913ae7d72082e11309309ae2ccd2f3882ceba26a482e60de8b25dc188a78e678ca41c99b7
|
data/Rakefile
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
require "bundler/gem_tasks"
|
|
2
|
-
require "
|
|
2
|
+
require "rb_sys/extensiontask"
|
|
3
3
|
require "rake/testtask"
|
|
4
|
-
require 'rake_compiler_dock'
|
|
5
|
-
require "rubygems/package_task"
|
|
6
|
-
require "bundler"
|
|
7
4
|
|
|
8
5
|
CROSS_PLATFORMS = %w[
|
|
9
6
|
aarch64-linux
|
|
7
|
+
aarch64-linux-musl
|
|
10
8
|
arm64-darwin
|
|
11
9
|
x64-mingw-ucrt
|
|
12
10
|
x86_64-darwin
|
|
@@ -18,9 +16,7 @@ spec = Bundler.load_gemspec("typst.gemspec")
|
|
|
18
16
|
|
|
19
17
|
Gem::PackageTask.new(spec).define
|
|
20
18
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
Rake::ExtensionTask.new("typst", spec) do |ext|
|
|
19
|
+
RbSys::ExtensionTask.new("typst", spec) do |ext|
|
|
24
20
|
ext.lib_dir = "lib/typst"
|
|
25
21
|
ext.source_pattern = "*.{rs,toml}"
|
|
26
22
|
ext.cross_compile = true
|
|
@@ -40,8 +36,8 @@ task 'gem:native' do |t|
|
|
|
40
36
|
end
|
|
41
37
|
|
|
42
38
|
task 'gem:native:push' do |t|
|
|
39
|
+
sh "gem signin"
|
|
43
40
|
CROSS_PLATFORMS.each do |platform|
|
|
44
|
-
sh "gem signin"
|
|
45
41
|
sh "gem push pkg/typst-#{spec.version}-#{platform}.gem"
|
|
46
42
|
end
|
|
47
43
|
end
|
data/ext/typst/Cargo.toml
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "typst"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.14.2"
|
|
4
4
|
edition = "2021"
|
|
5
5
|
|
|
6
6
|
[lib]
|
|
7
7
|
crate-type = ["cdylib"]
|
|
8
8
|
|
|
9
9
|
[dependencies]
|
|
10
|
-
chrono = { version = "0.4.
|
|
10
|
+
chrono = { version = "0.4.42", default-features = false, features = [
|
|
11
11
|
"clock",
|
|
12
12
|
"std",
|
|
13
13
|
] }
|
|
14
|
-
codespan-reporting = "0.
|
|
15
|
-
comemo = "0.
|
|
14
|
+
codespan-reporting = "0.13"
|
|
15
|
+
comemo = "0.5.0"
|
|
16
16
|
dirs = "5" #
|
|
17
17
|
ecow = "0.2"
|
|
18
18
|
env_logger = "0.10.1" #
|
|
@@ -21,28 +21,26 @@ filetime = "0.2.22" #
|
|
|
21
21
|
flate2 = "1" #
|
|
22
22
|
fontdb = "0.15.0" #
|
|
23
23
|
log = "0.4.20" #
|
|
24
|
-
magnus = { version = "0.
|
|
24
|
+
magnus = { version = "0.8.2" }
|
|
25
25
|
pathdiff = "0.2"
|
|
26
26
|
same-file = "1" #
|
|
27
27
|
siphasher = "1.0" #
|
|
28
28
|
tar = "0.4" #
|
|
29
|
-
|
|
30
|
-
#typst-library = { git = "https://github.com/typst/typst.git", tag = "v0.13.0" }
|
|
31
|
-
serde = { version = "1.0.217", features = ["derive"] }
|
|
29
|
+
serde = { version = "1.0.228", features = ["derive"] }
|
|
32
30
|
serde_json = "1"
|
|
33
31
|
serde_yaml = "0.9"
|
|
34
|
-
typst = "0.
|
|
35
|
-
typst-library = "0.
|
|
36
|
-
typst-kit = { version = "0.
|
|
32
|
+
typst = "0.14.2"
|
|
33
|
+
typst-library = "0.14.2"
|
|
34
|
+
typst-kit = { version = "0.14.2", features = [
|
|
37
35
|
"downloads",
|
|
38
36
|
"embed-fonts",
|
|
39
37
|
"vendor-openssl",
|
|
40
38
|
] }
|
|
41
|
-
typst-pdf = "0.
|
|
42
|
-
typst-svg = "0.
|
|
43
|
-
typst-html = "0.
|
|
44
|
-
typst-render = "0.
|
|
45
|
-
typst-eval = "0.
|
|
39
|
+
typst-pdf = "0.14.2"
|
|
40
|
+
typst-svg = "0.14.2"
|
|
41
|
+
typst-html = "0.14.2"
|
|
42
|
+
typst-render = "0.14.2"
|
|
43
|
+
typst-eval = "0.14.2"
|
|
46
44
|
ureq = { version = "2", default-features = false, features = [
|
|
47
45
|
"gzip",
|
|
48
46
|
"socks-proxy",
|
|
@@ -51,4 +49,4 @@ walkdir = "2.4.0"
|
|
|
51
49
|
|
|
52
50
|
# enable rb-sys feature to test against Ruby head. This is only needed if you
|
|
53
51
|
# want to work with the unreleased, in-development, next version of Ruby
|
|
54
|
-
rb-sys = { version = "0.9.
|
|
52
|
+
rb-sys = { version = "0.9.123", default-features = false, features = ["stable-api-compiled-fallback"] }
|
data/ext/typst/src/compiler.rs
CHANGED
|
@@ -4,9 +4,10 @@ use codespan_reporting::term::{self, termcolor};
|
|
|
4
4
|
use ecow::{eco_format, EcoString};
|
|
5
5
|
use typst::diag::{Severity, SourceDiagnostic, StrResult, Warned};
|
|
6
6
|
use typst::foundations::Datetime;
|
|
7
|
-
use
|
|
7
|
+
use typst_html::HtmlDocument;
|
|
8
8
|
use typst::layout::PagedDocument;
|
|
9
|
-
use typst::syntax::{FileId, Source, Span};
|
|
9
|
+
//use typst::syntax::{FileId, Source, Span};
|
|
10
|
+
use typst::syntax::{FileId, Lines, Span};
|
|
10
11
|
use typst::{World, WorldExt};
|
|
11
12
|
|
|
12
13
|
use crate::world::SystemWorld;
|
|
@@ -167,7 +168,7 @@ pub fn format_diagnostics(
|
|
|
167
168
|
)
|
|
168
169
|
.with_labels(label(world, diagnostic.span).into_iter().collect());
|
|
169
170
|
|
|
170
|
-
term::
|
|
171
|
+
term::emit_to_write_style(&mut w, &config, world, &diag)?;
|
|
171
172
|
|
|
172
173
|
// Stacktrace-like helper diagnostics.
|
|
173
174
|
for point in &diagnostic.trace {
|
|
@@ -176,7 +177,7 @@ pub fn format_diagnostics(
|
|
|
176
177
|
.with_message(message)
|
|
177
178
|
.with_labels(label(world, point.span).into_iter().collect());
|
|
178
179
|
|
|
179
|
-
term::
|
|
180
|
+
term::emit_to_write_style(&mut w, &config, world, &help)?;
|
|
180
181
|
}
|
|
181
182
|
}
|
|
182
183
|
|
|
@@ -192,7 +193,7 @@ fn label(world: &SystemWorld, span: Span) -> Option<Label<FileId>> {
|
|
|
192
193
|
impl<'a> codespan_reporting::files::Files<'a> for SystemWorld {
|
|
193
194
|
type FileId = FileId;
|
|
194
195
|
type Name = String;
|
|
195
|
-
type Source =
|
|
196
|
+
type Source = Lines<String>;
|
|
196
197
|
|
|
197
198
|
fn name(&'a self, id: FileId) -> CodespanResult<Self::Name> {
|
|
198
199
|
let vpath = id.vpath();
|
data/ext/typst/src/lib.rs
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
use std::path::PathBuf;
|
|
2
2
|
|
|
3
|
-
use magnus::{
|
|
4
|
-
use magnus::{prelude::*};
|
|
3
|
+
use magnus::{function, prelude::*, Error, Ruby};
|
|
5
4
|
|
|
6
5
|
use std::collections::HashMap;
|
|
7
6
|
use query::{query as typst_query, QueryCommand, SerializationFormat};
|
|
@@ -15,6 +14,7 @@ mod query;
|
|
|
15
14
|
mod world;
|
|
16
15
|
|
|
17
16
|
fn to_html(
|
|
17
|
+
ruby: &Ruby,
|
|
18
18
|
input: PathBuf,
|
|
19
19
|
root: Option<PathBuf>,
|
|
20
20
|
font_paths: Vec<PathBuf>,
|
|
@@ -23,11 +23,11 @@ fn to_html(
|
|
|
23
23
|
sys_inputs: HashMap<String, String>,
|
|
24
24
|
) -> Result<Vec<Vec<u8>>, Error> {
|
|
25
25
|
let input = input.canonicalize()
|
|
26
|
-
.map_err(|err| magnus::Error::new(
|
|
26
|
+
.map_err(|err| magnus::Error::new(ruby.exception_arg_error(), err.to_string()))?;
|
|
27
27
|
|
|
28
28
|
let root = if let Some(root) = root {
|
|
29
29
|
root.canonicalize()
|
|
30
|
-
.map_err(|err| magnus::Error::new(
|
|
30
|
+
.map_err(|err| magnus::Error::new(ruby.exception_arg_error(), err.to_string()))?
|
|
31
31
|
} else if let Some(dir) = input.parent() {
|
|
32
32
|
dir.into()
|
|
33
33
|
} else {
|
|
@@ -35,12 +35,12 @@ fn to_html(
|
|
|
35
35
|
};
|
|
36
36
|
|
|
37
37
|
let resource_path = resource_path.canonicalize()
|
|
38
|
-
.map_err(|err| magnus::Error::new(
|
|
38
|
+
.map_err(|err| magnus::Error::new(ruby.exception_arg_error(), err.to_string()))?;
|
|
39
39
|
|
|
40
40
|
let mut default_fonts = Vec::new();
|
|
41
41
|
for entry in walkdir::WalkDir::new(resource_path.join("fonts")) {
|
|
42
42
|
let path = entry
|
|
43
|
-
.map_err(|err| magnus::Error::new(
|
|
43
|
+
.map_err(|err| magnus::Error::new(ruby.exception_arg_error(), err.to_string()))?
|
|
44
44
|
.into_path();
|
|
45
45
|
let Some(extension) = path.extension() else {
|
|
46
46
|
continue;
|
|
@@ -72,16 +72,17 @@ fn to_html(
|
|
|
72
72
|
.font_paths(font_paths)
|
|
73
73
|
.ignore_system_fonts(ignore_system_fonts)
|
|
74
74
|
.build()
|
|
75
|
-
.map_err(|msg| magnus::Error::new(
|
|
75
|
+
.map_err(|msg| magnus::Error::new(ruby.exception_arg_error(), msg.to_string()))?;
|
|
76
76
|
|
|
77
77
|
let bytes = world
|
|
78
78
|
.compile(Some("html"), None, &Vec::new())
|
|
79
|
-
.map_err(|msg| magnus::Error::new(
|
|
79
|
+
.map_err(|msg| magnus::Error::new(ruby.exception_arg_error(), msg.to_string()))?;
|
|
80
80
|
|
|
81
81
|
Ok(bytes)
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
fn to_svg(
|
|
85
|
+
ruby: &Ruby,
|
|
85
86
|
input: PathBuf,
|
|
86
87
|
root: Option<PathBuf>,
|
|
87
88
|
font_paths: Vec<PathBuf>,
|
|
@@ -90,11 +91,11 @@ fn to_svg(
|
|
|
90
91
|
sys_inputs: HashMap<String, String>,
|
|
91
92
|
) -> Result<Vec<Vec<u8>>, Error> {
|
|
92
93
|
let input = input.canonicalize()
|
|
93
|
-
.map_err(|err| magnus::Error::new(
|
|
94
|
+
.map_err(|err| magnus::Error::new(ruby.exception_arg_error(), err.to_string()))?;
|
|
94
95
|
|
|
95
96
|
let root = if let Some(root) = root {
|
|
96
97
|
root.canonicalize()
|
|
97
|
-
.map_err(|err| magnus::Error::new(
|
|
98
|
+
.map_err(|err| magnus::Error::new(ruby.exception_arg_error(), err.to_string()))?
|
|
98
99
|
} else if let Some(dir) = input.parent() {
|
|
99
100
|
dir.into()
|
|
100
101
|
} else {
|
|
@@ -102,12 +103,12 @@ fn to_svg(
|
|
|
102
103
|
};
|
|
103
104
|
|
|
104
105
|
let resource_path = resource_path.canonicalize()
|
|
105
|
-
.map_err(|err| magnus::Error::new(
|
|
106
|
+
.map_err(|err| magnus::Error::new(ruby.exception_arg_error(), err.to_string()))?;
|
|
106
107
|
|
|
107
108
|
let mut default_fonts = Vec::new();
|
|
108
109
|
for entry in walkdir::WalkDir::new(resource_path.join("fonts")) {
|
|
109
110
|
let path = entry
|
|
110
|
-
.map_err(|err| magnus::Error::new(
|
|
111
|
+
.map_err(|err| magnus::Error::new(ruby.exception_arg_error(), err.to_string()))?
|
|
111
112
|
.into_path();
|
|
112
113
|
let Some(extension) = path.extension() else {
|
|
113
114
|
continue;
|
|
@@ -126,16 +127,17 @@ fn to_svg(
|
|
|
126
127
|
.font_paths(font_paths)
|
|
127
128
|
.ignore_system_fonts(ignore_system_fonts)
|
|
128
129
|
.build()
|
|
129
|
-
.map_err(|msg| magnus::Error::new(
|
|
130
|
+
.map_err(|msg| magnus::Error::new(ruby.exception_arg_error(), msg.to_string()))?;
|
|
130
131
|
|
|
131
132
|
let svg_bytes = world
|
|
132
133
|
.compile(Some("svg"), None, &Vec::new())
|
|
133
|
-
.map_err(|msg| magnus::Error::new(
|
|
134
|
+
.map_err(|msg| magnus::Error::new(ruby.exception_arg_error(), msg.to_string()))?;
|
|
134
135
|
|
|
135
136
|
Ok(svg_bytes)
|
|
136
137
|
}
|
|
137
138
|
|
|
138
139
|
fn to_png(
|
|
140
|
+
ruby: &Ruby,
|
|
139
141
|
input: PathBuf,
|
|
140
142
|
root: Option<PathBuf>,
|
|
141
143
|
font_paths: Vec<PathBuf>,
|
|
@@ -144,11 +146,11 @@ fn to_png(
|
|
|
144
146
|
sys_inputs: HashMap<String, String>,
|
|
145
147
|
) -> Result<Vec<Vec<u8>>, Error> {
|
|
146
148
|
let input = input.canonicalize()
|
|
147
|
-
.map_err(|err| magnus::Error::new(
|
|
149
|
+
.map_err(|err| magnus::Error::new(ruby.exception_arg_error(), err.to_string()))?;
|
|
148
150
|
|
|
149
151
|
let root = if let Some(root) = root {
|
|
150
152
|
root.canonicalize()
|
|
151
|
-
.map_err(|err| magnus::Error::new(
|
|
153
|
+
.map_err(|err| magnus::Error::new(ruby.exception_arg_error(), err.to_string()))?
|
|
152
154
|
} else if let Some(dir) = input.parent() {
|
|
153
155
|
dir.into()
|
|
154
156
|
} else {
|
|
@@ -156,12 +158,12 @@ fn to_png(
|
|
|
156
158
|
};
|
|
157
159
|
|
|
158
160
|
let resource_path = resource_path.canonicalize()
|
|
159
|
-
.map_err(|err| magnus::Error::new(
|
|
161
|
+
.map_err(|err| magnus::Error::new(ruby.exception_arg_error(), err.to_string()))?;
|
|
160
162
|
|
|
161
163
|
let mut default_fonts = Vec::new();
|
|
162
164
|
for entry in walkdir::WalkDir::new(resource_path.join("fonts")) {
|
|
163
165
|
let path = entry
|
|
164
|
-
.map_err(|err| magnus::Error::new(
|
|
166
|
+
.map_err(|err| magnus::Error::new(ruby.exception_arg_error(), err.to_string()))?
|
|
165
167
|
.into_path();
|
|
166
168
|
let Some(extension) = path.extension() else {
|
|
167
169
|
continue;
|
|
@@ -180,16 +182,17 @@ fn to_png(
|
|
|
180
182
|
.font_paths(font_paths)
|
|
181
183
|
.ignore_system_fonts(ignore_system_fonts)
|
|
182
184
|
.build()
|
|
183
|
-
.map_err(|msg| magnus::Error::new(
|
|
185
|
+
.map_err(|msg| magnus::Error::new(ruby.exception_arg_error(), msg.to_string()))?;
|
|
184
186
|
|
|
185
187
|
let bytes = world
|
|
186
188
|
.compile(Some("png"), None, &Vec::new())
|
|
187
|
-
.map_err(|msg| magnus::Error::new(
|
|
189
|
+
.map_err(|msg| magnus::Error::new(ruby.exception_arg_error(), msg.to_string()))?;
|
|
188
190
|
|
|
189
191
|
Ok(bytes)
|
|
190
192
|
}
|
|
191
193
|
|
|
192
194
|
fn to_pdf(
|
|
195
|
+
ruby: &Ruby,
|
|
193
196
|
input: PathBuf,
|
|
194
197
|
root: Option<PathBuf>,
|
|
195
198
|
font_paths: Vec<PathBuf>,
|
|
@@ -198,11 +201,11 @@ fn to_pdf(
|
|
|
198
201
|
sys_inputs: HashMap<String, String>,
|
|
199
202
|
) -> Result<Vec<Vec<u8>>, Error> {
|
|
200
203
|
let input = input.canonicalize()
|
|
201
|
-
.map_err(|err| magnus::Error::new(
|
|
204
|
+
.map_err(|err| magnus::Error::new(ruby.exception_arg_error(), err.to_string()))?;
|
|
202
205
|
|
|
203
206
|
let root = if let Some(root) = root {
|
|
204
207
|
root.canonicalize()
|
|
205
|
-
.map_err(|err| magnus::Error::new(
|
|
208
|
+
.map_err(|err| magnus::Error::new(ruby.exception_arg_error(), err.to_string()))?
|
|
206
209
|
} else if let Some(dir) = input.parent() {
|
|
207
210
|
dir.into()
|
|
208
211
|
} else {
|
|
@@ -210,12 +213,12 @@ fn to_pdf(
|
|
|
210
213
|
};
|
|
211
214
|
|
|
212
215
|
let resource_path = resource_path.canonicalize()
|
|
213
|
-
.map_err(|err| magnus::Error::new(
|
|
216
|
+
.map_err(|err| magnus::Error::new(ruby.exception_arg_error(), err.to_string()))?;
|
|
214
217
|
|
|
215
218
|
let mut default_fonts = Vec::new();
|
|
216
219
|
for entry in walkdir::WalkDir::new(resource_path.join("fonts")) {
|
|
217
220
|
let path = entry
|
|
218
|
-
.map_err(|err| magnus::Error::new(
|
|
221
|
+
.map_err(|err| magnus::Error::new(ruby.exception_arg_error(), err.to_string()))?
|
|
219
222
|
.into_path();
|
|
220
223
|
let Some(extension) = path.extension() else {
|
|
221
224
|
continue;
|
|
@@ -234,16 +237,17 @@ fn to_pdf(
|
|
|
234
237
|
.font_paths(font_paths)
|
|
235
238
|
.ignore_system_fonts(ignore_system_fonts)
|
|
236
239
|
.build()
|
|
237
|
-
.map_err(|msg| magnus::Error::new(
|
|
240
|
+
.map_err(|msg| magnus::Error::new(ruby.exception_arg_error(), msg.to_string()))?;
|
|
238
241
|
|
|
239
242
|
let pdf_bytes = world
|
|
240
243
|
.compile(Some("pdf"), None, &Vec::new())
|
|
241
|
-
.map_err(|msg| magnus::Error::new(
|
|
244
|
+
.map_err(|msg| magnus::Error::new(ruby.exception_arg_error(), msg.to_string()))?;
|
|
242
245
|
|
|
243
246
|
Ok(pdf_bytes)
|
|
244
247
|
}
|
|
245
248
|
|
|
246
249
|
fn query(
|
|
250
|
+
ruby: &Ruby,
|
|
247
251
|
selector: String,
|
|
248
252
|
field: Option<String>,
|
|
249
253
|
one: bool,
|
|
@@ -258,15 +262,15 @@ fn query(
|
|
|
258
262
|
let format = match format.unwrap().to_ascii_lowercase().as_str() {
|
|
259
263
|
"json" => SerializationFormat::Json,
|
|
260
264
|
"yaml" => SerializationFormat::Yaml,
|
|
261
|
-
_ => return Err(magnus::Error::new(
|
|
265
|
+
_ => return Err(magnus::Error::new(ruby.exception_arg_error(), "unsupported serialization format"))?,
|
|
262
266
|
};
|
|
263
267
|
|
|
264
268
|
let input = input.canonicalize()
|
|
265
|
-
.map_err(|err| magnus::Error::new(
|
|
269
|
+
.map_err(|err| magnus::Error::new(ruby.exception_arg_error(), err.to_string()))?;
|
|
266
270
|
|
|
267
271
|
let root = if let Some(root) = root {
|
|
268
272
|
root.canonicalize()
|
|
269
|
-
.map_err(|err| magnus::Error::new(
|
|
273
|
+
.map_err(|err| magnus::Error::new(ruby.exception_arg_error(), err.to_string()))?
|
|
270
274
|
} else if let Some(dir) = input.parent() {
|
|
271
275
|
dir.into()
|
|
272
276
|
} else {
|
|
@@ -274,12 +278,12 @@ fn query(
|
|
|
274
278
|
};
|
|
275
279
|
|
|
276
280
|
let resource_path = resource_path.canonicalize()
|
|
277
|
-
.map_err(|err| magnus::Error::new(
|
|
281
|
+
.map_err(|err| magnus::Error::new(ruby.exception_arg_error(), err.to_string()))?;
|
|
278
282
|
|
|
279
283
|
let mut default_fonts = Vec::new();
|
|
280
284
|
for entry in walkdir::WalkDir::new(resource_path.join("fonts")) {
|
|
281
285
|
let path = entry
|
|
282
|
-
.map_err(|err| magnus::Error::new(
|
|
286
|
+
.map_err(|err| magnus::Error::new(ruby.exception_arg_error(), err.to_string()))?
|
|
283
287
|
.into_path();
|
|
284
288
|
let Some(extension) = path.extension() else {
|
|
285
289
|
continue;
|
|
@@ -298,7 +302,7 @@ fn query(
|
|
|
298
302
|
.font_paths(font_paths)
|
|
299
303
|
.ignore_system_fonts(ignore_system_fonts)
|
|
300
304
|
.build()
|
|
301
|
-
.map_err(|msg| magnus::Error::new(
|
|
305
|
+
.map_err(|msg| magnus::Error::new(ruby.exception_arg_error(), msg.to_string()))?;
|
|
302
306
|
|
|
303
307
|
let result = typst_query(
|
|
304
308
|
&mut world,
|
|
@@ -312,15 +316,15 @@ fn query(
|
|
|
312
316
|
|
|
313
317
|
match result {
|
|
314
318
|
Ok(data) => Ok(data),
|
|
315
|
-
Err(msg) => Err(magnus::Error::new(
|
|
319
|
+
Err(msg) => Err(magnus::Error::new(ruby.exception_arg_error(), msg.to_string())),
|
|
316
320
|
}
|
|
317
321
|
}
|
|
318
322
|
|
|
319
323
|
#[magnus::init]
|
|
320
|
-
fn init() -> Result<(), Error> {
|
|
324
|
+
fn init(ruby: &Ruby) -> Result<(), Error> {
|
|
321
325
|
env_logger::init();
|
|
322
326
|
|
|
323
|
-
let module = define_module("Typst")?;
|
|
327
|
+
let module = ruby.define_module("Typst")?;
|
|
324
328
|
module.define_singleton_method("_to_pdf", function!(to_pdf, 6))?;
|
|
325
329
|
module.define_singleton_method("_to_svg", function!(to_svg, 6))?;
|
|
326
330
|
module.define_singleton_method("_to_png", function!(to_png, 6))?;
|
data/ext/typst/src/query.rs
CHANGED
|
@@ -2,11 +2,13 @@ use comemo::Track;
|
|
|
2
2
|
use ecow::{eco_format, EcoString};
|
|
3
3
|
use serde::Serialize;
|
|
4
4
|
use typst::diag::{bail, StrResult, Warned};
|
|
5
|
+
use typst::engine::Sink;
|
|
5
6
|
use typst::foundations::{Content, IntoValue, LocatableSelector, Scope};
|
|
6
7
|
use typst::layout::PagedDocument;
|
|
7
8
|
use typst::syntax::Span;
|
|
9
|
+
use typst::syntax::SyntaxMode;
|
|
8
10
|
use typst::World;
|
|
9
|
-
use typst_eval::{eval_string, EvalMode};
|
|
11
|
+
use typst_eval::eval_string; //{eval_string, EvalMode};
|
|
10
12
|
|
|
11
13
|
use crate::world::SystemWorld;
|
|
12
14
|
|
|
@@ -73,9 +75,10 @@ fn retrieve(
|
|
|
73
75
|
let selector = eval_string(
|
|
74
76
|
&typst::ROUTINES,
|
|
75
77
|
world.track(),
|
|
78
|
+
Sink::new().track_mut(),
|
|
76
79
|
&command.selector,
|
|
77
80
|
Span::detached(),
|
|
78
|
-
|
|
81
|
+
SyntaxMode::Code,
|
|
79
82
|
Scope::default(),
|
|
80
83
|
)
|
|
81
84
|
.map_err(|errors| {
|
data/ext/typst/src/world.rs
CHANGED
|
@@ -3,13 +3,14 @@ use std::path::{Path, PathBuf};
|
|
|
3
3
|
use std::sync::{Mutex, OnceLock};
|
|
4
4
|
|
|
5
5
|
use chrono::{DateTime, Datelike, Local};
|
|
6
|
+
//use rustc_hash::FxHashMap;
|
|
6
7
|
use ecow::eco_format;
|
|
7
8
|
use typst::diag::{FileError, FileResult, StrResult};
|
|
8
9
|
use typst::foundations::{Bytes, Datetime, Dict};
|
|
9
|
-
use typst::syntax::{FileId, Source, VirtualPath};
|
|
10
|
+
use typst::syntax::{FileId, Lines, Source, VirtualPath};
|
|
10
11
|
use typst::text::{Font, FontBook};
|
|
11
12
|
use typst::utils::LazyHash;
|
|
12
|
-
use typst::{Features, Library,
|
|
13
|
+
use typst::{Features, Library, LibraryExt, World};
|
|
13
14
|
use typst_kit::{
|
|
14
15
|
fonts::{FontSearcher, FontSlot},
|
|
15
16
|
package::PackageStorage,
|
|
@@ -129,9 +130,20 @@ impl SystemWorld {
|
|
|
129
130
|
|
|
130
131
|
/// Lookup a source file by id.
|
|
131
132
|
#[track_caller]
|
|
132
|
-
pub fn lookup(&self, id: FileId) ->
|
|
133
|
-
self.source(id)
|
|
134
|
-
.expect("file id does not point to any source file")
|
|
133
|
+
pub fn lookup(&self, id: FileId) -> Lines<String> {
|
|
134
|
+
// self.source(id)
|
|
135
|
+
// .expect("file id does not point to any source file")
|
|
136
|
+
self.slot(id, |slot| {
|
|
137
|
+
if let Some(source) = slot.source.get() {
|
|
138
|
+
let source = source.as_ref().expect("file is not valid");
|
|
139
|
+
source.lines().clone()
|
|
140
|
+
} else if let Some(bytes) = slot.file.get() {
|
|
141
|
+
let bytes = bytes.as_ref().expect("file is not valid");
|
|
142
|
+
Lines::try_from(bytes).expect("file is not valid utf-8")
|
|
143
|
+
} else {
|
|
144
|
+
panic!("file id does not point to any source file");
|
|
145
|
+
}
|
|
146
|
+
})
|
|
135
147
|
}
|
|
136
148
|
}
|
|
137
149
|
|
|
@@ -193,7 +205,7 @@ impl SystemWorldBuilder {
|
|
|
193
205
|
input,
|
|
194
206
|
root: self.root,
|
|
195
207
|
main: FileId::new(None, main_path),
|
|
196
|
-
library: LazyHash::new(
|
|
208
|
+
library: LazyHash::new(Library::builder().with_inputs(self.inputs).with_features(self.features).build()),
|
|
197
209
|
book: LazyHash::new(fonts.book),
|
|
198
210
|
fonts: fonts.fonts,
|
|
199
211
|
slots: Mutex::default(),
|
|
@@ -300,6 +312,11 @@ impl<T: Clone> SlotCell<T> {
|
|
|
300
312
|
self.accessed = false;
|
|
301
313
|
}
|
|
302
314
|
|
|
315
|
+
/// Gets the contents of the cell.
|
|
316
|
+
fn get(&self) -> Option<&FileResult<T>> {
|
|
317
|
+
self.data.as_ref()
|
|
318
|
+
}
|
|
319
|
+
|
|
303
320
|
/// Gets the contents of the cell or initialize them.
|
|
304
321
|
fn get_or_init(
|
|
305
322
|
&mut self,
|
|
Binary file
|
metadata
CHANGED
|
@@ -1,57 +1,62 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: typst
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.14.2.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Flinn
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: rb_sys
|
|
15
14
|
requirement: !ruby/object:Gem::Requirement
|
|
16
15
|
requirements:
|
|
16
|
+
- - "~>"
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '0.9'
|
|
17
19
|
- - ">="
|
|
18
20
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: 0.9.
|
|
21
|
+
version: 0.9.123
|
|
20
22
|
type: :runtime
|
|
21
23
|
prerelease: false
|
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
25
|
requirements:
|
|
26
|
+
- - "~>"
|
|
27
|
+
- !ruby/object:Gem::Version
|
|
28
|
+
version: '0.9'
|
|
24
29
|
- - ">="
|
|
25
30
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: 0.9.
|
|
31
|
+
version: 0.9.123
|
|
27
32
|
- !ruby/object:Gem::Dependency
|
|
28
33
|
name: rubyzip
|
|
29
34
|
requirement: !ruby/object:Gem::Requirement
|
|
30
35
|
requirements:
|
|
31
36
|
- - "~>"
|
|
32
37
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '2
|
|
38
|
+
version: '3.2'
|
|
34
39
|
type: :runtime
|
|
35
40
|
prerelease: false
|
|
36
41
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
42
|
requirements:
|
|
38
43
|
- - "~>"
|
|
39
44
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '2
|
|
45
|
+
version: '3.2'
|
|
41
46
|
- !ruby/object:Gem::Dependency
|
|
42
47
|
name: hexapdf
|
|
43
48
|
requirement: !ruby/object:Gem::Requirement
|
|
44
49
|
requirements:
|
|
45
50
|
- - "~>"
|
|
46
51
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: '1.
|
|
52
|
+
version: '1.5'
|
|
48
53
|
type: :development
|
|
49
54
|
prerelease: false
|
|
50
55
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
56
|
requirements:
|
|
52
57
|
- - "~>"
|
|
53
58
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: '1.
|
|
59
|
+
version: '1.5'
|
|
55
60
|
- !ruby/object:Gem::Dependency
|
|
56
61
|
name: test-unit
|
|
57
62
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -66,7 +71,6 @@ dependencies:
|
|
|
66
71
|
- - "~>"
|
|
67
72
|
- !ruby/object:Gem::Version
|
|
68
73
|
version: '3.6'
|
|
69
|
-
description:
|
|
70
74
|
email: flinn@actsasflinn.com
|
|
71
75
|
executables: []
|
|
72
76
|
extensions:
|
|
@@ -79,7 +83,6 @@ files:
|
|
|
79
83
|
- Rakefile
|
|
80
84
|
- ext/typst/Cargo.toml
|
|
81
85
|
- ext/typst/extconf.rb
|
|
82
|
-
- ext/typst/src/compiler-new.rs
|
|
83
86
|
- ext/typst/src/compiler.rs
|
|
84
87
|
- ext/typst/src/download.rs
|
|
85
88
|
- ext/typst/src/fonts.rs
|
|
@@ -110,11 +113,11 @@ files:
|
|
|
110
113
|
- lib/formats/svg.rb
|
|
111
114
|
- lib/query.rb
|
|
112
115
|
- lib/typst.rb
|
|
116
|
+
- lib/typst/typst.bundle
|
|
113
117
|
homepage: https://github.com/actsasflinn/typst-rb
|
|
114
118
|
licenses:
|
|
115
119
|
- Apache-2.0
|
|
116
120
|
metadata: {}
|
|
117
|
-
post_install_message:
|
|
118
121
|
rdoc_options: []
|
|
119
122
|
require_paths:
|
|
120
123
|
- lib
|
|
@@ -129,8 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
129
132
|
- !ruby/object:Gem::Version
|
|
130
133
|
version: '0'
|
|
131
134
|
requirements: []
|
|
132
|
-
rubygems_version: 3.
|
|
133
|
-
signing_key:
|
|
135
|
+
rubygems_version: 3.6.9
|
|
134
136
|
specification_version: 4
|
|
135
137
|
summary: Ruby binding to typst, a new markup-based typesetting system that is powerful
|
|
136
138
|
and easy to learn.
|