typst-rb 0.15.0.0.3

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.
data/lib/document.rb ADDED
@@ -0,0 +1,37 @@
1
+ module Typst
2
+ class Document
3
+ attr_accessor :bytes
4
+
5
+ def initialize(bytes)
6
+ @bytes = bytes
7
+ end
8
+
9
+ def write_some(filename)
10
+ if pages.size == 1
11
+ write_one(filename)
12
+ else
13
+ write_paged(filename)
14
+ end
15
+ end
16
+
17
+ def write_one(filename)
18
+ File.write(filename, pages.first, mode: "wb")
19
+ end
20
+
21
+ def write_paged(base_filename)
22
+ pages.each_with_index do |page, i|
23
+ paged_filename = File.basename(base_filename, ".*") + "_{{n}}" + File.extname(base_filename) unless base_filename.include?("{{n}}")
24
+ paged_filename = paged_filename.gsub("{{n}}", (i+1).to_s)
25
+ File.write(paged_filename, page, mode: "wb")
26
+ end
27
+ end
28
+
29
+ def pages
30
+ bytes.collect{ |page| page.pack("C*").to_s }
31
+ end
32
+
33
+ def document
34
+ pages.size == 1 ? pages.first : pages
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,13 @@
1
+ module Typst
2
+ class HtmlExperimental < Base
3
+ def initialize(*options)
4
+ super(*options)
5
+ @compiled = HtmlExperimentalDocument.new(Typst::_to_html(*self.typst_args))
6
+ end
7
+ end
8
+ class HtmlExperimentalDocument < Document
9
+ alias_method :write, :write_one
10
+ end
11
+
12
+ register_format(html_experimental: HtmlExperimental)
13
+ end
@@ -0,0 +1,13 @@
1
+ module Typst
2
+ class Pdf < Base
3
+ def initialize(*options)
4
+ super(*options)
5
+ @compiled = PdfDocument.new(Typst::_to_pdf(*self.typst_pdf_args))
6
+ end
7
+ end
8
+ class PdfDocument < Document
9
+ alias_method :write, :write_one
10
+ end
11
+
12
+ register_format(pdf: Pdf)
13
+ end
@@ -0,0 +1,13 @@
1
+ module Typst
2
+ class Png < Base
3
+ def initialize(*options)
4
+ super(*options)
5
+ @compiled = PngDocument.new(Typst::_to_png(*self.typst_png_args))
6
+ end
7
+ end
8
+ class PngDocument < Document
9
+ alias_method :write, :write_some
10
+ end
11
+
12
+ register_format(png: Png)
13
+ end
@@ -0,0 +1,13 @@
1
+ module Typst
2
+ class Svg < Base
3
+ def initialize(*options)
4
+ super(*options)
5
+ @compiled = SvgDocument.new(Typst::_to_svg(*self.typst_args))
6
+ end
7
+ end
8
+ class SvgDocument < Document
9
+ alias_method :write, :write_some
10
+ end
11
+
12
+ register_format(svg: Svg)
13
+ end
data/lib/query.rb ADDED
@@ -0,0 +1,22 @@
1
+ module Typst
2
+ class Query < Base
3
+ attr_accessor :format
4
+
5
+ def initialize(selector, input, field: nil, one: false, format: "json", root: ".", font_paths: [], ignore_system_fonts: false, ignore_embedded_fonts: false, sys_inputs: {})
6
+ self.format = format
7
+ @result = Typst::_query(selector, field, one, format, input, root, font_paths, ignore_system_fonts, ignore_embedded_fonts, sys_inputs)
8
+ end
9
+
10
+ def result(raw: false)
11
+ case raw || format
12
+ when "json" then JSON(@result)
13
+ when "yaml" then YAML::safe_load(@result)
14
+ else @result
15
+ end
16
+ end
17
+
18
+ def to_s
19
+ @result
20
+ end
21
+ end
22
+ end
data/lib/typst-rb.rb ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Entry shim matching the gem's published name (typst-rb), so Bundler's
4
+ # by-name auto-require works with no require: option. The code answers to
5
+ # "typst", unchanged from upstream.
6
+ require_relative "typst"
data/lib/typst.rb ADDED
@@ -0,0 +1,101 @@
1
+ def Typst(*options)
2
+ Typst::Base.new(*options)
3
+ end
4
+
5
+ module Typst
6
+ @@formats = {}
7
+
8
+ def self.register_format(**format)
9
+ @@formats.merge!(format)
10
+ end
11
+
12
+ def self.formats
13
+ @@formats
14
+ end
15
+
16
+ def self.clear_cache(max_age = 0)
17
+ Typst::_clear_cache(max_age)
18
+ end
19
+
20
+ def self.build_world_from_s(main_source, **options, &blk)
21
+ dependencies = options[:dependencies] ||= {}
22
+ fonts = options[:fonts] ||= {}
23
+
24
+ Dir.mktmpdir do |tmp_dir|
25
+ tmp_main_file = Pathname.new(tmp_dir).join("main.typ")
26
+ File.write(tmp_main_file, main_source)
27
+
28
+ dependencies.each do |dep_name, dep_source|
29
+ tmp_dep_file = Pathname.new(tmp_dir).join(dep_name)
30
+ File.binwrite(tmp_dep_file, dep_source)
31
+ end
32
+
33
+ relative_font_path = Pathname.new(tmp_dir).join("fonts")
34
+ relative_font_path.mkpath
35
+ fonts.each do |font_name, font_bytes|
36
+ tmp_font_file = relative_font_path.join(font_name)
37
+ File.binwrite(tmp_font_file, font_bytes)
38
+ end
39
+
40
+ options[:file] = tmp_main_file
41
+ options[:root] = tmp_dir
42
+ options[:font_paths] = [relative_font_path]
43
+
44
+ blk.call(options)
45
+ end
46
+ end
47
+
48
+ def self.build_world_from_zip(zip_file_path, main_file = "main.typ", **options, &blk)
49
+ options[:dependencies] ||= {}
50
+ options[:fonts] ||= {}
51
+
52
+ Zip::File.open(zip_file_path) do |zipfile|
53
+ file_names = zipfile.dir.glob("*").collect{ |f| f.name }
54
+ case
55
+ when file_names.include?(main_file) then tmp_main_file = main_file
56
+ when file_names.include?("main.typ") then tmp_main_file = "main.typ"
57
+ when file_names.size == 1 then tmp_main_file = file_names.first
58
+ else raise "no main file found"
59
+ end
60
+ main_source = zipfile.file.read(tmp_main_file)
61
+ file_names.delete(tmp_main_file)
62
+ file_names.delete("fonts/")
63
+
64
+ file_names.each do |dep_name|
65
+ options[:dependencies][dep_name] = zipfile.file.read(dep_name)
66
+ end
67
+
68
+ font_file_names = zipfile.dir.glob("fonts/*").collect{ |f| f.name }
69
+ font_file_names.each do |font_name|
70
+ options[:fonts][Pathname.new(font_name).basename.to_s] = zipfile.file.read(font_name)
71
+ end
72
+
73
+ options[:main_file] = tmp_main_file
74
+
75
+ build_world_from_s(main_source, **options, &blk)
76
+ end
77
+ end
78
+ end
79
+
80
+ require "cgi/escape"
81
+ require "pathname"
82
+ require "tmpdir"
83
+ require "zip/filesystem"
84
+ require "json"
85
+ require "yaml"
86
+
87
+ begin
88
+ # native precompiled gems package shared libraries in <gem_dir>/lib/typst/<ruby_version>
89
+ RUBY_VERSION =~ /(\d+\.\d+)/
90
+ require_relative "typst/#{Regexp.last_match(1)}/typst"
91
+ rescue LoadError
92
+ require_relative "typst/typst"
93
+ end
94
+
95
+ require_relative "base"
96
+ require_relative "query"
97
+ require_relative "document"
98
+ require_relative "formats/pdf"
99
+ require_relative "formats/svg"
100
+ require_relative "formats/png"
101
+ require_relative "formats/html_experimental"
metadata ADDED
@@ -0,0 +1,126 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: typst-rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.15.0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Flinn
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rb_sys
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '0.9'
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: 0.9.128
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '0.9'
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: 0.9.128
32
+ - !ruby/object:Gem::Dependency
33
+ name: rubyzip
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - "~>"
37
+ - !ruby/object:Gem::Version
38
+ version: '3.2'
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - "~>"
44
+ - !ruby/object:Gem::Version
45
+ version: '3.2'
46
+ - !ruby/object:Gem::Dependency
47
+ name: hexapdf
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - "~>"
51
+ - !ruby/object:Gem::Version
52
+ version: '1.5'
53
+ type: :development
54
+ prerelease: false
55
+ version_requirements: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '1.5'
60
+ - !ruby/object:Gem::Dependency
61
+ name: test-unit
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '3.6'
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: '3.6'
74
+ email: flinn@actsasflinn.com
75
+ executables: []
76
+ extensions:
77
+ - ext/typst/extconf.rb
78
+ extra_rdoc_files: []
79
+ files:
80
+ - Cargo.lock
81
+ - Cargo.toml
82
+ - LICENSE
83
+ - README.md
84
+ - README.typ
85
+ - Rakefile
86
+ - ext/typst/Cargo.toml
87
+ - ext/typst/extconf.rb
88
+ - ext/typst/src/compiler.rs
89
+ - ext/typst/src/download.rs
90
+ - ext/typst/src/lib.rs
91
+ - ext/typst/src/package.rs
92
+ - ext/typst/src/query.rs
93
+ - ext/typst/src/world.rs
94
+ - lib/base.rb
95
+ - lib/document.rb
96
+ - lib/formats/html_experimental.rb
97
+ - lib/formats/pdf.rb
98
+ - lib/formats/png.rb
99
+ - lib/formats/svg.rb
100
+ - lib/query.rb
101
+ - lib/typst-rb.rb
102
+ - lib/typst.rb
103
+ homepage: https://github.com/am1006/typst-rb
104
+ licenses:
105
+ - Apache-2.0
106
+ metadata:
107
+ source_code_uri: https://github.com/am1006/typst-rb
108
+ rdoc_options: []
109
+ require_paths:
110
+ - lib
111
+ required_ruby_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: 3.0.0
116
+ required_rubygems_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ requirements: []
122
+ rubygems_version: 4.0.16
123
+ specification_version: 4
124
+ summary: Ruby binding to typst, a new markup-based typesetting system that is powerful
125
+ and easy to learn.
126
+ test_files: []