pandoc_rb 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c27ff79488f9163a4b41df80ae1d95e84f89e824
4
+ data.tar.gz: 0513060bf403e6030a1b0a4404a87a60260aa04d
5
+ SHA512:
6
+ metadata.gz: 53e519be108994e836a6607d628c21e710df3d5b1cf05de9946073bf358e7c5d85f16dc8e2359b5e8b8e552ee28103320faa664a650c9b78dd603a3630a3e018
7
+ data.tar.gz: c18837eeb3c34ef302ab17cdc5dd2ca8678679cafc26b5f8ecd538515f043a9e2696354ca00e29900a65b77e1bb91052c1953e7149002ed9661f5d426a73851a
@@ -0,0 +1,45 @@
1
+ *.aux
2
+ *.chi
3
+ *.chs.h
4
+ *.dyn_hi
5
+ *.dyn_o
6
+ *.eventlog
7
+ *.gem
8
+ *.hi
9
+ *.hp
10
+ *.log
11
+ *.o
12
+ *.out
13
+ *.prof
14
+ *.rbc
15
+ *.so
16
+ *.swp
17
+ .HTF/
18
+ .cabal-sandbox/
19
+ .hpc
20
+ .hsenv
21
+ .rvmrc
22
+ .stack-work/
23
+ /.bundle/
24
+ /.config
25
+ /.yardoc/
26
+ /InstalledFiles
27
+ /_yardoc/
28
+ /coverage/
29
+ /doc/
30
+ /ext/pandoc_rb/Makefile
31
+ /lib/Text_Pandoc_C.so
32
+ /lib/bundler/man/
33
+ /pkg/
34
+ /rdoc/
35
+ /spec/examples.txt
36
+ /spec/reports/
37
+ /test/tmp/
38
+ /test/version_tmp/
39
+ /tmp/
40
+ /vendor/bundle
41
+ cabal-dev
42
+ cabal.project.local
43
+ cabal.sandbox.config
44
+ dist
45
+ dist-*
@@ -0,0 +1 @@
1
+ pandoc_rb
@@ -0,0 +1 @@
1
+ ruby-2.3.1
@@ -0,0 +1,24 @@
1
+ language: ruby
2
+ cache: bundler
3
+ cache:
4
+ directories:
5
+ - $HOME/.ghc
6
+ - $HOME/.cabal
7
+ - $HOME/.stack
8
+ sudo: required
9
+ rvm:
10
+ - 2.3.1
11
+
12
+ before_install:
13
+ - sudo apt-get -qq update
14
+ - sudo apt-get install -y libgmp-dev
15
+ - sudo apt-get install -y build-essential
16
+ - mkdir -p ~/.local/bin
17
+ - export PATH=$HOME/.local/bin:$PATH
18
+ - travis_retry curl -L https://www.stackage.org/stack/linux-x86_64 | tar xz --wildcards --strip-components=1 -C ~/.local/bin '*/stack'
19
+ - stack update
20
+
21
+ install:
22
+ - bundle install
23
+ - bundle exec rake compile
24
+ - bundle exec rake build
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pandoc-rb.gemspec
4
+ gemspec
@@ -0,0 +1,48 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ pandoc_rb (0.2.1)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ benchmark-ips (2.7.2)
10
+ byebug (9.0.6)
11
+ coderay (1.1.1)
12
+ kalibera (0.1)
13
+ memoist (~> 0.11.0)
14
+ rbzip2 (~> 0.2.0)
15
+ memoist (0.11.0)
16
+ method_source (0.8.2)
17
+ minitest (5.8.3)
18
+ pandoc-ruby (2.0.1)
19
+ pry (0.10.4)
20
+ coderay (~> 1.1.0)
21
+ method_source (~> 0.8.1)
22
+ slop (~> 3.4)
23
+ pry-byebug (3.4.2)
24
+ byebug (~> 9.0)
25
+ pry (~> 0.10)
26
+ rake (10.5.0)
27
+ rake-compiler (1.0.4)
28
+ rake
29
+ rbzip2 (0.2.0)
30
+ slop (3.6.0)
31
+
32
+ PLATFORMS
33
+ ruby
34
+
35
+ DEPENDENCIES
36
+ benchmark-ips
37
+ bundler (~> 1.15.1)
38
+ kalibera
39
+ minitest (~> 5.0)
40
+ pandoc-ruby
41
+ pandoc_rb!
42
+ pry
43
+ pry-byebug
44
+ rake (~> 10.0)
45
+ rake-compiler
46
+
47
+ BUNDLED WITH
48
+ 1.15.1
data/LICENSE ADDED
@@ -0,0 +1,30 @@
1
+ Copyright Michael Klein (c) 2017
2
+
3
+ All rights reserved.
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ * Redistributions of source code must retain the above copyright
9
+ notice, this list of conditions and the following disclaimer.
10
+
11
+ * Redistributions in binary form must reproduce the above
12
+ copyright notice, this list of conditions and the following
13
+ disclaimer in the documentation and/or other materials provided
14
+ with the distribution.
15
+
16
+ * Neither the name of Michael Klein nor the names of other
17
+ contributors may be used to endorse or promote products derived
18
+ from this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,31 @@
1
+ Copyright Michael Klein (c) 2017
2
+
3
+ All rights reserved.
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ * Redistributions of source code must retain the above copyright
9
+ notice, this list of conditions and the following disclaimer.
10
+
11
+ * Redistributions in binary form must reproduce the above
12
+ copyright notice, this list of conditions and the following
13
+ disclaimer in the documentation and/or other materials provided
14
+ with the distribution.
15
+
16
+ * Neither the name of Michael Klein nor the names of other
17
+ contributors may be used to endorse or promote products derived
18
+ from this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+
@@ -0,0 +1,83 @@
1
+ [![Build Status](https://travis-ci.org/michaeljklein/pandoc-ruby.svg?branch=master)](https://travis-ci.org/michaeljklein/pandoc-ruby)
2
+
3
+
4
+ # PandocRb
5
+
6
+ Like [PandocRuby](https://github.com/alphabetum/pandoc-ruby), but its interface is more limited:
7
+
8
+ ```ruby
9
+ module PandocRb
10
+ def self.raise_exception(result)
11
+ ..
12
+
13
+ def self.convert(in_format_str, out_format_str, input_str, extract_media_path='')
14
+ ..
15
+
16
+ def self.reader_from_ext(extension)
17
+ ..
18
+ end
19
+ ```
20
+
21
+ The primary benefit is that instead of using `system` calls,
22
+ `pandoc_rb` directly uses the memory allocated for Ruby [String](https://ruby-doc.org/core-2.2.1/String.html)s
23
+ through the FFI.
24
+
25
+ The benchmark results indicate that both significant constant (from initialization) and linear (from streaming through bash pipes)
26
+ overhead for `PandocRuby` is eliminated in `pandoc_rb`.
27
+
28
+ ## Installation
29
+
30
+ Requires Haskell-[`stack`](https://docs.haskellstack.org/en/stable/README/)
31
+
32
+ Add this line to your application's Gemfile:
33
+
34
+ ```ruby
35
+ gem 'pandoc_rb'
36
+ ```
37
+
38
+ And then execute:
39
+
40
+ $ bundle install
41
+
42
+ Or install it yourself as:
43
+
44
+ $ gem install pandoc_rb
45
+
46
+ ## Usage
47
+
48
+ `pandoc_rb`'s main interface is contained in the `PandocRb` module.
49
+
50
+ The public interface consists of constants and a main conversion function
51
+
52
+ The constants include:
53
+ ```ruby
54
+ PandocRb::Version # The current version
55
+ PandocRb::Readers # A list of allowed readers
56
+ PandocRb::Writers # A list of allowed writers
57
+ ```
58
+
59
+ And the main conversion function is:
60
+ ```ruby
61
+ # General conversion function
62
+ PandocRb.convert input_format, output_format, input_string, (optional) extract_media_path
63
+
64
+ # Convert `markdown` to `latex`
65
+ PandocRb.convert 'markdown', 'latex', '_italic text_'
66
+
67
+ # Convert `docx` to `latex` from file
68
+ PandocRb.convert 'docx', 'latex', File.binread('some_doc.docx'), `extract/figures/dir`
69
+
70
+ # Convert `markdown` to `docx`, writing to a `docx` file
71
+ File.open 'some_doc.docx', 'wb' do |file|
72
+ file.write PandocRb.convert('markdown', 'docx', '_italic text_')
73
+ end
74
+ ```
75
+
76
+ ## Contributing
77
+
78
+ 1. Fork it ( https://github.com/michaeljklein/pandoc_rb/fork )
79
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
80
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
81
+ 4. Push to the branch (`git push origin my-new-feature`)
82
+ 5. Create a new Pull Request
83
+
@@ -0,0 +1,31 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+ require 'rake/extensiontask'
4
+
5
+ Rake::ExtensionTask.new 'pandoc_rb', $gemspec do |ext|
6
+ ext.lib_dir = "lib/pandoc_rb"
7
+ end
8
+
9
+ Rake::TestTask.new(:test) do |t|
10
+ t.libs << "test"
11
+ t.libs << "lib"
12
+ t.test_files = FileList["test/**/*_test.rb"]
13
+ end
14
+
15
+ task :build => :compile
16
+
17
+ desc "Run tests"
18
+ task :default => :test
19
+
20
+ task :nuke do
21
+ Dir.chdir(__dir__) do
22
+ FileUtils.rm_rf 'tmp'
23
+ FileUtils.rm_rf 'ext/pandoc_rb/.stack-work'
24
+ FileUtils.rm_f 'ext/pandoc_rb/a.out'
25
+ Dir['**/*.so'].each do |so|
26
+ FileUtils.rm_f so
27
+ end
28
+ end
29
+ end
30
+
31
+
@@ -0,0 +1,2 @@
1
+ import Distribution.Simple
2
+ main = defaultMain
@@ -0,0 +1,69 @@
1
+ require 'pandoc_rb'
2
+ require 'benchmark/ips'
3
+ require 'pandoc-ruby'
4
+
5
+
6
+ def test_files_hash(dir='test/files')
7
+ @test_files_hash ||= begin
8
+ hash = {}
9
+ Dir["#{dir}/*"].each do |file|
10
+ extension = PandocRb.reader_from_ext File.extname(file)
11
+ hash[extension] ||= []
12
+ hash[extension] << file
13
+ end
14
+ hash
15
+ end
16
+ end
17
+
18
+
19
+ Benchmark.ips do |bench|
20
+ 10.times do
21
+ PandocRb.convert 'markdown', 'latex', 'warmup'
22
+ end
23
+
24
+ 10.times do
25
+ PandocRuby.convert 'warmup', from: 'markdown', to: 'latex'
26
+ end
27
+
28
+ # Number of seconds to run each benchmark
29
+ bench.time = 5 # seconds
30
+
31
+ bench.stats = :bootstrap
32
+ bench.confidence = 95 # percent
33
+
34
+ test_files_hash.each do |reader, file_paths|
35
+ if PandocRb::Readers.include? reader
36
+ file_paths.each do |file_path|
37
+ file = File.binread file_path
38
+ file.force_encoding "UTF-8"
39
+ bench.report "from: #{reader}, to: Fixnum, file: #{File.basename(file_path)}, sum bytes" do
40
+ file.each_byte.reduce(:+)
41
+ end
42
+ ['markdown', 'latex', 'html', 'docx'].each do |writer|
43
+ GC.start(full_mark: true, immediate_sweep: true)
44
+
45
+ # Convert by telling pandoc through a C extension to read the string
46
+ bench.report "from: #{reader}, to: #{writer}, file: #{File.basename(file_path)}, pandoc_rb" do
47
+ PandocRb.convert reader, writer, file
48
+ end
49
+
50
+ # Convert by telling pandoc through PandocRuby to read the file
51
+ bench.report "from: #{reader}, to: #{writer}, file: #{File.basename(file_path)}, pandoc-ruby (read file)" do
52
+ PandocRuby.convert [file_path], from: reader, to: writer
53
+ end
54
+
55
+ # PandocRuby is incapable of accepting a raw docx file as input
56
+ unless file_path.match(/\.docx/)
57
+ # Convert by telling pandoc through PandocRuby to read stdin
58
+ bench.report "from: #{reader}, to: #{writer}, file: #{File.basename(file_path)}, pandoc-ruby" do
59
+ PandocRuby.convert file , from: reader, to: writer
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ bench.compare!
68
+ end
69
+
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "pandoc_rb"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,130 @@
1
+ # Loads mkmf which is used to make makefiles for Ruby extensions
2
+ require 'mkmf'
3
+ require 'pry'
4
+ require 'open3'
5
+
6
+
7
+ module OS
8
+ def OS.windows?
9
+ (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
10
+ end
11
+
12
+ def OS.mac?
13
+ (/darwin/ =~ RUBY_PLATFORM) != nil
14
+ end
15
+
16
+ def OS.unix?
17
+ !OS.windows?
18
+ end
19
+
20
+ def OS.linux?
21
+ OS.unix? and not OS.mac?
22
+ end
23
+ end
24
+
25
+
26
+ def system_indent(command)
27
+ puts "running #{command}"
28
+ exit_status = system command
29
+ if exit_status
30
+ puts "ran #{command}"
31
+ else
32
+ puts ["failed:", "<command>", command.split(' '), "</command>"].flatten
33
+ raise "#{command} failed"
34
+ end
35
+ exit_status
36
+ end
37
+
38
+ Dir.chdir(__dir__){ system_indent 'stack setup' }
39
+
40
+ Dir.chdir(__dir__){ system_indent 'stack build' }
41
+
42
+ def stack_path
43
+ @stack_path ||= begin
44
+ Dir.chdir(__dir__) do
45
+ temp_stack_path = `stack path`.lines.map do |line|
46
+ /^(?<var>[^:]+): (?<val>.*)$/ =~ line.chomp
47
+ [var, File.absolute_path(val)]
48
+ end.to_h
49
+ temp_stack_path['compiler-lib'] = temp_stack_path['compiler-bin'].sub(/bin$/, 'lib')
50
+ temp_stack_path['compiler'] = temp_stack_path['compiler-bin'].sub(/^.*\/([^\/]+)\/bin$/, '\1')
51
+ temp_stack_path
52
+ end
53
+ end
54
+ end
55
+
56
+
57
+ # Give it a name
58
+ extension_name = 'pandoc_rb/pandoc_rb'
59
+
60
+ LIBDIR = ::CONFIG['libdir']
61
+ INCLUDEDIR = ::CONFIG['includedir']
62
+
63
+ HEADER_DIRS = [
64
+ File.join(stack_path['compiler-lib'], stack_path['compiler'], "rts"),
65
+ File.join(stack_path['local-install-root'], "bin"),
66
+
67
+ # /home/hsolo/.stack/programs/x86_64-linux/ghc-8.0.2/lib/ghc-8.0.2/include/
68
+ File.join(stack_path['compiler-lib'], stack_path['compiler'], "include"),
69
+
70
+ # .stack-work/dist/x86_64-osx/Cabal-1.24.2.0/build/PandocRb.dylib/PandocRb.dylib-tmp/
71
+ File.join(stack_path['dist-dir'], "build/PandocRb.dylib/PandocRb.dylib-tmp"),
72
+
73
+ # Then search /usr/local for people that installed from source
74
+ '/usr/local/include',
75
+
76
+ # Check the ruby install locations
77
+ INCLUDEDIR,
78
+
79
+ # Finally fall back to /usr
80
+ '/usr/include',
81
+ ]
82
+
83
+ LIB_DIRS = [
84
+ # /home/hsolo/.stack/programs/x86_64-linux/ghc-8.0.2/lib/ghc-8.0.2/rts/
85
+ File.join(stack_path['compiler-lib'], stack_path['compiler'], "rts"),
86
+ File.join(stack_path['local-install-root'], "bin"),
87
+ File.join(stack_path['dist-dir'], "build/PandocRb.dylib/PandocRb.dylib-tmp"), # PandocRb_stub.h
88
+ File.join(stack_path['compiler-lib'], stack_path['compiler'], "include"),
89
+
90
+ # First search /opt/local for macports
91
+ '/opt/local/lib',
92
+
93
+ # Then search /usr/local for people that installed from source
94
+ '/usr/local/lib',
95
+
96
+ # Check the ruby install locations
97
+ LIBDIR,
98
+
99
+ # Finally fall back to /usr
100
+ '/usr/lib',
101
+ ]
102
+
103
+ dir_config extension_name, HEADER_DIRS, LIB_DIRS
104
+
105
+ have_header 'stdio.h'
106
+ have_header 'ruby.h'
107
+ have_header 'HsFFI.h'
108
+ have_header 'PandocRb_stub.h', 'HsFFI.h'
109
+ find_library 'HSrts-ghc8.0.2', nil
110
+ find_library 'PandocRb', nil
111
+
112
+ $INCFLAGS = File.join(stack_path['local-install-root'], "bin/PandocRb.dylib") + ' ' + $INCFLAGS
113
+ $INCFLAGS += " -I#{File.join(stack_path['compiler-lib'], stack_path['compiler'], "include")}" # HsFFI.h
114
+ $INCFLAGS += " -I#{File.join(stack_path['dist-dir'], "build/PandocRb.dylib/PandocRb.dylib-tmp")}" # PandocRb_stub.h
115
+ $INCFLAGS += " -L#{File.join(stack_path['compiler-lib'], stack_path['compiler'], "rts")}"
116
+ $INCFLAGS += " -lHSrts-ghc8.0.2"
117
+
118
+ $LDFLAGS = File.join(stack_path['local-install-root'], "bin/PandocRb.dylib") + ' ' + $LDFLAGS
119
+ $LDFLAGS += " -I#{File.join(stack_path['compiler-lib'], stack_path['compiler'], "include")}" # HsFFI.h
120
+ $LDFLAGS += " -I#{File.join(stack_path['dist-dir'], "build/PandocRb.dylib/PandocRb.dylib-tmp")}" # PandocRb_stub.h
121
+ $LDFLAGS += " -L#{File.join(stack_path['compiler-lib'], stack_path['compiler'], "rts")}"
122
+ $LDFLAGS += " -Wl,-rpath,'#{File.join(stack_path['compiler-lib'], stack_path['compiler'], "rts")}'"
123
+ $LDFLAGS += " -Wl,-R'#{File.join(stack_path['local-install-root'], "bin")}'" unless OS.mac?
124
+ $LDFLAGS += " -Wl,-rpath,'#{File.join(stack_path['local-install-root'], "bin")}'"
125
+ $LDFLAGS += " -lHSrts-ghc8.0.2"
126
+
127
+ create_makefile extension_name
128
+
129
+ system_indent 'make'
130
+