wallyqs-org-ruby 0.6.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.
Files changed (123) hide show
  1. data/.bnsignore +18 -0
  2. data/.gitignore +2 -0
  3. data/Gemfile +7 -0
  4. data/Gemfile.lock +36 -0
  5. data/History.txt +112 -0
  6. data/README.rdoc +67 -0
  7. data/Rakefile +33 -0
  8. data/TAGS +167 -0
  9. data/announcement.txt +24 -0
  10. data/bin/org-ruby +45 -0
  11. data/lib/org-ruby.rb +55 -0
  12. data/lib/org-ruby/headline.rb +110 -0
  13. data/lib/org-ruby/html_output_buffer.rb +273 -0
  14. data/lib/org-ruby/html_symbol_replace.rb +345 -0
  15. data/lib/org-ruby/line.rb +244 -0
  16. data/lib/org-ruby/output_buffer.rb +237 -0
  17. data/lib/org-ruby/parser.rb +366 -0
  18. data/lib/org-ruby/regexp_helper.rb +192 -0
  19. data/lib/org-ruby/textile_output_buffer.rb +102 -0
  20. data/lib/org-ruby/textile_symbol_replace.rb +346 -0
  21. data/lib/org-ruby/tilt.rb +29 -0
  22. data/org-ruby.gemspec +40 -0
  23. data/spec/data/freeform-example.org +113 -0
  24. data/spec/data/freeform.org +111 -0
  25. data/spec/data/hyp-planning.org +335 -0
  26. data/spec/data/remember.org +53 -0
  27. data/spec/headline_spec.rb +65 -0
  28. data/spec/html_examples/advanced-code.html +81 -0
  29. data/spec/html_examples/advanced-code.org +106 -0
  30. data/spec/html_examples/advanced-lists.html +31 -0
  31. data/spec/html_examples/advanced-lists.org +31 -0
  32. data/spec/html_examples/block_code.html +28 -0
  33. data/spec/html_examples/block_code.org +35 -0
  34. data/spec/html_examples/blockcomment.html +3 -0
  35. data/spec/html_examples/blockcomment.org +15 -0
  36. data/spec/html_examples/blockquote.html +7 -0
  37. data/spec/html_examples/blockquote.org +13 -0
  38. data/spec/html_examples/center.html +6 -0
  39. data/spec/html_examples/center.org +7 -0
  40. data/spec/html_examples/code-comment.html +18 -0
  41. data/spec/html_examples/code-comment.org +22 -0
  42. data/spec/html_examples/code-syntax.html +98 -0
  43. data/spec/html_examples/code-syntax.org +99 -0
  44. data/spec/html_examples/comment-trees.html +4 -0
  45. data/spec/html_examples/comment-trees.org +13 -0
  46. data/spec/html_examples/custom-seq-todo.html +15 -0
  47. data/spec/html_examples/custom-seq-todo.org +24 -0
  48. data/spec/html_examples/custom-todo.html +15 -0
  49. data/spec/html_examples/custom-todo.org +24 -0
  50. data/spec/html_examples/custom-typ-todo.html +15 -0
  51. data/spec/html_examples/custom-typ-todo.org +24 -0
  52. data/spec/html_examples/deflist.html +6 -0
  53. data/spec/html_examples/deflist.org +6 -0
  54. data/spec/html_examples/entities.html +4 -0
  55. data/spec/html_examples/entities.org +11 -0
  56. data/spec/html_examples/escape-pre.html +6 -0
  57. data/spec/html_examples/escape-pre.org +6 -0
  58. data/spec/html_examples/export-exclude-only.html +13 -0
  59. data/spec/html_examples/export-exclude-only.org +81 -0
  60. data/spec/html_examples/export-keywords.html +4 -0
  61. data/spec/html_examples/export-keywords.org +18 -0
  62. data/spec/html_examples/export-tags.html +8 -0
  63. data/spec/html_examples/export-tags.org +82 -0
  64. data/spec/html_examples/export-title.html +2 -0
  65. data/spec/html_examples/export-title.org +4 -0
  66. data/spec/html_examples/footnotes.html +10 -0
  67. data/spec/html_examples/footnotes.org +7 -0
  68. data/spec/html_examples/html-literal.html +2 -0
  69. data/spec/html_examples/html-literal.org +6 -0
  70. data/spec/html_examples/inline-formatting.html +20 -0
  71. data/spec/html_examples/inline-formatting.org +33 -0
  72. data/spec/html_examples/inline-images.html +10 -0
  73. data/spec/html_examples/inline-images.org +15 -0
  74. data/spec/html_examples/link-features.html +8 -0
  75. data/spec/html_examples/link-features.org +19 -0
  76. data/spec/html_examples/lists.html +23 -0
  77. data/spec/html_examples/lists.org +47 -0
  78. data/spec/html_examples/metadata-comment.html +27 -0
  79. data/spec/html_examples/metadata-comment.org +30 -0
  80. data/spec/html_examples/only-list.html +5 -0
  81. data/spec/html_examples/only-list.org +3 -0
  82. data/spec/html_examples/only-table.html +6 -0
  83. data/spec/html_examples/only-table.org +5 -0
  84. data/spec/html_examples/skip-header.html +3 -0
  85. data/spec/html_examples/skip-header.org +28 -0
  86. data/spec/html_examples/skip-table.html +4 -0
  87. data/spec/html_examples/skip-table.org +19 -0
  88. data/spec/html_examples/subsupscript-nil.html +3 -0
  89. data/spec/html_examples/subsupscript-nil.org +6 -0
  90. data/spec/html_examples/subsupscript.html +3 -0
  91. data/spec/html_examples/subsupscript.org +5 -0
  92. data/spec/html_examples/tables.html +35 -0
  93. data/spec/html_examples/tables.org +50 -0
  94. data/spec/html_examples/text.html +2 -0
  95. data/spec/html_examples/text.org +16 -0
  96. data/spec/line_spec.rb +155 -0
  97. data/spec/output_buffer_spec.rb +19 -0
  98. data/spec/parser_spec.rb +152 -0
  99. data/spec/regexp_helper_spec.rb +57 -0
  100. data/spec/spec_helper.rb +20 -0
  101. data/spec/textile_examples/block_code.org +35 -0
  102. data/spec/textile_examples/block_code.textile +29 -0
  103. data/spec/textile_examples/blockquote.org +13 -0
  104. data/spec/textile_examples/blockquote.textile +11 -0
  105. data/spec/textile_examples/center.org +7 -0
  106. data/spec/textile_examples/center.textile +6 -0
  107. data/spec/textile_examples/footnotes.org +7 -0
  108. data/spec/textile_examples/footnotes.textile +8 -0
  109. data/spec/textile_examples/keywords.org +13 -0
  110. data/spec/textile_examples/keywords.textile +11 -0
  111. data/spec/textile_examples/links.org +11 -0
  112. data/spec/textile_examples/links.textile +10 -0
  113. data/spec/textile_examples/lists.org +36 -0
  114. data/spec/textile_examples/lists.textile +20 -0
  115. data/spec/textile_examples/single-space-plain-list.org +13 -0
  116. data/spec/textile_examples/single-space-plain-list.textile +10 -0
  117. data/spec/textile_examples/tables.org +50 -0
  118. data/spec/textile_examples/tables.textile +40 -0
  119. data/spec/textile_output_buffer_spec.rb +21 -0
  120. data/tasks/test_case.rake +49 -0
  121. data/test/test_orgmode_parser.rb +0 -0
  122. data/util/gen-special-replace.el +37 -0
  123. metadata +244 -0
@@ -0,0 +1,192 @@
1
+ require 'logger'
2
+
3
+ module Orgmode
4
+
5
+ # = Summary
6
+ #
7
+ # This class contains helper routines to deal with the Regexp "black
8
+ # magic" you need to properly parse org-mode files.
9
+ #
10
+ # = Key methods
11
+ #
12
+ # * Use +rewrite_emphasis+ to replace org-mode emphasis strings (e.g.,
13
+ # \/italic/) with the suitable markup for the output.
14
+ #
15
+ # * Use +rewrite_links+ to get a chance to rewrite all org-mode
16
+ # links with suitable markup for the output.
17
+ #
18
+ # * Use +rewrite_images+ to rewrite all inline image links with suitable
19
+ # markup for the output.
20
+ class RegexpHelper
21
+
22
+ ######################################################################
23
+ # EMPHASIS
24
+ #
25
+ # I figure it's best to stick as closely to the elisp implementation
26
+ # as possible for emphasis. org.el defines the regular expression that
27
+ # is used to apply "emphasis" (in my terminology, inline formatting
28
+ # instead of block formatting). Here's the documentation from org.el.
29
+ #
30
+ # Terminology: In an emphasis string like " *strong word* ", we
31
+ # call the initial space PREMATCH, the final space POSTMATCH, the
32
+ # stars MARKERS, "s" and "d" are BORDER characters and "trong wor"
33
+ # is the body. The different components in this variable specify
34
+ # what is allowed/forbidden in each part:
35
+ #
36
+ # pre Chars allowed as prematch. Line beginning allowed, too.
37
+ # post Chars allowed as postmatch. Line end will be allowed too.
38
+ # border The chars *forbidden* as border characters.
39
+ # body-regexp A regexp like \".\" to match a body character. Don't use
40
+ # non-shy groups here, and don't allow newline here.
41
+ # newline The maximum number of newlines allowed in an emphasis exp.
42
+ #
43
+ # I currently don't use +newline+ because I've thrown this information
44
+ # away by this point in the code. TODO -- revisit?
45
+ attr_reader :pre_emphasis
46
+ attr_reader :post_emphasis
47
+ attr_reader :border_forbidden
48
+ attr_reader :body_regexp
49
+ attr_reader :markers
50
+
51
+ attr_reader :org_emphasis_regexp
52
+
53
+ def initialize
54
+ # Set up the emphasis regular expression.
55
+ @pre_emphasis = " \t\\('\""
56
+ @post_emphasis = "- \t.,:!?;'\"\\)"
57
+ @border_forbidden = " \t\r\n,\"'"
58
+ @body_regexp = ".*?"
59
+ @markers = "*/_=~+"
60
+ @logger = Logger.new(STDERR)
61
+ @logger.level = Logger::WARN
62
+ build_org_emphasis_regexp
63
+ build_org_link_regexp
64
+ @org_subp_regexp = /([_^])\{(.*?)\}/
65
+ @org_footnote_regexp = /\[fn:(.+?)(:(.*?))?\]/
66
+ end
67
+
68
+ # Finds all emphasis matches in a string.
69
+ # Supply a block that will get the marker and body as parameters.
70
+ def match_all(str)
71
+ str.scan(@org_emphasis_regexp) do |match|
72
+ yield $2, $3
73
+ end
74
+ end
75
+
76
+ # Compute replacements for all matching emphasized phrases.
77
+ # Supply a block that will get the marker and body as parameters;
78
+ # return the replacement string from your block.
79
+ #
80
+ # = Example
81
+ #
82
+ # re = RegexpHelper.new
83
+ # result = re.rewrite_emphasis("*bold*, /italic/, =code=") do |marker, body|
84
+ # "<#{map[marker]}>#{body}</#{map[marker]}>"
85
+ # end
86
+ #
87
+ # In this example, the block body will get called three times:
88
+ #
89
+ # 1. Marker: "*", body: "bold"
90
+ # 2. Marker: "/", body: "italic"
91
+ # 3. Marker: "=", body: "code"
92
+ #
93
+ # The return from this block is a string that will be used to
94
+ # replace "*bold*", "/italic/", and "=code=",
95
+ # respectively. (Clearly this sample string will use HTML-like
96
+ # syntax, assuming +map+ is defined appropriately.)
97
+ def rewrite_emphasis(str)
98
+ str.gsub(@org_emphasis_regexp) do |match|
99
+ inner = yield $2, $3
100
+ "#{$1}#{inner}#{$4}"
101
+ end
102
+ end
103
+
104
+ # rewrite subscript and superscript (_{foo} and ^{bar})
105
+ def rewrite_subp(str) # :yields: type ("_" for subscript and "^" for superscript), text
106
+ str.gsub(@org_subp_regexp) do |match|
107
+ yield $1, $2
108
+ end
109
+ end
110
+
111
+ # rewrite footnotes
112
+ def rewrite_footnote(str) # :yields: name, definition or nil
113
+ str.gsub(@org_footnote_regexp) do |match|
114
+ yield $1, $3
115
+ end
116
+ end
117
+
118
+ # = Summary
119
+ #
120
+ # Rewrite org-mode links in a string to markup suitable to the
121
+ # output format.
122
+ #
123
+ # = Usage
124
+ #
125
+ # Give this a block that expect the link and optional friendly
126
+ # text. Return how that link should get formatted.
127
+ #
128
+ # = Example
129
+ #
130
+ # re = RegexpHelper.new
131
+ # result = re.rewrite_links("[[http://www.bing.com]] and [[http://www.hotmail.com][Hotmail]]") do |link, text}
132
+ # text ||= link
133
+ # "<a href=\"#{link}\">#{text}</a>"
134
+ # end
135
+ #
136
+ # In this example, the block body will get called two times. In the
137
+ # first instance, +text+ will be nil (the org-mode markup gives no
138
+ # friendly text for the link +http://www.bing.com+. In the second
139
+ # instance, the block will get text of *Hotmail* and the link
140
+ # +http://www.hotmail.com+. In both cases, the block returns an
141
+ # HTML-style link, and that is how things will get recorded in
142
+ # +result+.
143
+ def rewrite_links(str) # :yields: link, text
144
+ i = str.gsub(@org_link_regexp) do |match|
145
+ yield $1, nil
146
+ end
147
+ if str =~ @org_angle_link_text_regexp
148
+ i.gsub(@org_angle_link_text_regexp) do |match|
149
+ yield "#{$2}:#{$3}", nil
150
+ end
151
+ else
152
+ i.gsub(@org_link_text_regexp) do |match|
153
+ yield $1, $2
154
+ end
155
+ end
156
+ end
157
+
158
+ # Rewrites all of the inline image tags.
159
+ def rewrite_images(str) # :yields: image_link
160
+ str.gsub(@org_img_regexp) do |match|
161
+ yield $1
162
+ end
163
+ end
164
+
165
+ private
166
+
167
+ def build_org_emphasis_regexp
168
+ @org_emphasis_regexp = Regexp.new("([#{@pre_emphasis}]|^)\n" +
169
+ "( [#{@markers}] )\n" +
170
+ "( [^#{@border_forbidden}] | " +
171
+ " [^#{@border_forbidden}]#{@body_regexp}[^#{@border_forbidden}] )\n" +
172
+ "\\2\n" +
173
+ "([#{@post_emphasis}]|$)\n", Regexp::EXTENDED)
174
+ @logger.debug "Just created regexp: #{@org_emphasis_regexp}"
175
+ end
176
+
177
+ def build_org_link_regexp
178
+ @org_link_regexp = /\[\[
179
+ ([^\]]*) # This is the URL
180
+ \]\]/x
181
+ @org_img_regexp = /\[\[
182
+ ([^\]]*\.(jpg|jpeg|gif|png)) # Like a normal URL, but must end with a specified extension
183
+ \]\]/xi
184
+ @org_link_text_regexp = /\[\[
185
+ ([^\]]*) # This is the URL
186
+ \]\[
187
+ ([^\]]*) # This is the friendly text
188
+ \]\]/x
189
+ @org_angle_link_text_regexp = /(<|&lt;)(\w+):([^\]\t\n\r<> ][^\]\t\n\r<> ]*)(>|&gt;)/x
190
+ end
191
+ end # class Emphasis
192
+ end # module Orgmode
@@ -0,0 +1,102 @@
1
+ require 'stringio'
2
+
3
+ module Orgmode
4
+
5
+ class TextileOutputBuffer < OutputBuffer
6
+
7
+ def initialize(output)
8
+ super(output)
9
+ @add_paragraph = false
10
+ @support_definition_list = true # TODO this should be an option
11
+ @footnotes = {}
12
+ end
13
+
14
+ def push_mode(mode)
15
+ super(mode)
16
+ @output << "bc.. " if mode_is_code(mode)
17
+ @output << "\np=. " if mode == :center
18
+ end
19
+
20
+ def pop_mode(mode = nil)
21
+ m = super(mode)
22
+ @add_paragraph = (mode_is_code(m))
23
+ @output << "\n" if mode == :center
24
+ m
25
+ end
26
+
27
+ # Maps org markup to textile markup.
28
+ TextileMap = {
29
+ "*" => "*",
30
+ "/" => "_",
31
+ "_" => "_",
32
+ "=" => "@",
33
+ "~" => "@",
34
+ "+" => "+"
35
+ }
36
+
37
+ # Handles inline formatting for textile.
38
+ def inline_formatting(input)
39
+ input = @re_help.rewrite_emphasis(input) do |marker, body|
40
+ m = TextileMap[marker]
41
+ "#{m}#{body}#{m}"
42
+ end
43
+ input = @re_help.rewrite_subp(input) do |type, text|
44
+ if type == "_" then
45
+ "~#{text}~"
46
+ elsif type == "^" then
47
+ "^#{text}^"
48
+ end
49
+ end
50
+ input = @re_help.rewrite_links(input) do |link, text|
51
+ text ||= link
52
+ link = link.gsub(/ /, "%20")
53
+ "\"#{text}\":#{link}"
54
+ end
55
+ input = @re_help.rewrite_footnote(input) do |name, defi|
56
+ # textile only support numerical names! Use hash as a workarround
57
+ name = name.hash.to_s unless name.to_i.to_s == name # check if number
58
+ @footnotes[name] = defi if defi
59
+ "[#{name}]"
60
+ end
61
+ Orgmode.special_symbols_to_textile(input)
62
+ input
63
+ end
64
+
65
+ def output_footnotes!
66
+ return false if @footnotes.empty?
67
+
68
+ @footnotes.each do |name, defi|
69
+ @output << "\nfn#{name}. #{defi}\n"
70
+ end
71
+
72
+ return true
73
+ end
74
+
75
+ # Flushes the current buffer
76
+ def flush!
77
+ @logger.debug "FLUSH ==========> #{@output_type}"
78
+ if (@output_type == :blank) then
79
+ @output << "\n"
80
+ elsif (@buffer.length > 0) then
81
+ if @add_paragraph then
82
+ @output << "p. " if @output_type == :paragraph
83
+ @add_paragraph = false
84
+ end
85
+ @output << "bq. " if current_mode == :blockquote
86
+ if @output_type == :definition_list and @support_definition_list then
87
+ @output << "-" * @list_indent_stack.length << " "
88
+ @buffer.sub!("::", ":=")
89
+ elsif @output_type == :ordered_list then
90
+ @output << "#" * @list_indent_stack.length << " "
91
+ elsif @output_type == :unordered_list or \
92
+ (@output_type == :definition_list and not @support_definition_list) then
93
+ @output << "*" * @list_indent_stack.length << " "
94
+ end
95
+ @output << inline_formatting(@buffer) << "\n"
96
+ end
97
+ clear_accumulation_buffer!
98
+ end
99
+
100
+
101
+ end # class TextileOutputBuffer
102
+ end # module Orgmode
@@ -0,0 +1,346 @@
1
+ # encoding: utf-8
2
+ # Autogenerated by util/gen-special-replace.el
3
+
4
+ module Orgmode
5
+ def Orgmode.special_symbols_to_textile(str)
6
+ str.gsub!(/\\Agrave((\{\})|(\s|$))/, "À\\3")
7
+ str.gsub!(/\\agrave((\{\})|(\s|$))/, "à\\3")
8
+ str.gsub!(/\\Aacute((\{\})|(\s|$))/, "Á\\3")
9
+ str.gsub!(/\\aacute((\{\})|(\s|$))/, "á\\3")
10
+ str.gsub!(/\\Acirc((\{\})|(\s|$))/, "Â\\3")
11
+ str.gsub!(/\\acirc((\{\})|(\s|$))/, "â\\3")
12
+ str.gsub!(/\\Atilde((\{\})|(\s|$))/, "Ã\\3")
13
+ str.gsub!(/\\atilde((\{\})|(\s|$))/, "ã\\3")
14
+ str.gsub!(/\\Auml((\{\})|(\s|$))/, "Ä\\3")
15
+ str.gsub!(/\\auml((\{\})|(\s|$))/, "ä\\3")
16
+ str.gsub!(/\\Aring((\{\})|(\s|$))/, "Å\\3")
17
+ str.gsub!(/\\AA((\{\})|(\s|$))/, "Å\\3")
18
+ str.gsub!(/\\aring((\{\})|(\s|$))/, "å\\3")
19
+ str.gsub!(/\\AElig((\{\})|(\s|$))/, "Æ\\3")
20
+ str.gsub!(/\\aelig((\{\})|(\s|$))/, "æ\\3")
21
+ str.gsub!(/\\Ccedil((\{\})|(\s|$))/, "Ç\\3")
22
+ str.gsub!(/\\ccedil((\{\})|(\s|$))/, "ç\\3")
23
+ str.gsub!(/\\Egrave((\{\})|(\s|$))/, "È\\3")
24
+ str.gsub!(/\\egrave((\{\})|(\s|$))/, "è\\3")
25
+ str.gsub!(/\\Eacute((\{\})|(\s|$))/, "É\\3")
26
+ str.gsub!(/\\eacute((\{\})|(\s|$))/, "é\\3")
27
+ str.gsub!(/\\Ecirc((\{\})|(\s|$))/, "Ê\\3")
28
+ str.gsub!(/\\ecirc((\{\})|(\s|$))/, "ê\\3")
29
+ str.gsub!(/\\Euml((\{\})|(\s|$))/, "Ë\\3")
30
+ str.gsub!(/\\euml((\{\})|(\s|$))/, "ë\\3")
31
+ str.gsub!(/\\Igrave((\{\})|(\s|$))/, "Ì\\3")
32
+ str.gsub!(/\\igrave((\{\})|(\s|$))/, "ì\\3")
33
+ str.gsub!(/\\Iacute((\{\})|(\s|$))/, "Í\\3")
34
+ str.gsub!(/\\iacute((\{\})|(\s|$))/, "í\\3")
35
+ str.gsub!(/\\Icirc((\{\})|(\s|$))/, "Î\\3")
36
+ str.gsub!(/\\icirc((\{\})|(\s|$))/, "î\\3")
37
+ str.gsub!(/\\Iuml((\{\})|(\s|$))/, "Ï\\3")
38
+ str.gsub!(/\\iuml((\{\})|(\s|$))/, "ï\\3")
39
+ str.gsub!(/\\Ntilde((\{\})|(\s|$))/, "Ñ\\3")
40
+ str.gsub!(/\\ntilde((\{\})|(\s|$))/, "ñ\\3")
41
+ str.gsub!(/\\Ograve((\{\})|(\s|$))/, "Ò\\3")
42
+ str.gsub!(/\\ograve((\{\})|(\s|$))/, "ò\\3")
43
+ str.gsub!(/\\Oacute((\{\})|(\s|$))/, "Ó\\3")
44
+ str.gsub!(/\\oacute((\{\})|(\s|$))/, "ó\\3")
45
+ str.gsub!(/\\Ocirc((\{\})|(\s|$))/, "Ô\\3")
46
+ str.gsub!(/\\ocirc((\{\})|(\s|$))/, "ô\\3")
47
+ str.gsub!(/\\Otilde((\{\})|(\s|$))/, "Õ\\3")
48
+ str.gsub!(/\\otilde((\{\})|(\s|$))/, "õ\\3")
49
+ str.gsub!(/\\Ouml((\{\})|(\s|$))/, "Ö\\3")
50
+ str.gsub!(/\\ouml((\{\})|(\s|$))/, "ö\\3")
51
+ str.gsub!(/\\Oslash((\{\})|(\s|$))/, "Ø\\3")
52
+ str.gsub!(/\\oslash((\{\})|(\s|$))/, "ø\\3")
53
+ str.gsub!(/\\OElig((\{\})|(\s|$))/, "Œ\\3")
54
+ str.gsub!(/\\oelig((\{\})|(\s|$))/, "œ\\3")
55
+ str.gsub!(/\\Scaron((\{\})|(\s|$))/, "Š\\3")
56
+ str.gsub!(/\\scaron((\{\})|(\s|$))/, "š\\3")
57
+ str.gsub!(/\\szlig((\{\})|(\s|$))/, "ß\\3")
58
+ str.gsub!(/\\Ugrave((\{\})|(\s|$))/, "Ù\\3")
59
+ str.gsub!(/\\ugrave((\{\})|(\s|$))/, "ù\\3")
60
+ str.gsub!(/\\Uacute((\{\})|(\s|$))/, "Ú\\3")
61
+ str.gsub!(/\\uacute((\{\})|(\s|$))/, "ú\\3")
62
+ str.gsub!(/\\Ucirc((\{\})|(\s|$))/, "Û\\3")
63
+ str.gsub!(/\\ucirc((\{\})|(\s|$))/, "û\\3")
64
+ str.gsub!(/\\Uuml((\{\})|(\s|$))/, "Ü\\3")
65
+ str.gsub!(/\\uuml((\{\})|(\s|$))/, "ü\\3")
66
+ str.gsub!(/\\Yacute((\{\})|(\s|$))/, "Ý\\3")
67
+ str.gsub!(/\\yacute((\{\})|(\s|$))/, "ý\\3")
68
+ str.gsub!(/\\Yuml((\{\})|(\s|$))/, "Ÿ\\3")
69
+ str.gsub!(/\\yuml((\{\})|(\s|$))/, "ÿ\\3")
70
+ str.gsub!(/\\fnof((\{\})|(\s|$))/, "ƒ\\3")
71
+ str.gsub!(/\\real((\{\})|(\s|$))/, "ℜ\\3")
72
+ str.gsub!(/\\image((\{\})|(\s|$))/, "ℑ\\3")
73
+ str.gsub!(/\\weierp((\{\})|(\s|$))/, "℘\\3")
74
+ str.gsub!(/\\Alpha((\{\})|(\s|$))/, "Α\\3")
75
+ str.gsub!(/\\alpha((\{\})|(\s|$))/, "α\\3")
76
+ str.gsub!(/\\Beta((\{\})|(\s|$))/, "Β\\3")
77
+ str.gsub!(/\\beta((\{\})|(\s|$))/, "β\\3")
78
+ str.gsub!(/\\Gamma((\{\})|(\s|$))/, "Γ\\3")
79
+ str.gsub!(/\\gamma((\{\})|(\s|$))/, "γ\\3")
80
+ str.gsub!(/\\Delta((\{\})|(\s|$))/, "Δ\\3")
81
+ str.gsub!(/\\delta((\{\})|(\s|$))/, "δ\\3")
82
+ str.gsub!(/\\Epsilon((\{\})|(\s|$))/, "Ε\\3")
83
+ str.gsub!(/\\epsilon((\{\})|(\s|$))/, "ε\\3")
84
+ str.gsub!(/\\varepsilon((\{\})|(\s|$))/, "ε\\3")
85
+ str.gsub!(/\\Zeta((\{\})|(\s|$))/, "Ζ\\3")
86
+ str.gsub!(/\\zeta((\{\})|(\s|$))/, "ζ\\3")
87
+ str.gsub!(/\\Eta((\{\})|(\s|$))/, "Η\\3")
88
+ str.gsub!(/\\eta((\{\})|(\s|$))/, "η\\3")
89
+ str.gsub!(/\\Theta((\{\})|(\s|$))/, "Θ\\3")
90
+ str.gsub!(/\\theta((\{\})|(\s|$))/, "θ\\3")
91
+ str.gsub!(/\\thetasym((\{\})|(\s|$))/, "ϑ\\3")
92
+ str.gsub!(/\\vartheta((\{\})|(\s|$))/, "ϑ\\3")
93
+ str.gsub!(/\\Iota((\{\})|(\s|$))/, "Ι\\3")
94
+ str.gsub!(/\\iota((\{\})|(\s|$))/, "ι\\3")
95
+ str.gsub!(/\\Kappa((\{\})|(\s|$))/, "Κ\\3")
96
+ str.gsub!(/\\kappa((\{\})|(\s|$))/, "κ\\3")
97
+ str.gsub!(/\\Lambda((\{\})|(\s|$))/, "Λ\\3")
98
+ str.gsub!(/\\lambda((\{\})|(\s|$))/, "λ\\3")
99
+ str.gsub!(/\\Mu((\{\})|(\s|$))/, "Μ\\3")
100
+ str.gsub!(/\\mu((\{\})|(\s|$))/, "μ\\3")
101
+ str.gsub!(/\\nu((\{\})|(\s|$))/, "ν\\3")
102
+ str.gsub!(/\\Nu((\{\})|(\s|$))/, "Ν\\3")
103
+ str.gsub!(/\\Xi((\{\})|(\s|$))/, "Ξ\\3")
104
+ str.gsub!(/\\xi((\{\})|(\s|$))/, "ξ\\3")
105
+ str.gsub!(/\\Omicron((\{\})|(\s|$))/, "Ο\\3")
106
+ str.gsub!(/\\omicron((\{\})|(\s|$))/, "ο\\3")
107
+ str.gsub!(/\\Pi((\{\})|(\s|$))/, "Π\\3")
108
+ str.gsub!(/\\pi((\{\})|(\s|$))/, "π\\3")
109
+ str.gsub!(/\\Rho((\{\})|(\s|$))/, "Ρ\\3")
110
+ str.gsub!(/\\rho((\{\})|(\s|$))/, "ρ\\3")
111
+ str.gsub!(/\\Sigma((\{\})|(\s|$))/, "Σ\\3")
112
+ str.gsub!(/\\sigma((\{\})|(\s|$))/, "σ\\3")
113
+ str.gsub!(/\\sigmaf((\{\})|(\s|$))/, "ς\\3")
114
+ str.gsub!(/\\varsigma((\{\})|(\s|$))/, "ς\\3")
115
+ str.gsub!(/\\Tau((\{\})|(\s|$))/, "Τ\\3")
116
+ str.gsub!(/\\Upsilon((\{\})|(\s|$))/, "Υ\\3")
117
+ str.gsub!(/\\upsih((\{\})|(\s|$))/, "ϒ\\3")
118
+ str.gsub!(/\\upsilon((\{\})|(\s|$))/, "υ\\3")
119
+ str.gsub!(/\\Phi((\{\})|(\s|$))/, "Φ\\3")
120
+ str.gsub!(/\\phi((\{\})|(\s|$))/, "φ\\3")
121
+ str.gsub!(/\\Chi((\{\})|(\s|$))/, "Χ\\3")
122
+ str.gsub!(/\\chi((\{\})|(\s|$))/, "χ\\3")
123
+ str.gsub!(/\\acutex((\{\})|(\s|$))/, "𝑥́\\3")
124
+ str.gsub!(/\\Psi((\{\})|(\s|$))/, "Ψ\\3")
125
+ str.gsub!(/\\psi((\{\})|(\s|$))/, "ψ\\3")
126
+ str.gsub!(/\\tau((\{\})|(\s|$))/, "τ\\3")
127
+ str.gsub!(/\\Omega((\{\})|(\s|$))/, "Ω\\3")
128
+ str.gsub!(/\\omega((\{\})|(\s|$))/, "ω\\3")
129
+ str.gsub!(/\\piv((\{\})|(\s|$))/, "ϖ\\3")
130
+ str.gsub!(/\\partial((\{\})|(\s|$))/, "∂\\3")
131
+ str.gsub!(/\\alefsym((\{\})|(\s|$))/, "ℵ\\3")
132
+ str.gsub!(/\\ETH((\{\})|(\s|$))/, "Ð\\3")
133
+ str.gsub!(/\\eth((\{\})|(\s|$))/, "ð\\3")
134
+ str.gsub!(/\\THORN((\{\})|(\s|$))/, "Þ\\3")
135
+ str.gsub!(/\\thorn((\{\})|(\s|$))/, "þ\\3")
136
+ str.gsub!(/\\dots((\{\})|(\s|$))/, "…\\3")
137
+ str.gsub!(/\\hellip((\{\})|(\s|$))/, "…\\3")
138
+ str.gsub!(/\\middot((\{\})|(\s|$))/, "·\\3")
139
+ str.gsub!(/\\iexcl((\{\})|(\s|$))/, "¡\\3")
140
+ str.gsub!(/\\iquest((\{\})|(\s|$))/, "¿\\3")
141
+ str.gsub!(/\\shy((\{\})|(\s|$))/, "\\3")
142
+ str.gsub!(/\\ndash((\{\})|(\s|$))/, "–\\3")
143
+ str.gsub!(/\\mdash((\{\})|(\s|$))/, "—\\3")
144
+ str.gsub!(/\\quot((\{\})|(\s|$))/, "\"\\3")
145
+ str.gsub!(/\\acute((\{\})|(\s|$))/, "´\\3")
146
+ str.gsub!(/\\ldquo((\{\})|(\s|$))/, "“\\3")
147
+ str.gsub!(/\\rdquo((\{\})|(\s|$))/, "”\\3")
148
+ str.gsub!(/\\bdquo((\{\})|(\s|$))/, "„\\3")
149
+ str.gsub!(/\\lsquo((\{\})|(\s|$))/, "‘\\3")
150
+ str.gsub!(/\\rsquo((\{\})|(\s|$))/, "’\\3")
151
+ str.gsub!(/\\sbquo((\{\})|(\s|$))/, "‚\\3")
152
+ str.gsub!(/\\laquo((\{\})|(\s|$))/, "«\\3")
153
+ str.gsub!(/\\raquo((\{\})|(\s|$))/, "»\\3")
154
+ str.gsub!(/\\lsaquo((\{\})|(\s|$))/, "‹\\3")
155
+ str.gsub!(/\\rsaquo((\{\})|(\s|$))/, "›\\3")
156
+ str.gsub!(/\\circ((\{\})|(\s|$))/, "ˆ\\3")
157
+ str.gsub!(/\\vert((\{\})|(\s|$))/, "|\\3")
158
+ str.gsub!(/\\brvbar((\{\})|(\s|$))/, "¦\\3")
159
+ str.gsub!(/\\sect((\{\})|(\s|$))/, "§\\3")
160
+ str.gsub!(/\\amp((\{\})|(\s|$))/, "&\\3")
161
+ str.gsub!(/\\lt((\{\})|(\s|$))/, "<\\3")
162
+ str.gsub!(/\\gt((\{\})|(\s|$))/, ">\\3")
163
+ str.gsub!(/\\tilde((\{\})|(\s|$))/, "~\\3")
164
+ str.gsub!(/\\dagger((\{\})|(\s|$))/, "†\\3")
165
+ str.gsub!(/\\Dagger((\{\})|(\s|$))/, "‡\\3")
166
+ str.gsub!(/\\nbsp((\{\})|(\s|$))/, " \\3")
167
+ str.gsub!(/\\ensp((\{\})|(\s|$))/, " \\3")
168
+ str.gsub!(/\\emsp((\{\})|(\s|$))/, " \\3")
169
+ str.gsub!(/\\thinsp((\{\})|(\s|$))/, " \\3")
170
+ str.gsub!(/\\curren((\{\})|(\s|$))/, "¤\\3")
171
+ str.gsub!(/\\cent((\{\})|(\s|$))/, "¢\\3")
172
+ str.gsub!(/\\pound((\{\})|(\s|$))/, "£\\3")
173
+ str.gsub!(/\\yen((\{\})|(\s|$))/, "¥\\3")
174
+ str.gsub!(/\\euro((\{\})|(\s|$))/, "€\\3")
175
+ str.gsub!(/\\EUR((\{\})|(\s|$))/, "€\\3")
176
+ str.gsub!(/\\EURdig((\{\})|(\s|$))/, "€\\3")
177
+ str.gsub!(/\\EURhv((\{\})|(\s|$))/, "€\\3")
178
+ str.gsub!(/\\EURcr((\{\})|(\s|$))/, "€\\3")
179
+ str.gsub!(/\\EURtm((\{\})|(\s|$))/, "€\\3")
180
+ str.gsub!(/\\copy((\{\})|(\s|$))/, "©\\3")
181
+ str.gsub!(/\\reg((\{\})|(\s|$))/, "®\\3")
182
+ str.gsub!(/\\trade((\{\})|(\s|$))/, "™\\3")
183
+ str.gsub!(/\\minus((\{\})|(\s|$))/, "−\\3")
184
+ str.gsub!(/\\pm((\{\})|(\s|$))/, "±\\3")
185
+ str.gsub!(/\\plusmn((\{\})|(\s|$))/, "±\\3")
186
+ str.gsub!(/\\times((\{\})|(\s|$))/, "×\\3")
187
+ str.gsub!(/\\frasl((\{\})|(\s|$))/, "⁄\\3")
188
+ str.gsub!(/\\div((\{\})|(\s|$))/, "÷\\3")
189
+ str.gsub!(/\\frac12((\{\})|(\s|$))/, "½\\3")
190
+ str.gsub!(/\\frac14((\{\})|(\s|$))/, "¼\\3")
191
+ str.gsub!(/\\frac34((\{\})|(\s|$))/, "¾\\3")
192
+ str.gsub!(/\\permil((\{\})|(\s|$))/, "‰\\3")
193
+ str.gsub!(/\\sup1((\{\})|(\s|$))/, "¹\\3")
194
+ str.gsub!(/\\sup2((\{\})|(\s|$))/, "²\\3")
195
+ str.gsub!(/\\sup3((\{\})|(\s|$))/, "³\\3")
196
+ str.gsub!(/\\radic((\{\})|(\s|$))/, "√\\3")
197
+ str.gsub!(/\\sum((\{\})|(\s|$))/, "∑\\3")
198
+ str.gsub!(/\\prod((\{\})|(\s|$))/, "∏\\3")
199
+ str.gsub!(/\\micro((\{\})|(\s|$))/, "µ\\3")
200
+ str.gsub!(/\\macr((\{\})|(\s|$))/, "¯\\3")
201
+ str.gsub!(/\\deg((\{\})|(\s|$))/, "°\\3")
202
+ str.gsub!(/\\prime((\{\})|(\s|$))/, "′\\3")
203
+ str.gsub!(/\\Prime((\{\})|(\s|$))/, "″\\3")
204
+ str.gsub!(/\\infin((\{\})|(\s|$))/, "∞\\3")
205
+ str.gsub!(/\\infty((\{\})|(\s|$))/, "∞\\3")
206
+ str.gsub!(/\\prop((\{\})|(\s|$))/, "∝\\3")
207
+ str.gsub!(/\\proptp((\{\})|(\s|$))/, "∝\\3")
208
+ str.gsub!(/\\not((\{\})|(\s|$))/, "¬\\3")
209
+ str.gsub!(/\\land((\{\})|(\s|$))/, "∧\\3")
210
+ str.gsub!(/\\wedge((\{\})|(\s|$))/, "∧\\3")
211
+ str.gsub!(/\\lor((\{\})|(\s|$))/, "∨\\3")
212
+ str.gsub!(/\\vee((\{\})|(\s|$))/, "∨\\3")
213
+ str.gsub!(/\\cap((\{\})|(\s|$))/, "∩\\3")
214
+ str.gsub!(/\\cup((\{\})|(\s|$))/, "∪\\3")
215
+ str.gsub!(/\\int((\{\})|(\s|$))/, "∫\\3")
216
+ str.gsub!(/\\there4((\{\})|(\s|$))/, "∴\\3")
217
+ str.gsub!(/\\sim((\{\})|(\s|$))/, "∼\\3")
218
+ str.gsub!(/\\cong((\{\})|(\s|$))/, "≅\\3")
219
+ str.gsub!(/\\simeq((\{\})|(\s|$))/, "≅\\3")
220
+ str.gsub!(/\\asymp((\{\})|(\s|$))/, "≈\\3")
221
+ str.gsub!(/\\approx((\{\})|(\s|$))/, "≈\\3")
222
+ str.gsub!(/\\ne((\{\})|(\s|$))/, "≠\\3")
223
+ str.gsub!(/\\neq((\{\})|(\s|$))/, "≠\\3")
224
+ str.gsub!(/\\equiv((\{\})|(\s|$))/, "≡\\3")
225
+ str.gsub!(/\\le((\{\})|(\s|$))/, "≤\\3")
226
+ str.gsub!(/\\ge((\{\})|(\s|$))/, "≥\\3")
227
+ str.gsub!(/\\sub((\{\})|(\s|$))/, "⊂\\3")
228
+ str.gsub!(/\\subset((\{\})|(\s|$))/, "⊂\\3")
229
+ str.gsub!(/\\sup((\{\})|(\s|$))/, "⊃\\3")
230
+ str.gsub!(/\\supset((\{\})|(\s|$))/, "⊃\\3")
231
+ str.gsub!(/\\nsub((\{\})|(\s|$))/, "⊄\\3")
232
+ str.gsub!(/\\sube((\{\})|(\s|$))/, "⊆\\3")
233
+ str.gsub!(/\\nsup((\{\})|(\s|$))/, "⊅\\3")
234
+ str.gsub!(/\\supe((\{\})|(\s|$))/, "⊇\\3")
235
+ str.gsub!(/\\forall((\{\})|(\s|$))/, "∀\\3")
236
+ str.gsub!(/\\exist((\{\})|(\s|$))/, "∃\\3")
237
+ str.gsub!(/\\exists((\{\})|(\s|$))/, "∃\\3")
238
+ str.gsub!(/\\empty((\{\})|(\s|$))/, "∅\\3")
239
+ str.gsub!(/\\emptyset((\{\})|(\s|$))/, "∅\\3")
240
+ str.gsub!(/\\isin((\{\})|(\s|$))/, "∈\\3")
241
+ str.gsub!(/\\in((\{\})|(\s|$))/, "∈\\3")
242
+ str.gsub!(/\\notin((\{\})|(\s|$))/, "∉\\3")
243
+ str.gsub!(/\\ni((\{\})|(\s|$))/, "∋\\3")
244
+ str.gsub!(/\\nabla((\{\})|(\s|$))/, "∇\\3")
245
+ str.gsub!(/\\ang((\{\})|(\s|$))/, "∠\\3")
246
+ str.gsub!(/\\angle((\{\})|(\s|$))/, "∠\\3")
247
+ str.gsub!(/\\perp((\{\})|(\s|$))/, "⊥\\3")
248
+ str.gsub!(/\\sdot((\{\})|(\s|$))/, "⋅\\3")
249
+ str.gsub!(/\\cdot((\{\})|(\s|$))/, "⋅\\3")
250
+ str.gsub!(/\\lceil((\{\})|(\s|$))/, "⌈\\3")
251
+ str.gsub!(/\\rceil((\{\})|(\s|$))/, "⌉\\3")
252
+ str.gsub!(/\\lfloor((\{\})|(\s|$))/, "⌊\\3")
253
+ str.gsub!(/\\rfloor((\{\})|(\s|$))/, "⌋\\3")
254
+ str.gsub!(/\\lang((\{\})|(\s|$))/, "⟨\\3")
255
+ str.gsub!(/\\rang((\{\})|(\s|$))/, "⟩\\3")
256
+ str.gsub!(/\\larr((\{\})|(\s|$))/, "←\\3")
257
+ str.gsub!(/\\leftarrow((\{\})|(\s|$))/, "←\\3")
258
+ str.gsub!(/\\gets((\{\})|(\s|$))/, "←\\3")
259
+ str.gsub!(/\\lArr((\{\})|(\s|$))/, "⇐\\3")
260
+ str.gsub!(/\\Leftarrow((\{\})|(\s|$))/, "⇐\\3")
261
+ str.gsub!(/\\uarr((\{\})|(\s|$))/, "↑\\3")
262
+ str.gsub!(/\\uparrow((\{\})|(\s|$))/, "↑\\3")
263
+ str.gsub!(/\\uArr((\{\})|(\s|$))/, "⇑\\3")
264
+ str.gsub!(/\\Uparrow((\{\})|(\s|$))/, "⇑\\3")
265
+ str.gsub!(/\\rarr((\{\})|(\s|$))/, "→\\3")
266
+ str.gsub!(/\\to((\{\})|(\s|$))/, "→\\3")
267
+ str.gsub!(/\\rightarrow((\{\})|(\s|$))/, "→\\3")
268
+ str.gsub!(/\\rArr((\{\})|(\s|$))/, "⇒\\3")
269
+ str.gsub!(/\\Rightarrow((\{\})|(\s|$))/, "⇒\\3")
270
+ str.gsub!(/\\darr((\{\})|(\s|$))/, "↓\\3")
271
+ str.gsub!(/\\downarrow((\{\})|(\s|$))/, "↓\\3")
272
+ str.gsub!(/\\dArr((\{\})|(\s|$))/, "⇓\\3")
273
+ str.gsub!(/\\Downarrow((\{\})|(\s|$))/, "⇓\\3")
274
+ str.gsub!(/\\harr((\{\})|(\s|$))/, "↔\\3")
275
+ str.gsub!(/\\leftrightarrow((\{\})|(\s|$))/, "↔\\3")
276
+ str.gsub!(/\\hArr((\{\})|(\s|$))/, "⇔\\3")
277
+ str.gsub!(/\\Leftrightarrow((\{\})|(\s|$))/, "⇔\\3")
278
+ str.gsub!(/\\crarr((\{\})|(\s|$))/, "↵\\3")
279
+ str.gsub!(/\\hookleftarrow((\{\})|(\s|$))/, "↵\\3")
280
+ str.gsub!(/\\arccos((\{\})|(\s|$))/, "arccos\\3")
281
+ str.gsub!(/\\arcsin((\{\})|(\s|$))/, "arcsin\\3")
282
+ str.gsub!(/\\arctan((\{\})|(\s|$))/, "arctan\\3")
283
+ str.gsub!(/\\arg((\{\})|(\s|$))/, "arg\\3")
284
+ str.gsub!(/\\cos((\{\})|(\s|$))/, "cos\\3")
285
+ str.gsub!(/\\cosh((\{\})|(\s|$))/, "cosh\\3")
286
+ str.gsub!(/\\cot((\{\})|(\s|$))/, "cot\\3")
287
+ str.gsub!(/\\coth((\{\})|(\s|$))/, "coth\\3")
288
+ str.gsub!(/\\csc((\{\})|(\s|$))/, "csc\\3")
289
+ str.gsub!(/\\deg((\{\})|(\s|$))/, "deg\\3")
290
+ str.gsub!(/\\det((\{\})|(\s|$))/, "det\\3")
291
+ str.gsub!(/\\dim((\{\})|(\s|$))/, "dim\\3")
292
+ str.gsub!(/\\exp((\{\})|(\s|$))/, "exp\\3")
293
+ str.gsub!(/\\gcd((\{\})|(\s|$))/, "gcd\\3")
294
+ str.gsub!(/\\hom((\{\})|(\s|$))/, "hom\\3")
295
+ str.gsub!(/\\inf((\{\})|(\s|$))/, "inf\\3")
296
+ str.gsub!(/\\ker((\{\})|(\s|$))/, "ker\\3")
297
+ str.gsub!(/\\lg((\{\})|(\s|$))/, "lg\\3")
298
+ str.gsub!(/\\lim((\{\})|(\s|$))/, "lim\\3")
299
+ str.gsub!(/\\liminf((\{\})|(\s|$))/, "liminf\\3")
300
+ str.gsub!(/\\limsup((\{\})|(\s|$))/, "limsup\\3")
301
+ str.gsub!(/\\ln((\{\})|(\s|$))/, "ln\\3")
302
+ str.gsub!(/\\log((\{\})|(\s|$))/, "log\\3")
303
+ str.gsub!(/\\max((\{\})|(\s|$))/, "max\\3")
304
+ str.gsub!(/\\min((\{\})|(\s|$))/, "min\\3")
305
+ str.gsub!(/\\Pr((\{\})|(\s|$))/, "Pr\\3")
306
+ str.gsub!(/\\sec((\{\})|(\s|$))/, "sec\\3")
307
+ str.gsub!(/\\sin((\{\})|(\s|$))/, "sin\\3")
308
+ str.gsub!(/\\sinh((\{\})|(\s|$))/, "sinh\\3")
309
+ str.gsub!(/\\sup((\{\})|(\s|$))/, "sup\\3")
310
+ str.gsub!(/\\tan((\{\})|(\s|$))/, "tan\\3")
311
+ str.gsub!(/\\tanh((\{\})|(\s|$))/, "tanh\\3")
312
+ str.gsub!(/\\bull((\{\})|(\s|$))/, "•\\3")
313
+ str.gsub!(/\\bullet((\{\})|(\s|$))/, "•\\3")
314
+ str.gsub!(/\\star((\{\})|(\s|$))/, "⋆\\3")
315
+ str.gsub!(/\\lowast((\{\})|(\s|$))/, "∗\\3")
316
+ str.gsub!(/\\ast((\{\})|(\s|$))/, "*\\3")
317
+ str.gsub!(/\\odot((\{\})|(\s|$))/, "ʘ\\3")
318
+ str.gsub!(/\\oplus((\{\})|(\s|$))/, "⊕\\3")
319
+ str.gsub!(/\\otimes((\{\})|(\s|$))/, "⊗\\3")
320
+ str.gsub!(/\\checkmark((\{\})|(\s|$))/, "✓\\3")
321
+ str.gsub!(/\\para((\{\})|(\s|$))/, "¶\\3")
322
+ str.gsub!(/\\ordf((\{\})|(\s|$))/, "ª\\3")
323
+ str.gsub!(/\\ordm((\{\})|(\s|$))/, "º\\3")
324
+ str.gsub!(/\\cedil((\{\})|(\s|$))/, "¸\\3")
325
+ str.gsub!(/\\oline((\{\})|(\s|$))/, "‾\\3")
326
+ str.gsub!(/\\uml((\{\})|(\s|$))/, "¨\\3")
327
+ str.gsub!(/\\zwnj((\{\})|(\s|$))/, "‌\\3")
328
+ str.gsub!(/\\zwj((\{\})|(\s|$))/, "‍\\3")
329
+ str.gsub!(/\\lrm((\{\})|(\s|$))/, "‎\\3")
330
+ str.gsub!(/\\rlm((\{\})|(\s|$))/, "‏\\3")
331
+ str.gsub!(/\\smile((\{\})|(\s|$))/, "⌣\\3")
332
+ str.gsub!(/\\smiley((\{\})|(\s|$))/, "☺\\3")
333
+ str.gsub!(/\\blacksmile((\{\})|(\s|$))/, "☻\\3")
334
+ str.gsub!(/\\sad((\{\})|(\s|$))/, "☹\\3")
335
+ str.gsub!(/\\clubs((\{\})|(\s|$))/, "♣\\3")
336
+ str.gsub!(/\\clubsuit((\{\})|(\s|$))/, "♣\\3")
337
+ str.gsub!(/\\spades((\{\})|(\s|$))/, "♠\\3")
338
+ str.gsub!(/\\spadesuit((\{\})|(\s|$))/, "♠\\3")
339
+ str.gsub!(/\\hearts((\{\})|(\s|$))/, "♥\\3")
340
+ str.gsub!(/\\heartsuit((\{\})|(\s|$))/, "♥\\3")
341
+ str.gsub!(/\\diams((\{\})|(\s|$))/, "♦\\3")
342
+ str.gsub!(/\\diamondsuit((\{\})|(\s|$))/, "♦\\3")
343
+ str.gsub!(/\\Diamond((\{\})|(\s|$))/, "⋄\\3")
344
+ str.gsub!(/\\loz((\{\})|(\s|$))/, "◊\\3")
345
+ end
346
+ end # module Orgmode