greenmat 3.2.0.0 → 3.2.0.1

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.
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