greenmat 3.2.0.0 → 3.2.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fda7624ffadcd3576cd31d5785a9aa9eaf14cfe7
4
- data.tar.gz: 5ebc173f5a5dd42dcb73e3454303533484d31c47
3
+ metadata.gz: 99e020834997f3b59f385346f3667d1ca32fdbac
4
+ data.tar.gz: 17d1921ed9bb728470eb37ea620c067ffdda1fc6
5
5
  SHA512:
6
- metadata.gz: 9401853a7711a8969caabd10a54b3da514cbfc391cbdfc4796732876200f03d0c7d87f9266803069d2bd27cc4dc5806a711d8409efba540543d9d05afb6408d5
7
- data.tar.gz: c7c3611dd92f07addaad1c3781eaabc5aa04e696c66ac52d5d5ca59985d6e621a47464f6453aabe9e6c2df925ab7ea167903273bd59ec6211638b9c62d2feb7f
6
+ metadata.gz: 7b112616170f2816923c42db5bdda43a9d727976164ce49d0c1fc76980c6405ed7c437eca3f4c103fab72b6f38199e6580eeeb7c063bcb4367f635232718ae93
7
+ data.tar.gz: 7850871f158ca6527c602d8bf69896f5b59cb606057615893565c9ce2f7507ec6814e3de20135325b419162fd67aa6754e2c1f570b70a13083f44a878f1348a9
@@ -68,6 +68,9 @@ static void rb_greenmat_md_flags(VALUE hash, unsigned int *enabled_extensions_p)
68
68
  if (rb_hash_lookup(hash, CSTR2SYM("footnotes")) == Qtrue)
69
69
  extensions |= MKDEXT_FOOTNOTES;
70
70
 
71
+ if (rb_hash_lookup(hash, CSTR2SYM("no_mention_emphasis")) == Qtrue)
72
+ extensions |= MKDEXT_NO_MENTION_EMPHASIS;
73
+
71
74
  *enabled_extensions_p = extensions;
72
75
  }
73
76
 
@@ -342,6 +342,12 @@ _isalnum(int c)
342
342
  return isalnum(c) && c < 0x7f;
343
343
  }
344
344
 
345
+ static inline int
346
+ is_wordchar(int c)
347
+ {
348
+ return _isalnum(c) || c == '_' || c == '-';
349
+ }
350
+
345
351
  /*
346
352
  * Check whether a char is a Markdown space.
347
353
 
@@ -587,6 +593,38 @@ find_emph_char(uint8_t *data, size_t size, uint8_t c)
587
593
  return 0;
588
594
  }
589
595
 
596
+ static int
597
+ is_part_of_mention(uint8_t *data, size_t offset)
598
+ {
599
+ int i;
600
+ int lookbehind_limit = (int)-offset;
601
+ uint8_t character;
602
+
603
+ for (i = 0; i >= lookbehind_limit; i--) {
604
+ character = data[i];
605
+
606
+ if (is_wordchar(character)) {
607
+ // Continue lookbehind.
608
+ } else if (character == '@') {
609
+ if (i == offset) {
610
+ // The "@" is at beginning of the text. (e.g. "@foo")
611
+ return 1;
612
+ } else {
613
+ // Check if the previous character of the "@" is alphanumeric or not.
614
+ // " @foo" and "あ@foo" are mentions.
615
+ // "a@foo" is not a mention.
616
+ uint8_t prev_character = data[i - 1];
617
+ return !_isalnum(prev_character);
618
+ }
619
+ } else {
620
+ // Found non-mention character, so this is not a mention.
621
+ return 0;
622
+ }
623
+ }
624
+
625
+ return 0;
626
+ }
627
+
590
628
  /* parse_emph1 • parsing single emphase */
591
629
  /* closed by a symbol not preceded by whitespace and not followed by symbol */
592
630
  static size_t
@@ -612,6 +650,11 @@ parse_emph1(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size
612
650
  continue;
613
651
  }
614
652
 
653
+ if (rndr->ext_flags & MKDEXT_NO_MENTION_EMPHASIS) {
654
+ if (is_part_of_mention(data + i, i))
655
+ continue;
656
+ }
657
+
615
658
  work = rndr_newbuf(rndr, BUFFER_SPAN);
616
659
  parse_inline(work, rndr, data, i);
617
660
 
@@ -642,6 +685,11 @@ parse_emph2(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size
642
685
  i += len;
643
686
 
644
687
  if (i + 1 < size && data[i] == c && data[i + 1] == c && i && !_isspace(data[i - 1])) {
688
+ if (rndr->ext_flags & MKDEXT_NO_MENTION_EMPHASIS) {
689
+ if (is_part_of_mention(data + i, i))
690
+ continue;
691
+ }
692
+
645
693
  work = rndr_newbuf(rndr, BUFFER_SPAN);
646
694
  parse_inline(work, rndr, data, i);
647
695
 
@@ -678,6 +726,11 @@ parse_emph3(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size
678
726
  continue;
679
727
 
680
728
  if (i + 2 < size && data[i + 1] == c && data[i + 2] == c && rndr->cb.triple_emphasis) {
729
+ if (rndr->ext_flags & MKDEXT_NO_MENTION_EMPHASIS) {
730
+ if (is_part_of_mention(data + i, i))
731
+ continue;
732
+ }
733
+
681
734
  /* triple symbol found */
682
735
  struct buf *work = rndr_newbuf(rndr, BUFFER_SPAN);
683
736
 
@@ -714,6 +767,11 @@ char_emphasis(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t of
714
767
  return 0;
715
768
  }
716
769
 
770
+ if (rndr->ext_flags & MKDEXT_NO_MENTION_EMPHASIS) {
771
+ if (is_part_of_mention(data, offset))
772
+ return 0;
773
+ }
774
+
717
775
  if (size > 2 && data[1] != c) {
718
776
  /* whitespace cannot follow an opening emphasis;
719
777
  * strikethrough only takes two characters '~~' */
@@ -58,7 +58,8 @@ enum mkd_extensions {
58
58
  MKDEXT_DISABLE_INDENTED_CODE = (1 << 9),
59
59
  MKDEXT_HIGHLIGHT = (1 << 10),
60
60
  MKDEXT_FOOTNOTES = (1 << 11),
61
- MKDEXT_QUOTE = (1 << 12)
61
+ MKDEXT_QUOTE = (1 << 12),
62
+ MKDEXT_NO_MENTION_EMPHASIS = (1 << 13)
62
63
  };
63
64
 
64
65
  /* sd_callbacks - functions for rendering parsed data */
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'greenmat'
4
+ require 'greenmat/version'
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = 'greenmat'
@@ -1,9 +1,8 @@
1
1
  require 'greenmat.so'
2
2
  require 'greenmat/compat'
3
+ require 'greenmat/version'
3
4
 
4
5
  module Greenmat
5
- VERSION = '3.2.0.0'
6
-
7
6
  class Markdown
8
7
  attr_reader :renderer
9
8
  end
@@ -4,13 +4,18 @@ require 'test_helper'
4
4
  class MarkdownTest < Greenmat::TestCase
5
5
 
6
6
  def setup
7
- @markdown = Greenmat::Markdown.new(Greenmat::Render::HTML)
7
+ @markdown = Greenmat::Markdown.new(Greenmat::Render::HTML, greenmat_options)
8
8
  end
9
9
 
10
10
  def render_with(flags, text)
11
+ flags = greenmat_options.merge(flags)
11
12
  Greenmat::Markdown.new(Greenmat::Render::HTML, flags).render(text)
12
13
  end
13
14
 
15
+ def greenmat_options
16
+ { no_mention_emphasis: true }
17
+ end
18
+
14
19
  def test_that_simple_one_liner_goes_to_html
15
20
  assert_respond_to @markdown, :render
16
21
  assert_equal "<p>Hello World.</p>\n", @markdown.render("Hello World.")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: greenmat
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.0.0
4
+ version: 3.2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Natacha Porté
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-03-24 00:00:00.000000000 Z
12
+ date: 2015-03-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake-compiler