propaganda 0.1.0 → 0.2.0

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/README.rdoc CHANGED
@@ -3,6 +3,21 @@
3
3
  Generate PDFs from HTML. Generate them from Markdown and Textile. Take over
4
4
  the world.
5
5
 
6
+ == Note on Ruby Java Bridge and Invoking the Apache library
7
+
8
+ This gem relies on a java binary and Ruby provides a few ways of getting to
9
+ that. This gem provides support for executing the binary via the Ruby Java
10
+ Bridge (rjb) which is available on rubygems (http://rubygems.org/gems/rjb).
11
+ Source is available on Github (http://github.com/arton/rjb). When installing
12
+ the rjb gem you must have a JAVA_HOME environment variable set. If you install
13
+ your gems using sudo this can be flummoxing. For OSX:
14
+
15
+ sudo env JAVA_HOME=/Library/Java/Home gem install rjb
16
+
17
+ If you don't want to use rjb, you don't have to. The gem can invoke the java
18
+ library via shell commands if it doesn't detect the rjb gem. In order to
19
+ facilitate this you must have the java application on your path.
20
+
6
21
  == Installation
7
22
 
8
23
  Propaganda is available on Rubygems.org.
@@ -53,16 +68,6 @@ keep-together.within-<context>="always" etc. where <context> is line if the
53
68
  declaration is found on an inline level element, column if within a table cell
54
69
  otherwise page.
55
70
 
56
- == Note on Ruby Java Bridge
57
-
58
- For non-jruby usage this gem relies on the Ruby Java Bridge (rjb) which is
59
- available on rubygems (http://rubygems.org/gems/rjb). Source is available
60
- on Github (http://github.com/arton/rjb). When installing the rjb gem you
61
- must have a JAVA_HOME environment variable set. If you install your gems
62
- using sudo this can be flummoxing. Just use:
63
-
64
- sudo env JAVA_HOME=/Library/Java/Home gem install rjb
65
-
66
71
  == Note on Patches/Pull Requests
67
72
 
68
73
  * Fork the project.
data/Rakefile CHANGED
@@ -13,7 +13,6 @@ begin
13
13
  gem.files = FileList["[A-Z]*", "{bin,java,lib,templates,test}/**/*"]
14
14
  gem.add_dependency "BlueCloth", ">= 1.0.0"
15
15
  gem.add_dependency "RedCloth", ">= 4.1.1"
16
- gem.add_dependency "rjb", ">= 1.2.0"
17
16
  gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
18
17
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
19
18
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
@@ -0,0 +1,46 @@
1
+ require 'rjb'
2
+
3
+ module Propaganda
4
+ module Fop
5
+ class Bridge
6
+ def initialize(verbose=false)
7
+ @verbose = verbose
8
+ end
9
+
10
+ def invoke(*args)
11
+ # When invoking we need to use our own Manager class because the default
12
+ # cli Main class deletes the file on exit and always calls System.exit
13
+ # which closes our application. We avoid that and also setup additional
14
+ # protection against rogue System.exit calls in the library
15
+ SystemExitManager.disableSystemExitCall
16
+ Manager._invoke('main', '[Ljava.lang.String;', args)
17
+ Output.toString
18
+ rescue Exception => e
19
+ raise "Could not render document [#{e}] (" + Errors.toString + ")"
20
+ ensure
21
+ SystemExitManager.enableSystemExitCall
22
+ end
23
+
24
+ private
25
+
26
+ def self.classpath
27
+ path = File.join(File.dirname(__FILE__), '..', '..', '..', 'java')
28
+ File.expand_path(path)+':'+File.join(path, 'fop.jar')
29
+ end
30
+
31
+ Rjb::load(Bridge.classpath, ['-Djava.awt.headless=true'])
32
+ SystemExitManager = Rjb::import 'SystemExitManager'
33
+ Manager = Rjb::import 'org.apache.fop.cli.Manager'
34
+ ByteArray = Rjb::import 'java.io.ByteArrayOutputStream'
35
+ PrintStream = Rjb::import 'java.io.PrintStream'
36
+
37
+ # Internally fop is very noisy, we have to block all of that if we don't
38
+ # want to go crazy. To do that we overwrite the default streams,
39
+ # unfortunately these are globals, so its one size fits all
40
+ Errors = ByteArray.new
41
+ Rjb::import('java.lang.System').err = PrintStream.new(Errors)
42
+ Output = ByteArray.new
43
+ Rjb::import('java.lang.System').out = PrintStream.new(Output)
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,32 @@
1
+ require 'open3'
2
+
3
+ module Propaganda
4
+ module Fop
5
+ class Shell
6
+ def initialize(verbose=false)
7
+ @verbose = verbose
8
+ end
9
+
10
+ def invoke(*args)
11
+ command = "java -Djava.awt.headless=true -jar #{jarpath} #{args.join(' ')}"
12
+ if @verbose
13
+ `#{command}`
14
+ else
15
+ stdin, stdout, stderr = Open3.popen3(command)
16
+ @errors = stderr.read
17
+ @output = stdout.read
18
+ raise "Could not invoke: #{@errors}" unless @errors.blank?
19
+ @output
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def self.jarpath
26
+ path = File.join(File.dirname(__FILE__), '..', '..', '..', 'java')
27
+ File.expand_path(File.join(path, 'fop.jar'))
28
+ end
29
+
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,48 @@
1
+ require 'tempfile'
2
+
3
+ module Propaganda
4
+
5
+ def self.check_dependencies
6
+ require 'propaganda/fop/shell'
7
+ require 'propaganda/fop/bridge'
8
+ end
9
+
10
+ MODE = check_dependencies ? 'rjb' : 'shell'
11
+
12
+ class Renderer
13
+ def initialize(verbose=false)
14
+ @verbose = verbose
15
+ end
16
+
17
+ def version
18
+ invoke('-v')
19
+ end
20
+
21
+ def render(html, output, template=nil)
22
+ template ||= 'default'
23
+ stylesheet = File.join(File.dirname(__FILE__), '..', '..', 'templates', "#{template}.xsl")
24
+ stylesheet = File.expand_path(stylesheet)
25
+ tmp = Tempfile.new('fop')
26
+ tmp << html
27
+ tmp.flush
28
+ tmp.close
29
+ output = File.expand_path(output)
30
+ invoke('-xml', tmp.path, '-xsl', stylesheet, '-pdf', output)
31
+ ensure
32
+ tmp.close rescue nil
33
+ tmp = nil
34
+ end
35
+
36
+ private
37
+
38
+ def invoke(*args)
39
+ if MODE == 'rjb'
40
+ fop = Propaganda::Fop::Bridge.new(@verbose)
41
+ fop.invoke(*args)
42
+ elsif MODE == 'shell'
43
+ fop = Propaganda::Fop::Shell.new(@verbose)
44
+ fop.invoke(*args)
45
+ end
46
+ end
47
+ end
48
+ end
data/lib/propaganda.rb CHANGED
@@ -1,4 +1,4 @@
1
- require 'propaganda/fop'
1
+ require 'propaganda/renderer'
2
2
  require 'propaganda/formatter'
3
3
 
4
4
  module Propaganda
@@ -8,7 +8,7 @@ module Propaganda
8
8
  text = IO.read(input)
9
9
  formatter = Formatter.new
10
10
  text = formatter.format(text, title, engine)
11
- fop = Fop.new(verbose)
11
+ fop = Renderer.new(verbose)
12
12
  fop.render(text, output, template)
13
13
  end
14
14
 
data/test/fop_test.rb CHANGED
@@ -5,13 +5,13 @@ class FopTest < Test::Unit::TestCase
5
5
  File.delete('test/samples/sample.pdf') rescue nil
6
6
  assert File.exists?('test/samples/sample.html')
7
7
  text = IO.read('test/samples/sample.html')
8
- fop = Propaganda::Fop.new(true)
8
+ fop = Propaganda::Renderer.new(true)
9
9
  fop.render(text, 'test/samples/sample.pdf')
10
- assert File.exists?('test/samples/sample.pdf'), Propaganda::Fop::Errors.toString
10
+ assert File.exists?('test/samples/sample.pdf')
11
11
  end
12
12
 
13
13
  should "get the version" do
14
- fop = Propaganda::Fop.new
14
+ fop = Propaganda::Renderer.new
15
15
  assert fop.version
16
16
  end
17
17
  end
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: propaganda
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Rafter
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-02-24 00:00:00 -08:00
12
+ date: 2010-02-25 00:00:00 -08:00
13
13
  default_executable: propaganda
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -32,16 +32,6 @@ dependencies:
32
32
  - !ruby/object:Gem::Version
33
33
  version: 4.1.1
34
34
  version:
35
- - !ruby/object:Gem::Dependency
36
- name: rjb
37
- type: :runtime
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- version: 1.2.0
44
- version:
45
35
  - !ruby/object:Gem::Dependency
46
36
  name: thoughtbot-shoulda
47
37
  type: :development
@@ -84,8 +74,10 @@ files:
84
74
  - java/xml-apis-ext-1.3.04.jar
85
75
  - java/xmlgraphics-commons-1.3.1.jar
86
76
  - lib/propaganda.rb
87
- - lib/propaganda/fop.rb
77
+ - lib/propaganda/fop/bridge.rb
78
+ - lib/propaganda/fop/shell.rb
88
79
  - lib/propaganda/formatter.rb
80
+ - lib/propaganda/renderer.rb
89
81
  - templates/clean.xsl
90
82
  - templates/default.xsl
91
83
  - test/fop_test.rb
@@ -1,63 +0,0 @@
1
- require 'rjb'
2
- require 'tempfile'
3
-
4
- module Propaganda
5
- class Fop
6
- def initialize(verbose=false)
7
- unless verbose
8
- end
9
- end
10
-
11
- def version
12
- invoke('-v')
13
- Output.toString
14
- end
15
-
16
- def render(html, output, template=nil)
17
- template ||= 'default'
18
- stylesheet = File.join(File.dirname(__FILE__), '..', '..', 'templates', "#{template}.xsl")
19
- stylesheet = File.expand_path(stylesheet)
20
- tmp = Tempfile.new('fop')
21
- tmp << html
22
- tmp.flush
23
- tmp.close
24
- output = File.expand_path(output)
25
- invoke('-xml', tmp.path, '-xsl', stylesheet, '-pdf', output)
26
- ensure
27
- tmp = nil
28
- end
29
-
30
- private
31
-
32
- def invoke(*args)
33
- # When invoking we need to use our own Manager class because the default
34
- # cli Main class deletes the file on exit and always calls System.exit
35
- # which closes our application. We avoid that and also setup additional
36
- # protection against rogue System.exit calls in the library
37
- SystemExitManager.disableSystemExitCall
38
- Manager._invoke('main', '[Ljava.lang.String;', args)
39
- rescue Exception => e
40
- raise "Could not render document [#{e}] (" + Errors.toString + ")"
41
- ensure
42
- SystemExitManager.enableSystemExitCall
43
- end
44
-
45
- def self.classpath
46
- path = File.join(File.dirname(__FILE__), '..', '..', 'java')
47
- File.expand_path(path+':'+File.join(path, 'fop.jar'))
48
- end
49
-
50
- Rjb::load(Fop.classpath, ['-Djava.awt.headless=true'])
51
- SystemExitManager = Rjb::import 'SystemExitManager'
52
- Manager = Rjb::import 'org.apache.fop.cli.Manager'
53
- ByteArray = Rjb::import 'java.io.ByteArrayOutputStream'
54
- PrintStream = Rjb::import 'java.io.PrintStream'
55
-
56
- # Internally fop is very noisy, we have to block all of that if we don't
57
- # want to go crazy. To do that we overwrite the default streams
58
- Errors = ByteArray.new
59
- Rjb::import('java.lang.System').err = PrintStream.new(Errors)
60
- Output = ByteArray.new
61
- Rjb::import('java.lang.System').out = PrintStream.new(Output)
62
- end
63
- end