pygments.rb 0.2.13 → 0.3.0

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.
Files changed (64) hide show
  1. data/.gitignore +1 -0
  2. data/README.md +45 -19
  3. data/Rakefile +21 -11
  4. data/bench.rb +15 -48
  5. data/cache-lexers.rb +8 -0
  6. data/lexers +0 -0
  7. data/lib/pygments.rb +3 -6
  8. data/lib/pygments/mentos.py +343 -0
  9. data/lib/pygments/popen.rb +383 -0
  10. data/lib/pygments/version.rb +1 -1
  11. data/pygments.rb.gemspec +5 -4
  12. data/test/test_data.c +2581 -0
  13. data/test/test_data.py +514 -0
  14. data/test/test_data_generated +2582 -0
  15. data/test/test_pygments.rb +208 -84
  16. data/vendor/pygments-main/pygments/lexers/_mapping.py +1 -1
  17. data/vendor/pygments-main/pygments/lexers/shell.py +1 -1
  18. data/vendor/simplejson/.gitignore +10 -0
  19. data/vendor/simplejson/.travis.yml +5 -0
  20. data/vendor/simplejson/CHANGES.txt +291 -0
  21. data/vendor/simplejson/LICENSE.txt +19 -0
  22. data/vendor/simplejson/MANIFEST.in +5 -0
  23. data/vendor/simplejson/README.rst +19 -0
  24. data/vendor/simplejson/conf.py +179 -0
  25. data/vendor/simplejson/index.rst +628 -0
  26. data/vendor/simplejson/scripts/make_docs.py +18 -0
  27. data/vendor/simplejson/setup.py +104 -0
  28. data/vendor/simplejson/simplejson/__init__.py +510 -0
  29. data/vendor/simplejson/simplejson/_speedups.c +2745 -0
  30. data/vendor/simplejson/simplejson/decoder.py +425 -0
  31. data/vendor/simplejson/simplejson/encoder.py +567 -0
  32. data/vendor/simplejson/simplejson/ordered_dict.py +119 -0
  33. data/vendor/simplejson/simplejson/scanner.py +77 -0
  34. data/vendor/simplejson/simplejson/tests/__init__.py +67 -0
  35. data/vendor/simplejson/simplejson/tests/test_bigint_as_string.py +55 -0
  36. data/vendor/simplejson/simplejson/tests/test_check_circular.py +30 -0
  37. data/vendor/simplejson/simplejson/tests/test_decimal.py +66 -0
  38. data/vendor/simplejson/simplejson/tests/test_decode.py +83 -0
  39. data/vendor/simplejson/simplejson/tests/test_default.py +9 -0
  40. data/vendor/simplejson/simplejson/tests/test_dump.py +67 -0
  41. data/vendor/simplejson/simplejson/tests/test_encode_basestring_ascii.py +46 -0
  42. data/vendor/simplejson/simplejson/tests/test_encode_for_html.py +32 -0
  43. data/vendor/simplejson/simplejson/tests/test_errors.py +34 -0
  44. data/vendor/simplejson/simplejson/tests/test_fail.py +91 -0
  45. data/vendor/simplejson/simplejson/tests/test_float.py +19 -0
  46. data/vendor/simplejson/simplejson/tests/test_indent.py +86 -0
  47. data/vendor/simplejson/simplejson/tests/test_item_sort_key.py +20 -0
  48. data/vendor/simplejson/simplejson/tests/test_namedtuple.py +121 -0
  49. data/vendor/simplejson/simplejson/tests/test_pass1.py +76 -0
  50. data/vendor/simplejson/simplejson/tests/test_pass2.py +14 -0
  51. data/vendor/simplejson/simplejson/tests/test_pass3.py +20 -0
  52. data/vendor/simplejson/simplejson/tests/test_recursion.py +67 -0
  53. data/vendor/simplejson/simplejson/tests/test_scanstring.py +117 -0
  54. data/vendor/simplejson/simplejson/tests/test_separators.py +42 -0
  55. data/vendor/simplejson/simplejson/tests/test_speedups.py +20 -0
  56. data/vendor/simplejson/simplejson/tests/test_tuple.py +49 -0
  57. data/vendor/simplejson/simplejson/tests/test_unicode.py +109 -0
  58. data/vendor/simplejson/simplejson/tool.py +39 -0
  59. metadata +80 -22
  60. data/ext/extconf.rb +0 -14
  61. data/ext/pygments.c +0 -466
  62. data/lib/pygments/c.rb +0 -54
  63. data/lib/pygments/ffi.rb +0 -155
  64. data/vendor/.gitignore +0 -1
@@ -0,0 +1,39 @@
1
+ r"""Command-line tool to validate and pretty-print JSON
2
+
3
+ Usage::
4
+
5
+ $ echo '{"json":"obj"}' | python -m simplejson.tool
6
+ {
7
+ "json": "obj"
8
+ }
9
+ $ echo '{ 1.2:3.4}' | python -m simplejson.tool
10
+ Expecting property name: line 1 column 2 (char 2)
11
+
12
+ """
13
+ import sys
14
+ import simplejson as json
15
+
16
+ def main():
17
+ if len(sys.argv) == 1:
18
+ infile = sys.stdin
19
+ outfile = sys.stdout
20
+ elif len(sys.argv) == 2:
21
+ infile = open(sys.argv[1], 'rb')
22
+ outfile = sys.stdout
23
+ elif len(sys.argv) == 3:
24
+ infile = open(sys.argv[1], 'rb')
25
+ outfile = open(sys.argv[2], 'wb')
26
+ else:
27
+ raise SystemExit(sys.argv[0] + " [infile [outfile]]")
28
+ try:
29
+ obj = json.load(infile,
30
+ object_pairs_hook=json.OrderedDict,
31
+ use_decimal=True)
32
+ except ValueError, e:
33
+ raise SystemExit(e)
34
+ json.dump(obj, outfile, sort_keys=True, indent=' ', use_decimal=True)
35
+ outfile.write('\n')
36
+
37
+
38
+ if __name__ == '__main__':
39
+ main()
metadata CHANGED
@@ -1,46 +1,62 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pygments.rb
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 2
9
- - 13
10
- version: 0.2.13
8
+ - 3
9
+ - 0
10
+ version: 0.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Aman Gupta
14
+ - Ted Nyman
14
15
  autorequire:
15
16
  bindir: bin
16
17
  cert_chain: []
17
18
 
18
- date: 2012-06-19 00:00:00 +02:00
19
- default_executable:
19
+ date: 2012-09-26 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- name: rubypython
22
+ name: yajl-ruby
23
23
  prerelease: false
24
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
- hash: 13
29
+ hash: 19
30
30
  segments:
31
+ - 1
32
+ - 1
31
33
  - 0
32
- - 5
33
- - 3
34
- version: 0.5.3
34
+ version: 1.1.0
35
35
  type: :runtime
36
36
  version_requirements: *id001
37
37
  - !ruby/object:Gem::Dependency
38
- name: rake-compiler
38
+ name: posix-spawn
39
39
  prerelease: false
40
40
  requirement: &id002 !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
- - - "="
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ hash: 31
46
+ segments:
47
+ - 0
48
+ - 3
49
+ - 6
50
+ version: 0.3.6
51
+ type: :runtime
52
+ version_requirements: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ name: rake-compiler
55
+ prerelease: false
56
+ requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
44
60
  - !ruby/object:Gem::Version
45
61
  hash: 15
46
62
  segments:
@@ -49,8 +65,8 @@ dependencies:
49
65
  - 6
50
66
  version: 0.7.6
51
67
  type: :development
52
- version_requirements: *id002
53
- description: pygments.rb exposes the pygments syntax highlighter via embedded python
68
+ version_requirements: *id003
69
+ description: pygments.rb exposes the pygments syntax highlighter to Ruby
54
70
  email:
55
71
  - aman@tmm1.net
56
72
  executables: []
@@ -65,16 +81,18 @@ files:
65
81
  - README.md
66
82
  - Rakefile
67
83
  - bench.rb
68
- - ext/extconf.rb
69
- - ext/pygments.c
84
+ - cache-lexers.rb
85
+ - lexers
70
86
  - lib/pygments.rb
71
- - lib/pygments/c.rb
72
- - lib/pygments/ffi.rb
73
87
  - lib/pygments/lexer.rb
88
+ - lib/pygments/mentos.py
89
+ - lib/pygments/popen.rb
74
90
  - lib/pygments/version.rb
75
91
  - pygments.rb.gemspec
92
+ - test/test_data.c
93
+ - test/test_data.py
94
+ - test/test_data_generated
76
95
  - test/test_pygments.rb
77
- - vendor/.gitignore
78
96
  - vendor/custom_lexers/github.py
79
97
  - vendor/pygments-main/AUTHORS
80
98
  - vendor/pygments-main/CHANGES
@@ -413,7 +431,47 @@ files:
413
431
  - vendor/pygments-main/tests/test_token.py
414
432
  - vendor/pygments-main/tests/test_using_api.py
415
433
  - vendor/pygments-main/tests/test_util.py
416
- has_rdoc: true
434
+ - vendor/simplejson/.gitignore
435
+ - vendor/simplejson/.travis.yml
436
+ - vendor/simplejson/CHANGES.txt
437
+ - vendor/simplejson/LICENSE.txt
438
+ - vendor/simplejson/MANIFEST.in
439
+ - vendor/simplejson/README.rst
440
+ - vendor/simplejson/conf.py
441
+ - vendor/simplejson/index.rst
442
+ - vendor/simplejson/scripts/make_docs.py
443
+ - vendor/simplejson/setup.py
444
+ - vendor/simplejson/simplejson/__init__.py
445
+ - vendor/simplejson/simplejson/_speedups.c
446
+ - vendor/simplejson/simplejson/decoder.py
447
+ - vendor/simplejson/simplejson/encoder.py
448
+ - vendor/simplejson/simplejson/ordered_dict.py
449
+ - vendor/simplejson/simplejson/scanner.py
450
+ - vendor/simplejson/simplejson/tests/__init__.py
451
+ - vendor/simplejson/simplejson/tests/test_bigint_as_string.py
452
+ - vendor/simplejson/simplejson/tests/test_check_circular.py
453
+ - vendor/simplejson/simplejson/tests/test_decimal.py
454
+ - vendor/simplejson/simplejson/tests/test_decode.py
455
+ - vendor/simplejson/simplejson/tests/test_default.py
456
+ - vendor/simplejson/simplejson/tests/test_dump.py
457
+ - vendor/simplejson/simplejson/tests/test_encode_basestring_ascii.py
458
+ - vendor/simplejson/simplejson/tests/test_encode_for_html.py
459
+ - vendor/simplejson/simplejson/tests/test_errors.py
460
+ - vendor/simplejson/simplejson/tests/test_fail.py
461
+ - vendor/simplejson/simplejson/tests/test_float.py
462
+ - vendor/simplejson/simplejson/tests/test_indent.py
463
+ - vendor/simplejson/simplejson/tests/test_item_sort_key.py
464
+ - vendor/simplejson/simplejson/tests/test_namedtuple.py
465
+ - vendor/simplejson/simplejson/tests/test_pass1.py
466
+ - vendor/simplejson/simplejson/tests/test_pass2.py
467
+ - vendor/simplejson/simplejson/tests/test_pass3.py
468
+ - vendor/simplejson/simplejson/tests/test_recursion.py
469
+ - vendor/simplejson/simplejson/tests/test_scanstring.py
470
+ - vendor/simplejson/simplejson/tests/test_separators.py
471
+ - vendor/simplejson/simplejson/tests/test_speedups.py
472
+ - vendor/simplejson/simplejson/tests/test_tuple.py
473
+ - vendor/simplejson/simplejson/tests/test_unicode.py
474
+ - vendor/simplejson/simplejson/tool.py
417
475
  homepage: http://github.com/tmm1/pygments.rb
418
476
  licenses: []
419
477
 
@@ -443,7 +501,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
443
501
  requirements: []
444
502
 
445
503
  rubyforge_project:
446
- rubygems_version: 1.6.2
504
+ rubygems_version: 1.8.24
447
505
  signing_key:
448
506
  specification_version: 3
449
507
  summary: pygments wrapper for ruby
data/ext/extconf.rb DELETED
@@ -1,14 +0,0 @@
1
- require 'mkmf'
2
-
3
- python = %w[ 2.7 2.6 2.5 2.4 ].find do |version|
4
- have_library("python#{version}", 'Py_Initialize', "python#{version}/Python.h")
5
- end
6
-
7
- $CFLAGS << " -Wall "
8
-
9
- unless python
10
- $stderr.puts '*** could not find libpython or Python.h'
11
- else
12
- $defs << "-DPYGMENTS_PYTHON_VERSION=#{python.gsub('.','')}"
13
- create_makefile('pygments_ext')
14
- end
data/ext/pygments.c DELETED
@@ -1,466 +0,0 @@
1
- #include <stdio.h>
2
- #include <stdlib.h>
3
-
4
- #include <ruby.h>
5
-
6
- #if PYGMENTS_PYTHON_VERSION == 24
7
- #include <python2.4/Python.h>
8
- #elif PYGMENTS_PYTHON_VERSION == 25
9
- #include <python2.5/Python.h>
10
- #elif PYGMENTS_PYTHON_VERSION == 26
11
- #include <python2.6/Python.h>
12
- #elif PYGMENTS_PYTHON_VERSION == 27
13
- #include <python2.7/Python.h>
14
- #else
15
- #error Unknown python version
16
- #endif
17
-
18
- #ifdef RUBY_VM
19
- #include <ruby/st.h>
20
- #include <ruby/encoding.h>
21
- #else
22
- #include <st.h>
23
- #endif
24
-
25
- #ifndef RSTRING_PTR
26
- #define RSTRING_PTR(str) RSTRING(str)->ptr
27
- #endif
28
- #ifndef RSTRING_LEN
29
- #define RSTRING_LEN(str) RSTRING(str)->len
30
- #endif
31
-
32
- static VALUE mPygments, mPygmentsC;
33
- static PyObject
34
- /* modules */
35
- *pygments,
36
- *pygments_lexers,
37
- *pygments_formatters,
38
- *pygments_styles,
39
- *pygments_filters,
40
-
41
- /* lexer methods */
42
- *guess_lexer,
43
- *guess_lexer_for_filename,
44
- *get_lexer_for_mimetype,
45
- *get_lexer_for_filename,
46
- *get_lexer_by_name,
47
- *get_all_lexers,
48
-
49
- /* formatter methods */
50
- *get_formatter_by_name,
51
- *get_all_formatters,
52
-
53
- /* highlighter methods */
54
- *highlight,
55
-
56
- /* style methods */
57
- *get_all_styles,
58
-
59
- /* filter methods */
60
- *get_all_filters;
61
-
62
- static int
63
- each_hash_i(VALUE key, VALUE val, VALUE arg)
64
- {
65
- Check_Type(key, T_SYMBOL);
66
-
67
- PyObject *py = (PyObject*) arg, *py_val = NULL;
68
- switch (TYPE(val)) {
69
- case T_NIL:
70
- return ST_CONTINUE;
71
- break;
72
-
73
- case T_FALSE:
74
- py_val = Py_False;
75
- break;
76
-
77
- case T_TRUE:
78
- py_val = Py_True;
79
- break;
80
-
81
- case T_STRING:
82
- py_val = PyString_FromString(RSTRING_PTR(val));
83
- break;
84
-
85
- default:
86
- Check_Type(val, T_STRING);
87
- }
88
-
89
- PyDict_SetItemString(py, rb_id2name(SYM2ID(key)), py_val);
90
-
91
- return ST_CONTINUE;
92
- }
93
-
94
- static PyObject*
95
- rb_to_py(VALUE rb)
96
- {
97
- PyObject *py = NULL;
98
-
99
- switch (TYPE(rb)) {
100
- case T_HASH:
101
- py = PyDict_New();
102
- rb_hash_foreach(rb, each_hash_i, (VALUE)py);
103
- break;
104
- }
105
-
106
- return py;
107
- }
108
-
109
- static VALUE
110
- py_to_rb(PyObject *py)
111
- {
112
- VALUE rb = Qnil;
113
- Py_ssize_t len, i;
114
-
115
- if (py) {
116
- if (PyIter_Check(py)) {
117
- PyObject *item;
118
- rb = rb_ary_new();
119
-
120
- while ((item = PyIter_Next(py))) {
121
- rb_ary_push(rb, py_to_rb(item));
122
- Py_DECREF(item);
123
- }
124
-
125
- } else if (PyString_Check(py)) {
126
- char *data;
127
-
128
- if (PyString_AsStringAndSize(py, &data, &len) == 0) {
129
- rb = rb_str_new(data, len);
130
- }
131
-
132
- } else if (PyTuple_Check(py)) {
133
- len = PyTuple_Size(py);
134
-
135
- PyObject *item;
136
- rb = rb_ary_new();
137
-
138
- for (i=0; i<len; i++) {
139
- item = PyTuple_GetItem(py, i);
140
- rb_ary_push(rb, py_to_rb(item));
141
- }
142
-
143
- } else if (PyList_Check(py)) {
144
- len = PyList_Size(py);
145
-
146
- PyObject *item;
147
- rb = rb_ary_new();
148
-
149
- for (i=0; i<len; i++) {
150
- item = PyList_GetItem(py, i);
151
- rb_ary_push(rb, py_to_rb(item));
152
- }
153
-
154
- } else if (PyDict_Check(py)) {
155
- PyObject *key, *val;
156
- Py_ssize_t pos = 0;
157
-
158
- rb = rb_hash_new();
159
-
160
- while (PyDict_Next(py, &pos, &key, &val)) {
161
- rb_hash_aset(rb, py_to_rb(key), py_to_rb(val));
162
- }
163
- }
164
- }
165
-
166
- return rb;
167
- }
168
-
169
- static PyObject*
170
- pygments__lexer_for(VALUE code, VALUE options)
171
- {
172
- VALUE filename, mimetype, lexer;
173
- PyObject *ret = NULL, *args = NULL, *kwargs = NULL;
174
-
175
- if (RTEST(code))
176
- Check_Type(code, T_STRING);
177
-
178
- if (RTEST(options)) {
179
- Check_Type(options, T_HASH);
180
-
181
- VALUE kw = rb_hash_aref(options, ID2SYM(rb_intern("options")));
182
- if (RTEST(kw)) {
183
- Check_Type(kw, T_HASH);
184
- kwargs = rb_to_py(kw);
185
- }
186
-
187
- lexer = rb_hash_aref(options, ID2SYM(rb_intern("lexer")));
188
- filename = rb_hash_aref(options, ID2SYM(rb_intern("filename")));
189
- mimetype = rb_hash_aref(options, ID2SYM(rb_intern("mimetype")));
190
-
191
- if (RTEST(lexer)) {
192
- Check_Type(lexer, T_STRING);
193
- args = Py_BuildValue("(s)", RSTRING_PTR(lexer));
194
- ret = PyObject_Call(get_lexer_by_name, args, kwargs);
195
-
196
- } else if (RTEST(mimetype)) {
197
- Check_Type(mimetype, T_STRING);
198
- args = Py_BuildValue("(s)", RSTRING_PTR(mimetype));
199
- ret = PyObject_Call(get_lexer_for_mimetype, args, kwargs);
200
-
201
- } else if (RTEST(filename)) {
202
- Check_Type(filename, T_STRING);
203
-
204
- if (RTEST(code)) {
205
- args = Py_BuildValue("(ss)", RSTRING_PTR(filename), RSTRING_PTR(code));
206
- ret = PyObject_Call(guess_lexer_for_filename, args, kwargs);
207
- } else {
208
- args = Py_BuildValue("(s)", RSTRING_PTR(filename));
209
- ret = PyObject_Call(get_lexer_for_filename, args, kwargs);
210
- }
211
- }
212
- }
213
-
214
- if (ret == NULL && RTEST(code)) {
215
- args = Py_BuildValue("(s)", RSTRING_PTR(code));
216
- ret = PyObject_Call(guess_lexer, args, kwargs);
217
- }
218
-
219
- Py_XDECREF(args);
220
- Py_XDECREF(kwargs);
221
- PyErr_Clear();
222
- return ret;
223
- }
224
-
225
- static VALUE
226
- rb_pygments_lexer_name_for(int argc, VALUE *argv, VALUE self)
227
- {
228
- VALUE code = Qnil, options = Qnil;
229
- VALUE name = Qnil;
230
- PyObject *lexer = NULL, *aliases = NULL;
231
-
232
- int found = rb_scan_args(argc, argv, "11", &code, &options);
233
-
234
- if (found > 0) {
235
- if (found == 1 && TYPE(code) == T_HASH) {
236
- options = code;
237
- code = Qnil;
238
- }
239
-
240
- lexer = pygments__lexer_for(code, options);
241
-
242
- if (lexer) {
243
- aliases = PyObject_GetAttrString(lexer, "aliases");
244
- if (aliases && PyList_Size(aliases) > 0) {
245
- PyObject *alias = PyList_GetItem(aliases, 0);
246
- name = rb_str_new2(PyString_AsString(alias));
247
- }
248
- }
249
- }
250
-
251
- Py_XDECREF(aliases);
252
- Py_XDECREF(lexer);
253
- PyErr_Clear();
254
- return name;
255
- }
256
-
257
- static VALUE
258
- rb_pygments_css(int argc, VALUE *argv, VALUE self)
259
- {
260
- VALUE css = Qnil, prefix = Qnil, options = Qnil;
261
- PyObject *args = NULL, *kwargs = NULL, *formatter = NULL;
262
- int found = rb_scan_args(argc, argv, "02", &prefix, &options);
263
-
264
- if (found == 1 && TYPE(prefix) == T_HASH) {
265
- options = prefix;
266
- prefix = Qnil;
267
- }
268
-
269
- if (RTEST(prefix))
270
- Check_Type(prefix, T_STRING);
271
-
272
- if (RTEST(options)) {
273
- Check_Type(options, T_HASH);
274
- kwargs = rb_to_py(options);
275
- }
276
-
277
- args = Py_BuildValue("(s)", "html");
278
- formatter = PyObject_Call(get_formatter_by_name, args, kwargs);
279
- if (formatter) {
280
- PyObject *styles = PyObject_CallMethod(formatter, "get_style_defs", "(s)", RTEST(prefix) ? RSTRING_PTR(prefix) : "");
281
- if (styles) {
282
- css = rb_str_new2(PyString_AsString(styles));
283
- }
284
- Py_XDECREF(styles);
285
- }
286
-
287
- Py_XDECREF(args);
288
- Py_XDECREF(kwargs);
289
- Py_XDECREF(formatter);
290
- PyErr_Clear();
291
-
292
- return css;
293
- }
294
-
295
- static VALUE
296
- rb_pygments_highlight(int argc, VALUE *argv, VALUE self)
297
- {
298
- PyObject *args = NULL, *kwargs = NULL, *lexer = NULL, *formatter = NULL;
299
- VALUE code = Qnil, options = Qnil, ret = Qnil, format = Qnil;
300
- rb_scan_args(argc, argv, "11", &code, &options);
301
-
302
- if (RTEST(options)) {
303
- format = rb_hash_aref(options, ID2SYM(rb_intern("formatter")));
304
- if (RTEST(format))
305
- Check_Type(format, T_STRING);
306
-
307
- VALUE kw = rb_hash_aref(options, ID2SYM(rb_intern("options")));
308
- if (RTEST(kw)) {
309
- Check_Type(kw, T_HASH);
310
- kwargs = rb_to_py(kw);
311
- }
312
- }
313
-
314
- lexer = pygments__lexer_for(code, options);
315
-
316
- if (lexer) {
317
- args = Py_BuildValue("(s)", RTEST(format) ? RSTRING_PTR(format) : "html");
318
- formatter = PyObject_Call(get_formatter_by_name, args, kwargs);
319
- Py_XDECREF(args);
320
- args = NULL;
321
-
322
- if (formatter) {
323
- PyObject *input = NULL, *output = NULL;
324
-
325
- input = PyUnicode_FromStringAndSize(RSTRING_PTR(code), RSTRING_LEN(code));
326
- if (input) {
327
- output = PyObject_CallFunction(highlight, "(OOO)", input, lexer, formatter);
328
-
329
- if (output) {
330
- PyObject *string = PyUnicode_AsEncodedString(output, "utf-8", "strict");
331
- if (string) {
332
- Py_ssize_t len;
333
- char *data;
334
-
335
- if (PyString_AsStringAndSize(string, &data, &len) == 0) {
336
- ret = rb_str_new(data, len);
337
- }
338
- }
339
- Py_XDECREF(string);
340
- }
341
- }
342
-
343
- Py_XDECREF(output);
344
- Py_XDECREF(input);
345
- }
346
- }
347
-
348
- Py_XDECREF(args);
349
- Py_XDECREF(kwargs);
350
- Py_XDECREF(lexer);
351
- PyErr_Clear();
352
-
353
- #ifdef RUBY_VM
354
- if (RTEST(ret))
355
- rb_funcall(ret, rb_intern("force_encoding"), 1, rb_str_new2("utf-8"));
356
- #endif
357
-
358
- return ret;
359
- }
360
-
361
- static VALUE
362
- rb_pygments_styles(int argc, VALUE *argv, VALUE self)
363
- {
364
- PyObject *styles = PyObject_CallFunction(get_all_styles, "");
365
- VALUE ret = py_to_rb(styles);
366
- Py_XDECREF(styles);
367
- PyErr_Clear();
368
- return ret;
369
- }
370
-
371
- static VALUE
372
- rb_pygments_filters(int argc, VALUE *argv, VALUE self)
373
- {
374
- PyObject *filters = PyObject_CallFunction(get_all_filters, "");
375
- VALUE ret = py_to_rb(filters);
376
- Py_XDECREF(filters);
377
- PyErr_Clear();
378
- return ret;
379
- }
380
-
381
- static VALUE
382
- rb_pygments_lexers(int argc, VALUE *argv, VALUE self)
383
- {
384
- PyObject *lexers = PyObject_CallFunction(get_all_lexers, "");
385
- VALUE ret = py_to_rb(lexers);
386
- Py_XDECREF(lexers);
387
- PyErr_Clear();
388
- return ret;
389
- }
390
-
391
- static VALUE
392
- rb_pygments_formatters(int argc, VALUE *argv, VALUE self)
393
- {
394
- PyObject *formatters = PyObject_CallFunction(get_all_formatters, "");
395
- PyObject *item;
396
- VALUE ret = rb_ary_new();
397
-
398
- while ((item = PyIter_Next(formatters))) {
399
- VALUE curr = rb_ary_new();
400
- rb_ary_push(ret, curr);
401
-
402
- rb_ary_push(curr, py_to_rb(PyObject_GetAttrString(item, "__name__")));
403
- rb_ary_push(curr, py_to_rb(PyObject_GetAttrString(item, "name")));
404
- rb_ary_push(curr, py_to_rb(PyObject_GetAttrString(item, "aliases")));
405
-
406
- Py_DECREF(item);
407
- }
408
-
409
- Py_XDECREF(formatters);
410
- PyErr_Clear();
411
- return ret;
412
- }
413
-
414
- #define ENSURE(var, expr) do{ \
415
- if ((var = (expr)) == NULL) { \
416
- rb_raise(rb_eRuntimeError, "unable to lookup " # var); \
417
- } \
418
- } while(0)
419
-
420
- void
421
- Init_pygments_ext()
422
- {
423
- { /* python stuff */
424
- Py_Initialize();
425
-
426
- /* modules */
427
- ENSURE(pygments, PyImport_ImportModule("pygments"));
428
- ENSURE(pygments_lexers, PyImport_ImportModule("pygments.lexers"));
429
- ENSURE(pygments_formatters, PyImport_ImportModule("pygments.formatters"));
430
- ENSURE(pygments_styles, PyImport_ImportModule("pygments.styles"));
431
- ENSURE(pygments_filters, PyImport_ImportModule("pygments.filters"));
432
-
433
- /* lexer methods */
434
- ENSURE(guess_lexer, PyObject_GetAttrString(pygments_lexers, "guess_lexer"));
435
- ENSURE(guess_lexer_for_filename, PyObject_GetAttrString(pygments_lexers, "guess_lexer_for_filename"));
436
- ENSURE(get_lexer_for_filename, PyObject_GetAttrString(pygments_lexers, "get_lexer_for_filename"));
437
- ENSURE(get_lexer_for_mimetype, PyObject_GetAttrString(pygments_lexers, "get_lexer_for_mimetype"));
438
- ENSURE(get_lexer_by_name, PyObject_GetAttrString(pygments_lexers, "get_lexer_by_name"));
439
- ENSURE(get_all_lexers, PyObject_GetAttrString(pygments_lexers, "get_all_lexers"));
440
-
441
- /* formatter methods */
442
- ENSURE(get_formatter_by_name, PyObject_GetAttrString(pygments_formatters, "get_formatter_by_name"));
443
- ENSURE(get_all_formatters, PyObject_GetAttrString(pygments_formatters, "get_all_formatters"));
444
-
445
- /* highlighter methods */
446
- ENSURE(highlight, PyObject_GetAttrString(pygments, "highlight"));
447
-
448
- /* style methods */
449
- ENSURE(get_all_styles, PyObject_GetAttrString(pygments_styles, "get_all_styles"));
450
-
451
- /* filter methods */
452
- ENSURE(get_all_filters, PyObject_GetAttrString(pygments_filters, "get_all_filters"));
453
- }
454
-
455
- { /* ruby stuff */
456
- mPygments = rb_define_module("Pygments");
457
- mPygmentsC = rb_define_module_under(mPygments, "C");
458
- rb_define_method(mPygmentsC, "lexer_name_for", rb_pygments_lexer_name_for, -1);
459
- rb_define_method(mPygmentsC, "css", rb_pygments_css, -1);
460
- rb_define_method(mPygmentsC, "_highlight", rb_pygments_highlight, -1);
461
- rb_define_method(mPygmentsC, "styles", rb_pygments_styles, 0);
462
- rb_define_method(mPygmentsC, "filters", rb_pygments_filters, 0);
463
- rb_define_method(mPygmentsC, "_lexers", rb_pygments_lexers, 0);
464
- rb_define_method(mPygmentsC, "_formatters", rb_pygments_formatters, 0);
465
- }
466
- }