emf2svg 1.3.1-x86_64-linux → 1.4.2-x86_64-linux

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4fec41e166b83d1c318167267305e004e9332ae2980db1157cd50f6332b20181
4
- data.tar.gz: b6356a7204601818fc61d9dda070ba7fc51be62aa81cfe7ab51578922b024dc0
3
+ metadata.gz: d06df14a9888ad91f398333c262bf7ef668ae4c85ae4b4ac062b2bff03e5d0e5
4
+ data.tar.gz: f1b3092c2e46979b6b6bbc2fdba2d290ead8135f2c30c34c8b6a414fdbf76831
5
5
  SHA512:
6
- metadata.gz: a6479346be418675b74367e39af37f1011f2cc046b141736d21c22a765480a3cd5052cb7691e27c1011e8bb7f40adacf39278b1966a86648a2f21cd759e037e4
7
- data.tar.gz: 98af21214c215947586e3cf83b40dbd1f22c8887e075ee241ea2f22e5a4db7585deac94b85f303fba895f75b072305900cbedd5b8ea2fadd67aa5ca33838b4ba
6
+ metadata.gz: e5505d8c536f2db80565491c61144e4745d544ee61c9487d68823c9f04d08520561af6035006cabd692fa9786dba48e70a0f1d51749695027fcfa2a00044b59f
7
+ data.tar.gz: 9133bedd67891324384e866e0fd834b330918720b670801ad1d62a0ad5a9e5c69b7d8b90720e7ae36bb75a530521e8b3b1c8971ce9c5977dca32eed2b6f0163b
@@ -0,0 +1,178 @@
1
+ name: build
2
+
3
+ on:
4
+ push:
5
+ branches: [ main ]
6
+ paths-ignore:
7
+ - '*.adoc'
8
+ pull_request:
9
+ workflow_dispatch:
10
+
11
+ jobs:
12
+ test:
13
+ runs-on: ${{ matrix.os }}
14
+ strategy:
15
+ fail-fast: false
16
+ matrix:
17
+ os: [ ubuntu-18.04, ubuntu-latest, windows-latest, macos-latest ]
18
+ ruby-version: [ '2.7', '3.0', '3.1' ]
19
+
20
+ steps:
21
+ - uses: actions/checkout@v3
22
+
23
+ - uses: ruby/setup-ruby@v1
24
+ with:
25
+ bundler-cache: true
26
+ ruby-version: ${{ matrix.ruby-version }}
27
+
28
+ # https://github.com/microsoft/vcpkg/issues/15931
29
+ # no good solution :(
30
+ - name: Workaround for vcpkg
31
+ if: startsWith(matrix.os, 'ubuntu')
32
+ run: |
33
+ sudo apt-get update
34
+ sudo apt-get install gperf
35
+
36
+ - run: bundle exec rake
37
+
38
+ build:
39
+ name: build ${{ matrix.os }}, ${{ matrix.ruby-version }}, ${{ matrix.platform }}
40
+ runs-on: ${{ matrix.os }}
41
+ strategy:
42
+ fail-fast: false
43
+ matrix:
44
+ include:
45
+ - os: ubuntu-18.04
46
+ platform: any
47
+ ruby-version: '2.7'
48
+ - os: ubuntu-18.04
49
+ platform: x86_64-linux
50
+ ruby-version: '2.7'
51
+ - os: windows-latest
52
+ platform: x64-mingw32
53
+ ruby-version: '2.7'
54
+ - os: windows-latest
55
+ platform: x64-mingw-ucrt
56
+ ruby-version: '3.1'
57
+ - os: macos-latest
58
+ platform: x86_64-darwin
59
+ ruby-version: '2.7'
60
+ steps:
61
+ - uses: actions/checkout@v3
62
+
63
+ - name: Setup Ruby
64
+ uses: ruby/setup-ruby@v1
65
+ with:
66
+ ruby-version: ${{ matrix.ruby-version }}
67
+ bundler-cache: true
68
+
69
+ - name: Workaround for vcpkg
70
+ if: startsWith(matrix.os, 'ubuntu')
71
+ run: |
72
+ sudo apt-get update
73
+ sudo apt-get install gperf
74
+
75
+ - run: bundle exec rake gem:native:${{ matrix.platform }}
76
+
77
+ - uses: actions/upload-artifact@v2
78
+ with:
79
+ name: pkg
80
+ path: pkg/*.gem
81
+
82
+ cross-build:
83
+ name: build ${{ matrix.os }}, ${{ matrix.ruby-version }}, ${{ matrix.platform }}
84
+ runs-on: ${{ matrix.os }}
85
+ strategy:
86
+ fail-fast: false
87
+ matrix:
88
+ include:
89
+ - os: ubuntu-latest
90
+ platform: aarch64-linux
91
+ ruby-version: '2.7'
92
+ - os: macos-latest
93
+ platform: arm64-darwin
94
+ ruby-version: '2.7'
95
+ steps:
96
+ - uses: actions/checkout@v3
97
+
98
+ - name: Install Ubuntu packages
99
+ if: startsWith(matrix.os, 'ubuntu')
100
+ run: |
101
+ sudo apt-get update
102
+ sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu gperf
103
+
104
+ - name: Install Ruby
105
+ uses: ruby/setup-ruby@v1
106
+ with:
107
+ ruby-version: ${{ matrix.ruby-version }}
108
+ bundler-cache: true
109
+
110
+ - name: Build native extension
111
+ run: bundle exec rake gem:native:${{ matrix.platform }}
112
+
113
+ - uses: actions/upload-artifact@v2
114
+ with:
115
+ name: pkg
116
+ path: pkg/*.gem
117
+
118
+ test-build:
119
+ needs: [ build, cross-build ]
120
+ runs-on: ${{ matrix.os }}
121
+ strategy:
122
+ fail-fast: false
123
+ matrix:
124
+ os: [ ubuntu-18.04, ubuntu-latest, windows-latest, macos-latest ]
125
+ ruby-version: [ '2.7', '3.0', '3.1' ]
126
+
127
+ steps:
128
+ - uses: actions/checkout@v2
129
+
130
+ - uses: ruby/setup-ruby@v1
131
+ with:
132
+ ruby-version: ${{ matrix.ruby-version }}
133
+
134
+ - uses: actions/download-artifact@v2
135
+ with:
136
+ name: pkg
137
+ path: pkg
138
+
139
+ - name: Install binary gem
140
+ run: gem install -b pkg/emf2svg-$(ruby -I lib -r emf2svg/version -e "puts Emf2svg::VERSION")-$(ruby -e "puts RUBY_PLATFORM.sub(/darwin\d{2}$/, 'darwin')").gem
141
+ # MacOS with have something like arm64-darwin19, others just aarch64-linux
142
+ - name: Test conversion
143
+ run: |
144
+ ruby -remf2svg -e "puts File.write('output.svg', Emf2svg.from_file('spec/examples/image1.emf'), mode: 'wb')"
145
+
146
+ test-build-any:
147
+ needs: [ build, cross-build ]
148
+ runs-on: ${{ matrix.os }}
149
+ strategy:
150
+ fail-fast: false
151
+ matrix:
152
+ os: [ ubuntu-18.04, ubuntu-latest, windows-latest, macos-latest ]
153
+ ruby-version: [ '2.7', '3.0', '3.1' ]
154
+
155
+ steps:
156
+ - uses: actions/checkout@v2
157
+
158
+ - uses: ruby/setup-ruby@v1
159
+ with:
160
+ ruby-version: ${{ matrix.ruby-version }}
161
+
162
+ - uses: actions/download-artifact@v2
163
+ with:
164
+ name: pkg
165
+ path: pkg
166
+
167
+ - name: Workaround for vcpkg
168
+ if: startsWith(matrix.os, 'ubuntu')
169
+ run: |
170
+ sudo apt-get update
171
+ sudo apt-get install gperf
172
+
173
+ - name: Install native gem
174
+ run: gem install -b pkg/emf2svg-$(ruby -I lib -r emf2svg/version -e "puts Emf2svg::VERSION").gem
175
+
176
+ - name: Test conversion
177
+ run: |
178
+ ruby -remf2svg -e "puts File.write('output.svg', Emf2svg.from_file('spec/examples/image1.emf'), mode: 'wb')"
@@ -9,7 +9,6 @@ jobs:
9
9
  build:
10
10
  runs-on: ${{ matrix.os }}
11
11
  strategy:
12
- max-parallel: 3
13
12
  fail-fast: false
14
13
  matrix:
15
14
  include:
@@ -29,31 +28,38 @@ jobs:
29
28
  platform: x86_64-darwin
30
29
  ruby-version: '2.7'
31
30
  steps:
32
- - uses: actions/checkout@v2
31
+ - uses: actions/checkout@v3
33
32
 
34
- - uses: ruby/setup-ruby@v1
35
- with:
36
- ruby-version: ${{ matrix.ruby-version }}
37
- bundler-cache: true
33
+ - uses: ruby/setup-ruby@v1
34
+ with:
35
+ ruby-version: ${{ matrix.ruby-version }}
36
+ bundler-cache: true
38
37
 
39
- - run: bundle exec rake gem:native:${{ matrix.platform }}
38
+ # https://github.com/microsoft/vcpkg/issues/15931
39
+ # no good solution :(
40
+ - name: Workaround for vcpkg
41
+ if: startsWith(matrix.os, 'ubuntu')
42
+ run: |
43
+ sudo apt-get update
44
+ sudo apt-get install gperf
40
45
 
41
- - uses: actions/upload-artifact@v2
42
- with:
43
- name: pkg
44
- path: pkg/*.gem
46
+ - run: bundle exec rake gem:native:${{ matrix.platform }}
45
47
 
46
- - name: Install gem
47
- run: gem install -b pkg/emf2svg-*.gem
48
+ - uses: actions/upload-artifact@v3
49
+ with:
50
+ name: pkg
51
+ path: pkg/*.gem
48
52
 
49
- - name: Test conversion
50
- run: |
51
- ruby -remf2svg -e "puts File.write('output.svg', Emf2svg.from_file('spec/examples/image1.emf'), mode: 'wb')"
53
+ - name: Install gem
54
+ run: gem install -b pkg/emf2svg-*.gem
55
+
56
+ - name: Test conversion
57
+ run: |
58
+ ruby -remf2svg -e "puts File.write('output.svg', Emf2svg.from_file('spec/examples/image1.emf'), mode: 'wb')"
52
59
 
53
60
  cross:
54
61
  runs-on: ${{ matrix.os }}
55
62
  strategy:
56
- max-parallel: 3
57
63
  fail-fast: false
58
64
  matrix:
59
65
  include:
@@ -64,56 +70,55 @@ jobs:
64
70
  platform: arm64-darwin
65
71
  ruby-version: '2.7'
66
72
  steps:
67
- - uses: actions/checkout@v2
73
+ - uses: actions/checkout@v2
74
+
75
+ - name: Install packages
76
+ if: matrix.os == 'ubuntu-latest'
77
+ run: |
78
+ sudo apt-get update
79
+ sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu gperf
68
80
 
69
- - name: Install packages
70
- if: matrix.os == 'ubuntu-latest'
71
- run: |
72
- sudo apt-get update
73
- sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu gperf
74
-
75
- - uses: ruby/setup-ruby@v1
76
- with:
77
- ruby-version: ${{ matrix.ruby-version }}
78
- bundler-cache: true
81
+ - uses: ruby/setup-ruby@v1
82
+ with:
83
+ ruby-version: ${{ matrix.ruby-version }}
84
+ bundler-cache: true
79
85
 
80
- - run: bundle exec rake gem:native:${{ matrix.platform }}
86
+ - run: bundle exec rake gem:native:${{ matrix.platform }}
81
87
 
82
- - uses: actions/upload-artifact@v2
83
- with:
84
- name: pkg
85
- path: pkg/*.gem
88
+ - uses: actions/upload-artifact@v2
89
+ with:
90
+ name: pkg
91
+ path: pkg/*.gem
86
92
 
87
- - name: Install gem
88
- run: gem install -b pkg/emf2svg-*.gem
93
+ - name: Install gem
94
+ run: gem install -b pkg/emf2svg-*.gem
89
95
 
90
96
  publish:
91
97
  needs: [ build, cross ]
92
98
  runs-on: ubuntu-latest
93
99
  steps:
94
- - uses: actions/checkout@v2
95
-
96
- - uses: ruby/setup-ruby@v1
97
- with:
98
- ruby-version: '2.7'
99
- bundler-cache: true
100
-
101
- - uses: actions/download-artifact@v2
102
- with:
103
- name: pkg
104
- path: pkg
105
-
106
- - name: Publish to rubygems.org
107
- env:
108
- RUBYGEMS_API_KEY: ${{secrets.METANORMA_CI_RUBYGEMS_API_KEY}}
109
- run: |
110
- mkdir -p ~/.gem
111
- touch ~/.gem/credentials
112
- cat > ~/.gem/credentials << EOF
113
- ---
114
- :rubygems_api_key: ${RUBYGEMS_API_KEY}
115
- EOF
116
- chmod 0600 ~/.gem/credentials
117
- gem signin
118
- ls -l pkg/
119
- for gem in pkg/*.gem; do gem push -V $gem; done
100
+ - uses: actions/checkout@v2
101
+
102
+ - uses: ruby/setup-ruby@v1
103
+ with:
104
+ ruby-version: '2.7'
105
+ bundler-cache: true
106
+
107
+ - uses: actions/download-artifact@v2
108
+ with:
109
+ name: pkg
110
+ path: pkg
111
+
112
+ - name: Publish to rubygems.org
113
+ env:
114
+ RUBYGEMS_API_KEY: ${{secrets.METANORMA_CI_RUBYGEMS_API_KEY}}
115
+ run: |
116
+ mkdir -p ~/.gem
117
+ touch ~/.gem/credentials
118
+ cat > ~/.gem/credentials << EOF
119
+ ---
120
+ :rubygems_api_key: ${RUBYGEMS_API_KEY}
121
+ EOF
122
+ chmod 0600 ~/.gem/credentials
123
+ gem signin
124
+ for gem in pkg/*.gem; do gem push -V $gem; done
data/.rubocop.yml CHANGED
@@ -2,7 +2,7 @@ inherit_from:
2
2
  - 'https://raw.githubusercontent.com/riboseinc/oss-guides/master/ci/rubocop.yml'
3
3
 
4
4
  AllCops:
5
- TargetRubyVersion: 2.5
5
+ TargetRubyVersion: 2.6
6
6
  SuggestExtensions: false
7
7
 
8
8
  Gemspec/RequireMFA:
data/README.adoc CHANGED
@@ -1,12 +1,22 @@
1
- = emf2svg
1
+ = emf2svg Ruby gem for EMF to SVG conversion
2
+
3
+ image:https://github.com/metanorma/emf2svg-ruby/actions/workflows/build.yml/badge.svg["Build", link="https://github.com/metanorma/emf2svg-ruby/actions/workflows/build.yml"]
4
+ image:https://badge.fury.io/rb/emf2svg.svg["Gem Version", link="https://badge.fury.io/rb/emf2svg"]
2
5
 
3
6
  == Purpose
4
7
 
5
- Provides Ruby access to https://github.com/kakwa/libemf2svg (temporarily using
6
- the https://github.com/metanorma/libemf2svg[Metanorma fork] until upstreaming
7
- is complete).
8
+ The `emf2svg` Ruby gem provides a Ruby interface to the
9
+ https://github.com/kakwa/libemf2svg[libemf2svg] EMF-to-SVG conversion library.
10
+
11
+ NOTE: This gem currently uses the
12
+ https://github.com/metanorma/libemf2svg[Metanorma fork of libemf2svg]
13
+ until feature up-streaming is complete.
14
+
15
+ == Prerequisites
8
16
 
9
- == Installation
17
+ * Ruby version >= 2.6
18
+
19
+ == Install
10
20
 
11
21
  Install the gem directly:
12
22
 
@@ -22,17 +32,106 @@ Or add it to your `Gemfile`:
22
32
  gem 'emf2svg'
23
33
  ----
24
34
 
25
- === Dependencies
35
+ NOTE: For more information on how to install by compiling from source, see
36
+ <<install-from-source>>.
37
+
38
+
39
+ == Usage
40
+
41
+ This gem provides an interface to `libemf2svg`, allowing your Ruby code to
42
+ directly utilize EMF to SVG conversion facilities.
43
+
44
+ There are two ways to provide EMF data to `emf2svg`.
45
+
46
+ === Loading from file
47
+
48
+ `Emf2svg.from_file`:: Loads an EMF file directly from the filesystem.
49
+
50
+ [example]
51
+ .Example of using `Emf2svg.from_file` and exporting an SVG file
52
+ ====
53
+ [source,ruby]
54
+ ----
55
+ require "emf2svg"
56
+
57
+ data = Emf2svg.from_file("example.emf", 800, 600)
58
+ File.write("output.svg", data, mode: "wb")
59
+ ----
60
+ 800, 600 - optional width and height of the bounding rectangle for svg file
61
+ The image will be scaled to fit into this rectangle
62
+ These parameters are optional. If skipped or set to 0 SVG image will have the
63
+ same size as EMF (in pixels)
64
+ ====
65
+
66
+ === Loading binary data
67
+
68
+ `Emf2svg.from_binary_string`:: Loads EMF content from binary form.
69
+
70
+ [example]
71
+ .Example of using `Emf2svg.from_binary_string` and exporting an SVG file
72
+ ====
73
+ [source,ruby]
74
+ ----
75
+ require "emf2svg"
76
+
77
+ emf_content = File.read("example.emf", mode: "rb")
78
+ svg_data = Emf2svg.from_binary_string(emf_content, 800, 600)
79
+ File.write("output.svg", svg_data, mode: "wb")
80
+ ----
81
+ 800, 600 - optional width and height of the bounding rectangle for svg file
82
+ The image will be scaled to fit into this rectangle
83
+ These parameters are optional. If skipped or set to 0 SVG image will have the
84
+ same size as EMF (in pixels)
85
+ ====
86
+
87
+
88
+ [[packaging]]
89
+ == Packaging
90
+
91
+ === Pre-compiled extensions or building from source
92
+
93
+ This gem is distributed with pre-compiled native extensions for a set of
94
+ supported machine architectures.
95
+
96
+ On supported platforms, this removes the need for compiling the C extension and
97
+ the installation of system dependencies. This results in much faster and a more
98
+ reliable installation step.
99
+
100
+ The pre-compiled platforms are:
26
101
 
27
- * libiconv
28
- * libpng
29
- * libfontconfig
30
- * libfreetype
102
+ * `x86_64-linux` (GNU and `musl` flavors)
103
+ * `aarch64-linux` (GNU and `musl` flavors)
104
+ * `x86_64-darwin`
105
+ * `arm64-darwin`
106
+ * `x64-mingw32`
107
+ * `x64-mingw-ucrt`
108
+
109
+ When installing the gem, Ruby will automatically select a pre-compiled version
110
+ suitable for your platform, or opt to install from source if the platform
111
+ is not supported.
112
+
113
+ [[install-from-source]]
114
+ === Installing from source
115
+
116
+ ==== General
117
+
118
+ For platforms that require compilation, the `emf2svg` build script will
119
+ automatically compile the native extension locally.
120
+
121
+ The `emf2svg` build script maintains and installs all required libraries and
122
+ other dependencies using the `vcpkg` package manager.
123
+
124
+ Prior to installation, the system must already have install the appropriate
125
+ build system (such as `gcc`, `clang` or Visual Studio), and CMake.
126
+
127
+ ==== Build prerequisites by platform
31
128
 
32
129
  ==== Windows
33
130
 
34
- On Windows all necessary libraries are precompiled but you'll need Visual
35
- Studio 2019 with C++ Build Tools, which can be downloaded
131
+ On Windows, while all necessary libraries are already pre-compiled, Visual
132
+ Studio 2019 with C++ Build Tools still need to be installed.
133
+
134
+ They can be downloaded
36
135
  https://visualstudio.microsoft.com/downloads/[here], or installed with
37
136
  Chocolatey:
38
137
 
@@ -43,62 +142,45 @@ choco install visualstudio2019buildtools -y --no-progress --package-parameters "
43
142
 
44
143
  ==== macOS
45
144
 
145
+ On macOS, CMake needs to be installed.
146
+
46
147
  [source,sh]
47
148
  ----
48
149
  brew install cmake
49
150
  ----
50
151
 
51
- ==== Linux
152
+ ==== Linux: Debian
52
153
 
53
- ===== Debian
154
+ On Debian, the following build tools need to be installed.
54
155
 
55
156
  [source,sh]
56
157
  ----
57
- # compiler
58
- apt-get install gcc g++
158
+ # Choose your preferred compiler
159
+ # GCC
160
+ apt-get install gcc g++ gperf cmake pkg-config
59
161
  # or
60
- apt-get install clang
61
-
62
- # build deps
63
- apt-get install cmake pkg-config
64
-
65
- # library deps with their headers
66
- apt-get install libpng-dev libc6-dev libfontconfig1-dev libfreetype6-dev zlib1g-dev
162
+ # clang
163
+ apt-get install clang gperf cmake pkg-config
67
164
  ----
68
165
 
69
- ===== Fedora
70
-
71
- [source,sh]
72
- ----
73
- yum install cmake libpng-devel freetype-devel fontconfig-devel gcc-c++ gcc
74
- ----
166
+ NOTE: On Debian systems, there exists a
167
+ https://github.com/microsoft/vcpkg/issues/15931[vcpkg bug] that needs to be
168
+ addressed by installing the `gperf` package in addition to other build tools.
75
169
 
76
- == Usage
170
+ ==== Linux: Fedora
77
171
 
78
- This gem embeds libemf2svg, allowing your Ruby code to utilize EMF to SVG
79
- conversion facilities.
172
+ On Fedora, the following build tools need to be installed.
80
173
 
81
- [source,ruby]
82
- ----
83
- require "emf2svg"
84
-
85
- data = Emf2svg.from_file("example.emf")
86
- File.write("output.svg", data, mode: "wb")
174
+ [source,sh]
87
175
  ----
88
-
89
- It also can use content of emf as an input:
90
-
91
- [source,ruby]
176
+ yum install cmake gcc-c++ gcc
92
177
  ----
93
- require "emf2svg"
94
178
 
95
- emf_content = File.read("example.emf", mode: "rb")
96
- svg_data = Emf2svg.from_binary_string(emf_content)
97
- File.write("output.svg", svg_data, mode: "wb")
98
- ----
99
179
 
100
180
  == Development
101
181
 
182
+ === Basic steps
183
+
102
184
  After checking out the repo, run `bin/setup` to install dependencies. Then, run
103
185
  `rake spec` to run the tests. You can also run `bin/console` for an interactive
104
186
  prompt that will allow you to experiment.
@@ -109,6 +191,7 @@ release a new version, update the version number in `version.rb`, and then run
109
191
  git commits and the created tag, and push the `.gem` file to
110
192
  https://rubygems.org[rubygems.org].
111
193
 
194
+
112
195
  === Releasing
113
196
 
114
197
  Releasing is done automatically with GitHub Actions. Just bump and tag with
@@ -128,6 +211,7 @@ For a minor release (0.x.0) use:
128
211
  gem bump --version minor --tag --push
129
212
  ----
130
213
 
214
+
131
215
  == Contributing
132
216
 
133
217
  Bug reports and pull requests are welcome on GitHub at
@@ -136,6 +220,7 @@ safe, welcoming space for collaboration, and contributors are expected to adhere
136
220
  to the
137
221
  https://github.com/metanorma/emf2svg-ruby/blob/master/CODE_OF_CONDUCT.md[code of conduct].
138
222
 
223
+
139
224
  == Code of Conduct
140
225
 
141
226
  Everyone interacting in the emf2svg project's codebases, issue trackers, chat
data/Rakefile CHANGED
@@ -14,6 +14,7 @@ task default: %i[spec rubocop]
14
14
  task :compile do
15
15
  require_relative "ext/extconf"
16
16
  end
17
+
17
18
  task spec: :compile
18
19
 
19
20
  desc "Build install-compilation gem"
data/bin/emf2svg CHANGED
@@ -1,8 +1,38 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- require "bundler/setup"
5
4
  require "emf2svg"
6
5
 
7
- svg = Emf2svg.from_file(ARGV[0])
8
- File.write(ARGV[1], svg, mode: "wb")
6
+ def print_usage
7
+ usage = %{Usage: emf2svg <input> <output> [<width>] [<height>]
8
+ <input> -- emf file to convert
9
+ <output> -- svg file to save
10
+ <width> -- svg image width, defaults to source width in px if not set or 0
11
+ <height> -- svg image height, defaults to source height in px if not set or 0
12
+ Note: width and height specify bounding rectangle, the image will be scaled
13
+ propotionally to fit into it.
14
+ }
15
+ puts usage
16
+ end
17
+
18
+ def tint(pos)
19
+ ARGV.size > pos ? Integer(ARGV[pos]) : 0
20
+ rescue ArgumentError, TypeError => e
21
+ puts "ERROR: Failed to convert #{ARGV[pos]} to integer: #{e.message}"
22
+ print_usage
23
+ exit 1
24
+ end
25
+
26
+ if ARGV.size < 2 || ARGV.size > 4 || ARGV[0].casecmp("help").zero?
27
+ print_usage
28
+ exit 0
29
+ end
30
+
31
+ begin
32
+ svg = Emf2svg.from_file(ARGV[0], tint(2), tint(3))
33
+ File.write(ARGV[1], svg, mode: "wb")
34
+ rescue StandardError => e
35
+ puts "ERROR: Failed to process #{ARGV[0]}: #{e.message}"
36
+ print_usage
37
+ exit 1
38
+ end
data/emf2svg.gemspec CHANGED
@@ -8,10 +8,10 @@ Gem::Specification.new do |spec|
8
8
  spec.authors = ["Ribose"]
9
9
  spec.email = ["open.source@ribose.com"]
10
10
 
11
- spec.summary = "Ruby interface to libemf2svg."
11
+ spec.summary = "EMF to SVG conversion in Ruby."
12
12
  spec.homepage = "https://github.com/metanorma/emf2svg-ruby"
13
13
  spec.license = "BSD-2-Clause"
14
- spec.required_ruby_version = ">= 2.5.0"
14
+ spec.required_ruby_version = ">= 2.6.0"
15
15
 
16
16
  spec.metadata["homepage_uri"] = spec.homepage
17
17
  spec.metadata["source_code_uri"] = "https://github.com/metanorma/emf2svg-ruby"
data/exe/emf2svg CHANGED
@@ -3,5 +3,36 @@
3
3
 
4
4
  require "emf2svg"
5
5
 
6
- svg = Emf2svg.from_file(ARGV[0])
7
- File.write(ARGV[1], svg, mode: "wb")
6
+ def print_usage
7
+ usage = %{Usage: emf2svg <input> <output> [<width>] [<height>]
8
+ <input> -- emf file to convert
9
+ <output> -- svg file to save
10
+ <width> -- svg image width, defaults to source width in px if not set or 0
11
+ <height> -- svg image height, defaults to source height in px if not set or 0
12
+ Note: width and height specify bounding rectangle, the image will be scaled
13
+ propotionally to fit into it.
14
+ }
15
+ puts usage
16
+ end
17
+
18
+ def tint(pos)
19
+ ARGV.size > pos ? Integer(ARGV[pos]) : 0
20
+ rescue ArgumentError, TypeError => e
21
+ puts "ERROR: Failed to convert #{ARGV[pos]} to integer: #{e.message}"
22
+ print_usage
23
+ exit 1
24
+ end
25
+
26
+ if ARGV.size < 2 || ARGV.size > 4 || ARGV[0].casecmp("help").zero?
27
+ print_usage
28
+ exit 0
29
+ end
30
+
31
+ begin
32
+ svg = Emf2svg.from_file(ARGV[0], tint(2), tint(3))
33
+ File.write(ARGV[1], svg, mode: "wb")
34
+ rescue StandardError => e
35
+ puts "ERROR: Failed to process #{ARGV[0]}: #{e.message}"
36
+ print_usage
37
+ exit 1
38
+ end
Binary file
@@ -2,17 +2,19 @@ require "rbconfig"
2
2
  require "mini_portile2"
3
3
  require "pathname"
4
4
  require "tmpdir"
5
+ require "open3"
6
+ require_relative "version"
5
7
 
6
8
  module Emf2svg
7
9
  class Recipe < MiniPortileCMake
8
10
  ROOT = Pathname.new(File.expand_path("../..", __dir__))
9
11
 
10
12
  def initialize
11
- super("libemf2svg", "1.6.0")
13
+ super("libemf2svg", LIBEMF2SVG_VERSION)
12
14
 
13
15
  @files << {
14
- url: "https://github.com/metanorma/libemf2svg/releases/download/v1.6.0/libemf2svg.tar.gz",
15
- sha256: "0f186f40b98c06acdec1278a314cEc1f093e7504d34f7a15b697ebfe6c4d3097", # rubocop:disable Layout/LineLength
16
+ url: "https://github.com/metanorma/libemf2svg/releases/download/v#{LIBEMF2SVG_VERSION}/libemf2svg.tar.gz",
17
+ sha256: "c65f25040a351d18beb5172609a55d034245f85a1152d7f294780c6cc155d876", # rubocop:disable Layout/LineLength
16
18
  }
17
19
 
18
20
  @target = ROOT.join(@target).to_s
@@ -25,65 +27,15 @@ module Emf2svg
25
27
 
26
28
  def cook
27
29
  super
28
-
29
30
  FileUtils.touch(checkpoint)
30
31
  end
31
32
 
32
- # rubocop:disable Metrics/MethodLength
33
- # rubocop:disable Metrics/CyclomaticComplexity
34
- def host_platform
35
- @host_platform ||=
36
- case @host
37
- when /\Ax86_64.*mingw32/
38
- "x64-mingw32"
39
- when /\Ai[3-6]86.*mingw32/
40
- "x86-mingw32"
41
- when /\Ax86_64.*linux/
42
- "x86_64-linux"
43
- when /\A(arm64|aarch64).*linux/
44
- "arm64-linux"
45
- when /\Ai[3-6]86.*linux/
46
- "x86-linux"
47
- when /\Ax86_64.*(darwin|macos|osx)/
48
- "x86_64-darwin"
49
- when /\A(arm64|aarch64).*(darwin|macos|osx)/
50
- "arm64-darwin"
51
- else
52
- @host
53
- end
33
+ def windows_native?
34
+ MiniPortile.windows? && target_triplet.eql?("x64-mingw-static")
54
35
  end
55
36
 
56
- def target_platform
57
- @target_platform ||=
58
- case ENV["target_platform"]
59
- when /\A(arm64|aarch64).*(darwin|macos|osx)/
60
- "arm64-darwin"
61
- when /\Ac86_64.*(darwin|macos|osx)/
62
- "x86_64-darwin"
63
- when /\A(arm64|aarch64).*linux/
64
- "arm64-linux"
65
- else
66
- ENV["target_platform"] || host_platform
67
- end
68
- end
69
-
70
- def target_triplet
71
- @target_triplet ||=
72
- case target_platform
73
- when "arm64-darwin"
74
- "arm64-osx"
75
- when "x86_64-darwin"
76
- "x86_64-osx"
77
- else
78
- target_platform
79
- end
80
- end
81
-
82
- # rubocop:enable Metrics/CyclomaticComplexity
83
- # rubocop:enable Metrics/MethodLength
84
-
85
- def cross_compiling?
86
- not host_platform.eql? target_platform
37
+ def drop_target_triplet?
38
+ windows_native? || host_platform.eql?(target_platform)
87
39
  end
88
40
 
89
41
  def checkpoint
@@ -94,16 +46,14 @@ module Emf2svg
94
46
  opts = []
95
47
 
96
48
  opts << "-DCMAKE_BUILD_TYPE=Release"
49
+ opts << "-DLONLY=ON"
97
50
 
98
- if MiniPortile.windows? || cross_compiling?
99
- opts << "-DCMAKE_TOOLCHAIN_FILE=vcpkg/scripts/buildsystems/vcpkg.cmake"
100
- end
101
-
102
- if cross_compiling? && (not MiniPortile.windows?)
103
- message("Cross-compiling on #{host_platform} for #{target_platform}\n")
51
+ unless target_triplet.nil? || drop_target_triplet?
104
52
  opts << "-DVCPKG_TARGET_TRIPLET=#{target_triplet}"
105
53
  end
106
54
 
55
+ opts << "-DCMAKE_TOOLCHAIN_FILE=vcpkg/scripts/buildsystems/vcpkg.cmake"
56
+
107
57
  opts
108
58
  end
109
59
 
@@ -115,6 +65,28 @@ module Emf2svg
115
65
  "cmake --build #{File.expand_path(work_path)} --config Release"
116
66
  end
117
67
 
68
+ def lb_to_verify
69
+ pt = if MiniPortile.windows?
70
+ "emf2svg.dll"
71
+ else
72
+ "libemf2svg.{so,dylib}"
73
+ end
74
+ @lb_to_verify ||= Dir.glob(ROOT.join("lib", "emf2svg", pt))
75
+ end
76
+
77
+ def verify_libs
78
+ lb_to_verify.each do |l|
79
+ out, st = Open3.capture2("file #{l}")
80
+ raise "Failed to query file #{l}: #{out}" unless st.exitstatus.zero?
81
+
82
+ if out.include?(target_format)
83
+ message("Verifying #{l} ... OK\n")
84
+ else
85
+ raise "Invalid file format '#{out}', '#{@target_format}' expected"
86
+ end
87
+ end
88
+ end
89
+
118
90
  def install
119
91
  libs = if MiniPortile.windows?
120
92
  Dir.glob(File.join(work_path, "Release", "*.dll"))
@@ -122,12 +94,13 @@ module Emf2svg
122
94
  Dir.glob(File.join(work_path, "libemf2svg.{so,dylib}"))
123
95
  .grep(/\/(?:lib)?[a-zA-Z0-9\-]+\.(?:so|dylib)$/)
124
96
  end
125
-
126
97
  FileUtils.cp_r(libs, ROOT.join("lib", "emf2svg"), verbose: true)
98
+
99
+ verify_libs unless target_format.eql?("skip")
127
100
  end
128
101
 
129
102
  def execute(action, command, command_opts = {})
130
- super(action, command, command_opts.merge(debug: true))
103
+ super(action, command, command_opts.merge(debug: false))
131
104
  end
132
105
 
133
106
  def message(text)
@@ -150,5 +123,75 @@ module Emf2svg
150
123
  def port_path
151
124
  "port"
152
125
  end
126
+
127
+ # rubocop:disable Metrics/MethodLength
128
+ # rubocop:disable Metrics/CyclomaticComplexity
129
+ def host_platform
130
+ @host_platform ||=
131
+ case @host
132
+ when /\Ax86_64.*mingw32/
133
+ "x64-mingw32"
134
+ when /\Ax86_64.*linux/
135
+ "x86_64-linux"
136
+ when /\A(arm64|aarch64).*linux/
137
+ "arm64-linux"
138
+ when /\Ax86_64.*(darwin|macos|osx)/
139
+ "x86_64-darwin"
140
+ when /\A(arm64|aarch64).*(darwin|macos|osx)/
141
+ "arm64-darwin"
142
+ else
143
+ @host
144
+ end
145
+ end
146
+
147
+ def target_platform
148
+ @target_platform ||=
149
+ case ENV.fetch("target_platform", nil)
150
+ when /\A(arm64|aarch64).*(darwin|macos|osx)/
151
+ "arm64-darwin"
152
+ when /\Ax86_64.*(darwin|macos|osx)/
153
+ "x86_64-darwin"
154
+ when /\A(arm64|aarch64).*linux/
155
+ "aarch64-linux"
156
+ else
157
+ ENV.fetch("target_platform", host_platform)
158
+ end
159
+ end
160
+
161
+ def target_triplet
162
+ @target_triplet ||=
163
+ case target_platform
164
+ when "arm64-darwin"
165
+ "arm64-osx"
166
+ when "x86_64-darwin"
167
+ "x64-osx"
168
+ when "aarch64-linux"
169
+ "arm64-linux"
170
+ when "x86_64-linux"
171
+ "x64-linux"
172
+ when /\Ax64-mingw(32|-ucrt)/
173
+ "x64-mingw-static"
174
+ end
175
+ end
176
+
177
+ def target_format
178
+ @target_format ||=
179
+ case target_platform
180
+ when "arm64-darwin"
181
+ "Mach-O 64-bit dynamically linked shared library arm64"
182
+ when "x86_64-darwin"
183
+ "Mach-O 64-bit dynamically linked shared library x86_64"
184
+ when "aarch64-linux"
185
+ "ELF 64-bit LSB shared object, ARM aarch64"
186
+ when "x86_64-linux"
187
+ "ELF 64-bit LSB shared object, x86-64"
188
+ when /\Ax64-mingw(32|-ucrt)/
189
+ "PE32+ executable (DLL) (console) x86-64, for MS Windows"
190
+ else
191
+ "skip"
192
+ end
193
+ end
194
+ # rubocop:enable Metrics/CyclomaticComplexity
195
+ # rubocop:enable Metrics/MethodLength
153
196
  end
154
197
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Emf2svg
4
- VERSION = "1.3.1"
4
+ VERSION = "1.4.2"
5
+ LIBEMF2SVG_VERSION = "1.7.1"
5
6
  end
data/lib/emf2svg.rb CHANGED
@@ -39,17 +39,18 @@ module Emf2svg
39
39
  :int
40
40
 
41
41
  class << self
42
- def from_file(path)
42
+ def from_file(path, width = 0, height = 0)
43
43
  content = File.read(path, mode: "rb")
44
- from_binary_string(content)
44
+ from_binary_string(content, width, height)
45
45
  end
46
46
 
47
- def from_binary_string(content)
47
+ def from_binary_string(content, width = 0, height = 0)
48
48
  svg_out = FFI::MemoryPointer.new(:pointer)
49
49
  svg_out_len = FFI::MemoryPointer.new(:pointer)
50
50
  content_ptr = FFI::MemoryPointer.from_string(content)
51
51
 
52
- ret = emf2svg(content_ptr, content.size, svg_out, svg_out_len, options)
52
+ opt = options(width, height)
53
+ ret = emf2svg(content_ptr, content.size, svg_out, svg_out_len, opt)
53
54
  raise Error, "emf2svg failed with error code: #{ret}" unless ret == 1
54
55
 
55
56
  svg_out.read_pointer.read_bytes(svg_out_len.read_int)
@@ -57,13 +58,13 @@ module Emf2svg
57
58
 
58
59
  private
59
60
 
60
- def options
61
+ def options(width, height)
61
62
  GeneratorOptions.new.tap do |opts|
62
63
  opts[:verbose] = false
63
64
  opts[:emfplus] = true
64
65
  opts[:svgDelimiter] = true
65
- opts[:imgHeight] = 0
66
- opts[:imgWidth] = 0
66
+ opts[:imgHeight] = height
67
+ opts[:imgWidth] = width
67
68
  end
68
69
  end
69
70
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: emf2svg
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.4.2
5
5
  platform: x86_64-linux
6
6
  authors:
7
7
  - Ribose
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-04-03 00:00:00.000000000 Z
11
+ date: 2022-04-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -74,7 +74,7 @@ executables:
74
74
  extensions: []
75
75
  extra_rdoc_files: []
76
76
  files:
77
- - ".github/workflows/main.yml"
77
+ - ".github/workflows/build.yml"
78
78
  - ".github/workflows/release.yml"
79
79
  - ".gitignore"
80
80
  - ".rspec"
@@ -109,7 +109,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
109
109
  requirements:
110
110
  - - ">="
111
111
  - !ruby/object:Gem::Version
112
- version: 2.5.0
112
+ version: 2.6.0
113
113
  required_rubygems_version: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
@@ -119,5 +119,5 @@ requirements: []
119
119
  rubygems_version: 3.1.6
120
120
  signing_key:
121
121
  specification_version: 4
122
- summary: Ruby interface to libemf2svg.
122
+ summary: EMF to SVG conversion in Ruby.
123
123
  test_files: []
@@ -1,167 +0,0 @@
1
- name: main
2
-
3
- on:
4
- push:
5
- branches: [ main ]
6
- pull_request:
7
- workflow_dispatch:
8
-
9
- jobs:
10
- test:
11
- runs-on: ${{ matrix.os }}
12
- strategy:
13
- max-parallel: 4
14
- fail-fast: false
15
- matrix:
16
- os: [ ubuntu-18.04, ubuntu-latest, windows-latest, macos-latest ]
17
- ruby-version: [ '2.7' ]
18
- include:
19
- - os: windows-latest
20
- ruby-version: '3.1'
21
- steps:
22
- - uses: actions/checkout@v2
23
-
24
- - uses: ruby/setup-ruby@v1
25
- with:
26
- bundler-cache: true
27
- ruby-version: ${{ matrix.ruby-version }}
28
-
29
- - run: bundle exec rake
30
-
31
- build:
32
- runs-on: ${{ matrix.os }}
33
- strategy:
34
- max-parallel: 4
35
- fail-fast: false
36
- matrix:
37
- include:
38
- - os: ubuntu-18.04
39
- platform: any
40
- ruby-version: '2.7'
41
- - os: ubuntu-18.04
42
- platform: x86_64-linux
43
- ruby-version: '2.7'
44
- - os: windows-latest
45
- platform: x64-mingw32
46
- ruby-version: '2.7'
47
- - os: windows-latest
48
- platform: x64-mingw-ucrt
49
- ruby-version: '3.1'
50
- - os: macos-latest
51
- platform: x86_64-darwin
52
- ruby-version: '2.7'
53
- steps:
54
- - uses: actions/checkout@v2
55
-
56
- - uses: ruby/setup-ruby@v1
57
- with:
58
- ruby-version: ${{ matrix.ruby-version }}
59
- bundler-cache: true
60
-
61
- - run: bundle exec rake gem:native:${{ matrix.platform }}
62
-
63
- - uses: actions/upload-artifact@v2
64
- with:
65
- name: pkg
66
- path: pkg/*.gem
67
-
68
- - name: Install gem
69
- run: gem install -b pkg/emf2svg-*.gem
70
-
71
- - name: Test conversion
72
- run: |
73
- ruby -remf2svg -e "puts File.write('output.svg', Emf2svg.from_file('spec/examples/image1.emf'), mode: 'wb')"
74
-
75
- test-build:
76
- needs: build
77
- runs-on: ${{ matrix.os }}
78
- strategy:
79
- max-parallel: 4
80
- fail-fast: false
81
- matrix:
82
- include:
83
- - os: ubuntu-latest
84
- platform: any
85
- ruby-version: '2.7'
86
- - os: windows-latest
87
- platform: any
88
- ruby-version: '2.7'
89
- - os: macos-latest
90
- platform: any
91
- ruby-version: '2.7'
92
- - os: ubuntu-18.04
93
- platform: x86_64-linux
94
- ruby-version: '2.7'
95
- - os: ubuntu-latest
96
- platform: x86_64-linux
97
- ruby-version: '2.7'
98
- - os: windows-latest
99
- platform: x64-mingw32
100
- ruby-version: '2.7'
101
- - os: windows-latest
102
- platform: x64-mingw-ucrt
103
- ruby-version: '3.1'
104
- - os: macos-latest
105
- platform: x86_64-darwin
106
- ruby-version: '2.7'
107
-
108
- steps:
109
- - uses: actions/checkout@v2
110
-
111
- - uses: ruby/setup-ruby@v1
112
- with:
113
- ruby-version: ${{ matrix.ruby-version }}
114
-
115
- - uses: actions/download-artifact@v2
116
- with:
117
- name: pkg
118
- path: pkg
119
-
120
- - name: Install native gem
121
- if: matrix.platform == 'any'
122
- run: gem install -b pkg/emf2svg-$(ruby -I lib -r emf2svg/version -e "puts Emf2svg::VERSION").gem
123
-
124
- - name: Install binary gem
125
- if: matrix.platform != 'any'
126
- run: gem install -b pkg/emf2svg-*-${{ matrix.platform }}.gem
127
-
128
- - name: Test conversion
129
- run: |
130
- ruby -remf2svg -e "puts File.write('output.svg', Emf2svg.from_file('spec/examples/image1.emf'), mode: 'wb')"
131
-
132
- cross:
133
- runs-on: ${{ matrix.os }}
134
- strategy:
135
- max-parallel: 4
136
- fail-fast: false
137
- matrix:
138
- include:
139
- - os: ubuntu-latest
140
- platform: aarch64-linux
141
- ruby-version: '2.7'
142
- - os: macos-latest
143
- platform: arm64-darwin
144
- ruby-version: '2.7'
145
- steps:
146
- - uses: actions/checkout@v2
147
-
148
- - name: Install packages
149
- if: matrix.os == 'ubuntu-latest'
150
- run: |
151
- sudo apt-get update
152
- sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu gperf
153
-
154
- - uses: ruby/setup-ruby@v1
155
- with:
156
- ruby-version: ${{ matrix.ruby-version }}
157
- bundler-cache: true
158
-
159
- - run: bundle exec rake gem:native:${{ matrix.platform }}
160
-
161
- - uses: actions/upload-artifact@v2
162
- with:
163
- name: pkg
164
- path: pkg/*.gem
165
-
166
- - name: Install gem
167
- run: gem install -b pkg/emf2svg-*.gem