rmultimarkdown 6.7.0.1 → 6.7.0.2

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
  SHA256:
3
- metadata.gz: 8fd8bfbc3316f0cf803a3cbd85c39b398ec0d83587e4d61898306ed0af65dc99
4
- data.tar.gz: be476ee43b2fee74e71ae988126a0fbe7c255aa02f8017bb9304a2440d734924
3
+ metadata.gz: 2f0716fc464af2d155a21038fa169fa91b3be0fd0e128fb70e191710f898e215
4
+ data.tar.gz: a9dc54567a87cf6b44123b5dc33e5a4ce4e2997a040d35ee9340b7a02868d5e5
5
5
  SHA512:
6
- metadata.gz: 257a1c54b684ce8072d90f392f39dae0f6a249f417b463d54fb7c5f0e9dff50890448e3f35c8f113c65f2a379f276fbbb853f2a832a20a67e33a64ce5e4b77c8
7
- data.tar.gz: b2a99801765040749082e8e6d1a2ce55f832d2fe15ca85d987cec8ccf169b74b1b1ebbe033caaac9e147fab63228992b83ec8788fa325d99c23a765bad712aec
6
+ metadata.gz: a742b7c66fda2db7e4dfae8eb1b0b6cb1e716e84588a2268cd1ee584dd3455b68209c121de381827d1bf7ecb1c8cb9b03a3ac37ef0afb694247d63a1e676e33c
7
+ data.tar.gz: 6c11fa1de094e944daac1082867a5aa1f9fed39e410672b19e12fa92304b1178f14ed69fe71d66a206f1611cebf9ccfc13f43e652f16de6167dd6feaf4d66795
@@ -44,38 +44,54 @@ typedef struct engine_manager {
44
44
  mmd_engine *mmd_engine;
45
45
  } engine_manager;
46
46
 
47
- mmd_engine *get_mmd_engine(VALUE self) {
48
- engine_manager *manager;
49
- Data_Get_Struct(self, engine_manager, manager);
50
-
51
- return manager->mmd_engine;
52
- }
53
-
54
- static void free_engine_manager(engine_manager* manager) {
47
+ static void engine_manager_free(void *ptr) {
48
+ engine_manager *manager = (engine_manager *)ptr;
55
49
  if (manager->mmd_engine) {
56
50
  mmd_engine_free(manager->mmd_engine, true);
51
+ manager->mmd_engine = NULL;
57
52
  }
58
- free(manager);
53
+ xfree(manager);
59
54
  }
60
55
 
56
+ static size_t engine_manager_memsize(const void *ptr) {
57
+ return sizeof(engine_manager);
58
+ }
59
+
60
+ static const rb_data_type_t engine_manager_type = {
61
+ "MultiMarkdown/engine_manager",
62
+ { 0, engine_manager_free, engine_manager_memsize, },
63
+ 0, 0,
64
+ RUBY_TYPED_FREE_IMMEDIATELY
65
+ };
66
+
61
67
  static VALUE rb_multimarkdown_allocate(VALUE klass) {
62
- engine_manager *manager = malloc(sizeof(engine_manager));
68
+ engine_manager *manager;
69
+ VALUE obj = TypedData_Make_Struct(klass, engine_manager, &engine_manager_type, manager);
63
70
  manager->mmd_engine = NULL;
71
+ return obj;
72
+ }
64
73
 
65
- return Data_Wrap_Struct(klass, NULL, free_engine_manager, manager);
74
+ static engine_manager *get_manager(VALUE self) {
75
+ engine_manager *manager;
76
+ TypedData_Get_Struct(self, engine_manager, &engine_manager_type, manager);
77
+ return manager;
78
+ }
79
+
80
+ static mmd_engine *get_mmd_engine(VALUE self) {
81
+ return get_manager(self)->mmd_engine;
66
82
  }
67
83
 
68
84
  static VALUE rb_multimarkdown_start_engine(VALUE self, VALUE text) {
69
85
  Check_Type(text, T_STRING);
70
86
 
71
- engine_manager *manager;
72
- Data_Get_Struct(self, engine_manager, manager);
87
+ engine_manager *manager = get_manager(self);
73
88
 
74
89
  if (manager->mmd_engine) {
75
90
  mmd_engine_free(manager->mmd_engine, true);
91
+ manager->mmd_engine = NULL;
76
92
  }
77
93
 
78
- manager->mmd_engine = mmd_engine_create_with_string(StringValuePtr(text), get_exts(self));
94
+ manager->mmd_engine = mmd_engine_create_with_string(StringValueCStr(text), get_exts(self));
79
95
 
80
96
  return self;
81
97
  }
@@ -84,29 +100,25 @@ static VALUE rb_multimarkdown_start_engine(VALUE self, VALUE text) {
84
100
 
85
101
  static VALUE rb_multimarkdown_set_language(VALUE self, VALUE language) {
86
102
  short lang = ENGLISH;
87
- VALUE language_s = rb_funcall(language, rb_intern("to_s"), 0);
88
103
 
89
- if (rb_funcall(language_s, rb_intern("=="), 1, rb_str_new2("de")) == Qtrue || rb_funcall(language_s, rb_intern("=="), 1, rb_str_new2("german")) == Qtrue) {
104
+ VALUE language_s = rb_obj_as_string(language);
105
+ const char *s = StringValueCStr(language_s);
106
+
107
+ if (strcmp(s, "de") == 0 || strcmp(s, "german") == 0) {
90
108
  lang = GERMANGUILL;
91
- }
92
- else if (rb_funcall(language_s, rb_intern("=="), 1, rb_str_new2("ch")) == Qtrue || rb_funcall(language_s, rb_intern("=="), 1, rb_str_new2("de-ch")) == Qtrue || rb_funcall(language_s, rb_intern("=="), 1, rb_str_new2("swiss")) == Qtrue) {
109
+ } else if (strcmp(s, "ch") == 0 || strcmp(s, "de-ch") == 0 || strcmp(s, "swiss") == 0) {
93
110
  lang = GERMAN;
94
- }
95
- else if (rb_funcall(language_s, rb_intern("=="), 1, rb_str_new2("nl")) == Qtrue || rb_funcall(language_s, rb_intern("=="), 1, rb_str_new2("dutch")) == Qtrue) {
111
+ } else if (strcmp(s, "nl") == 0 || strcmp(s, "dutch") == 0) {
96
112
  lang = DUTCH;
97
- }
98
- else if (rb_funcall(language_s, rb_intern("=="), 1, rb_str_new2("fr")) == Qtrue || rb_funcall(language_s, rb_intern("=="), 1, rb_str_new2("french")) == Qtrue) {
113
+ } else if (strcmp(s, "fr") == 0 || strcmp(s, "french") == 0) {
99
114
  lang = FRENCH;
100
- }
101
- else if (rb_funcall(language_s, rb_intern("=="), 1, rb_str_new2("sp")) == Qtrue || rb_funcall(language_s, rb_intern("=="), 1, rb_str_new2("spanish")) == Qtrue) {
115
+ } else if (strcmp(s, "sp") == 0 || strcmp(s, "spanish") == 0) {
102
116
  lang = SPANISH;
103
- }
104
- else if (rb_funcall(language_s, rb_intern("=="), 1, rb_str_new2("sv")) == Qtrue || rb_funcall(language_s, rb_intern("=="), 1, rb_str_new2("swedish")) == Qtrue) {
117
+ } else if (strcmp(s, "sv") == 0 || strcmp(s, "swedish") == 0) {
105
118
  lang = SWEDISH;
106
119
  }
107
120
 
108
121
  mmd_engine_set_language(get_mmd_engine(self), lang);
109
-
110
122
  return language;
111
123
  }
112
124
 
@@ -127,21 +139,36 @@ static VALUE rb_multimarkdown_to_latex(VALUE self) {
127
139
  }
128
140
 
129
141
  static VALUE rb_multimarkdown_extract_metadata_keys(VALUE self) {
130
- char *metadata_keys = mmd_engine_metadata_keys(get_mmd_engine(self));
142
+ mmd_engine *engine = get_mmd_engine(self);
143
+ size_t end = 0;
144
+
145
+ if (!mmd_engine_has_metadata(engine, &end)) {
146
+ return rb_ary_new();
147
+ }
148
+
149
+ char *metadata_keys = mmd_engine_metadata_keys(engine);
131
150
  VALUE str = rb_utf8_str_new_cstr(metadata_keys);
132
151
  free(metadata_keys);
133
152
 
134
- return rb_funcall(str, rb_intern("split"), 1, rb_str_new2("\n"));
153
+ return rb_funcall(str, rb_intern("split"), 1, rb_str_new_cstr("\n"));
135
154
  }
136
155
 
137
156
  static VALUE rb_multimarkdown_extract_metadata_value(VALUE self, VALUE key) {
138
157
  Check_Type(key, T_STRING);
139
- char *pkey = StringValuePtr(key);
140
158
 
141
- char *metadata = mmd_engine_metavalue_for_key(get_mmd_engine(self), pkey);
142
- VALUE result = rb_utf8_str_new_cstr(metadata);
159
+ mmd_engine *engine = get_mmd_engine(self);
160
+ size_t end = 0;
143
161
 
144
- return result;
162
+ if (!mmd_engine_has_metadata(engine, &end)) {
163
+ return Qnil;
164
+ }
165
+
166
+ char *metadata = mmd_engine_metavalue_for_key(engine, StringValueCStr(key));
167
+ if (metadata == NULL) {
168
+ return Qnil;
169
+ }
170
+
171
+ return rb_utf8_str_new_cstr(metadata);
145
172
  }
146
173
 
147
174
  //*** Define Class
@@ -187,7 +214,7 @@ void Init_multi_markdown() {
187
214
  * The version of the MultiMarkdown-6 library
188
215
  */
189
216
  char *version = mmd_version();
190
- rb_define_const(rb_cMultiMarkdown, "MMD_VERSION", rb_str_new2(version));
217
+ rb_define_const(rb_cMultiMarkdown, "MMD_VERSION", rb_str_new_cstr(version));
191
218
  free(version);
192
219
 
193
220
  }
@@ -1,6 +1,6 @@
1
1
  class MultiMarkdown
2
2
 
3
3
  # The ruby 'multimarkdown' gem version
4
- VERSION = "6.7.0.1"
4
+ VERSION = "6.7.0.2"
5
5
 
6
6
  end
Binary file
@@ -87,4 +87,17 @@ eof
87
87
  assert_equal("M€tädätä", multimarkdown.metadata('umlauts'))
88
88
  end
89
89
 
90
+ def test_empty_metadata
91
+ m = MultiMarkdown.new "# Markdown without metadata"
92
+ assert_equal({}, m.metadata)
93
+
94
+ m2 = MultiMarkdown.new "foo: bar\n\n# Markdown with some metadata"
95
+ assert_equal("bar", m2.extract_metadata_value("foo"))
96
+ assert_equal(nil, m2.extract_metadata_value("doesnt_exist"))
97
+
98
+ m3 = MultiMarkdown.new "foo: bar\n\n# More Markdown", :no_metadata
99
+ assert_equal(nil, m3.extract_metadata_value("foo"))
100
+ assert_equal(nil, m3.extract_metadata_value("doesnt_exist"))
101
+ end
102
+
90
103
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rmultimarkdown
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.7.0.1
4
+ version: 6.7.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Till Schulte-Coerne