rmultimarkdown 4.5.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/LICENSE +75 -0
  2. data/MultiMarkdown-4/GLibFacade.c +294 -0
  3. data/MultiMarkdown-4/GLibFacade.h +95 -0
  4. data/MultiMarkdown-4/beamer.c +179 -0
  5. data/MultiMarkdown-4/beamer.h +11 -0
  6. data/MultiMarkdown-4/critic.c +111 -0
  7. data/MultiMarkdown-4/critic.h +15 -0
  8. data/MultiMarkdown-4/glib.h +11 -0
  9. data/MultiMarkdown-4/html.c +1062 -0
  10. data/MultiMarkdown-4/html.h +14 -0
  11. data/MultiMarkdown-4/latex.c +1137 -0
  12. data/MultiMarkdown-4/latex.h +16 -0
  13. data/MultiMarkdown-4/libMultiMarkdown.h +157 -0
  14. data/MultiMarkdown-4/lyx.c +2163 -0
  15. data/MultiMarkdown-4/lyx.h +36 -0
  16. data/MultiMarkdown-4/lyxbeamer.c +267 -0
  17. data/MultiMarkdown-4/lyxbeamer.h +11 -0
  18. data/MultiMarkdown-4/memoir.c +79 -0
  19. data/MultiMarkdown-4/memoir.h +10 -0
  20. data/MultiMarkdown-4/multimarkdown.c +469 -0
  21. data/MultiMarkdown-4/odf.c +1202 -0
  22. data/MultiMarkdown-4/odf.h +18 -0
  23. data/MultiMarkdown-4/opml.c +188 -0
  24. data/MultiMarkdown-4/opml.h +15 -0
  25. data/MultiMarkdown-4/parse_utilities.c +752 -0
  26. data/MultiMarkdown-4/parser.c +15679 -0
  27. data/MultiMarkdown-4/parser.h +188 -0
  28. data/MultiMarkdown-4/rng.c +117 -0
  29. data/MultiMarkdown-4/rtf.c +648 -0
  30. data/MultiMarkdown-4/rtf.h +17 -0
  31. data/MultiMarkdown-4/strtok.c +56 -0
  32. data/MultiMarkdown-4/strtok.h +9 -0
  33. data/MultiMarkdown-4/text.c +53 -0
  34. data/MultiMarkdown-4/text.h +11 -0
  35. data/MultiMarkdown-4/transclude.c +218 -0
  36. data/MultiMarkdown-4/transclude.h +26 -0
  37. data/MultiMarkdown-4/writer.c +576 -0
  38. data/MultiMarkdown-4/writer.h +34 -0
  39. data/README.md +75 -0
  40. data/Rakefile +85 -0
  41. data/bin/rmultimarkdown +128 -0
  42. data/ext/extconf.h +3 -0
  43. data/ext/extconf.rb +10 -0
  44. data/ext/multi_markdown.c +100 -0
  45. data/lib/multi_markdown.bundle +0 -0
  46. data/lib/multi_markdown.rb +88 -0
  47. data/lib/multi_markdown/version.rb +6 -0
  48. data/lib/rmultimarkdown.rb +1 -0
  49. data/rmultimarkdown.gemspec +37 -0
  50. data/test/multi_markdown_test.rb +64 -0
  51. metadata +122 -0
@@ -0,0 +1,34 @@
1
+ #include "parser.h"
2
+
3
+ #include "text.h"
4
+ #include "html.h"
5
+ #include "latex.h"
6
+ #include "memoir.h"
7
+ #include "beamer.h"
8
+ #include "lyx.h"
9
+ #include "lyxbeamer.h"
10
+ #include "opml.h"
11
+ #include "odf.h"
12
+ #include "rtf.h"
13
+ #include "critic.h"
14
+
15
+ char * export_node_tree(node *list, int format, unsigned long extensions);
16
+
17
+ void extract_references(node *list, scratch_pad *scratch);
18
+ link_data * extract_link_data(char *label, scratch_pad *scratch);
19
+
20
+ void pad(GString *out, int num, scratch_pad *scratch);
21
+
22
+ int note_number_for_label(char *text, scratch_pad *scratch);
23
+ int note_number_for_node(node *ref, scratch_pad *scratch);
24
+ node * node_matching_label(char *label, node *n);
25
+ int count_node_from_end(node *n);
26
+ int cite_count_node_from_end(node *n);
27
+ node * node_for_count(node *n, int count);
28
+ void move_note_to_used(node *list, scratch_pad *scratch);
29
+ void use_inline_footnote(node *ref, scratch_pad *scratch);
30
+ node * node_for_attribute(char *querystring, node *list);
31
+
32
+ char * dimension_for_attribute(char *querystring, node *list);
33
+
34
+ link_data * load_link_data(node *n, scratch_pad *scratch);
data/README.md ADDED
@@ -0,0 +1,75 @@
1
+ Ruby MultiMarkdown 4
2
+ ====================
3
+
4
+ [![Build Status](https://travis-ci.org/tillsc/multi_markdown.png?branch=master)](https://travis-ci.org/tillsc/multi_markdown)
5
+
6
+ An extension library around
7
+ [Fletcher Penney's MultiMarkdown](http://github.com/fletcher/MultiMarkdown-4/)
8
+ library in C. It is based upon the ruby
9
+ [rpeg-markdown](https://github.com/rtomayko/rpeg-markdown/) and
10
+ [rpeg-multimarkdown](https://github.com/djungelvral/rpeg-multimarkdown) libraries by
11
+ [Ryan Tomayko](https://github.com/rtomayko) and [Oliver "djungelvral"](https://github.com/djungelvral).
12
+
13
+ Synopsis
14
+ --------
15
+
16
+ >> require 'multimarkdown'
17
+
18
+ >> MultiMarkdown.new('Hello, world.').to_html
19
+ #=> "<p>Hello, world.</p>"
20
+
21
+ >> MultiMarkdown.new('_Hello World!_', :smart, :filter_html).to_html
22
+ #=> "<p><em>Hello World!</em></p>"
23
+
24
+ >> MultiMarkdown.new('_Hello World!_').to_latex
25
+ #=> "\emph{Hello World!}"
26
+
27
+ >> doc = MultiMarkdown.new("Title: Some document \n\nSome text in the document")
28
+
29
+ >> doc.metadata
30
+ #=> {"title" => "Some document"}
31
+
32
+ >> doc.metadata("Title")
33
+ #=> "Some document"
34
+
35
+ See [MultiMarkdown documentation](http://fletcher.github.io/MultiMarkdown-4/)
36
+ and `MultiMarkdown`'s [RDoc](http://rubydoc.info/gems/multimarkdown) for further Details.
37
+
38
+ Installation / Hacking
39
+ ----------------------
40
+
41
+ This library requires a recent version of glib2. All modern GNU userland
42
+ systems should be fine.
43
+
44
+ Install from [Rubygems](http://rubygems.org/gems/multimarkdown):
45
+
46
+ $ [sudo] gem install rmultimarkdown
47
+
48
+ Bundle via [Bundler](http://bundler.io):
49
+
50
+ gem 'rmultimarkdown'
51
+
52
+ Hacking:
53
+
54
+ $ git clone --recursive git://github.com/tillsc/multi_markdown.git
55
+ $ cd multi_markdown
56
+ $ bundle install
57
+ $ bundle exec rake test
58
+
59
+ Changes
60
+ -------
61
+
62
+ **Beware**: The versioning scheme isn't based upon
63
+ [Semantic Versioning](http://semver.org)! The first three version numbers are
64
+ inherited from the underlying C library. Only the last number is used to indicate
65
+ changes in the Ruby wrapper itself.
66
+
67
+ * [Version 4.5.0.1](http://github.com/tillsc/multi_markdown/tree/v4.5.0.1):
68
+ First Version based upon [rpeg-markdown](https://github.com/rtomayko/rpeg-markdown/)
69
+ and [rpeg-multimarkdown](https://github.com/djungelvral/rpeg-multimarkdown).
70
+
71
+ COPYING
72
+ -------
73
+
74
+ MultiMarkdown-4, multi_markdown are both licensed under the GPL and the MIT License.
75
+ See [LICENSE](LICENCSE) for more information.
data/Rakefile ADDED
@@ -0,0 +1,85 @@
1
+ require 'rake/clean'
2
+ require 'rdoc/task'
3
+ require 'bundler'
4
+
5
+ Bundler::GemHelper.install_tasks
6
+
7
+ task :default => :test
8
+
9
+ # ***** Build
10
+
11
+ DLEXT = RbConfig::CONFIG['DLEXT']
12
+
13
+ # For Mac OS X -- prevents prevent additional ._* files being added to tarball
14
+ ENV['COPYFILE_DISABLE'] = 'true'
15
+
16
+ namespace "MultiMarkdown-4" do
17
+
18
+ desc "Initialize the submodule"
19
+ task "init" => "generate_parser"
20
+
21
+ desc "Generate needed parser files"
22
+ task "generate_parser" do
23
+ chdir('MultiMarkdown-4') do
24
+ sh 'make parser.c'
25
+ end
26
+ end
27
+
28
+ end
29
+
30
+
31
+ file 'ext/Makefile' => ["MultiMarkdown-4:init"] + FileList['ext/{extconf.rb,*.c,*.h,*.rb}', 'MultiMarkdown-4/*.{c,h}'] do
32
+ chdir('ext') do
33
+ ruby 'extconf.rb'
34
+ end
35
+ end
36
+ CLEAN.include 'ext/Makefile'
37
+
38
+ file "ext/multi_markdown.#{DLEXT}" => FileList['ext/Makefile', 'ext/*.{c,h,rb}', 'MultiMarkdown-4/*.{c,h}'] do |f|
39
+ chdir('ext') do
40
+ sh 'make'
41
+ end
42
+ end
43
+ CLEAN.include 'ext/*.{o,bundle,so}'
44
+ CLEAN.include 'MultiMarkdown-4/*.o'
45
+
46
+ file "lib/multi_markdown.#{DLEXT}" => "ext/multi_markdown.#{DLEXT}" do |f|
47
+ cp f.prerequisites, "lib/", :preserve => true
48
+ end
49
+ CLEAN.include "lib/*.{so,bundle}"
50
+
51
+ desc 'Build the multi_markdown extension'
52
+ task :build => "lib/multi_markdown.#{DLEXT}"
53
+
54
+ # ***** Test
55
+
56
+ desc 'Run unit and conformance tests'
57
+ task :test => [ 'test:unit', 'test:conformance' ]
58
+
59
+ namespace :test do
60
+
61
+ desc 'Run unit tests'
62
+ task :unit => :build do |t|
63
+ ruby 'test/multi_markdown_test.rb'
64
+ end
65
+
66
+ desc "Run conformance tests"
67
+ task :conformance => :build do |t|
68
+ script = "#{pwd}/bin/rmultimarkdown"
69
+ chdir("MultiMarkdown-4/MarkdownTest") do
70
+ sh "./MarkdownTest.pl --script='#{script}' --flags='-c' --tidy"
71
+ sh "./MarkdownTest.pl --script='#{script}' --testdir='MultiMarkdownTests'"
72
+ sh "./MarkdownTest.pl --script='#{script}' --testdir='MultiMarkdownTests' --flags='-t latex' --ext='.tex'"
73
+ sh "./MarkdownTest.pl --script='#{script}' --testdir='BeamerTests' --flags='-t latex' --ext='.tex'"
74
+ sh "./MarkdownTest.pl --script='#{script}' --testdir='MemoirTests' --flags='-t latex' --ext='.tex'"
75
+ end
76
+ end
77
+
78
+ end
79
+
80
+ # ***** RDoc
81
+
82
+ Rake::RDocTask.new do |rd|
83
+ rd.main = "README.md"
84
+ rd.rdoc_files.include("README.md", "ext/**/*.c", "lib/**/*.rb")
85
+ end
@@ -0,0 +1,128 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ begin
4
+ require 'multi_markdown'
5
+ rescue LoadError => boom
6
+ local_path = File.expand_path(File.dirname(__FILE__))
7
+ $: << "#{local_path}/../lib"
8
+ require 'multi_markdown'
9
+ end
10
+
11
+ # Option parser -- http://florianpilz.github.com/micro-optparse/
12
+
13
+ require 'ostruct'
14
+ require 'optparse'
15
+
16
+ class Parser
17
+ attr_accessor :banner, :version
18
+ def initialize
19
+ @options = []
20
+ @used_short = []
21
+ yield self if block_given?
22
+ end
23
+
24
+ def option(name, desc, settings = {})
25
+ @options << [name, desc, settings]
26
+ end
27
+
28
+ def short_from(name)
29
+ name.to_s.chars.each do |c|
30
+ next if @used_short.include?(c) || c == "_"
31
+ return c # returns from short_from method
32
+ end
33
+ end
34
+
35
+ def validate(options) # remove this method if you want fewer lines of code and don't need validations
36
+ options.each_pair do |key, value|
37
+ opt = @options.find_all{ |o| o[0] == key }.first
38
+ key = "--" << key.to_s.gsub("_", "-")
39
+ unless opt[2][:value_in_set].nil? || opt[2][:value_in_set].include?(value)
40
+ puts "Parameter for #{key} must be in [" << opt[2][:value_in_set].join(", ") << "]" ; exit(1)
41
+ end
42
+ unless opt[2][:value_matches].nil? || opt[2][:value_matches] =~ value
43
+ puts "Parameter for #{key} must match /" << opt[2][:value_matches].source << "/" ; exit(1)
44
+ end
45
+ unless opt[2][:value_satisfies].nil? || opt[2][:value_satisfies].call(value)
46
+ puts "Parameter for #{key} must satisfy given conditions (see description)" ; exit(1)
47
+ end
48
+ end
49
+ end
50
+
51
+ def process!(arguments = ARGV)
52
+ @result = (@default_values || {}).clone # reset or new
53
+ @optionparser ||= OptionParser.new do |p| # prepare only once
54
+ @options.each do |o|
55
+ @used_short << short = o[2][:short] || short_from(o[0])
56
+ @result[o[0]] = o[2][:default] || false # set default
57
+ klass = o[2][:default].class == Fixnum ? Integer : o[2][:default].class
58
+ desk = o[1] + (o[2][:nodefault] ? "" : " (default is #{@result[o[0]]})")
59
+ if [TrueClass, FalseClass, NilClass].include?(klass) # boolean switch
60
+ p.on("-" << short, "--[no-]" << o[0].to_s.gsub("_", "-"), desk) {|x| @result[o[0]] = x}
61
+ else # argument with parameter
62
+ p.on("-" << short, "--" << o[0].to_s.gsub("_", "-") << " " << (o[2][:name] ? "[#{o[2][:name].to_s}]" : ""), klass, desk) {|x| @result[o[0]] = x}
63
+ end
64
+ end
65
+
66
+ p.banner = @banner unless @banner.nil?
67
+ p.on_tail("-h", "--help", "Show this message") {puts p ; exit}
68
+ short = @used_short.include?("v") ? "-V" : "-v"
69
+ p.on_tail(short, "--version", "Print version") {puts @version ; exit} unless @version.nil?
70
+ @default_values = @result.clone # save default values to reset @result in subsequent calls
71
+ end
72
+
73
+ begin
74
+ @optionparser.parse!(arguments)
75
+ rescue OptionParser::ParseError => e
76
+ puts e.message ; exit(1)
77
+ end
78
+
79
+ validate(@result) if self.respond_to?("validate")
80
+ @result
81
+ end
82
+ end
83
+
84
+ # Parse options
85
+ options = Parser.new do |p|
86
+ p.banner = "Ruby interface to MultiMarkdown"
87
+ p.version = "rmultimarkdown #{MultiMarkdown::VERSION}"
88
+ p.option :compatibility, "markdown compatibility mode", :default => false
89
+ p.option :filter_html, "filter out raw HTML except styles", :default => false
90
+ p.option :process_html, "process MultiMarkdown inside of raw HTML", :default => false
91
+ p.option :filter_styles, "filter out HTML styles", :default => false
92
+ p.option :smart, "use smart typography extension", :default => true
93
+ p.option :notes, "use notes extension", :default => true
94
+ p.option :output, "send output to FILE (default is stdout)", :name => "FILE", :default => "", :nodefault => true
95
+ p.option :to, "convert to FORMAT", :name => "FORMAT", :default => "html", :value_in_set => ["html","latex","memoir","beamer","odf","opml"]
96
+ p.option :extract, "extract and display metadata specified by KEY", :name => "KEY", :default => "", :nodefault => true
97
+ end.process!
98
+
99
+ # Convert options to MultiMarkdown module's options
100
+ mmopts = []
101
+ mmopts << :filter_html if options[:filter_html]
102
+ mmopts << :filter_styles if options[:filter_styles]
103
+ mmopts << :process_html if options[:process_html]
104
+ mmopts << :smart if options[:smart]
105
+ mmopts << :notes if options[:notes]
106
+ mmopts << :compatibility if options[:compatibility]
107
+
108
+ # ARGV will now only contain input filename, if it contains anything
109
+ STDIN.reopen(ARGV[0], 'rb') if ARGV.any?
110
+ multimarkdown = MultiMarkdown.new(STDIN.read,*mmopts)
111
+ STDOUT.reopen(options[:output], 'w') if options[:output]!=""
112
+
113
+ # Print specified metadata if requested
114
+ if options[:extract]!=""
115
+ puts multimarkdown.extract_metadata(options[:extract])
116
+ exit(0)
117
+ end
118
+
119
+ # Do processing
120
+ case options[:to]
121
+ when "html"
122
+ STDOUT.write(multimarkdown.to_html)
123
+ when "latex"
124
+ STDOUT.write(multimarkdown.to_latex)
125
+ else
126
+ puts "Output other than html & latex not currently supported"
127
+ exit(1)
128
+ end
data/ext/extconf.h ADDED
@@ -0,0 +1,3 @@
1
+ #ifndef EXTCONF_H
2
+ #define EXTCONF_H
3
+ #endif
data/ext/extconf.rb ADDED
@@ -0,0 +1,10 @@
1
+ require 'mkmf'
2
+
3
+ dir_config('multi_markdown')
4
+
5
+ mmd_objs = %w[parse_utilities.o parser.o GLibFacade.o writer.o text.o html.o latex.o memoir.o beamer.o lyx.o lyxbeamer.o opml.o odf.o critic.o rng.o rtf.o transclude.o]
6
+
7
+ $objs = mmd_objs.map { |s| "../MultiMarkdown-4/#{s}" } + ["multi_markdown.o"]
8
+
9
+ create_header
10
+ create_makefile('multi_markdown')
@@ -0,0 +1,100 @@
1
+ #include "ruby.h"
2
+ #include "../MultiMarkdown-4/parser.h"
3
+
4
+ static VALUE rb_cMultiMarkdown;
5
+
6
+ int get_exts(VALUE self) {
7
+ int extensions = 0;
8
+ if (rb_funcall(self, rb_intern("smart"), 0) == Qtrue)
9
+ extensions = extensions | EXT_SMART;
10
+ if (rb_funcall(self, rb_intern("notes"), 0) == Qtrue)
11
+ extensions = extensions | EXT_NOTES;
12
+ if (rb_funcall(self, rb_intern("filter_html"), 0) == Qtrue)
13
+ extensions = extensions | EXT_FILTER_HTML;
14
+ if (rb_funcall(self, rb_intern("filter_styles"), 0) == Qtrue)
15
+ extensions = extensions | EXT_FILTER_STYLES;
16
+ if (rb_funcall(self, rb_intern("process_html"), 0) == Qtrue)
17
+ extensions = extensions | EXT_PROCESS_HTML;
18
+ /* Compatibility overwrites all other extensions */
19
+ if (rb_funcall(self, rb_intern("compatibility"), 0) == Qtrue)
20
+ extensions = EXT_COMPATIBILITY;
21
+ return extensions;
22
+ }
23
+
24
+ char *get_text(VALUE self) {
25
+ /* grab char pointer to multimarkdown input text */
26
+ VALUE text = rb_iv_get(self, "@text");
27
+ Check_Type(text, T_STRING);
28
+ return StringValuePtr(text);
29
+ }
30
+
31
+ static VALUE rb_multimarkdown_to_html(VALUE self) {
32
+ char *html = markdown_to_string(get_text(self), get_exts(self), HTML_FORMAT);
33
+ VALUE result = rb_str_new2(html);
34
+ free(html);
35
+
36
+ return result;
37
+ }
38
+
39
+ static VALUE rb_multimarkdown_to_latex(VALUE self) {
40
+ char *latex = markdown_to_string(get_text(self), get_exts(self), LATEX_FORMAT);
41
+ VALUE result = rb_str_new2(latex);
42
+ free(latex);
43
+
44
+ return result;
45
+ }
46
+
47
+ static VALUE rb_multimarkdown_extract_metadata_keys(VALUE self) {
48
+ char *metadata_keys = extract_metadata_keys(get_text(self), get_exts(self));
49
+ VALUE str = rb_str_new2(metadata_keys);
50
+ free(metadata_keys);
51
+
52
+ return rb_funcall(str, rb_intern("split"), 1, rb_str_new2("\n"));
53
+ }
54
+
55
+ static VALUE rb_multimarkdown_extract_metadata_value(VALUE self, VALUE key) {
56
+ Check_Type(key, T_STRING);
57
+ char *pkey = StringValuePtr(key);
58
+
59
+ char *metadata = extract_metadata_value(get_text(self), get_exts(self), pkey);
60
+ VALUE result = rb_str_new2(metadata);
61
+ free(metadata);
62
+
63
+ return result;
64
+ }
65
+
66
+ void Init_multi_markdown() {
67
+
68
+ rb_cMultiMarkdown = rb_define_class("MultiMarkdown", rb_cObject);
69
+
70
+ /* Document-method: MultiMarkdown#to_html
71
+ *
72
+ * Return string containing HTML generated from MultiMarkdown text
73
+ */
74
+ rb_define_method(rb_cMultiMarkdown, "to_html", rb_multimarkdown_to_html, 0);
75
+
76
+ /* Document-method: MultiMarkdown#to_latex
77
+ *
78
+ * Return string containing latex generated from MultiMarkdown text
79
+ */
80
+ rb_define_method(rb_cMultiMarkdown, "to_latex", rb_multimarkdown_to_latex, 0);
81
+
82
+ /* Document-method: MultiMarkdown#extract_metadata_keys
83
+ *
84
+ * Return Array of metadata keys
85
+ */
86
+ rb_define_method(rb_cMultiMarkdown, "extract_metadata_keys", rb_multimarkdown_extract_metadata_keys, 0);
87
+
88
+ /* Document-method: MultiMarkdown#extract_metadata_value
89
+ * :call-seq: extract_metadata_value(key)
90
+ *
91
+ * Fetches metadata specified by +key+ from MultiMarkdown text
92
+ */
93
+ rb_define_method(rb_cMultiMarkdown, "extract_metadata_value", rb_multimarkdown_extract_metadata_value, 1);
94
+
95
+ rb_define_const(rb_cMultiMarkdown, "MMD_VERSION", rb_str_new2(MMD_VERSION));
96
+ /* Document-const: MultiMarkdown::MMD_VERSION
97
+ *
98
+ * The version of the MultiMarkdown-4 library
99
+ */
100
+ }
Binary file