rdiscount 1.2.7.1 → 1.2.9

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ require 'rake/gempackagetask'
5
5
  task :default => 'test:unit'
6
6
 
7
7
  DLEXT = Config::CONFIG['DLEXT']
8
- VERS = '1.2.7.1'
8
+ VERS = '1.2.9'
9
9
 
10
10
  spec =
11
11
  Gem::Specification.new do |s|
@@ -135,32 +135,11 @@ task :publish => :doc do |t|
135
135
  end
136
136
 
137
137
  # ==========================================================
138
- # Discount Submodule
138
+ # Update package's Discount sources
139
139
  # ==========================================================
140
140
 
141
- namespace :submodule do
142
- desc 'Init the upstream submodule'
143
- task :init do |t|
144
- unless File.exist? 'discount/markdown.c'
145
- rm_rf 'discount'
146
- sh 'git submodule init discount'
147
- sh 'git submodule update discount'
148
- end
149
- end
150
-
151
- desc 'Update the discount submodule'
152
- task :update => :init do
153
- sh 'git submodule update discount' unless File.symlink?('discount')
154
- end
155
-
156
- file 'discount/markdown.c' do
157
- Rake::Task['submodule:init'].invoke
158
- end
159
- task :exist => 'discount/markdown.c'
160
- end
161
-
162
141
  desc 'Gather required discount sources into extension directory'
163
- task :gather => 'submodule:exist' do |t|
142
+ task :gather => 'discount' do |t|
164
143
  files =
165
144
  FileList[
166
145
  'discount/{markdown,mkdio,amalloc,cstring}.h',
@@ -171,3 +150,20 @@ task :gather => 'submodule:exist' do |t|
171
150
  :verbose => true
172
151
  end
173
152
 
153
+ # best. task. ever.
154
+ file 'discount' do |f|
155
+ STDERR.puts((<<-TEXT).gsub(/^ +/, ''))
156
+ Sorry, this operation requires a human. Tell your human to:
157
+
158
+ Grab a discount tarball from:
159
+ http://www.pell.portland.or.us/~orc/Code/discount/
160
+
161
+ Extract here with something like:
162
+ tar xvzf discount-1.2.9.tar.gz
163
+
164
+ Create a discount symlink pointing at the version directory:
165
+ ln -hsf discount-1.2.9 discount
166
+
167
+ TEXT
168
+ fail "discount sources required."
169
+ end
@@ -6,3 +6,4 @@
6
6
  #define TABSTOP 4
7
7
  #define COINTOSS() (random()&1)
8
8
  #define INITRNG(x) srandom((unsigned int)x)
9
+ #define RELAXED_EMPHASIS 1
@@ -642,11 +642,11 @@ cputc(int c, MMIOT *f)
642
642
  * convert an email address to a string of nonsense
643
643
  */
644
644
  static void
645
- mangle(unsigned char *s, int len, MMIOT *f)
645
+ mangle(char *s, int len, MMIOT *f)
646
646
  {
647
647
  while ( len-- > 0 ) {
648
648
  Qstring("&#", f);
649
- Qprintf(f, COINTOSS() ? "x%02x;" : "%02d;", *s++);
649
+ Qprintf(f, COINTOSS() ? "x%02x;" : "%02d;", *((unsigned char*)(s++)) );
650
650
  }
651
651
  }
652
652
 
@@ -659,6 +659,9 @@ forbidden_tag(MMIOT *f)
659
659
  {
660
660
  int c = toupper(peek(f, 1));
661
661
 
662
+ if ( f->flags & DENY_HTML )
663
+ return 1;
664
+
662
665
  if ( c == 'A' && (f->flags & DENY_A) && !isalnum(peek(f,2)) )
663
666
  return 1;
664
667
  if ( c == 'I' && (f->flags & DENY_IMG)
@@ -941,29 +944,25 @@ text(MMIOT *f)
941
944
  }
942
945
  break;
943
946
  #endif
944
- case '*':
945
- case '_': if ( tag_text(f) || (isthisspace(f,-1) && isthisspace(f,1)) || (isalnum(peek(f,-1)) && isalnum(peek(f,1))) )
946
- Qchar(c, f);
947
+ case '_':
947
948
  #if RELAXED_EMPHASIS
948
- else if ( peek(f,1) == c ) {
949
- for ( rep = 1; peek(f,1) == c; pull(f) )
950
- ++rep;
951
-
952
- Qem(f, c, rep);
953
- }
954
- else if ( (isthisspace(f,-1) && isthisspace(f,1))
955
- || (isalnum(peek(f,-1)) && isalnum(peek(f,1))) )
949
+ /* If RELAXED_EMPHASIS, underscores don't count when
950
+ * they're in the middle of a word.
951
+ */
952
+ if ( (isthisspace(f,-1) && isthisspace(f,1))
953
+ || (isalnum(peek(f,-1)) && isalnum(peek(f,1))) ) {
956
954
  Qchar(c, f);
957
- else {
958
- Qem(f, c, 1);
955
+ break;
959
956
  }
960
- #else
957
+ /* else fall into the regular old emphasis case */
958
+ #endif
959
+ case '*': if ( tag_text(f) )
960
+ Qchar(c, f);
961
961
  else {
962
962
  for (rep = 1; peek(f,1) == c; pull(f) )
963
963
  ++rep;
964
964
  Qem(f,c,rep);
965
965
  }
966
- #endif
967
966
  break;
968
967
 
969
968
  case '`': if ( tag_text(f) )
@@ -411,6 +411,9 @@ headerblock(Paragraph *pp, int htyp)
411
411
 
412
412
  pp->hnumber = i;
413
413
 
414
+ while ( (i < S(p->text)) && isspace(T(p->text)[i]) )
415
+ ++i;
416
+
414
417
  CLIP(p->text, 0, i);
415
418
 
416
419
  for (j=S(p->text); j && (T(p->text)[j-1] == '#'); --j)
@@ -762,7 +765,7 @@ compile(Line *ptr, int toplevel, MMIOT *f)
762
765
  ptr = consume(ptr, &para);
763
766
 
764
767
  while ( ptr ) {
765
- if ( toplevel && (key = isopentag(ptr)) ) {
768
+ if ( toplevel && !(f->flags & DENY_HTML) && (key = isopentag(ptr)) ) {
766
769
  p = Pp(&d, ptr, strcmp(key, "STYLE") == 0 ? STYLE : HTML);
767
770
  if ( strcmp(key, "!--") == 0 )
768
771
  ptr = comment(p, key);
@@ -67,6 +67,7 @@ typedef struct mmiot {
67
67
  #define DENY_A 0x0001
68
68
  #define DENY_IMG 0x0002
69
69
  #define DENY_SMARTY 0x0004
70
+ #define DENY_HTML 0x0008
70
71
  #define INSIDE_TAG 0x0020
71
72
  #define NO_PSEUDO_PROTO 0x0040
72
73
  #define CDATA_OUTPUT 0x0080
@@ -41,7 +41,7 @@ queue(Document* a, Cstring *line)
41
41
  unsigned char c;
42
42
  int xp = 0;
43
43
  int size = S(*line);
44
- unsigned char *str = T(*line);
44
+ unsigned char *str = (unsigned char*)T(*line);
45
45
 
46
46
  CREATE(p->text);
47
47
  ATTACH(a->content, p);
@@ -68,6 +68,7 @@ queue(Document* a, Cstring *line)
68
68
  }
69
69
 
70
70
 
71
+ #ifdef PANDOC_HEADER
71
72
  /* trim leading blanks from a header line
72
73
  */
73
74
  static void
@@ -76,6 +77,7 @@ snip(Line *p)
76
77
  CLIP(p->text, 0, 1);
77
78
  p->dle = mkd_firstnonblank(p);
78
79
  }
80
+ #endif
79
81
 
80
82
 
81
83
  /* build a Document from any old input.
@@ -45,6 +45,7 @@ extern char markdown_version[];
45
45
  #define MKD_NOLINKS 0x0001 /* don't do link processing, block <a> tags */
46
46
  #define MKD_NOIMAGE 0x0002 /* don't do image processing, block <img> */
47
47
  #define MKD_NOPANTS 0x0004 /* don't run smartypants() */
48
+ #define MKD_NOHTML 0x0008 /* don't allow raw html through AT ALL */
48
49
  #define MKD_TAGTEXT 0x0020 /* don't expand `_` and `*` */
49
50
  #define MKD_NO_EXT 0x0040 /* don't allow pseudo-protocols */
50
51
  #define MKD_CDATA 0x0080 /* generate code for xml ![CDATA[...]] */
@@ -5,16 +5,11 @@
5
5
 
6
6
  static VALUE rb_cRDiscount;
7
7
 
8
- static ID id_text;
9
- static ID id_smart;
10
- static ID id_notes;
11
-
12
-
13
8
  static VALUE
14
9
  rb_rdiscount_to_html(int argc, VALUE *argv, VALUE self)
15
10
  {
16
11
  /* grab char pointer to markdown input text */
17
- VALUE text = rb_funcall(self, id_text, 0);
12
+ VALUE text = rb_funcall(self, rb_intern("text"), 0);
18
13
  Check_Type(text, T_STRING);
19
14
 
20
15
  /* allocate a ruby string buffer and wrap it in a stream */
@@ -23,9 +18,15 @@ rb_rdiscount_to_html(int argc, VALUE *argv, VALUE self)
23
18
 
24
19
  /* compile flags */
25
20
  int flags = MKD_TABSTOP | MKD_NOHEADER;
26
- if (rb_funcall(self, id_smart, 0) != Qtrue )
21
+
22
+ /* smart */
23
+ if ( rb_funcall(self, rb_intern("smart"), 0) != Qtrue )
27
24
  flags = flags | MKD_NOPANTS;
28
25
 
26
+ /* filter_html */
27
+ if ( rb_funcall(self, rb_intern("filter_html"), 0) == Qtrue )
28
+ flags = flags | MKD_NOHTML;
29
+
29
30
  MMIOT *doc = mkd_string(RSTRING(text)->ptr, RSTRING(text)->len, flags);
30
31
  markdown(doc, stream, flags);
31
32
 
@@ -36,11 +37,6 @@ rb_rdiscount_to_html(int argc, VALUE *argv, VALUE self)
36
37
 
37
38
  void Init_rdiscount()
38
39
  {
39
- /* Initialize frequently used Symbols */
40
- id_text = rb_intern("text");
41
- id_smart = rb_intern("smart");
42
- id_notes = rb_intern("notes");
43
-
44
40
  rb_cRDiscount = rb_define_class("RDiscount", rb_cObject);
45
41
  rb_define_method(rb_cRDiscount, "to_html", rb_rdiscount_to_html, -1);
46
42
  }
@@ -31,8 +31,11 @@ class RDiscount
31
31
  # Set true to have smarty-like quote translation performed.
32
32
  attr_accessor :smart
33
33
 
34
- # BlueCloth compatible output filtering.
35
- attr_accessor :filter_styles, :filter_html
34
+ # Do not output <style> tags included in the source text.
35
+ attr_accessor :filter_styles
36
+
37
+ # Do not output any raw HTML included in the source text.
38
+ attr_accessor :filter_html
36
39
 
37
40
  # RedCloth compatible line folding -- not used for Markdown but
38
41
  # included for compatibility.
@@ -48,8 +51,7 @@ class RDiscount
48
51
  # the source text.
49
52
  # * <tt>:fold_lines</tt> - RedCloth compatible line folding (not used).
50
53
  #
51
- # NOTE: The <tt>:filter_styles</tt> and <tt>:filter_html</tt> extensions
52
- # are not yet implemented.
54
+ # NOTE: The <tt>:filter_styles</tt> extension is not yet implemented.
53
55
  def initialize(text, *extensions)
54
56
  @text = text
55
57
  @smart = nil
@@ -30,6 +30,11 @@ class MarkdownTest < Test::Unit::TestCase
30
30
  assert_equal "<p><em>start _ foo_bar bar_baz _ end</em> <em>italic</em> <strong>bold</strong> <a><em>blah</em></a></p>", markdown.to_html.strip
31
31
  end
32
32
 
33
+ def test_that_filter_html_works
34
+ markdown = Markdown.new('Through <em>NO</em> <script>DOUBLE NO</script>', :filter_html)
35
+ assert_equal "<p>Through &lt;em>NO&lt;/em> &lt;script>DOUBLE NO&lt;/script></p>", markdown.to_html.strip
36
+ end
37
+
33
38
  def test_that_bluecloth_restrictions_are_supported
34
39
  markdown = Markdown.new('Hello World.')
35
40
  [:filter_html, :filter_styles].each do |restriction|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdiscount
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.7.1
4
+ version: 1.2.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Tomayko
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-08-09 00:00:00 -07:00
12
+ date: 2008-08-26 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15