From 5ed4214a22a1980eece9ea08cd808b033aabb56c Mon Sep 17 00:00:00 2001 From: Iristyle Date: Mon, 16 Sep 2013 22:29:05 -0400 Subject: [PATCH] feat(ST2.EditorPackages): bump up all packages - Refresh PackageCache with latest versions of everything --- .../tools/PackageCache/Abacus/Abacus.py | 21 +- .../PackageCache/Abacus/PHP.sublime-settings | 10 + .../PackageCache/Abacus/Perl.sublime-settings | 10 + .../PackageCache/Abacus/package-metadata.json | 2 +- .../Block Cursor Everywhere/README.md | 3 + .../SublimeBlockCursor.py | 3 +- .../package-metadata.json | 2 +- .../BracketHighlighter/bh_core.py | 32 +- .../bh_core.sublime-settings | 48 +- .../bh_modules/bracketremove.py | 1 + .../bh_modules/bracketselect.py | 13 + .../bh_modules/rubykeywords.py | 3 +- .../bh_modules/swapbrackets.py | 8 +- .../BracketHighlighter/bh_plugin.py | 6 +- .../BracketHighlighter/bh_swapping.py | 13 +- .../icons/angle_bracket.png | Bin 217 -> 420 bytes .../icons/angle_bracket_close.png | Bin 155 -> 341 bytes .../icons/angle_bracket_close_small.png | Bin 143 -> 288 bytes .../icons/angle_bracket_open.png | Bin 155 -> 342 bytes .../icons/angle_bracket_open_small.png | Bin 138 -> 279 bytes .../icons/angle_bracket_small.png | Bin 191 -> 364 bytes .../BracketHighlighter/icons/bookmark.png | Bin 108 -> 371 bytes .../icons/bookmark_small.png | Bin 118 -> 297 bytes .../BracketHighlighter/icons/circle.png | Bin 220 -> 292 bytes .../BracketHighlighter/icons/circle_small.png | Bin 215 -> 246 bytes .../icons/curly_bracket.png | Bin 242 -> 443 bytes .../icons/curly_bracket_close.png | Bin 173 -> 331 bytes .../icons/curly_bracket_close_small.png | Bin 156 -> 299 bytes .../icons/curly_bracket_open.png | Bin 173 -> 334 bytes .../icons/curly_bracket_open_small.png | Bin 145 -> 302 bytes .../icons/curly_bracket_small.png | Bin 211 -> 359 bytes .../BracketHighlighter/icons/dot.png | Bin 167 -> 248 bytes .../BracketHighlighter/icons/dot_small.png | Bin 148 -> 221 bytes .../BracketHighlighter/icons/double_quote.png | Bin 158 -> 383 bytes .../icons/double_quote_close.png | Bin 125 -> 302 bytes .../icons/double_quote_close_small.png | Bin 131 -> 288 bytes .../icons/double_quote_offset.png | Bin 163 -> 414 bytes .../icons/double_quote_offset_open.png | Bin 133 -> 296 bytes .../icons/double_quote_offset_open_small.png | Bin 134 -> 305 bytes .../icons/double_quote_offset_small.png | Bin 169 -> 378 bytes .../icons/double_quote_open.png | Bin 133 -> 291 bytes .../icons/double_quote_open_small.png | Bin 134 -> 279 bytes .../icons/double_quote_small.png | Bin 167 -> 354 bytes .../BracketHighlighter/icons/question.png | Bin 176 -> 325 bytes .../icons/question_small.png | Bin 158 -> 298 bytes .../BracketHighlighter/icons/quote.png | Bin 125 -> 302 bytes .../BracketHighlighter/icons/quote_small.png | Bin 131 -> 307 bytes .../icons/round_bracket.png | Bin 270 -> 414 bytes .../icons/round_bracket_close.png | Bin 188 -> 319 bytes .../icons/round_bracket_close_small.png | Bin 148 -> 325 bytes .../icons/round_bracket_open.png | Bin 190 -> 334 bytes .../icons/round_bracket_open_small.png | Bin 147 -> 312 bytes .../icons/round_bracket_small.png | Bin 206 -> 394 bytes .../BracketHighlighter/icons/single_quote.png | Bin 137 -> 373 bytes .../icons/single_quote_close.png | Bin 111 -> 295 bytes .../icons/single_quote_close_small.png | Bin 104 -> 248 bytes .../icons/single_quote_offset.png | Bin 141 -> 383 bytes .../icons/single_quote_offset_open.png | Bin 114 -> 290 bytes .../icons/single_quote_offset_open_small.png | Bin 103 -> 229 bytes .../icons/single_quote_offset_small.png | Bin 124 -> 300 bytes .../icons/single_quote_open.png | Bin 114 -> 290 bytes .../icons/single_quote_open_small.png | Bin 103 -> 234 bytes .../icons/single_quote_small.png | Bin 124 -> 310 bytes .../icons/square_bracket.png | Bin 101 -> 247 bytes .../icons/square_bracket_close.png | Bin 97 -> 205 bytes .../icons/square_bracket_close_small.png | Bin 111 -> 196 bytes .../icons/square_bracket_open.png | Bin 98 -> 206 bytes .../icons/square_bracket_open_small.png | Bin 112 -> 196 bytes .../icons/square_bracket_small.png | Bin 127 -> 236 bytes .../BracketHighlighter/icons/star.png | Bin 244 -> 344 bytes .../BracketHighlighter/icons/star_small.png | Bin 166 -> 284 bytes .../BracketHighlighter/icons/tag.png | Bin 306 -> 477 bytes .../BracketHighlighter/icons/tag_small.png | Bin 215 -> 370 bytes .../BracketHighlighter/package-metadata.json | 2 +- .../PackageCache/BracketHighlighter/readme.md | 46 +- .../PackageCache/BracketHighlighter/ure.py | 207 ++++ .../tools/PackageCache/Bracketeer/LICENSE | 26 + .../tools/PackageCache/Bracketeer/README.md | 9 + .../Bracketeer/package-metadata.json | 2 +- .../PackageCache/Clipboard Manager/LICENSE | 26 + .../PackageCache/Clipboard Manager/README.md | 9 + .../Clipboard Manager/package-metadata.json | 2 +- .../tools/PackageCache/EasyMotion/README.md | 14 +- .../EasyMotion/package-metadata.json | 2 +- .../ColorSchemes/Print-Grayscale.tmTheme | 2 +- .../PackageCache/ExportHtml/ExportHtml.py | 17 +- .../ExportHtml/package-metadata.json | 2 +- .../tools/PackageCache/FileDiffs/LICENSE | 26 + .../tools/PackageCache/FileDiffs/README.md | 9 + .../PackageCache/FileDiffs/file_diffs.py | 2 + .../FileDiffs/package-metadata.json | 2 +- .../PackageCache/LiveReload/livereload_st2.py | 7 +- .../LiveReload/package-metadata.json | 2 +- .../PackageCache/Markdown Preview/CHANGES.md | 26 + .../Markdown Preview/Default.sublime-commands | 47 +- .../Markdown Preview/Markdown.sublime-build | 12 + .../Markdown Preview/MarkdownPreview.py | 417 +++++-- .../MarkdownPreview.sublime-settings | 58 +- .../PackageCache/Markdown Preview/README.md | 73 +- .../Markdown Preview/desktop/__init__.py | 29 +- .../Markdown Preview/desktop/dialog.py | 6 +- .../Markdown Preview/desktop/windows.py | 4 +- .../PackageCache/Markdown Preview/github.css | 1038 +++++++++++------ .../PackageCache/Markdown Preview/helper.py | 49 + .../Markdown Preview/highlight.css | 129 ++ .../Markdown Preview/highlight.js | 1 + .../lib/linux-x32/libssl-0.9.8/_ssl.so | Bin 0 -> 93503 bytes .../lib/linux-x32/libssl-1.0.0/_ssl.so | Bin 0 -> 109394 bytes .../lib/linux-x32/libssl-10/_ssl.so | Bin 0 -> 113027 bytes .../lib/linux-x64/libssl-0.9.8/_ssl.so | Bin 0 -> 110450 bytes .../lib/linux-x64/libssl-1.0.0/_ssl.so | Bin 0 -> 128697 bytes .../lib/linux-x64/libssl-10/_ssl.so | Bin 0 -> 132945 bytes .../Markdown Preview/lib/linux/ssl.py | 437 +++++++ .../Markdown Preview/markdown/LICENSE.md | 30 + .../Markdown Preview/markdown/README.md | 30 + .../Markdown Preview/markdown/__init__.py | 448 +++++++ .../Markdown Preview/markdown/__main__.py | 87 ++ .../Markdown Preview/markdown/__version__.py | 28 + .../Markdown Preview/markdown/blockparser.py | 99 ++ .../markdown/blockprocessors.py | 558 +++++++++ .../markdown/extensions/__init__.py | 53 + .../markdown/extensions/abbr.py | 96 ++ .../markdown/extensions/admonition.py | 118 ++ .../markdown/extensions/attr_list.py | 140 +++ .../markdown/extensions/codehilite.py | 240 ++++ .../markdown/extensions/def_list.py | 118 ++ .../markdown/extensions/extra.py | 54 + .../markdown/extensions/fenced_code.py | 161 +++ .../markdown/extensions/footnotes.py | 313 +++++ .../markdown/extensions/headerid.py | 207 ++++ .../markdown/extensions/meta.py | 93 ++ .../markdown/extensions/nl2br.py | 38 + .../markdown/extensions/sane_lists.py | 51 + .../markdown/extensions/smart_strong.py | 42 + .../markdown/extensions/tables.py | 100 ++ .../markdown/extensions/toc.py | 221 ++++ .../markdown/extensions/wikilinks.py | 151 +++ .../markdown/inlinepatterns.py | 483 ++++++++ .../Markdown Preview/markdown/odict.py | 194 +++ .../markdown/postprocessors.py | 104 ++ .../markdown/preprocessors.py | 298 +++++ .../Markdown Preview/markdown/serializers.py | 277 +++++ .../markdown/treeprocessors.py | 360 ++++++ .../Markdown Preview/markdown/util.py | 136 +++ .../Markdown Preview/mathjax.html | 26 + .../Markdown Preview/messages.json | 4 + .../Markdown Preview/package-metadata.json | 2 +- .../PackageCache/Markdown Preview/sample.html | 265 +++-- .../PackageCache/Markdown Preview/sample.md | 205 +++- .../Missing.sublime-commands | 9 +- .../package-metadata.json | 2 +- .../Related Files/package-metadata.json | 2 +- .../Default (Linux).sublime-keymap | 5 + .../Default (OSX).sublime-keymap | 5 + .../Default (Windows).sublime-keymap | 5 + .../SmartMarkdown/package-metadata.json | 2 +- .../PackageCache/SmartMarkdown/readme.md | 28 +- .../SmartMarkdown/smart_folding.py | 25 +- .../Solarized (dark).tmTheme | 334 ++---- .../Solarized (light).tmTheme | 390 +++---- .../package-metadata.json | 2 +- .../Solarized Color Scheme/samples/README.md | 2 + .../Solarized Color Scheme/samples/test.c | 26 + .../samples/test.coffee | 23 + .../Solarized Color Scheme/samples/test.html | 20 + .../Solarized Color Scheme/samples/test.js | 42 + .../Solarized Color Scheme/samples/test.md | 26 + .../Solarized Color Scheme/samples/test.py | 39 + .../Solarized Color Scheme/samples/test.rb | 49 + .../StringEncode/Default.sublime-commands | 8 + .../tools/PackageCache/StringEncode/LICENSE | 26 + .../tools/PackageCache/StringEncode/README.md | 21 +- .../StringEncode/package-metadata.json | 2 +- .../PackageCache/StringEncode/package.json | 16 +- .../StringEncode/string_encode.py | 157 ++- .../PackageCache/TrailingSpaces/README.md | 24 + .../TrailingSpaces/package-metadata.json | 2 +- .../Default (OSX).sublime-keymap | 442 +++++++ .../Default (Windows).sublime-keymap | 90 +- .../package-metadata.json | 2 +- 180 files changed, 9360 insertions(+), 1211 deletions(-) create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Abacus/PHP.sublime-settings create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Abacus/Perl.sublime-settings create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/ure.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Bracketeer/LICENSE create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Clipboard Manager/LICENSE create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/FileDiffs/LICENSE create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/CHANGES.md create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/Markdown.sublime-build create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/helper.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/highlight.css create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/highlight.js create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/lib/linux-x32/libssl-0.9.8/_ssl.so create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/lib/linux-x32/libssl-1.0.0/_ssl.so create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/lib/linux-x32/libssl-10/_ssl.so create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/lib/linux-x64/libssl-0.9.8/_ssl.so create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/lib/linux-x64/libssl-1.0.0/_ssl.so create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/lib/linux-x64/libssl-10/_ssl.so create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/lib/linux/ssl.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/LICENSE.md create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/README.md create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/__init__.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/__main__.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/__version__.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/blockparser.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/blockprocessors.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/__init__.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/abbr.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/admonition.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/attr_list.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/codehilite.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/def_list.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/extra.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/fenced_code.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/footnotes.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/headerid.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/meta.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/nl2br.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/sane_lists.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/smart_strong.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/tables.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/toc.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/wikilinks.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/inlinepatterns.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/odict.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/postprocessors.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/preprocessors.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/serializers.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/treeprocessors.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/util.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/mathjax.html create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/messages.json create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/README.md create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.c create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.coffee create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.html create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.js create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.md create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.py create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.rb create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/LICENSE create mode 100644 EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Editor/Default (OSX).sublime-keymap diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Abacus/Abacus.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Abacus/Abacus.py index 1a994cf..25442d6 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Abacus/Abacus.py +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Abacus/Abacus.py @@ -8,15 +8,16 @@ class AbacusCommand(sublime_plugin.TextCommand): perform a series of replacements. """ def run(self, edit): - candidates = [] - separators = sublime.load_settings("Abacus.sublime-settings").get("com.khiltd.abacus.separators") - indentor = Template("$indentation$left_col") - lg_aligner = Template("$left_col$separator") - rg_aligner = Template("$left_col$gutter$separator_padding$separator") + candidates = [] + separators = sublime.load_settings("Abacus.sublime-settings").get("com.khiltd.abacus.separators") + syntax_specific = self.view.settings().get("com.khiltd.abacus.separators", []) + indentor = Template("$indentation$left_col") + lg_aligner = Template("$left_col$separator") + rg_aligner = Template("$left_col$gutter$separator_padding$separator") #Run through the separators accumulating alignment candidates #starting with the longest ones i.e. '==' before '='. - longest_first = self.sort_separators(separators) + longest_first = self.sort_separators(syntax_specific + [sep for sep in separators if sep["token"] not in [t["token"] for t in syntax_specific]]) #Favor those that lean right so assignments with slice notation in them #get handled sanely @@ -118,10 +119,10 @@ class AbacusCommand(sublime_plugin.TextCommand): potential_matches = [m for m in token_matcher.finditer(collapsed)] if debug: - print "Pattern:" - print token_matcher.pattern - print "Matches:" - print potential_matches + print("Pattern:") + print(token_matcher.pattern) + print("Matches:") + print(potential_matches) if len(potential_matches): #Split on the first/last occurrence of the token diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Abacus/PHP.sublime-settings b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Abacus/PHP.sublime-settings new file mode 100644 index 0000000..60f1a00 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Abacus/PHP.sublime-settings @@ -0,0 +1,10 @@ +{ + "com.khiltd.abacus.separators": + [ + { + "token": "=>", + "gravity": "right", + "preserve_indentation": true + } + ] +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Abacus/Perl.sublime-settings b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Abacus/Perl.sublime-settings new file mode 100644 index 0000000..60f1a00 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Abacus/Perl.sublime-settings @@ -0,0 +1,10 @@ +{ + "com.khiltd.abacus.separators": + [ + { + "token": "=>", + "gravity": "right", + "preserve_indentation": true + } + ] +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Abacus/package-metadata.json b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Abacus/package-metadata.json index e7f9187..b921063 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Abacus/package-metadata.json +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Abacus/package-metadata.json @@ -1 +1 @@ -{"url": "https://github.com/khiltd/Abacus", "version": "2013.01.11.00.24.46", "description": "An Alignment Plugin for Sublime Text 2 that actually works `\u2318\u2325^ ]`"} \ No newline at end of file +{"url": "https://github.com/khiltd/Abacus", "version": "2013.07.23.05.22.38", "description": "An Alignment Plugin for Sublime Text 2 that actually works `\u2318\u2325^ ]`"} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Block Cursor Everywhere/README.md b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Block Cursor Everywhere/README.md index 2575d03..5352b0e 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Block Cursor Everywhere/README.md +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Block Cursor Everywhere/README.md @@ -1,5 +1,8 @@ # BlockCursorEverywhere # +I apologize, but this is no longer updated. I don't even use it anymore because of API limitations. I recommend looking at the original repo by netpro2k. + + ![Screenshot](http://f.cl.ly/items/42131K2X1h0j0P2m1O2B/Screen%20Shot%202011-12-02%20at%202.36.54%20AM.png) It can become very difficult to keep track of your cursor location. This is solved by having a "block" cursor, which is very easy to spot no matter where it is on screen. Unfortunately, Sublime Text 2 does not (yet) support this feature natively. This Plugin mimics this functionality by highlighting the area behind the cursor whenever it moves (similar to how you might highlight syntax errors, or color a comment). diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Block Cursor Everywhere/SublimeBlockCursor.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Block Cursor Everywhere/SublimeBlockCursor.py index 0336494..9d088e9 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Block Cursor Everywhere/SublimeBlockCursor.py +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Block Cursor Everywhere/SublimeBlockCursor.py @@ -19,7 +19,8 @@ class BlockCursorEverywhere(sublime_plugin.EventListener): view.erase_regions('BlockCursorListener') def on_selection_modified(self, view): - if view.settings().get('is_widget') or not("Vintage" in view.settings().get('ignored_packages') or view.settings().get('command_mode')): + no_vintage = view.settings().get('ignored_packages') is None or "Vintage" in view.settings().get('ignored_packages') + if view.settings().get('is_widget') or not(no_vintage or view.settings().get('command_mode')): view.erase_regions('BlockCursorListener') return self.show_block_cursor(view) diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Block Cursor Everywhere/package-metadata.json b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Block Cursor Everywhere/package-metadata.json index d22c40a..e9c311f 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Block Cursor Everywhere/package-metadata.json +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Block Cursor Everywhere/package-metadata.json @@ -1 +1 @@ -{"url": "https://github.com/ingshtrom/BlockCursorEverywhere", "version": "2013.01.20.10.51.30", "description": "Sublime Text 2 plugin to mimic a block cursor in Vintage command mode."} \ No newline at end of file +{"url": "https://github.com/ingshtrom/BlockCursorEverywhere", "version": "2013.08.02.15.49.34", "description": "Sublime Text 2 plugin to mimic a block cursor in Vintage command mode."} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_core.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_core.py index 8e644b6..1c1e32e 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_core.py +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_core.py @@ -3,7 +3,7 @@ import sublime import sublime_plugin from time import time, sleep import thread -import re +import ure from bh_plugin import BracketPlugin, BracketRegion, ImportModule from collections import namedtuple import traceback @@ -398,8 +398,8 @@ class ScopeDefinition(object): """ self.style = bracket.get("style", "default") - self.open = re.compile("\\A" + bracket.get("open", "."), re.MULTILINE | re.IGNORECASE) - self.close = re.compile(bracket.get("close", ".") + "\\Z", re.MULTILINE | re.IGNORECASE) + self.open = ure.compile("\\A" + bracket.get("open", "."), ure.MULTILINE | ure.IGNORECASE) + self.close = ure.compile(bracket.get("close", ".") + "\\Z", ure.MULTILINE | ure.IGNORECASE) self.name = bracket["name"] sub_search = bracket.get("sub_bracket_search", "false") self.sub_search_only = sub_search == "only" @@ -537,7 +537,7 @@ class BhCore(object): self.last_id_view = None self.last_id_sel = None self.view_tracker = (None, None) - self.ignore_threshold = override_thresh + self.ignore_threshold = override_thresh or bool(self.settings.get("ignore_threshold", False)) self.adj_only = adj_only if adj_only is not None else bool(self.settings.get("match_only_adjacent", False)) self.auto_selection_threshold = int(self.settings.get("auto_selection_threshold", 10)) self.no_multi_select_icons = bool(self.settings.get("no_multi_select_icons", False)) @@ -668,8 +668,8 @@ class BhCore(object): "(?:%s)\n" % '|'.join(self.find_regex) + "(?:%s)" % '|'.join(self.sub_find_regex) ) - self.sub_pattern = re.compile("(?:%s)" % '|'.join(self.sub_find_regex), re.MULTILINE | re.IGNORECASE) - self.pattern = re.compile("(?:%s)" % '|'.join(self.find_regex), re.MULTILINE | re.IGNORECASE) + self.sub_pattern = ure.compile("(?:%s)" % '|'.join(self.sub_find_regex), ure.MULTILINE | ure.IGNORECASE) + self.pattern = ure.compile("(?:%s)" % '|'.join(self.find_regex), ure.MULTILINE | ure.IGNORECASE) self.enabled = True def init_match(self): @@ -810,9 +810,13 @@ class BhCore(object): if view == None: return + + view.settings().set("BracketHighlighterBusy", True) + if not GLOBAL_ENABLE: for region_key in view.settings().get("bh_regions", []): view.erase_regions(region_key) + view.settings().set("BracketHighlighterBusy", False) return if self.keycommand: @@ -834,11 +838,13 @@ class BhCore(object): # Nothing to search for if not self.enabled: + view.settings().set("BracketHighlighterBusy", False) return # Abort if selections are beyond the threshold if self.use_selection_threshold and num_sels >= self.selection_threshold: self.highlight(view) + view.settings().set("BracketHighlighterBusy", False) return multi_select_count = 0 @@ -859,6 +865,7 @@ class BhCore(object): self.highlight(view) if self.count_lines: sublime.status_message('In Block: Lines ' + str(self.lines) + ', Chars ' + str(self.chars)) + view.settings().set("BracketHighlighterBusy", False) def save_incomplete_regions(self, left, right, regions): """ @@ -926,7 +933,9 @@ class BhCore(object): if left is not None and right is not None: bracket = self.brackets[left.type] - left, right, regions = self.run_plugin(bracket.name, left, right, regions) + left, right, regions, nobracket = self.run_plugin(bracket.name, left, right, regions) + if nobracket: + return True # Matched brackets if left is not None and right is not None and bracket is not None: @@ -946,7 +955,7 @@ class BhCore(object): regions = [sublime.Region(sel.a, sel.b)] if left is not None and right is not None: - left, right, regions = self.run_plugin(bracket.name, left, right, regions) + left, right, regions, _ = self.run_plugin(bracket.name, left, right, regions) if left is None and right is None: self.store_sel(regions) return True @@ -971,7 +980,7 @@ class BhCore(object): if left is not None and right is not None: bracket = self.brackets[left.type] - left, right, regions = self.run_plugin(bracket.name, left, right, regions) + left, right, regions, _ = self.run_plugin(bracket.name, left, right, regions) # Matched brackets if left is not None and right is not None and bracket is not None: @@ -1113,16 +1122,17 @@ class BhCore(object): lbracket = BracketRegion(left.begin, left.end) rbracket = BracketRegion(right.begin, right.end) + nobracket = False if ( ("__all__" in self.transform or name in self.transform) and self.plugin != None and self.plugin.is_enabled() ): - lbracket, rbracket, regions = self.plugin.run_command(self.view, name, lbracket, rbracket, regions) + lbracket, rbracket, regions, nobracket = self.plugin.run_command(self.view, name, lbracket, rbracket, regions) left = left.move(lbracket.begin, lbracket.end) if lbracket is not None else None right = right.move(rbracket.begin, rbracket.end) if rbracket is not None else None - return left, right, regions + return left, right, regions, nobracket def match_scope_brackets(self, bfr, sel): """ diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_core.sublime-settings b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_core.sublime-settings index de60409..0b59898 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_core.sublime-settings +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_core.sublime-settings @@ -9,9 +9,10 @@ // this defines if the unmatched bracket should be shown. "show_unmatched" : true, - // High visibilty style and color for high visibility mode + // High visibility style and color for high visibility mode // (solid|outline|underline) "high_visibility_style": "outline", + // (scope|__default__|__bracket__) "high_visibility_color": "__bracket__", @@ -21,6 +22,9 @@ // Character threshold to search "search_threshold": 5000, + // Ignore threshold + "ignore_threshold": false, + // Set mode for string escapes to ignore (regex|string) "bracket_string_escape_mode": "string", @@ -215,15 +219,26 @@ "find_in_sub_search": "only", "enabled": false }, - // Angle + // PHP Angle { - "name": "angle", - "open": "(<)", - "close": "(>)", + "name": "php_angle", + "open": "(<\\?)(?:php)?", + "close": "(\\?>)", "style": "angle", "scope_exclude": ["string", "comment", "keyword.operator"], "language_filter": "whitelist", - "language_list": ["HTML", "HTML 5", "XML", "PHP", "HTML+CFML", "ColdFusion", "ColdFusionCFC"], + "language_list": ["HTML", "HTML 5", "PHP"], + "enabled": true + }, + // Angle + { + "name": "angle", + "open": "(<)(?!\\?)", + "close": "(?)", + "style": "angle", + "scope_exclude": ["string", "comment", "keyword.operator", "source.ruby.rails.embedded.html", "source.ruby.embedded.html"], + "language_filter": "whitelist", + "language_list": ["HTML", "HTML 5", "XML", "PHP", "HTML (Rails)", "HTML (Jinja Templates)", "HTML (Twig)", "HTML+CFML", "ColdFusion", "ColdFusionCFC"], "plugin_library": "bh_modules.tags", "enabled": true }, @@ -238,16 +253,29 @@ "language_list": ["CSS"], "enabled": true }, + // Ruby embedded HTML + { + "name": "ruby_embedded_html", + "open": "((?:(?<=<%)|(?<=^))\\s*\\b(?:if|case|until|unless|while|begin|class|module|def\\b[\\p{Ll}\\p{Lu}]*)|\\bdo)\\b", + "close": "\\b(end)\\b", + "style": "default", + "scope_exclude": ["text.html", "source", "comment", "string"], + "scope_exclude_exceptions": ["source.ruby.rails.embedded.html", "source.ruby.embedded.html"], + "plugin_library": "bh_modules.rubykeywords", + "language_filter": "whitelist", + "language_list": ["HTML", "HTML 5", "PHP", "HTML (Rails)"], + "enabled": true + }, // Ruby conditional statements { "name": "ruby", - "open": "(^\\s*\\b(?:if|case|until|unless|while|begin|class|module|def\\b\\s*[a-zA-Z_\\d]+)|\\bdo)\\b", + "open": "(^\\s*\\b(?:if|case|until|unless|while|begin|class|module|def\\b[\\p{Ll}\\p{Lu}]*)|\\bdo)\\b", "close": "\\b(end)\\b", "style": "default", "scope_exclude": ["string", "comment"], "plugin_library": "bh_modules.rubykeywords", "language_filter": "whitelist", - "language_list": ["Ruby", "Ruby on Rails", "HTML (Rails)"], + "language_list": ["Ruby", "Ruby on Rails"], "enabled": true }, // C/C++ compile switches @@ -300,6 +328,8 @@ // use the color from the "default" style. "default": { "icon": "dot", + // BH1's original default color for reference + // "color": "entity.name.class", "color": "brackethighlighter.default", "style": "underline" }, @@ -366,7 +396,7 @@ // Determine which style of tag-matching to use in which syntax "tag_mode": { "xhtml": ["XML"], - "html": ["HTML", "HTML 5", "PHP"], + "html": ["HTML", "HTML 5", "PHP", "HTML (Jinja Templates)", "HTML (Rails)", "HTML (Twig)"], "cfml": ["HTML+CFML", "ColdFusion", "ColdFusionCFC"] } } diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_modules/bracketremove.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_modules/bracketremove.py index 3e62d38..98a9d96 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_modules/bracketremove.py +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_modules/bracketremove.py @@ -35,6 +35,7 @@ class BracketRemove(bh_plugin.BracketPluginCommand): self.left = None self.right = None + self.nobracket = True def plugin(): diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_modules/bracketselect.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_modules/bracketselect.py index 99e1db0..af14a64 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_modules/bracketselect.py +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_modules/bracketselect.py @@ -6,25 +6,38 @@ DEFAULT_TAGS = ["cfml", "html", "angle"] class SelectBracket(bh_plugin.BracketPluginCommand): def run(self, edit, name, select='', tags=DEFAULT_TAGS): + current_left, current_right = self.selection[0].begin(), self.selection[0].end() left, right = self.left, self.right first, last = left.end, right.begin if select == 'left': if name in tags and left.size() > 1: first, last = left.begin + 1, left.begin + 1 + if first == current_left and last == current_right: + first, last = left.begin, left.begin else: first, last = left.end, left.end + if first == current_left and last == current_right: + first, last = left.begin, left.begin elif select == 'right': if left.end != right.end: if name in tags and left.size() > 1: first, last = right.begin + 1, right.begin + 1 + if first == current_left and last == current_right: + first, last = right.end, right.end else: first, last = right.begin, right.begin + if first == current_left and last == current_right: + first, last = right.end, right.end else: # There is no second bracket, so just select the first if name in tags and left.size() > 1: first, last = left.begin + 1, left.begin + 1 else: first, last = right.end, right.end + if first == current_left and last == current_right: + first, last = right.end, right.end + elif first == current_left and last == current_right: + first, last = left.begin, right.end self.selection = [sublime.Region(first, last)] diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_modules/rubykeywords.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_modules/rubykeywords.py index e4684f3..ff78a21 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_modules/rubykeywords.py +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_modules/rubykeywords.py @@ -5,8 +5,9 @@ def post_match(view, name, style, first, second, center, bfr, threshold): if first is not None: # Strip whitespace from the beginning of first bracket open_bracket = bfr[first.begin:first.end] + print (open_bracket) if open_bracket != "do": - m = re.match(r"^(\s*\b)[\w\W]*", open_bracket) + m = re.match(r"(\s*\b)[\w\W]*", open_bracket) if m: first = first.move(first.begin + m.end(1), first.end) return first, second, style diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_modules/swapbrackets.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_modules/swapbrackets.py index 9ed3abe..3db5400 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_modules/swapbrackets.py +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_modules/swapbrackets.py @@ -6,8 +6,14 @@ BracketRemove = ImpMod.import_from("bh_modules.bracketremove", "BracketRemove") class SwapBrackets(BracketRemove): def run(self, edit, name, remove_content=False, remove_indent=False, remove_block=False): offset = self.left.toregion().size() - self.selection = [sublime.Region(self.left.begin, self.right.begin - offset)] + selection = [sublime.Region(self.left.begin, self.right.begin - offset)] + left = self.left.move(self.left.end, self.left.end) + right = self.right.move(self.right.begin, self.right.begin) super(SwapBrackets, self).run(edit, name) + self.selection = selection + self.left = left + self.right = right + self.nobracket = False def plugin(): diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_plugin.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_plugin.py index cd3bafb..78a600e 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_plugin.py +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_plugin.py @@ -115,16 +115,18 @@ class BracketPlugin(object): setattr(plugin, "right", right) setattr(plugin, "view", view) setattr(plugin, "selection", selection) + setattr(plugin, "nobracket", False) edit = view.begin_edit() self.args["edit"] = edit self.args["name"] = name try: + nobracket = False plugin.run(**self.args) - left, right, selection = plugin.left, plugin.right, plugin.selection + left, right, selection, nobracket = plugin.left, plugin.right, plugin.selection, plugin.nobracket except Exception: print "BracketHighlighter: Plugin Run Error:\n%s" % str(traceback.format_exc()) view.end_edit(edit) - return left, right, selection + return left, right, selection, nobracket class BracketPluginCommand(object): diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_swapping.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_swapping.py index 7516406..c28c930 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_swapping.py +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/bh_swapping.py @@ -1,3 +1,4 @@ +import sublime import sublime_plugin import bh_wrapping @@ -14,6 +15,13 @@ class SwapBrackets(bh_wrapping.WrapBrackets): class SwapBracketsCommand(sublime_plugin.WindowCommand): + def finalize(self, callback): + if self.view is not None: + if not self.view.settings().get("BracketHighlighterBusy", False): + callback() + else: + sublime.set_timeout(lambda: self.finalize(callback), 100) + def swap_brackets(self, value): if value < 0: return @@ -29,7 +37,10 @@ class SwapBracketsCommand(sublime_plugin.WindowCommand): } } ) - self.wrap.wrap(value) + + self.view = self.window.active_view() + + sublime.set_timeout(lambda: self.finalize(lambda: self.wrap.wrap(value)), 100) def run(self): view = self.window.active_view() diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/angle_bracket.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/angle_bracket.png index eb72330e2acb3d78ddaaadec80d240a7b5682f27..a6aaef4fb767f6cd7e7ace5122f82c5bc29af9a6 100644 GIT binary patch literal 420 zcmV;V0bBlwP)~D34{+3chQbh_6!uOd@N?WX-`KW|r#}P$yJZiiI`R ztfvBEYERsEQzCG5OeNT3cqKH1@dM3nMDx08I^m8m5ULLd2pl(XvVB0jX_Omrc2jFM zO`}-6k@75QLN>9m)i$FgZP+s+EaRIz%Bjn!#}#{IE-1;^nP9-R=shsvIPM8|#m>JY zrk*>>(g%q{H4XybBYd5NIA8EAx5#RE8#jQ{kmc)t!75-C@b>~90t^5<8N+jjw|=+) O0000~)y=cqVcZ=6#+^&M)J^Y&%2u?f@IULh<<-Hjl+-&Uim@);Wt)`ybpDKCn`%zopr0C*Hv;Q#;t diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/angle_bracket_close.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/angle_bracket_close.png index d638c0edc2f25834d575abe0bb8f9cbb2bf04b2d..edb8b196e018cf49147ddfc7ba86c9385a639f20 100644 GIT binary patch literal 341 zcmV-b0jmCqP)jt=iZqN=C74Sm(R3n4{q5$nkB_`hu<%AkE;2O({C7aW3sVR7G#LlM?eUjG`%~#Jk zh9&4ncHMD9&gKKg6<}1{rUgj{;&g+S{ozVVm^iAjQkBZ5*1_>_>cT< ztY8x04tT>9pr;_H+|2GEdhfhNsUqZvLUyQSq?Is9I@rbam z!WN{3sT^mNUlA!07$xMVu$`ePQOrpAzH`PYdjo+|N9Lvb+>Z4u_T3c7-eZ+;g>f;T hMCkzsYX*e_3_XlLSyJW&_yK*x;OXk;vd$@?2>>bKUElx! literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`VV*9IAr_~TfBgS%lF+h3) zN5|@h853ieWg33S3gojTF&6Dzz}1{rUgj{;&g+S{ozVVm^s!d;$!Q*c8kpIM^*1 zKC&vTYqx62<70?4W9<0OywOHeDsn|aCBv1X$|94^0WV&&I=tz3eWxT~uW(8vz|(_` zkKqyje?vx(HH{*hJ+?+Lc9{P;&d2BQR5Igf1B=Z*J_TbH&!Pj2I@9zSk{FA0*%Q4s zJ#NILyd%p`~5hI*uWUIm(*B(nRh- zK?md7Vn&XfhOphjg(6o=R`S|AY+kG^U@vom?IdGHhRLKwofF;87BOd>u#wPU@7dPn kE^F|rVc}zj1_ovZIUAov*JtW228IEHr>mdKI;Vst05Jk_ssI20 literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`NuDl_Ar_~TfBgS%l(L>?@ z$C0fLdnU**vouz43+!i2st)2cV0u*TP$S)O)#Iy^kw88BBWDL4A3uo$JQi$67Cm88 zI>G(D@duw}oCDvHwHF+=ELD+u-B5Ayf^TQ@9R>!4Tin;LBuYL4+Q#7N>gTe~DWM4f D5;`>S diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/angle_bracket_open_small.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/angle_bracket_open_small.png index dc7be3d5447d0ad0ded92c25cbdbe93eaf40be8a..e3e66793e075b953d1a808e3d4594b509d293e7d 100644 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GJ3U<-Ln>}1{rUgj{;&hnu|Rg7EzC1kWK3fguvdr_*I>~& z!sKA{(4J|+lKDZWWgC7RtPgPzXK$$4`_Nv^!hxTih2bN+Nw>YjQOS^DuWF-%Qf zu$5Wrg3dk$UuKb|%0-(Wx+~~0JYxQ$!)~Xr@n>U&y?{SM5@T14!353;cVZa43b+eW z99gTxTyAhJ literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`fu1goAr_~TfBgS%l@q+XL zjw4$g_DqmrW@)V87TC|4R9(cggZ;?%#)w`S{e}bXPO~_7KClzGuXvqxgTW0hUgl`8 lq=kGP;=FfTOoVtC7#7^&RQ+A5e;sHzgQu&X%Q~loCIHdTE6xA_ diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/angle_bracket_small.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/angle_bracket_small.png index d55828a494650bf8acd25fafc5bda475ea9a1814..fb5879f8c7f3b611d6056d434043ed0d98eccf4a 100644 GIT binary patch literal 364 zcmV-y0h9iTP)7gFD;{ zP9K5;pk?;d$cZr=G(d?=oCpCEFkiZ+Jim4Zw9(BG^jih4)&#P_qRhW!*+4ds4P*n^z}5y{0t^7_G|M2`rI!5w0000< KMNUMnLSTZ}X_Afr literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr_~TfBgS%lF+l17 z$C0fLdjw9!vm6NxC~RWmVEQPgP{)1bTYw?ELLK{&*^Lnm6BxfY{4f((y|6Re;psc3 zjf#5A4iA*Y&Kj&?oBF^1JnQ$yAADlYAq_vou86j^97@nO;mKK;r0|P(V)4M_fsxmPOq{?DiZJ!_W8DF^kb|Y)1v&%pZ$TE;6r*?n zsdqQm6~GpK?#L`w4KNh%d{1#J?m}7RI;L_dZ39!ikg8lt|9?z=C%{F30RRJK|8Uj+ R#7h7G002ovPDHLkV1mh9n*#s< literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#-1*YAr-goUN!_O<8Zq8uKwly zdl5+!FZ^QL$lz8k?7+ByA%NkFmyRK`YPIUEwl5E63h9>3DAqM~e diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/bookmark_small.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/bookmark_small.png index 4aa0a1201c534445db3c9cfbfe7d46de611cd2a8..acf8012ca90685d137b47ea2091c9abb33c269f4 100644 GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1Gr#)R9Ln>}1{rUgj{;&g+S{ozVVm^t|0~5*|tV3fMwAfD^ zQ81A0n5kjVoW$O6Ku94?^}383mzPsY@9ahko{stnSsYts7?^%H-jMIGzpO2IkNFY1 zM~%C}J?0}$U$__r9+&qxYyxWU^opFhNM0rL@V_Du@AxQ={0qLsGrz@ps|HU(TA zdmDbdb$HUm?C{3@e9VD{Fusb3S(aO6Hpp}|H~#qTaHY+-!Gf)$p5G<)3geNUDIqRX suCXrWofOF4W0i1)@$g|r21Yi9_dfm)HC|^e2YQRa)78&qol`;+0Hu{|tN;K2 literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ww^AIAr_~TfBgS%&#XG5@fMp6 zQxc;W4@2W(hco`2j0y!T9hD~x4+x)}Fq=7v;b`0f3jxi(V~zfu$`=_JPV4hc*)Y|= Q9%vAQr>mdKI;Vst06(%L$p8QV diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/circle.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/circle.png index 8073357311e16b93fc80a6b9f2121fa0b439215d..f23afb00d3e29ade81b23e4d59242c3144e0f8b0 100644 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G$2?seLn>}1{rUgj{;&g+S{ozVVm^t|0}a*vIP(96AK!{_&k32+hizQi*Xa`N(%UM zN_gcrMU%M#EJv&urrfwUdBz@*PR}Vv(wv!%icdYzXZP@AUUKbrlf$3JS&9V{Shk9H zZk%(a=|p2oj)cSNrWK7Gr^PR9Qb}p}^^Q@jTYkc$;vz1koJip?$;L;&nbsB`%xF%z k!U%Te3g!$Z1|}W`0rg3VzSD0r0e!^a>FVdQ&MBb@0QjV9KmY&$ literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`i#=T&Lo7}w|M>sko>^65{t_ku zYln@D7uo*&`+NKG{r&aF|1V}-aO1Ci{XZ80BZY_dj32(gzyC6Vm*M80`5p`=D$Iu& z76_jg&SnUBTdZ)jF{j~R{Ut|+O^lo=5*HZE8D6P>;#E*(n8>t=;U>4tg$6}djRi-T zuDB#6C)!?XVVQEnuO%&@g!_S4r;Nk&FTxul8)lqY!q7XDO=BHH5^qqka-al5`}qd8 ULlV!<0iDa>>FVdQ&MBb@0Ho$qVgLXD diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/circle_small.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/circle_small.png index da6d4b455611ff68241c65be527b80b763de0edd..d32b92547657fbe07f081bf337ae5a9693d7d036 100644 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GGdx`!Ln>}1{rUgj{;&hnu|W17s|F@^3kO3EnTDiGj3*dX zk{A{CeUKN9X*e}8Mb1*OfU)Ci;fYw5B<83#hXeJ86dFa0XL@|GHQX1haMVGqjggJ{ z9Yc_?qDIAg;eccg-xVgDjqDCKg8hG7f^^ik%Oo@``@-&_DSt#y;rN=1yArN2F6NUc qJ+Ok=P1fL5Lm)fP4rT@>9tNo|t+#A`FTMqIBZH@_pUXO@geCx(AyM1_ literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^E_P~Lo7}w|M>sko>^65wt})i zHd7&sz;ULHiUP*M*$mI`@2{WT_~rJ0jt{aLW|AJf%B&Z2&erW9Q9VjpV zQQ`x4$J-B*0YBy&yf~Q2aAE#d7YPH=<&695|8Hxx5|-~c^qjR!A+Et&-JpgqxtsG# z#zdA!y%AsJnUY+SgoVz}x353c_{BwG9@`O42OSSDuO$|m{U*!|lONewYEBgn0lJjI M)78&qol`;+0IN4mYybcN diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/curly_bracket.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/curly_bracket.png index 66b88172bfe430db503c88030b18cab2345f76f0..dc48ec6789cb799175ae0ec36f1aa70be6c297dd 100644 GIT binary patch literal 443 zcmV;s0Yv_ZP)V1kwn$^<2rddOI@+qy^002ovPDHLkV1hO=wy^*J literal 242 zcmV-4Y3my+YsEkac>BzDQ?`D0<;0M5d3r?slg!x7v-*dhp-<(i-ZTbUbVpwtA;$gB zfEmL`5hUy^z(54D_7XHt<^TWy07*qoM6N<$f<4J#&j0`b diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/curly_bracket_close.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/curly_bracket_close.png index b16d32079cce94ce5624f048296293d6d7d3910e..077331710797dff672c059906427eed562eef7b4 100644 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GZ#`WcLn>}1{rUgj{;&g+S{ozV5{mycBZV8>s2g=LbLdy%(+Mi|2*-UzQ_Y)NMqmBp8Su?)LJ;Ysp@#gbFJL bg#!%Yl2JPjs?Gcj^f-g3tDnm{r-UW|#J6~Q literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr_~TfBgS%&&>BnykkAX zMoBqS9-a!7qYXbK1?H<>XAro@a%8`zVZzyZ4u#tdPXm}|oG@L$lI36{uz5l{Wp)5myv0h<9|gib&XgNEYYMJAf_6|XY{r0rrm@@z^)qr$Qq3=D}s W#IBaCEO`R7pTX1B&t;ucLK6UGaXgs- diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/curly_bracket_close_small.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/curly_bracket_close_small.png index fde34df1f371e61867c2d0540612c92468cdc659..05f13ade35fbbeee32db43398d39f9ee9cbf38a4 100644 GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GXFXjULn>}1{rUgj{;&g+S{oyqj>;-?hDV$pf0!NiFm%XI zc*_(ZGND2CUvd+_!y1Q0mIXdpA~6g}?i%+vL?5$1VySXH$eyv`aKrxz{w;@(F^aPt zVw9h7gY(O&wiiDbgUVPonopRes#)5=AQ11MEiU6>*xY((M?HfsyTbz|fqaFXAxjQ? zXY<%M&td%}0ZEPpS2>wy@$$NPJ5`0cFs-*+aV+@|IelF{r5}E+u6lm=L literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`$(}BbAr_~TfBgS%&#Wpje+iF( zc0iH?o4|dxr1&CUhKE-j_RJGve#Z1s%!}s*>mz4}GcM~GXF1fcc6?{vsA9<`!tgOu zA&fC8t%zrad!|G~QlhNt%LjY{zj-3OmRRWX2r@IMi*PNOy?Uw}&^iWBS3j3^P6}1{rUgj{;&g+S{ozV6RQJ^9pVfhSrz{Ew@7=K zcC_-GW^Smk-RjgJ!!EMmqd3z?W{uwrE87ewP2{j=FtndiD-NU;|(+OL=JhS zjiPLa82Q<5F)Hs?FltD8BIEeE$boUzcgLH)^1gY@M;#fo*f|o~|Ic{9ARsNUaJqt; zIqwZ;XV(Tf#RCjqa~ZBYKas$+RMDYt8FxmY<9Cf828&KNIzD7*Zd}JZadmQIW5EIE zEzf2$?UikidGpDkMt+vD!z0cw1q>@#_H?L5y*bIrD`s?>F=FkDhG~2+E@{Z>vb)I| e?2%y*NMPt(9ORnYm8cE$JAwr-aPXgPcgcXdePb3(ae>cu( zm0@<66||sDWTG_NnJF!dp-GKeY=77u`A(525bKC%*l4knErQ`=sF#tjqt8Z0hUL@5 VUKsPAn+UX@!PC{xWt~$(69AV-H^2Y@ diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/curly_bracket_open_small.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/curly_bracket_open_small.png index 9a7584e6e671970178f85604e93d6ed8f343440b..0c3d0b44b154deb3ae4a29f95d53f307670df63a 100644 GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G7d%}YLn>}1{rUgj{;&g+S{oyqPRgrbhDR(4We!5x43D_K z6f`hhQK~a3WUOj+V3_ojy>SQQseKOm>_BT{nFE8V>;aDy zPmWVn!VNbVI-V{}l0SL2>PZX33C4dO)8bvUTV4n;ZJ2akF4F#}9)o3r%bgGMj4~%K z^f#UKY++}!5|`lF!py>Ui?Ml?#ykey88Rn$CEbi>r6_dEC1mnjOq%Qvd4h*AVrRpf x*X&=o7~2HrbGXYIylMz!@3CrF#h`G2Az!U+qVnnIWPj!7@Q}qE=<%1Zf6_?><};t=-S41MOh&boFyt=akR{0Jg9#y#N3J diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/curly_bracket_small.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/curly_bracket_small.png index b8a4d91fe866894da5c52796f8d10ecd9aad3f3d..a348972bc0fcbe30717382edb57bf55e76f68d02 100644 GIT binary patch literal 359 zcmV-t0hs=YP)*LSO@w zmWP^g0B4TCkvbdD^78@`asUi3Af`;frP%?9CjjvSBm*{(Y54=FSq`K)02yC^8uWn# z2Yi6)xj>C_-~yE9Cm{{M)PA5wHdGk#1<{~r55T|zD8^PU!18$jNhZ>`JrF>R_5i3< zQv~7!0_qyE=(|A3aK;heC>?dcr~^hFFzSE-cK|?u0RVJAjG%KTTN3~P002ovPDHLk FV1iSxf7k#3 literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`vpiiKLn?0Fy=2JM>>%K9QFWfv zh7BGI%R8S)-D-_-E@H8DXz@5;)s@TDy`+0y>Su0k$y9?S8!OHl{Yfh8+4@cW(qex8 zv?m9zv-L>`9PUY~5y)gJk7+%~v{WrXQJBp*WR^p7h{T=+NAom49N=yg;P~jqTdpUt z;BX|zoDWCj&drj2a!YoKMq1s&Wt=V&6MWt+IQ}qy`ie~t4~QQ&mSA5I<(2?+C4;A{ KpUXO@geCxL$xwv= diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/dot.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/dot.png index 95f2c7d0e2ef96e7bd74c2a6a95e6eac9d4e184b..52e549314c3d52ee3aac02a8ffec37dd09e4b29d 100644 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GvpiiKLn>}1{rUgj{;&g+S{ozVVm^t|11p%>?l9_zyeMr* z60l%6x`a8v(?dy&;Su+L!-K3VWIUf4P6`x>XGp4*DH3nI(J(Djfua8?Pry!=D60mE z`3YY}!9kiGo-Y^xNNs`H( m)N7S+g%M`+Ek*`LHioRY`!A&*`tbr?$>8bg=d#Wzp$PyjO;INR literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`d7dtgAr_~TfBgS%l@rU#S zhNCh|q!K>7zrX+W|Ah=E>iCy1b(l6VuXy;c-h@HqH{TMG4nu_p_Iw|{zrW9v#N+X! zUphn}xq;=%&KnKPfsGs`S!`m@zfTtF-Cy^26T>B5g+IT)=l2WFnZlXGz+kJy*yhz? Q4z!uU)78&qol`;+01#Y0pa1{> diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/dot_small.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/dot_small.png index 32c26d23fb361acfd1e15333cc1b61c6748cb64f..8ebbe9ac7e9bee7727def28669d77a473ed59916 100644 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G^`0({Ar-fh{`~)Mf7pRZt&NdwF`q;!!&1HghNR}k0)`Wh zm>p{5JI*tIWL+U~S7rjkk#8O~wF-I)#}(X+xEHZI==7_76YOApA<87)A+mTTvzUOU z+hz?0M)r&-frhAkjraH@bUWN+4PG?_viDdeTww&6e_#dk3MK|79tNHT60&RG9sUG# O3WKMspUXO@geCxKxkau3 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(Vi}jAr_~TfBgS%lF+l17 z=aGL7G8{+#ERj0EdxZO+@&P>sG4-PjGyZ2hcz=Jt=n{zuf8~X@OiW@pvGaJM)&IZ0 x%b7hgCrWjA1w>cZ{rj`h+T`-V6^trL462p_j(#3e+knM@hSsQ@yLnYwD^YGNgNq%vKTPFXQ(^R-dq*yK;0Ht_(cnxoA)CtR}GGMx)hbKW8$G;vp zqx9+(P2_ke?9m9l%5jLYvc34qgizv384E&p1dUJRr_`c~p^pFn literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`sh%#5Ar-gYPTa`ppvc3z*&*h_ z-Xo{>&s{3*;q#Gcl1WqVQE|Q^O};>(iQ4x#He8z0m>OhPyg~j`kU@HdsXcGW85tY4 zW#xx1`4t@a@a}HBzQu_TulCGgW0Nz>y(hBo-!c0SP6>>gTe~ HDWM4f)^<85 diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/double_quote_close.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/double_quote_close.png index 7c25d7689601cff68ff5b46aa7dc3464bc126b1b..02aca9f3899ff0a18fc2726d86ddee7c99cc8c85 100644 GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G7d%}YLn>}1{rUgj{;&g+S{ozVVm^t|11p$4N*kC&CTsU| zIOqsGctW*ac;a}vVpOE2P0!8 zYnJLER);+knJT-46^oK)H;5czQ#mzRmet?`qh^FX(??dJr<#0>tXtN&t+KhflR<2c z_=hD0PM<_99T?AkU}E~jd!(u-g55?zU<i!>5nz8J+E`mmE>=7dD=BK|{1* xSy9o`jZDWbhJ9SY>?UjQszLBQLjwadgC^g`Rc^9uAwa(|c)I$ztaD0e0sz-cW}*N9 literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`E}kxqAr_~TfBgS%l@q$zX z&xVgL(+|YU)HJbua5A+yd{8~Z!6f7`kI6riB;E@4BcB^*@ORqtznY{tiO-E!fsvVE X!el9-I77BTpm_|Qu6{1-oD!M<*q0`F diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/double_quote_close_small.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/double_quote_close_small.png index 71af73bb83035359ae05fd1957d197490a79e122..ad4656f382210fc4c497da8738ae8baf93a9b932 100644 GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1Ghdf;zLn>}1{rUgj{;&g+S{ozVVm^t|0~1Odm;}TbHZn|_ z!6abLu#x%Xvc^-4LIsEFS$;IA{A2Lk(;#B($;-&BVrDPE?og}WFXm*@-NftgNARp8 ze?x`xq#1U)vIPvU9`|NES}>ttNx0IV1`$!|3qnfFV#fnb1)DxFWh7ZQsH8FYPEmN^ z&{er4%8pT!UBlt1$ON7F4y)Q{oZ$G^?9s`u#&)Rn!ly=+0~WXBfDT*1>?UjQsv(fQ h$1357HG{$dhHN&sy4H>oE1+)}JYD@<);T3K0RSI}VJH9q literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`UY;(FAr_~TfBgS%lF+iGu zIng6$6HkZI^@h*@-!g|9mX7}uvm9gu>{*fw72dHwTD(N+14GB-`ByfZ91%?P;fKXFCK)3eb!H z#zPVQ>B{@)J~nvQTrMG?bKf>{xrBhx;id}wodt;+FvR_)z_nBn4&LvZxxgcU#dZTJ zZaDmuOHZMtQnTRx)BD8YNF-5ZPej@iTqmtoad^6E0GlS{5Q?kidR5^Zjzu07Dk3u} z*U8~mByz}CnTv}SY%oaVEiq(*&xO=yd0ZG|fIv5y^oEG-GV!QMN%FYJMZn>T(V{2| zZP*eMELw@j7R#B<4WbsA(-TllaV;^xs6ll0-en>R{37*1G7~JOzQjcYJcyS_mElI@ zI|@{3zqE@*s=dTFd!76js6y2$X4SK;K7LFN0f&IS1-t|p0D377BvYmYp#T5?07*qo IM6N<$g7g%uD*ylh literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`S)MMAAr-goPQJ)_K!Jxf)*nVvtZe0;x+P$t!j{J07EbdT7YI)buTfo~{rWQVs;?Ir&L2pNP0bXUwQ%Dq z=M)8L|8^CXOK0{vE1InMyrO)KYEDwko1V~fyM737SDz*Iq51q4<|{I0-|m@e$pdX= N@O1TaS?83{1OUIMKD__{ diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/double_quote_offset_open.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/double_quote_offset_open.png index aaaa8b6f86a6526ac5d37cecb7afec7fc6d0777f..d4621c1d15a177bcee79e4ef26899abb46ece5d4 100644 GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1Gr#xL8Ln>}1{rUgj{;&g+S{ozVVm^t|11p$M6gDumeiE@v zU=p~`{)kQH6EDjXL&g;W~xYn8ohmChN*)(cxOd$oP}@iVmma$GZ$i<7(~M#KTkhk9uD*sgQu&X%Q~loCIHSvX2Jjf literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`KAtX)Ar_~TfBgS%lF+l17 z_mR&HKV+wzXFu|J;tv+y8Q^7}1{rUgj{;&g+S{ozVVm^sUd<6`T*mNGTIoLF& zTz1&mz!LL8o>64N5#fd(%po=nBF3H@Z5U5}VpAz(R{6-PQq_^c&Y|#g1B357hMm(U zKVq2i-hM%+^n(teMTQ$Y0~o#H9g+?Usc_h^Br!%kW18Xm&7nqKbL(N9sqBwFJJd9U z@$G0h=HGBh{=$*B7o9q?_--^Dt8Z}rqb%kgxK@Ti^$5E|4P%Gwgd?&GEFUt4@OpMm zDBNNtS9)Ltvzx5JtA;@K9;<{ajLdHt8W@-vs=jdhx!F0{0lmlI>FVdQ&MBb@0O99s A3jhEB literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`zMd|QAr_~TfBgS%l@q*L> z_9M?5BX~P5H~e5+$tJ`4s7^tQ`BA%rjQc9a{|!Gl1aALrZwOr?#lRfsk+X@1L-~3` h;sic7UIj*GhNG|eCN2}Y#tk%>!PC{xWt~$(698b)D%Su2 diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/double_quote_offset_small.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/double_quote_offset_small.png index 131c95b9e22bf7ff1527a400ae193c9ecdc44d02..a02933950fd033bdddd000fa6b9b672235f87a96 100644 GIT binary patch literal 378 zcmV-=0fqjFP)Tr6b@32+1{Gp72$$iQ$qL%}efh9Pdth?|pY>T)LB^3HUn!Q@|V` z7$*akfFYR?r=Sof{|U$Vjqx+)mF$3G->(59-Tnq0s`dmn;01!VfR%CgngX75;}!VW ziN~)@=-5+OFk+VwSJZ?NhRpV4oFY@k7%(SSNTwW1PFI;6%_cyyI{V=|m6s~S6|2PU zY(~IBHg=Tgl~Be+%}lrP;xf zEfxcN{&+x39PD#J2I8^Qd;$ym9J#J`2NaExgV9-t!!bLIzWpg}0-As(pb0ozz*~R; Y0A0aD^O7>#GXMYp07*qoM6N<$f_2cGZU6uP literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`1)eUBAr_~TfBgS%l@q`2e zbD~GiCY}zZ>kXj+zGV(IEFJ$7jUD(q&NFY65?Idoky&M@g+d+2ktByZ{72k3N*0J{ zX|jdNw5xn)$XX$FMaVXX?N77SdA?V7LYEw4I@h3dwZWi>SK^uH%rc}1{rUgj{;&hnu|W17tAs0z%x@XgjJ|3HX!J8I z5Ks{G|H045Yw<*y*6@{D>D6#XYMt0_qGZSrVvsqB(@(2(+jjp-A+2WM!K zXr99+hlYkdOu8}+GFzUUczonYiZi>(KE}>ZBI(Xgez^KQWMX+DxXucC_3P%^N5?{ME-)bKph6%D0_#GOhQi!lY+9H88!Yk`ux23?Z66V lH(7&M4T0SS76tSWgQu&X%Q~loCIIPeWt#v1 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`KAtX)Ar_~TfBgS%lF+l17 z_mR&HKV+wzXFu|J;tv+y8Q^7}1{rUgj{;&hnu|W17tAr!g4V^xHT1s8mw^i%*90&R~Q%bNt7N~!R#h$@Twt@oq z_9M?5BX~P5H~e5+$tJ`4s7^tQ`BA%rjQc9a{|!Gl1aALrZwOr?#lRfsk+X@1L-~3` h;sic7UIj*GhNG|eCN2}Y#tk%>!PC{xWt~$(698b)D%Su2 diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/double_quote_small.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/double_quote_small.png index 3d4daeb3967d9544e363f52fc20fc1f7f1710be7..4f149fc1819172adb5ecc708f7183ed9aed7c1d7 100644 GIT binary patch literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@j4Ylmjv*Dd-b{PQ+oHhJdXcqHP@+*#;vfjg08t|d?cv?S zY2lHz?z+gw`O{-&@0qbD;MYR`~JbXKx6Q9^>bP0l+XkKA9ses literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`d7dtgAr_~TfBgS%lF+g$w z`;q635xgCj8-6fOlHqAl+-S&S!FA-XgAUsf{zePFZpOeLJU`fvxHsJ3Ta_R>>5kTl z8L}Z~?Q_^3Y+-#ht3BZQSLfL7%MAuPY&H#T-BKoVzObd6^hp^60Il`DCjVti!ZLQC O%?zHdelF{r5}E*5r8(08 diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/question.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/question.png index fc0bf7a2393cc3e273f6d6a020b41821f50b481b..8e5324ab2c1abb330844b7ac7028c60ad175162b 100644 GIT binary patch literal 325 zcmV-L0lNN)P)Bq?$*HVgVpt@SiYnpp^p*fcOKFMHiqBLJy4x zv~mE<5g-c!(8L?i9HBrf2jFuUGB6-kFSW9v0}}fq5MQ8WE+CXP3TT-I2wA>>mf4W% zmQ(70189X1S>`ZOP#q&{G$bkEQK>FCh{V1?t|5#=y+PuDR3p;W0ide*0}$^A;`cyY zK+o!!0ZXm;fZSX_ZU~?UyF9(4U;`R|A-$Vq3!roWv^ln5#Ad@$2aGyk)BzL&fB*vk X4_XRc`IG+D00000NkvXXu0mjfIXiXK literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`<(@8%Ar`&KKmPx>XI7P%zr<3& zonfPmdKI;Vst0BRRG8~^|S diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/question_small.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/question_small.png index 434dc2cacedd2730708c746392ec45ba5378dbf9..9d4c23da46f95440be5cd25d732306c47ad996c8 100644 GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GXFOdTLn>}1{rUgj{;&g+S{oyq^F2l`2OWoe_6D6f3`h7I ze%J}@XMe=+aK~X9w?pRymNg7V#Q!NDX#c-rL8HrO4?e~T>%|#9Ix2*HOO7@AI>lU)?CBn;>;22WQ%mvv4FO#n$hWR(B_ literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`sh%#5Ar`&KKmPx>XI7P%y?{+X zona%pK=H(62WbIzhC*I}-;%nE#}*BQzbt}!Pu7V$2yQ0$d*$Y*9)9?1Oi+J)yXKnoc>UHx3vIVCg! E0961iHvj+t diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/quote.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/quote.png index d4fe698477ee4464c58ff8c4dd6ba5f4dd6614a1..b073dc6c7eb658abc83d80a6b592fa32c0a3dde5 100644 GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G7d%}YLn>}1{rUgj{;&g+S{ozVVm^t|11p%@<}iyam=ROy z!=T04d4S2G=7Bwv4nq>F(38TXB-sfc8yD0%WL=p2ieW;(y@R(+jH;?#<(wH4Tf#On xm`t6l-7jj;XLj0M*5Fk`AUn?%W(Fo62D_gdSMgo3TMP6XgQu&X%Q~loCICTBXW{?= literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`E}kxqAr_~TfBgS%l@q%On z&xVgL(+|YU)HJbua5A+yd{8~Z!6f7`kI6riB;E@4BcB^*@ORqtznY{tiO-E!fti`1 Y{E(E;$>VbDK=T+pUHx3vIVCg!0Ot-TUH||9 diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/quote_small.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/quote_small.png index 414e6bab27aebac15688352a2cea2c7244e6a869..e44fbbc5d176739c4b67751798f450ccb4297761 100644 GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GS3O-ELn>}1{rUgj{;&g+S{ozVVm^r?J_CkFtPXb=jxc#V z;&QNI>=N}b5}d;Aae)7y@&R@Qv4*bvAN^b+9j23~2ox|RRjSz8hw!lcxp+nGf)W=W z!$)VGKqe;Xi$_>9rm{KM>A4i0U{{fEKBB*#kHIsBvEAaTEJN3C?h649)2$hf@TRz^ zGe6EKwRzPL$lha>aD@@*=+Xl#nAvVIGBC0+$REy&F)Ca(1?WKrPgg&ebxsLQ0O%QG AGXMYp literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`UY;(FAr_~TfBgS%l@q#1+ zbD~GiCY}zZ>kXj+zGV(IEFJ$RW;w_R*s~-VD!gNVw0Mcs2ZoNz4H3K@=b1O&yU=|s ekeTfe1A~kY-$aRfm!1GkW$<+Mb6Mw<&;$UMjVh%8 diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/round_bracket.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/round_bracket.png index 92e3c48bf729d1730411a3650be583a6eac33cae..19d79ac9f481bca2b631b714ff51a5e47875bcf8 100644 GIT binary patch literal 414 zcmV;P0b%}$P)!Z6LvDP~Jr6kdhg$qy`9gQ{& z+uEqKKC~=<0imhUNq?ks*tWnm=6PXS)x^X8a2~eB_0DDIE*R$Yy08c7;n3AJvVgtyN04i#TC5-aP0wGG2 z`N9VP8#e&}H4&2>$Ku3cG=@yW5&;Mg06a;n5P+?T)-Vold?u;yK1e~-$W~H&A=QYK zO~9F1mayz*n~3V@R=nnevilxqCsfvlj2+)!MmNCa0p0=(0Go&>zxi--{Qv*}07*qo IM6N<$f~`xY`~Uy| literal 270 zcmV+p0rCEcP)_)*|8mr22ni>5_TXKpP86D|Uaz-O*6 z1unRQv-XQ54mgsssYo7+66Xk(ELyv$$`L~Y5%O5^nMp1OAxOk51-|7m+4-B`4IOtY U#FTn{J^%m!07*qoM6N<$f}}=eTL1t6 diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/round_bracket_close.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/round_bracket_close.png index 1c23aee14f9049993b3ffa19094914db5a6ea1d6..772f7b0cf31c69a8ea3fc55a2a8a09bee669bc81 100644 GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G4?SHRLn>}1{rUgj{;&g+S{ozV6pI549r_NLpBOc`P8{HL z`18=7r6Gga=&YhOi=M*9pN&5l1hg+0vpC#%Xs>1A&}TWtf}utFg3LsRRgyg+C))TM zBIHihd1QqIC`+3uY;@$~T(F&4jNzlZO5Fhm5f|wRH~5$zHgIQLG+4l=pefQ;5^L~^ z;ma(+_*n~fGEWeeUE%Y?U;>|o!+Q;mhOm=2xKx`GPK3L$W~kn0sWS86nJ_C=p`dXd zuTaV9lX>DsffHW+ytwEQQ>0qp4YfZGe#Skwd^cU(m2id8`8Fd1BOAk)jm1;?()nKj PJgTe~DWM4f`1Nv1 literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-f_Uf#{w;2_|7k<~t; ztI>A`C!5lZ<4PSFX|hcc5gpqS7xk`q9X;a;ubf4}qDJYn8p&s-OGX9gtxM%JF9~tr z`QUJj&B@|HO9N*F?~Ro=9F!V6d0m8V+;GrnoXUGdNaAM0G>3yMH8)z1vsCR+Oy$#T l=g#^zMf}1a}1{rUgj{;&g+8rK&thK+|DEDtbr@H2d5^^$d5 z$1KzkA>Z+{v4YveALJR;CS>!e@(D0JV)y7PP&h8*CG?P8A2Um6SIy zt13G57Cm6z;wLeoXaVENPpwZ}7*!P&7|u2suxl(z^_gTe~DWM4fyuxfp literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(Vi}jAr_~TfBgS%&#XG5aT;3* zV0j3ppfwDhu6{1-oD!MI(aDjArLFjGZ#1@Sq=gX^v;F}NNiBTTR?9IAm{f315ps^Be5^g+X3jM z9o-!ufX4qY;wqyL1MPqdSjq&tN5MlpiIOf3K+gOASP~}99k2n7A3&}HhHPboUIEFI zT_I7}96Ny4CU79t3`!lKfYu)T0Bs}EtxfmfrqQiQHrg{9 gb-?g&06>5N04LoO=XbB*9{>OV07*qoM6N<$f^O-0k^lez literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-f_o-yQVb`WvBsA;lJ z^``r(2#%F8tx2LYl(;(`OLn>}1{rUgj{;&g+n$`?OhNH}n7$zKLZ}`C^AbsIB zqrvH~jS+Gk!Y7Par?8zkBK%MJ0AtbFL=|Jfrl#LEQ~nBeh&KFSwq3k{q4#g&oeC9o z7Kg(BawoqteL2_0=kbP@Ign2weLFLAtbnZqkLtq{WetZNEFLiQu~;fRW#Hfl3KEzo z%%pHy?2(4(OCctn3!DDi1!ZP9E@pcLKF8W&1`xl(W0*qdQ$pDr0imI zF9(H&IT;B{oEC>LXcijrv@pB9ZVF`Yu}ZkY=zN=zfsu{jbNr8v=7n7uKwmO=y85}S Ib4q9e0Gu0fD*ylh literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`QJyZ2Ar_~TfBgS%&#XG5QI1W8 zxzKzk+YaWBl?vMwk26Fn?BhMM@k!M}-VS}HjS4&28cgyRs0i$C_#q^~Ju$n1N#H*F vBMYxZ7o}fuS$kb_6uV;0JYA@LHzUJ>4vu3FAN`g9+QQ)J>gTe~DWM4fW!^B9 diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/round_bracket_small.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/round_bracket_small.png index b1198309e1f09364d5ebe06b06c1a4ca57020d80..6893093acf62c1e9fb830c24e3c69870665ab128 100644 GIT binary patch literal 394 zcmV;50d@X~P)BRGO1 zI6_Bo1V^wNFoNB{5$FbNKryB9YC!IU#QxxtOD_629tZcqj4{=fawFoKOqfm92q3jL zACXqM=l}X`a+n_L7rS|5RhvyZ52iD}(&Qqro=gG9cSMwoTf=h@7=TlWz)OH1QVH-~ z=mj!j-!(cGg;*AJR%>TJtSZF2)>fsnYv<#18n(cegyfO|A7lao*z-vO;t0qhl~98# zV8o&Y9ka6pP)<_T#;)LXbuUoZyW9x}_A`aRf_=@N^z|KrOkfT;tqAEmr*=a{Y%l`g zbqtT02gZOMl8J;zw&MkyYC6D;0Jr3v2LxgsXm_D+auR?;Nh|{B%~xf_p_IGwoQgr0 o;=h}U3xPtQ5GVw)%Ugf}0KQhZTQ4XOQ~&?~07*qoM6N<$g5l1eLI3~& literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Q$1ZALn>~)y=2JMY#`E*xPHO9 zuqytep&9D~ybrqWX?q~RpX{IHImacVf6~9?HVM|k;va3|lj=`?-g0fXjF84f$;}R1 zO(#5VzG88DK|wTkjKSg!F*OgnZ-{0nK8$8kblbA7;fVCTCb?#9g#`i;a=#~J#58Kx zRYWoI`*d8Zd&t*%#=_e`;r=dm(-y;Wjq?0Qk`dq7k31Fej{4RIaxH_WtDnm{r-UW| DwKGo~ diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/single_quote.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/single_quote.png index a69f2c0fd8a960f202900c38e2f7d0590fdd8a4a..11d6ffc38fce6124d0f05762b31a94df01d3ed7b 100644 GIT binary patch literal 373 zcmV-*0gC>KP)GSUkm|VZ~PEP47kZ9B=TuT6GmTRfH{ZE3H=-~ z;H_Hf5(>0_TJnT`PF%{YF4zLDuznMgZ;+M`&>wC?oN%$!#4|ax-`(l}lsoXiB(FIb_&qK!CxS@Dm(uO9tryWWZGnE+70Rx(ld~)}1{rUgj{;&g+S{ozVVm^t|0~5*{7zCtwT9_TC z=`lR|?ocDwAwS`*K!BqQ+r1C+!Zi#@j6r9W)LBFtZpe3A*bAs%Q08L!aDw&1VMg(W z9}gX#H!)>dHpQ^#G%RCvR?w3QFEjNWShDZEQjwvh8T>FSAgLg;cC7mM{ pw{+x753FEzlQp=&$G~C0u>1IGCc8`1vVopr@O1TaS?83{1OWe%W*Gng literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`W}YsNAr_~TfBgS%l@q%;% z58Jhd{ZFJ0aGO4m+{xzR%sazv9pn3k3b`w)&L*-wQVuL^49j`B=LP;PPz9R6;OXk; Jvd$@?2>@;#Ag=%b diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/single_quote_close_small.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/single_quote_close_small.png index ddd2499e1b85c06b1cba9eb499f900e13208e557..65b31fdeb3903bf7c57cafd2219fb2e992d1a44d 100644 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GvpiiKLn>}1{rUgj{;&g+S{ozVVm^sYd;tuPI34aV9AOgK z$uNcc!~yYt$_LmL!W1scY;t0FQeCTJXD`5h!I(>q;iI#OA!F5YMs@|gBaZ}jEoGGW z$KcD(_{E3WK!Bn5f4@Ub!#%|b4O6(eG&o(0Oe7T|_ca{SSh7M!W5Jaofi#)5eeSXb suNnf`d#nX!?pm2b}`tOe&ljj#62D*~L)78&qol`;+0MTtycK`qY literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``kpS1Ar_~TfBgS%l@q#o1 zGjsX@L4|+ros54SYNiM=pJU#5??T_PK;{=f4Nu;%+A@F7+5yzc;OXk;vd$@?2>_Fr BAVvTH diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/single_quote_offset.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/single_quote_offset.png index bc59327dbd62f9eccb0b22360d32970a38fc3bc1..31297474c190ed141cf22b962ac6f4243562cff5 100644 GIT binary patch literal 383 zcmV-_0f7FAP)KSKN7MA<4jM=ZP2NB4eLQV1xyzMO*_o@zPF|M)C&VzN1L|@8q+s0InO2M*uKgWUgc!^a3rU zh=d~Rtm0}tb`_`r3B$JY#od~m>#7g=%!WPN1Hi20Bf_UK>}ALn1Hg@76Y|AOpMDPj zvu;u$lJ^v!Sg?Wk^aHX`(EywfOjyY~%y-2Mq!Cc)8fYU=FR{rn0E*CHD!pG*nphqg z$t0+B>@U$an`j^rp8Yb?e3Ak98q7BUmmJ_t?0lq^BggWm9yr!p54s~B3UH6*H^2>W dU4Xv;0|2TNBC0DS}1{rUgj{;&g+S{ozVVm^sd22@>}m18HLMMKI@Hm^k!C-&@OnDXMB z^G*4MEB`awZcbzps%BQ5Hu*IJvk7|u%ZW~=3H?78zUlTzJ-}8qm3hYjmMT@JCjt&^ z3s^KA`b`QL+b!&)el3{ETrl;g_(zMrS9}&8O@~*^<4#z>(80W5-#mu1yd|XvGP*Oa kFoIlp;6nj}LjxlNbG;02vi%Qrpnn)VUHx3vIVCg!0Mi3!wg3PC literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`mYyz-Ar_~TfBgS%lu|oO) z_mR&HKV)~Z`TXW*y!b@w15Xx%{!X?(fBP9yBtO(2;Fa+0{9?qwketpv@0(+m9?%d5 MPgg&ebxsLQ08s=b0RR91 diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/single_quote_offset_open_small.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/single_quote_offset_open_small.png index 8a159e34b4917aed4713a70e2fff2eefff5ec55d..3f5ca1ea641e5585bdb26b00ab3150ec6bfdde54 100644 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G?Vc`@*^ B9#sGU diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/single_quote_offset_small.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/single_quote_offset_small.png index 98460c6690c200570c1210e4287584e59ef723c4..db25ba40b2780cab80281e706a5b33421af652a0 100644 GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G=R92;Ln>}1{rUgj{;&g+S{ozVV!nihiz2xkVi=CdH&ieR z*eiI6YX}B$=KtvD66v_;epcgy`(yPB*1R$@FI*%Tj4 zHiWr-{8Dy+(d6IZ#)1arEhqMJto^CM v*0b1mQy_bfRl*g<#e5Q_2OO*!6b>+O3-C_6z$42J^cjPvtDnm{r-UW|IeKem literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&YmugAr_~TfBgS%l(L<7f znK}J{RuXRn&yoEbJB~Acv`^ys!5iA6$9HK@s|52u=egcxItjcwyQB}1{rUgj{;&g+S{ozVVm^sd22@>}m18HLMMKI@Hm^k!C-&@OnDXMB z^G*4MEB`awZcbzps%BQ5Hu*IJvk7|u%ZW~=3H?78zUlTzJ-}8qm3hYjmMT@JCjt&^ z3s^KA`b`QL+b!&)el3{ETrl;g_(zMrS9}&8O@~*^<4#z>(80W5-#mu1yd|XvGP*Oa kFoIlp;6nj}LjxlNbG;02vi%Qrpnn)VUHx3vIVCg!0Mi3!wg3PC literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`mYyz-Ar_~TfBgS%lu|oO) z_mR&HKV)~Z`TXW*y!b@w15Xx%{!X?(fBP9yBtO(2;Fa+0{9?qwketpv@0(+m9?%d5 MPgg&ebxsLQ08s=b0RR91 diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/single_quote_open_small.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/single_quote_open_small.png index 8a159e34b4917aed4713a70e2fff2eefff5ec55d..86c8e664acd5bb47fd45e8384ea0231a6775e860 100644 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GJ)SO(Ar-fh{`~)Mf7pRZt&NdwF`vXIz5<3vY+XJKPnnDg z57o06C|s8*(&cy9RKv(RPvJHr|AJ}e0ZEoS`5eCOWmw9mpe`uo@Uq)sjlqPS4)Pu6 znLjo)>ajn1`L=;M<4-$tAfE-pM@EHx48BuR)SZr9d{uFU5ok&2ffdYdvIegj0@-=C dFf%amF!@*^ B9#sGU diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/single_quote_small.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/single_quote_small.png index f21e44eb5e13fe335a0d6c76b16839a16c90ffc1..dd7d49ac10c09182381ee6bd2cc8b9fa27a3e0ec 100644 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GH#}V&Ln>}1{rUgj{;&g+S{ozVVm^sUd<6`T*h~yr73MLB ziYuHn3D8quRR817z^w9-+vAaZLqubQvFAn`hLe+6JsxrWH*{p&_-v98tMGynWdU`C zPJ4z&?HO6DE9SB>HAKjrRebSskwCZeif0VW8nuG69$Yxcyy9?z-F}DFF$?&QJa4RE z>K=vN1ge#29Zy6dGm>Hg^uRFLpuWYoYk=V+o&(DSUahK6k!HBMCpE+6@e0N-W(*9< X*ZCRk{21;4jbre1^>bP0l+XkKFYGFH diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/square_bracket.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/square_bracket.png index 84bdf1c6be70ee332e6a5ece415be724e4cd0830..f3f00b2cdc52bfc5c42b99e48c224884c2853a09 100644 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GGd*1#Ln>}1{rUgj{;&g+S{oyqj>Qqyh8qn1``80~R?4xl z1&AaZpUXO@geCwtl^s?9 diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/square_bracket_close.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/square_bracket_close.png index 3e86fbca9ee07b2851798f897794750d6e3129fc..dc5eb2cc415bb153f3aab8c1ec110a7cd5afad98 100644 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G`JOJ0Ar-fh{`~)Mf7pRZt&NdQM`e{bLlU#iC;5gSOrB~@ ziyBzoe2}-da9C8yEYG^c>H&j*@uG*v6z6id%No3D2xRZEO1Q$fm`|egzzSxM+$mNJ zAO8u;GA&TsuH2Yr>Df?t`BP$feH12cmLe~I*C_4p@1s~J39{an^LB{Ts5qk%$> literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8lEnWAr`&KKmPx>XXfkS@p}-| u?rprwaWPwul))rk2R4zN4EoD%Ffh3PkmC8)CNdMKhr!d;&t;ucLK6ULmKv-8 diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/square_bracket_close_small.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/square_bracket_close_small.png index c743d19008e57dfce48617dd932bfd1717ad0829..5740f81f4a0c5188457f31873a1b85aaae7a4917 100644 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GX`U{QAr-fh{`~)Mf7pRZt&NfGiNynZzBdki%n>Ip6bp3f zG939erG>$gufQSsy?kM2!WG8Fd=jMxRxrECI)pl8rluGO@ZGS#pm?Ff`46KdUxG}o kaGw=SRYy64LjxnjcMm}yiDQ2JKpPo6UHx3vIVCg!0NJxYj{pDw literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`W}YsNAr_~TfBgS%&#XG5aT*&3 z(??l_e@sWFYZM+-QrPF+$=L1AyWkGPrsT$~mkAFheG)KaU^x4kSLn%wAL&377(8A5 KT-G@yGywpo%OpJj diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/square_bracket_open.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/square_bracket_open.png index 0281a6357ec6e5d2a5494398deb15d1fe06734dc..e773360b5ecacfedbcf9f0127b22103f88645e60 100644 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G1)eUBAr-fh{`~)Mf7pRZt&NdQC*_49LlUFSC-H_K%omq6 zE^2V8d0=1nz@e*>S&nsz)dIl|$%`Kv6{m8z%No3D2xRZEO1Q$fm`|egzzSxKQU}`= zk)3U_Z6O>6lP(%A%-TGs@W}TbH=t661_ovZ_B~bS=E{Aa1GJmL)78&qol`;+0R7=d AMF0Q* literal 98 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`nw~C>Ar_~TfBgS%&&;>ynZ4G5 uReg;d%pX=tnkHOnn3%$Fb7rT8&qhXu7@{thCp@^( z?(m19|Bs`}HU@#$!l_ysyaERdE;zJANt8KUdfwpwc7g}MO%6n@w{VH?|oGT~s=>v|*x0X^%MmDKhsleN>X!)_CN-Q1XE!88#g`(}oIWjV{)%%LfmrKUK_N ZV95R?BR79rhAPlR22WQ%mvv4FO#tm|C+`3N diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/star.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/star.png index a754806c7b21d041fcffb2c6d092569d6bdd96db..109b6e80cab0eb5d58f293a1f549f6802047c640 100644 GIT binary patch literal 344 zcmV-e0jK_nP)rXH-a8o*fqg?3oo$s+WV zyV_g8YXFGa0R3G>C|A+uWN1iN(Ncs7o8cq()Qbshm++OuHi2X4oXz$30KDK=ZsCc% zPsAyeo7e+Z3~@N1 z(cA~T`{fFb+NBVUN!01R5rSzz$_Tx<^XTk`9j_nsBG_W>Sp qo;&8U3rV{ZHh>1u0RA7~Ex-VpCLniYSw&<30000yJ_Z literal 244 zcmV}1{rUgj{;&g+S{ozVVm^sadri3LNO{({y92Fqs?W^+h4M96oTJ8iTP5TB4LB)QJa;qz98 zASr_d?jkV~7P(AjvS^THah>x(M3n8}nLSi$TjYw)TekiEyM eA&EgCfnlp1&z(D+uM>biVeoYIb6Mw<&;$TNX=A7W literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`xt=bLAr`&KKmPx>XI7P%-l8DT z9hBr?CSdM-vuBBf0cVGFg9TqlcjFF@j_^rI4B{b=V-@PSj_5k*xO6dAIqc!;IM48r zRpB1bk+3Ba0Srg{9Ax;9Jax$7JTmnOOA?#F^$;S%xzN`89qJcnxXhF&kblX NgQu&X%Q~loCID%HG+qDz diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/tag.png b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/icons/tag.png index 7e8f47cf3c049286559099ff0776473007246928..822427df76a2b539622db11a6cc3352db2afbca5 100644 GIT binary patch literal 477 zcmV<30V4j1P)QJie?!H-1Mw3e&Szv~{6>sLxY8O69zD!J%n!x5fF96bH=rXv z4pbDF0r6g-BSdNGfPX-|1BkESkT(Y6eLzQuljQLJP;oM8mvid3^3xz9>{{9fp|U;D*&+{k>R2W4kWoGgeD$J9RbQgUO=-RkyH|*$?F2~>;I&KU!aPL ztdbCmBgt_@0@+0|j*tR5;wh1q*HTm$;E663Abvu?^4SzuMg(e4e2&-#sx@iq0H|RK z(CQZ%oB?8Ps#M2Bwj*Sa9C43OgM{i1Kyt(hAXX={;e)d_9POBlI$-2D03g5sj87p< T*BLri00000NkvXXu0mjf7lXFz literal 306 zcmV-20nPr2P)U zzb=G96b0}pBqG@ag-)U%bP~4GC^g~@yunsFrAlN=5~W&r2ug)oL?aP}O0{JD+n;7W z8Dl=5b(5RiIdkrrd(Q*}gb)iMMWjftI)?=O0etnYVIPMTFp0aoWfjM{#xmy6$~6NP za1bx6ILj3_eUEN&Oe~h3sLiTqVFlB51USNTtS559D@L)E47rpNdU(f2Lg?p1-Y1tY zm?~{?i9vLK3%msw0Km8=bqfm9 QLjV8(07*qoM6N<$g8SN(xc~qF literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^E_P~Lo5W}9yH8rWRzgIuztxc z=8Wvioh~jpc^9_6RLOh5lICe%$hdf^xxtK*45ejqhm;mgKGKr@qr5ID^U>ap?1Qpe z84LP^^*O zF=dfQA|ZwcqLSL>_b3WyF6gkEHshh}O$+w83&+@t3OQ{a*ya6eWPZ8pET6wa;7*`R O89ZJ6T-G@yGywn@qEH_I diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/package-metadata.json b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/package-metadata.json index b699bc8..9ae6e32 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/package-metadata.json +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/package-metadata.json @@ -1 +1 @@ -{"url": "https://github.com/facelessuser/BracketHighlighter", "version": "2013.03.27.09.00.08", "description": "Bracket and tag highlighter for Sublime Text 2"} \ No newline at end of file +{"url": "https://github.com/facelessuser/BracketHighlighter", "version": "2013.09.15.18.40.20", "description": "Bracket and tag highlighter for Sublime Text 2"} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/readme.md b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/readme.md index f9067f3..079cc93 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/readme.md +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/readme.md @@ -1,3 +1,22 @@ +# Table of Contents +- [About](#about) + - [Sublime Text 3 Support?](#sublime-text-3-support) + - [Overview](#overview) +- [Feature List](#feature-list) +- [General Use](#general-use) + - [Built-in Supported brackets](#built-in-supported-brackets) + - [Additional Features](#additional-features) + - [Bracket Plugin](#bracket-plugin) + - [Shortcuts](#shortcuts) +- [Customizing BracketHighligher](#costumizing-brackethighlighter) + - [Configuring Brackets](#cnfiguring-brackets) + - [Configuring Highlight Style](#configuring-highlight-style) +- [Bracket Plugin API](#bracket-plugin-api) + - ['Defintion' Plugins](#definition-plugins) + - [Run Instance Plugins](#run-instance-plugins) +- [Credits](#credits) +- [Changelog](#changelog) + # About This is a fork of pyparadigm's _SublimeBrackets_ and _SublimeTagmatcher_ (both are no longer available). I forked this to fix some issues I had and to add some features I wanted. I also wanted to improve the efficiency of the matching. This cuts down on the parallel searching that is now streamlined in one search. Since then, I have rewritten the entire code base to bring more flexibility, speed, and features. @@ -9,7 +28,7 @@ ST3 support is found here (at the present time): https://github.com/facelessuse ## Overview Bracket Highlighter matches a variety of brackets such as: ```[]```, ```()```, ```{}```, ```""```, ```''```, ``````, and even custom brackets. -# FeatureList +# Feature List - Customizable to highlight almost any bracket - Customizable bracket highlight style - High visibility bracket highlight mode @@ -23,7 +42,7 @@ Bracket Highlighter matches a variety of brackets such as: ```[]```, ```()```, ` - Bracket plugins that can jump between bracket ends, select content, remove brackets and/or content, wrap selectios with brackets, swap brackets, swap quotes (handling quote escaping between the main quotes), fold/unfold conent between brackets, toggle through tag attribute selecection, select both the opening and closing tag name to change both simultaneously. # General Use -In general BracketHighligher (BH) will automatically highlight brackets (or defined bracket like start and end blocks) its between. By default, BH will but opening and closing icons in the gutter of the corresponding line containing open or closising bracket. BH, by default, will underline the closing and opening bracket as well. +In general, BracketHighligher (BH) will highlight brackets (or defined bracket like start and end blocks) surrounding the cursor. By default, BH will put opening and closing icons in the gutter of the corresponding line containing open or closising bracket. BH, by default, will underline the closing and opening bracket as well. ## Built-in Supported brackets Currently BH supports the following brackets out of the box: @@ -70,7 +89,7 @@ These are the basic settings you can change: // this defines if the unmatched bracket should be shown. "show_unmatched" : true, - // High visibilty style and color for high visibility mode + // High visibility style and color for high visibility mode // (solid|outline|underline) "high_visibility_style": "outline", // (scope|__default__|__bracket__) @@ -93,7 +112,7 @@ These are the basic settings you can change: ``` ### Bracket Plugins -Bh is also extendable via plugins and provides an number of plugins by default. See ```Bracket Plugins``` to learn more about the included plugins. +Bh is also extendable via plugins and provides an number of plugins by default. See [Bracket Plugins](#bracket-plugins) to learn more about the included plugins. ## Bracket Plugin BH provides a number of built in Bracket Plugins that take advantage of BH's matching to provide additional features. Most plugin features are available via the Tools->Packages->BracketHighlighter menu or the command palette. To see how to configure shortcuts, see the ```Example.sublime-settings``` file. @@ -108,10 +127,10 @@ Removes the surrounding brackets. Folds the content of the current surrounding brackets. ### Swap Quotes Plugin -Swap the quotes style of surrounding quotes from double to single or vice versa. It also handlings escaping and unescaping of sub quotes. +Swap the quotes style of surrounding quotes from double to single or vice versa. It also handles escaping and unescaping of sub quotes. ### Tag Plugin -Plugin used to help highlight tags +Plugin used to help highlight tags. Additional tag settings found in ```bh_core.sublime-settings```: ```javascript @@ -150,7 +169,7 @@ By default BH provides no shortcuts to avoid shortcut conflicts, but you can vie BH is extremely flexible and be customized and extended to fit a User's needs. The first step is to copy the ```bh_core.sublime-settings``` to your ```User``` folder. ## Configuring Brackets -BH has been written to allow users to define any brackets they would like to have highlighted. There are two kinds of brackets you can define ```scope_brackets``` (search file for scope regions and then use regex to test for opening and closing brackets) and ```brackets``` (use regex to find opening and closing brackets). ```bracket``` type should usually be the preferred type. ```scope_brackets``` are usually used for brackets whose opening and closing are the same and not distinguishable form one another by regex; scope brackets must be contained in a continuous scope region like string for quotes etc. +BH has been written to allow users to define any brackets they would like to have highlighted. There are two kinds of brackets you can define: ```scope_brackets``` (search file for scope regions and then use regex to test for opening and closing brackets) and ```brackets``` (use regex to find opening and closing brackets). ```bracket``` should usually be the preferred type. ```scope_brackets``` are usually used for brackets whose opening and closing are the same and not distinguishable form one another by regex; scope brackets must be contained in a continuous scope region like string for quotes etc. ### Configuring Brackets Brackets are defined under ```brackets``` in ```bh_core.sublime-settings```. @@ -228,7 +247,7 @@ Python Single Quote bracket will be used as an eample (not all options are shown - **plugin_library (optional)**: defines plugin to use for determining matches (see Bracket Plugin API for more info on matching plugins) ## Configuring Highlight Style -Each bracket definition (described in ```Configuring Scope Brackets``` and ```Configuring Brackets```) has a ```style``` setting that you give a style definition to. Style definitions are defined under ```bracket_styles``` in ```bh_core.sublime-settings```. +Each bracket definition (described in [Configuring Scope Brackets](#configuring-scope-brackets) and [Configuring Brackets](#configuring-brackets)) has a ```style``` setting that you give a style definition to. Style definitions are defined under ```bracket_styles``` in ```bh_core.sublime-settings```. There are two special style definitions whose names are reserved: ```default``` and ```unmatched```, but you can configure them. All other custom style definitions follow the same pattern (see ```curly``` below and compare to the special style defintions; format is the same) All custom styles follow this pattern. See description below: @@ -260,7 +279,8 @@ There are two special style definitions whose names are reserved: ```default``` }, ``` -- **icon**: icon to show in gutter. Available options are (angle|round|curly|square|tag|star|dot|bookmark|question|quote|double_quote|single_quote|single_quote_offset|double_quote_offset|none) +- **icon**: icon to show in gutter. Available options are (angle|round|curly|square|tag|star|dot|bookmark|question|quote|double_quote|single_quote|single_quote_offset| +double_quote_offset|none) - **color**: scope to define color - **style**: higlight style. Available options are (solid|outline|underline|none) @@ -316,7 +336,7 @@ Methods of BracketRegion: These are plugins that are attached to the bracket definition and aid in processing the brackets. These kids of plugins have two methods you can provide ```post_match``` and/or ```compare```. ### compare -```compare``` is run when comparing the opening bracket with closing brackets. This allows you to provide logic to accept or regect a the pairing of an opening bracket with a closing bracket. You should not change the text in the view during this operation. +```compare``` is run when comparing the opening bracket with closing brackets. This allows you to provide logic to accept or reject the pairing of an opening bracket with a closing bracket. You should not change the text in the view during this operation. The ```compare``` method receives the following paramters: @@ -463,8 +483,10 @@ def plugin(): - pyparadigm: for his original efforts with SublimeBrackets and SublimeTagmatcher which originally BracketHighlighter was built off of and the inspiration behind the current implementation. - BoundInCode: for his Tag icon -# Version 2.0.0 +# Changelog + +#### Version 2.0.0 - Re-write of BracketHighlighter -# Version Older +#### Older Versions - See [Complete Changelog](https://github.com/facelessuser/BracketHighlighter/blob/BH2/CHANGELOG.md) diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/ure.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/ure.py new file mode 100644 index 0000000..bcd33ac --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/BracketHighlighter/ure.py @@ -0,0 +1,207 @@ +""" +ure - unicode re + +A simple script that wraps the re interface with methods to handle unicode properties. +Patterns will all have re.UNICODE enabled and unicode property formats will be replaced +with the unicode characters in that category. + +Example: +r"\p{Ll}\p{Lu}" + +Licensed under MIT +Copyright (c) 2013 Isaac Muse +""" +import re +import sys +from os.path import dirname +try: + import unicodedata +except: + sys.path.append(dirname(sys.executable)) + import unicodedata + +PY3 = sys.version_info[0] >= 3 +uchr = chr if PY3 else unichr + +DEBUG = re.DEBUG +I = re.I +IGNORECASE = re.IGNORECASE +L = re.L +LOCALE = re.LOCALE +M = re.M +MULTILINE = re.MULTILINE +S = re.S +DOTALL = re.DOTALL +U = re.U +UNICODE = re.UNICODE +X = re.X +VERBOSE = re.VERBOSE +escape = re.escape +purge = re.purge + +_unicode_properties = None +_unicode_key_pattern = None + + +def _build_unicode_property_table(unicode_range): + """ + Build property table for unicode range. + """ + table = {} + p = None + for i in range(*unicode_range): + try: + c = uchr(i) + p = unicodedata.category(c) + except: + continue + if p[0] not in table: + table[p[0]] = {} + if p[1] not in table[p[0]]: + table[p[0]][p[1]] = [] + table[p[0]][p[1]].append(c) + + # Join as one string + for k1, v1 in table.items(): + for k2, v2 in v1.items(): + v1[k2] = ''.join(v2) + + return table + + +def _build_unicode_key_pattern(): + """ + Build regex key pattern + """ + unicode_prop = r"\p\{(%s)\}" + unicode_keys = [] + for k1, v1 in _unicode_properties.items(): + unicode_keys.append("%s(?:%s)" % (k1, "|".join(v1.keys()))) + return re.compile(unicode_prop % "|".join(unicode_keys), re.UNICODE) + + +def _init_unicode(): + """ + Prepare unicode property tables and key pattern + """ + global _unicode_properties + global _unicode_key_pattern + _unicode_properties = _build_unicode_property_table((0x0000, 0x10FFFF)) + _unicode_key_pattern = _build_unicode_key_pattern() + + +def find_char_groups(s): + """ + Find character groups + """ + pos = 0 + groups = [] + escaped = False + found = False + first = None + for c in s: + if c == "\\": + escaped = not escaped + elif escaped: + escaped = False + elif c == "[" and not found: + found = True + first = pos + elif c == "]" and found: + groups.append((first, pos)) + pos += 1 + return groups + + +def get_unicode_category(prop): + """ + Retrieve the unicode category from the table + """ + p1, p2 = (prop[0], prop[1]) if len(prop) > 1 else (prop[0], None) + return ''.join([x for x in _unicode_properties[p1].values()]) if p2 is None else _unicode_properties[p1][p2] + + +def parse_unicode_properties(re_pattern): + """ + Replaces regex property notation with unicode values + """ + char_groups = find_char_groups(re_pattern) + ure_pattern = re_pattern + for p in reversed(list(_unicode_key_pattern.finditer(re_pattern))): + v = get_unicode_category(p.group(1)) + brackets = True + if v is None: + continue + for g in char_groups: + if p.start(0) >= g[0] and p.end(0) <= g[1]: + brackets = False + break + if brackets: + v = "[" + v + "]" + ure_pattern = ure_pattern[:p.start(0) - 1] + v + ure_pattern[p.end(0): len(ure_pattern)] + return ure_pattern + + +def compile(pattern, flags=0): + """ + compile after parsing unicode properties and set flag to unicode + """ + return re.compile(parse_unicode_properties(pattern), flags | re.UNICODE) + + +def search(pattern, string, flags=0): + """ + search after parsing unicode properties and set flag to unicode + """ + re.search(parse_unicode_properties(pattern), string, flags | re.UNICODE) + + +def match(pattern, string, flags=0): + """ + match after parsing unicode properties and set flag to unicode + """ + re.match(parse_unicode_properties(pattern), string, flags | re.UNICODE) + + +def split(pattern, string, maxsplit=0, flags=0): + """ + split after parsing unicode properties and set flag to unicode + """ + re.split(parse_unicode_properties(pattern), string, maxsplit, flags | re.UNICODE) + + +def findall(pattern, string, flags=0): + """ + findall after parsing unicode properties and set flag to unicode + """ + re.findall(parse_unicode_properties(pattern), string, flags | re.UNICODE) + + +def finditer(pattern, string, flags=0): + """ + finditer after parsing unicode properties and set flag to unicode + """ + re.finditer(parse_unicode_properties(pattern), string, flags | re.UNICODE) + + +def sub(pattern, repl, string, count=0, flags=0): + """ + sub after parsing unicode properties and set flag to unicode + """ + re.sub(parse_unicode_properties(pattern), repl, string, count, flags | re.UNICODE) + + +def subn(pattern, repl, string, count=0, flags=0): + """ + subn after parsing unicode properties and set flag to unicode + """ + re.subn(parse_unicode_properties(pattern), repl, string, flags | re.UNICODE) + + +_init_unicode() + + +if __name__ == "__main__": + print("Testing ure's unicode properties replacement") + print(parse_unicode_properties(r"[\p{Ll}\p{Lu}]")) + print(parse_unicode_properties(r"\p{Ll}\p{Lu}")) diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Bracketeer/LICENSE b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Bracketeer/LICENSE new file mode 100644 index 0000000..8da8c54 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Bracketeer/LICENSE @@ -0,0 +1,26 @@ +Copyright (c) 2012, Colin T.A. Gray +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of this project. diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Bracketeer/README.md b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Bracketeer/README.md index ef342ae..d33469c 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Bracketeer/README.md +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Bracketeer/README.md @@ -7,6 +7,8 @@ Some bracket manipulation, selection, and insertion commands. Installation ------------ +### Sublime Text 2 + 1. Using Package Control, install "Bracketeer" Or: @@ -20,6 +22,13 @@ Or: 2. clone this repo 3. Install keymaps for the commands (see Example.sublime-keymap for my preferred keys) +### Sublime Text 3 + +1. Open the Sublime Text 2 Packages folder +2. clone this repo, but use the `st3` branch + + git clone -b st3 git@github.com:colinta/SublimeBracketeer + Commands -------- diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Bracketeer/package-metadata.json b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Bracketeer/package-metadata.json index 9406bac..938aa82 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Bracketeer/package-metadata.json +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Bracketeer/package-metadata.json @@ -1 +1 @@ -{"url": "https://github.com/colinta/SublimeBracketeer", "version": "1.5.2", "description": "Some bracket manipulation, selection, and insertion commands."} \ No newline at end of file +{"url": "https://github.com/colinta/SublimeBracketeer", "version": "2013.07.09.15.11.00", "description": "Some bracket manipulation, selection, and insertion commands."} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Clipboard Manager/LICENSE b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Clipboard Manager/LICENSE new file mode 100644 index 0000000..8da8c54 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Clipboard Manager/LICENSE @@ -0,0 +1,26 @@ +Copyright (c) 2012, Colin T.A. Gray +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of this project. diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Clipboard Manager/README.md b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Clipboard Manager/README.md index 2878e59..66a2844 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Clipboard Manager/README.md +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Clipboard Manager/README.md @@ -15,6 +15,8 @@ the full command-list below. Installation ------------ +### Sublime Text 2 + 1. Using Package Control, install "Clipboard Manager" Or: @@ -28,6 +30,13 @@ Or: 2. clone this repo 3. Install keymaps for the commands (see Example.sublime-keymap for my preferred keys) +### Sublime Text 3 + +1. Open the Sublime Text 2 Packages folder +2. clone this repo, but use the `st3` branch + + git clone -b st3 git@github.com:colinta/SublimeClipboardManager + Commands -------- diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Clipboard Manager/package-metadata.json b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Clipboard Manager/package-metadata.json index 11a74c2..2b56d8f 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Clipboard Manager/package-metadata.json +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Clipboard Manager/package-metadata.json @@ -1 +1 @@ -{"url": "https://gist.github.com/1590661", "version": "1.2.3", "description": "A version of the Sublime Text 2 plugin at that makes for TextMate-like clipboard history."} \ No newline at end of file +{"url": "https://gist.github.com/1590661", "version": "2013.07.09.15.13.48", "description": "A version of the Sublime Text 2 plugin at that makes for TextMate-like clipboard history."} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/EasyMotion/README.md b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/EasyMotion/README.md index 345e0e7..8dab70b 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/EasyMotion/README.md +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/EasyMotion/README.md @@ -6,6 +6,8 @@ It's heavily inspired by [Vim's EasyMotion](http://www.vim.org/scripts/script.ph After pressing the EasyMotion shortcut (default `cmd-;`/`ctrl-;`), you then press the character that you'd like to jump to. EasyMotion will then replace all currently visible instances of that character with one of `a-zA-Z0-9`. Press the key for the one you want and your cursor will be moved right to it. +Here I'm pressing `cmd-;` followed by `f`. EasyMotion highlights the 6 visible "f" characters with `a-f`. I then press `d` to jump to the beginning of the `function`. + ![Animated Gif](https://raw.github.com/tednaleid/sublime-EasyMotion/add_images/images/easymotion.gif) @@ -22,7 +24,7 @@ Then type `EasyMotion` and choose the EasyMotion plugin from the dropdown. Hit Manual installation should be as easy as cloning this git repository into your Sublime `Packages` directory. On OSX: - cd ~/Application\ Support/Sublime\ Text\ 2/Packages + cd ~/Library/Application\ Support/Sublime\ Text\ 2/Packages git clone git://github.com/tednaleid/sublime-EasyMotion.git EasyMotion (The directory name underneath packages __must__ be `EasyMotion` and not `sublime-EasyMotion` for some preferences to get picked up) @@ -34,6 +36,16 @@ If you're interested in trying the next release of the plugin, you can switch yo This branch will have features that are marked as fixed in the issue, but haven't yet been merged to `master`. +### Sublime Text 3 Experimental Support + +There is experimental support for Sublime Text 3 on the `st3` branch that requires manual installation and the use of the `st3` branch. + + cd ~/Library/Application\ Support/Sublime\ Text\ 3/Packages + git clone git://github.com/tednaleid/sublime-EasyMotion.git EasyMotion + cd EasyMotion + git checkout st3 + + ## Usage ### Jump to any visible character diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/EasyMotion/package-metadata.json b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/EasyMotion/package-metadata.json index 5e98f3f..117e61c 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/EasyMotion/package-metadata.json +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/EasyMotion/package-metadata.json @@ -1 +1 @@ -{"url": "https://github.com/tednaleid/sublime-EasyMotion", "version": "2013.03.26.20.46.50", "description": "Sublime Text 2 plugin to quickly jump to any character in the visible area of the active view."} \ No newline at end of file +{"url": "https://github.com/tednaleid/sublime-EasyMotion", "version": "2013.08.10.19.55.17", "description": "Sublime Text 2 plugin to quickly jump to any character in the visible area of the active view."} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ExportHtml/ColorSchemes/Print-Grayscale.tmTheme b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ExportHtml/ColorSchemes/Print-Grayscale.tmTheme index c1b2a58..cd26fd1 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ExportHtml/ColorSchemes/Print-Grayscale.tmTheme +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ExportHtml/ColorSchemes/Print-Grayscale.tmTheme @@ -44,7 +44,7 @@ bracketContentsForeground #000000 bracketContentsOptions - underline --> + underline tagsOptions stippled_underline diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ExportHtml/ExportHtml.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ExportHtml/ExportHtml.py index 93fa85b..bb46af1 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ExportHtml/ExportHtml.py +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ExportHtml/ExportHtml.py @@ -60,13 +60,13 @@ ANNOTATE_CLOSE = '''''' BODY_START = '''
'''
 
-FILE_INFO = '''
%(date_time)s %(file)s\n\n
''' +FILE_INFO = '''
%(date_time)s %(file)s\n\n
''' TABLE_START = '''''' LINE = ( '' + - '' + '
' + + '' + '%(line)s ' + '' + @@ -500,6 +500,7 @@ class ExportHtml(object): html_line = LINE % { "line_id": num, "color": self.gfground, + "bgcolor": self.gbground, "line": str(num).rjust(self.gutter_pad).replace(" ", ' '), "code_id": num, "code": line, @@ -578,12 +579,17 @@ class ExportHtml(object): '&': '&', '>': '>', '<': '<', - '\t': ' ' * self.tab_size, - ' ': ' ', + '\t': ' ' * self.tab_size, '\n': '' } - return ''.join(encode_table.get(c, c) for c in text).encode('ascii', 'xmlcharrefreplace') + return re.sub( + r'(?!\s($|\S))\s', + ' ', + ''.join( + encode_table.get(c, c) for c in text + ).encode('ascii', 'xmlcharrefreplace') + ) def get_annotations(self): annotations = get_annotations(self.view) @@ -789,6 +795,7 @@ class ExportHtml(object): date_time = time.strftime(self.date_time_format, self.time) the_html.write( FILE_INFO % { + "bgcolor": self.bground, "color": self.fground, "date_time": date_time, "file": self.file_name if self.show_full_path else path.basename(self.file_name) diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ExportHtml/package-metadata.json b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ExportHtml/package-metadata.json index 9887e8e..5ff7671 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ExportHtml/package-metadata.json +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ExportHtml/package-metadata.json @@ -1 +1 @@ -{"url": "https://github.com/facelessuser/ExportHtml", "version": "2013.03.29.23.39.49", "description": "Sublime Text - Export code to HTML for copying/printing/saving. Also, export code to BBCode for forum posts."} \ No newline at end of file +{"url": "https://github.com/facelessuser/ExportHtml", "version": "2013.05.24.14.57.59", "description": "Sublime Text - Export code to HTML for copying/printing/saving. Also, export code to BBCode for forum posts."} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/FileDiffs/LICENSE b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/FileDiffs/LICENSE new file mode 100644 index 0000000..8da8c54 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/FileDiffs/LICENSE @@ -0,0 +1,26 @@ +Copyright (c) 2012, Colin T.A. Gray +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of this project. diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/FileDiffs/README.md b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/FileDiffs/README.md index ad0183a..91c3161 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/FileDiffs/README.md +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/FileDiffs/README.md @@ -7,6 +7,8 @@ Shows diffs - also in an external diff tool - between the current file, or selec Installation ------------ +### Sublime Text 2 + 1. Using Package Control, install "FileDiffs" Or: @@ -20,6 +22,13 @@ Or: 2. clone this repo 3. Install keymaps for the commands (see Example.sublime-keymap for my preferred keys) +### Sublime Text 3 + +1. Open the Sublime Text 2 Packages folder +2. clone this repo, but use the `st3` branch + + git clone -b st3 git@github.com:colinta/SublimeFileDiffs + Add External Diff Tool -------- diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/FileDiffs/file_diffs.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/FileDiffs/file_diffs.py index 16f79a8..7aa5c2d 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/FileDiffs/file_diffs.py +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/FileDiffs/file_diffs.py @@ -101,6 +101,8 @@ class FileDiffCommand(sublime_plugin.TextCommand): self.diff_with_external(a, b, from_file, to_file) if open_in_sublime: + # fix diffs + diffs = map(lambda line: (line and line[-1] == "\n") and line or line + "\n", diffs) self.diff_in_sublime(diffs) def diff_with_external(self, a, b, from_file=None, to_file=None): diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/FileDiffs/package-metadata.json b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/FileDiffs/package-metadata.json index 7710cac..ea4ac7a 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/FileDiffs/package-metadata.json +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/FileDiffs/package-metadata.json @@ -1 +1 @@ -{"url": "https://github.com/spape/SublimeFileDiffs", "version": "1.5.0", "description": "Shows diffs - also in an external diff tool - between the current file, or selection(s) in the current file, and clipboard, another file, or unsaved changes."} \ No newline at end of file +{"url": "https://github.com/colinta/SublimeFileDiffs", "version": "2013.07.09.15.11.56", "description": "Shows diffs between the current file, or selection(s) in the current file, and clipboard, another file, or unsaved changes."} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/LiveReload/livereload_st2.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/LiveReload/livereload_st2.py index e2a9461..22bdcf3 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/LiveReload/livereload_st2.py +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/LiveReload/livereload_st2.py @@ -82,11 +82,6 @@ class CompassThread(threading.Thread): global LivereloadFactory print 'compass compile ' + self.dirname - # autocreate config.rb for compass - if not os.path.exists(os.path.join(self.dirname, "config.rb")): - print "Generating config.rb" - shutil.copy(os.path.join(sublime.packages_path(), "LiveReload","assets","config.rb"), self.dirname) - # compass compile p = subprocess.Popen(['compass compile ' + self.dirname.replace('\\','/')],shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT ) if p.stdout.read() : @@ -433,4 +428,4 @@ class WSRequestHandler(SimpleHTTPRequestHandler): def log_message(self, f, *args): # Save instead of printing - self.last_message = f % args \ No newline at end of file + self.last_message = f % args diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/LiveReload/package-metadata.json b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/LiveReload/package-metadata.json index a7ceb3b..62f7948 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/LiveReload/package-metadata.json +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/LiveReload/package-metadata.json @@ -1 +1 @@ -{"url": "https://github.com/dz0ny/LiveReload-sublimetext2", "version": "2013.03.07.03.08.21", "description": "LiveReload plugin for SublimeText"} \ No newline at end of file +{"url": "https://github.com/dz0ny/LiveReload-sublimetext2", "version": "2013.07.23.07.25.42", "description": "LiveReload plugin for SublimeText"} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/CHANGES.md b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/CHANGES.md new file mode 100644 index 0000000..ed3b11b --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/CHANGES.md @@ -0,0 +1,26 @@ +Changes in Markdown Preview +=========================== + +## 1.0.3 + +* The `messages.json` should OK for this time. + +## 1.0.2 + +* Fixes messages.json and changelog versions. + +## 1.0.1 + +* Removed markdown2 parser for its not well maintained and buggy. +* Make Python Markdown parser as default. +* Split the preview commands for *Python Markdown* parser and *Github Flavored Markdown* parser. +* Add markdown file build support, build parser are config via the origin `"parser"` settings. +* Add this changlog file for both developpers and users. +* Add messages.json which make display of `README.md` and `CHANGES.md` +* Try use `Markdown Extended.tmLanguage` for cheat sheet if you installed `Markdown Extended`. + +## 1.0.0 + +* Support for ST3. +* Added Python Markdown parser. +* CSS search first in markdown file directory and the the build-in. diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/Default.sublime-commands b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/Default.sublime-commands index 47d1f0e..534cbff 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/Default.sublime-commands +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/Default.sublime-commands @@ -1,28 +1,61 @@ [ { - "caption": "Markdown Preview: preview in Browser", + "caption": "Markdown Preview: Python Markdown: Preview in Browser", "command": "markdown_preview", "args": { - "target": "browser" + "target": "browser", + "parser": "markdown" } }, { - "caption": "Markdown Preview: export HTML in Sublime Text", + "caption": "Markdown Preview: Python Markdown: Export HTML in Sublime Text", "command": "markdown_preview", "args": { - "target": "sublime" + "target": "sublime", + "parser": "markdown" } }, { - "caption": "Markdown Preview: copy to clipboard", + "caption": "Markdown Preview: Python Markdown: Copy to Clipboard", "command": "markdown_preview", "args": { - "target": "clipboard" + "target": "clipboard", + "parser": "markdown" + } + }, + + + { + "caption": "Markdown Preview: Github Flavored Markdown: Preview in Browser", + "command": "markdown_preview", + "args": { + "target": "browser", + "parser": "github" } }, { - "caption": "Markdown Preview: open Markdown Cheat sheet", + "caption": "Markdown Preview: Github Flavored Markdown: Export HTML in Sublime Text", + "command": "markdown_preview", + "args": { + "target": "sublime", + "parser": "github" + } + }, + { + "caption": "Markdown Preview: Github Flavored Markdown: Copy to Clipboard", + "command": "markdown_preview", + "args": { + "target": "clipboard", + "parser": "github" + } + }, + { + "caption": "Markdown Preview: Open Markdown Cheat sheet", "command": "markdown_cheatsheet", "args": {} } + + + + ] diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/Markdown.sublime-build b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/Markdown.sublime-build new file mode 100644 index 0000000..57c13f9 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/Markdown.sublime-build @@ -0,0 +1,12 @@ +{ + "target": "markdown_build", + "selector": "text.html.markdown", + + "variants": [ + + { + "target": "markdown_build_github", + "name": "Build with Github API" + } + ] +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/MarkdownPreview.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/MarkdownPreview.py index 7b78a6e..a661d56 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/MarkdownPreview.py +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/MarkdownPreview.py @@ -1,31 +1,130 @@ # -*- encoding: UTF-8 -*- import sublime import sublime_plugin -import desktop -import tempfile -import markdown2 + import os import sys +import traceback +import tempfile import re import json -import urllib2 +import time +import traceback -settings = sublime.load_settings('MarkdownPreview.sublime-settings') +if sublime.version() >= '3000': + from . import desktop + from . import markdown2 + from . import markdown + from .helper import INSTALLED_DIRECTORY + from urllib.request import urlopen + from urllib.error import HTTPError, URLError + + def Request(url, data, headers): + ''' Adapter for urllib2 used in ST2 ''' + import urllib.request + return urllib.request.Request(url, data=data, headers=headers, method='POST') +else: # ST2 + import desktop + import markdown2 + import markdown + from helper import INSTALLED_DIRECTORY + from urllib2 import Request, urlopen, HTTPError, URLError +_CANNOT_CONVERT = u'cannot convert markdown' + def getTempMarkdownPreviewPath(view): ''' return a permanent full path of the temp markdown preview file ''' + + settings = sublime.load_settings('MarkdownPreview.sublime-settings') + tmp_filename = '%s.html' % view.id() - tmp_fullpath = os.path.join(tempfile.gettempdir(), tmp_filename) + if settings.get('path_tempfile'): + tmp_fullpath = os.path.join(settings.get('path_tempfile'), tmp_filename) + else: + tmp_fullpath = os.path.join(tempfile.gettempdir(), tmp_filename) return tmp_fullpath +def save_utf8(filename, text): + v = sublime.version() + if v >= '3000': + f = open(filename, 'w', encoding='utf-8') + f.write(text) + f.close() + else: # 2.x + f = open(filename, 'w') + f.write(text.encode('utf-8')) + f.close() + +def load_utf8(filename): + v = sublime.version() + if v >= '3000': + return open(filename, 'r', encoding='utf-8').read() + else: # 2.x + return open(filename, 'r').read().decode('utf-8') + +def load_resource(name): + ''' return file contents for files within the package root folder ''' + v = sublime.version() + if v >= '3000': + filename = '/'.join(['Packages', INSTALLED_DIRECTORY, name]) + try: + return sublime.load_resource(filename) + except: + print("Error while load_resource('%s')" % filename) + traceback.print_exc() + return '' + + else: # 2.x + filename = os.path.join(sublime.packages_path(), INSTALLED_DIRECTORY, name) + + if not os.path.isfile(filename): + print('Error while lookup resources file: %s', name) + return '' + + try: + return open(filename, 'r').read().decode('utf-8') + except: + print("Error while load_resource('%s')" % filename) + traceback.print_exc() + return '' + +def exists_resource(resource_file_path): + if sublime.version() >= '3000': + try: + sublime.load_resource(resource_file_path) + return True + except: + return False + else: + filename = os.path.join(os.path.dirname(sublime.packages_path()), resource_file_path) + return os.path.isfile(filename) + +def new_scratch_view(window, text): + ''' create a new scratch view and paste text content + return the new view + ''' + + new_view = window.new_file() + new_view.set_scratch(True) + if sublime.version() >= '3000': + new_view.run_command('append', { + 'characters': text, + }) + else: # 2.x + new_edit = new_view.begin_edit() + new_view.insert(new_edit, 0, text) + new_view.end_edit(new_edit) + return new_view class MarkdownPreviewListener(sublime_plugin.EventListener): ''' auto update the output html if markdown file has already been converted once ''' def on_post_save(self, view): - if view.file_name().endswith(tuple(settings.get('markdown_filetypes', (".md", ".markdown", ".mdown")))): + settings = sublime.load_settings('MarkdownPreview.sublime-settings') + filetypes = settings.get('markdown_filetypes') + if filetypes and view.file_name().endswith(tuple(filetypes)): temp_file = getTempMarkdownPreviewPath(view) if os.path.isfile(temp_file): # reexec markdown conversion @@ -36,57 +135,107 @@ class MarkdownPreviewListener(sublime_plugin.EventListener): class MarkdownCheatsheetCommand(sublime_plugin.TextCommand): ''' open our markdown cheat sheet in ST2 ''' def run(self, edit): - cheatsheet = os.path.join(sublime.packages_path(), 'Markdown Preview', 'sample.md') - self.view.window().open_file(cheatsheet) + lines = '\n'.join(load_resource('sample.md').splitlines()) + view = new_scratch_view(self.view.window(), lines) + view.set_name("Markdown Cheatsheet") + + # Set syntax file + syntax_files = ["Packages/Markdown Extended/Syntaxes/Markdown Extended.tmLanguage", "Packages/Markdown/Markdown.tmLanguage"] + for file in syntax_files: + if exists_resource(file): + view.set_syntax_file(file) + break # Done if any syntax is set. + sublime.status_message('Markdown cheat sheet opened') -class MarkdownPreviewCommand(sublime_plugin.TextCommand): - ''' preview file contents with python-markdown and your web browser ''' - def getCSS(self): - ''' return the correct CSS file based on parser and settings ''' - config_parser = settings.get('parser') - config_css = settings.get('css') +class MarkdownCompiler(): + ''' Do the markdown converting ''' - styles = '' - if config_css and config_css != 'default': - styles += u"" % config_css - else: - css_filename = 'markdown.css' - if config_parser and config_parser == 'github': - css_filename = 'github.css' - # path via package manager - css_path = os.path.join(sublime.packages_path(), 'Markdown Preview', css_filename) - if not os.path.isfile(css_path): - # path via git repo - css_path = os.path.join(sublime.packages_path(), 'sublimetext-markdown-preview', css_filename) - if not os.path.isfile(css_path): - sublime.error_message('markdown.css file not found!') - raise Exception("markdown.css file not found!") - styles += u"" % open(css_path, 'r').read().decode('utf-8') + def get_search_path_css(self): + css_name = self.settings.get('css', 'default') + if os.path.isabs(css_name): + return u"" % css_name - if settings.get('allow_css_overrides'): + if css_name == 'default': + css_name = 'github.css' if self.settings.get('parser', 'default') == 'github' else 'markdown.css' + + # Try the local folder for css file. + mdfile = self.view.file_name() + if mdfile is not None: + css_path = os.path.join(os.path.dirname(mdfile), css_name) + if os.path.isfile(css_path): + return u"" % load_utf8(css_path) + + # Try the build-in css files. + return u"" % load_resource(css_name) + + def get_override_css(self): + ''' handls allow_css_overrides setting. ''' + + if self.settings.get('allow_css_overrides'): filename = self.view.file_name() - filetypes = settings.get('markdown_filetypes') + filetypes = self.settings.get('markdown_filetypes') if filename and filetypes: for filetype in filetypes: if filename.endswith(filetype): css_filename = filename.rpartition(filetype)[0] + '.css' if (os.path.isfile(css_filename)): - styles += u"" % open(css_filename, 'r').read().decode('utf-8') + return u"" % load_utf8(css_filename) + return '' - return styles + def get_stylesheet(self): + ''' return the correct CSS file based on parser and settings ''' + return self.get_search_path_css() + self.get_override_css() - def get_contents(self, region): + def get_javascript(self): + js_files = self.settings.get('js') + scripts = '' + + if js_files is not None: + # Ensure string values become a list. + if isinstance(js_files, str) or isinstance(js_files, unicode): + js_files = [js_files] + # Only load scripts if we have a list. + if isinstance(js_files, list): + for js_file in js_files: + if os.path.isabs(js_file): + # Load the script inline to avoid cross-origin. + scripts += u"" % load_utf8(js_file) + else: + scripts += u"" % js_file + return scripts + + def get_mathjax(self): + ''' return the MathJax script if enabled ''' + + if self.settings.get('enable_mathjax') is True: + return load_resource('mathjax.html') + return '' + + def get_highlight(self): + ''' return the Highlight.js and css if enabled ''' + + highlight = '' + if self.settings.get('enable_highlight') is True and self.settings.get('parser') == 'default': + highlight += "" % load_resource('highlight.css') + highlight += "" % load_resource('highlight.js') + highlight += "" + return highlight + + + def get_contents(self, wholefile=False): ''' Get contents or selection from view and optionally strip the YAML front matter ''' + region = sublime.Region(0, self.view.size()) contents = self.view.substr(region) - # use selection if any - selection = self.view.substr(self.view.sel()[0]) - if selection.strip() != '': - contents = selection - if settings.get('strip_yaml_front_matter') and contents.startswith('---'): + if not wholefile: + # use selection if any + selection = self.view.substr(self.view.sel()[0]) + if selection.strip() != '': + contents = selection + if self.settings.get('strip_yaml_front_matter') and contents.startswith('---'): title = '' title_match = re.search('(?:title:)(.+)', contents, flags=re.IGNORECASE) if title_match: @@ -110,39 +259,62 @@ class MarkdownPreviewCommand(sublime_plugin.TextCommand): html = RE_SOURCES.sub(tag_fix, html) return html - def convert_markdown(self, markdown): - ''' convert input markdown to HTML, with github or builtin parser ''' - config_parser = settings.get('parser') - github_oauth_token = settings.get('github_oauth_token') + def get_config_extensions(self, default_extensions): + config_extensions = self.settings.get('enabled_extensions') + if not config_extensions or config_extensions == 'default': + return default_extensions + if 'default' in config_extensions: + config_extensions.remove( 'default' ) + config_extensions.extend( default_extensions ) + return config_extensions + + def convert_markdown(self, markdown_text, parser): + ''' convert input markdown to HTML, with github or builtin parser ''' + + markdown_html = _CANNOT_CONVERT + if parser == 'github': + github_oauth_token = self.settings.get('github_oauth_token') - markdown_html = u'cannot convert markdown' - if config_parser and config_parser == 'github': # use the github API sublime.status_message('converting markdown with github API...') try: - github_mode = settings.get('github_mode', 'gfm') - data = {"text": markdown, "mode": github_mode} - json_data = json.dumps(data) + github_mode = self.settings.get('github_mode', 'gfm') + data = { + "text": markdown_text, + "mode": github_mode + } + headers = { + 'Content-Type': 'application/json' + } + if github_oauth_token: + headers['Authorization'] = "token %s" % github_oauth_token + data = json.dumps(data).encode('utf-8') url = "https://api.github.com/markdown" sublime.status_message(url) - request = urllib2.Request(url, json_data, {'Content-Type': 'application/json'}) - if github_oauth_token: - request.add_header('Authorization', "token %s" % github_oauth_token) - markdown_html = urllib2.urlopen(request).read().decode('utf-8') - except urllib2.HTTPError, e: + request = Request(url, data, headers) + markdown_html = urlopen(request).read().decode('utf-8') + except HTTPError: + e = sys.exc_info()[1] if e.code == 401: sublime.error_message('github API auth failed. Please check your OAuth token.') else: sublime.error_message('github API responded in an unfashion way :/') - except urllib2.URLError: + except URLError: sublime.error_message('cannot use github API to convert markdown. SSL is not included in your Python installation') except: + e = sys.exc_info()[1] + print(e) + traceback.print_exc() sublime.error_message('cannot use github API to convert markdown. Please check your settings.') else: sublime.status_message('converted markdown with github API successfully') - else: + + elif parser == 'markdown2': # convert the markdown - markdown_html = markdown2.markdown(markdown, extras=['footnotes', 'toc', 'fenced-code-blocks', 'cuddled-lists']) + enabled_extras = set(self.get_config_extensions(['footnotes', 'toc', 'fenced-code-blocks', 'cuddled-lists'])) + if self.settings.get("enable_mathjax") is True or self.settings.get("enable_highlight") is True: + enabled_extras.add('code-friendly') + markdown_html = markdown2.markdown(markdown_text, extras=list(enabled_extras)) toc_html = markdown_html.toc_html if toc_html: toc_markers = ['[toc]', '[TOC]', ''] @@ -151,41 +323,62 @@ class MarkdownPreviewCommand(sublime_plugin.TextCommand): # postprocess the html from internal parser markdown_html = self.postprocessor(markdown_html) + else: + sublime.status_message('converting markdown with Python markdown...') + config_extensions = self.get_config_extensions(['extra', 'toc']) + markdown_html = markdown.markdown(markdown_text, extensions=config_extensions) + markdown_html = self.postprocessor(markdown_html) return markdown_html - def run(self, edit, target='browser'): - region = sublime.Region(0, self.view.size()) - encoding = self.view.encoding() - if encoding == 'Undefined': - encoding = 'utf-8' - elif encoding == 'Western (Windows 1252)': - encoding = 'windows-1252' - elif encoding == 'UTF-8 with BOM': - encoding = 'utf-8' + def get_title(self): + title = self.view.name() + if not title: + fn = self.view.file_name() + title = 'untitled' if not fn else os.path.splitext(os.path.basename(fn))[0] + return '%s' % title - contents = self.get_contents(region) + def run(self, view, parser, wholefile=False): + ''' return full html and body html for view. ''' + self.settings = sublime.load_settings('MarkdownPreview.sublime-settings') + self.view = view + + contents = self.get_contents(wholefile) + + body = self.convert_markdown(contents, parser) - markdown_html = self.convert_markdown(contents) + html = u'' + html += '' + html += self.get_stylesheet() + html += self.get_javascript() + html += self.get_highlight() + html += self.get_mathjax() + html += self.get_title() + html += '' + html += body + html += '' + html += '' + return html, body - full_html = u'' - full_html += '' % encoding - full_html += self.getCSS() - full_html += '' - full_html += markdown_html - full_html += '' - full_html += '' + +compiler = MarkdownCompiler() + + + +class MarkdownPreviewCommand(sublime_plugin.TextCommand): + def run(self, edit, parser='markdown', target='browser'): + settings = sublime.load_settings('MarkdownPreview.sublime-settings') + html, body = compiler.run(self.view, parser) if target in ['disk', 'browser']: # check if LiveReload ST2 extension installed and add its script to the resulting HTML livereload_installed = ('LiveReload' in os.listdir(sublime.packages_path())) + # build the html if livereload_installed: - full_html += '' + html += '' # update output html file tmp_fullpath = getTempMarkdownPreviewPath(self.view) - tmp_html = open(tmp_fullpath, 'w') - tmp_html.write(full_html.encode(encoding)) - tmp_html.close() + save_utf8(tmp_fullpath, html) # now opens in browser if needed if target == 'browser': config_browser = settings.get('browser') @@ -205,13 +398,65 @@ class MarkdownPreviewCommand(sublime_plugin.TextCommand): sublime.status_message('Markdown preview launched in default html viewer') elif target == 'sublime': # create a new buffer and paste the output HTML - new_view = self.view.window().new_file() - new_view.set_scratch(True) - new_edit = new_view.begin_edit() - new_view.insert(new_edit, 0, markdown_html) - new_view.end_edit(new_edit) + new_scratch_view(self.view.window(), body) sublime.status_message('Markdown preview launched in sublime') elif target == 'clipboard': # clipboard copy the full HTML - sublime.set_clipboard(full_html) + sublime.set_clipboard(html) sublime.status_message('Markdown export copied to clipboard') + + +class MarkdownBuildCommand(sublime_plugin.WindowCommand): + def init_panel(self): + if not hasattr(self, 'output_view'): + if sublime.version() >= '3000': + self.output_view = self.window.create_output_panel("markdown") + else: + self.output_view = self.window.get_output_panel("markdown") + + def puts(self, message): + message = message + '\n' + if sublime.version() >= '3000': + self.output_view.run_command('append', {'characters': message, 'force': True, 'scroll_to_end': True}) + else: + selection_was_at_end = (len(self.output_view.sel()) == 1 + and self.output_view.sel()[0] + == sublime.Region(self.output_view.size())) + self.output_view.set_read_only(False) + edit = self.output_view.begin_edit() + self.output_view.insert(edit, self.output_view.size(), message) + if selection_was_at_end: + self.output_view.show(self.output_view.size()) + self.output_view.end_edit(edit) + self.output_view.set_read_only(True) + + def run(self): + view = self.window.active_view() + if not view: + return + start_time = time.time() + + self.init_panel() + + show_panel_on_build = sublime.load_settings("Preferences.sublime-settings").get("show_panel_on_build", True) + if show_panel_on_build: + self.window.run_command("show_panel", {"panel": "output.markdown"}) + + mdfile = view.file_name() + if mdfile is None: + self.puts("Can't build a unsaved markdown file.") + return + + self.puts("Compiling %s..." % mdfile) + + html, body = compiler.run(view, 'markdown', True) + + htmlfile = os.path.splitext(mdfile)[0]+'.html' + self.puts(" ->"+htmlfile) + save_utf8(htmlfile, html) + + elapsed = time.time() - start_time + if body == _CANNOT_CONVERT: + self.puts(_CANNOT_CONVERT) + self.puts("[Finished in %.1fs]" % (elapsed)) + sublime.status_message("Build finished") diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/MarkdownPreview.sublime-settings b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/MarkdownPreview.sublime-settings index f815f52..f3478e0 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/MarkdownPreview.sublime-settings +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/MarkdownPreview.sublime-settings @@ -11,14 +11,50 @@ "browser": "default", /* - Sets the default parser for converting markdown to html. + Sets the parser used for build markdown to html. + + NOTE: The parser setting is not for the preview commands now. + The preivew have sperated commands for each parser markdown. + Warning for github API : if you have a ST2 linux build, Python is not built with SSL o it may not work - default - Use the builtin python-markdown2 parser + default - The current default parser is python-markdown parser. + markdown - Use the buildin python-markdown parser + markdown2 - (Deprecated) Use the builtin python-markdown2 parser. github - User github API to convert markdown, so you can use GitHub flavored Markdown, see http://github.github.com/github-flavored-markdown/ */ "parser": "default", + /* + Enable or not mathjax support. + */ + "enable_mathjax": false, + + /* + Enable or not highlight.js support for syntax highlighting. + */ + "enable_highlight": false, + + /* + List of enabled extensions of the selected markdown parser. + + You can get the full list of extensions at: + * The markdown2 parser, the `default`: https://github.com/trentm/python-markdown2/wiki/Extras + * The python markdown parser, the `markdown`: http://pythonhosted.org/Markdown/extensions/index.html + + + default - use the default set of extensions, see table latter. + [ "default", "def_list", ... ] - a list of extensions. Use "default" to include the default extensions. + + Parser | "default" Values + ------------|--------------------------- + default | ["footnotes", "toc", "fenced-code-blocks", "cuddled-lists" ] + markdown | ["extra", "toc"] + github | extensions values are not used. + + */ + "enabled_extensions": "default", + /* Default mode for the github Markdon parser : markdown (documents) or gfm (comments) see http://developer.github.com/v3/markdown/#render-an-arbitrary-markdown-document @@ -46,11 +82,29 @@ */ "allow_css_overrides": true, + /* + Sets the JavaScript files to embed in the HTML + + Set an array of URLs or filepaths to JavaScript files. Absolute filepaths will be loaded + into the script tag; others will be set as the `src` attribute. The order of files in the + array is the order in which they are embedded. + */ + // "js": ["http://example.com/script.js", "/path/to/script.js"], + /* Sets the supported filetypes for auto-reload on save */ "markdown_filetypes": [".md", ".markdown", ".mdown"], + /* + Sets a custom temporary folder for MarkdownPreview-generated html files. Useful if you're + using LiveReload and don't want to use the OS default. The directory must already exist. + + Examples: /tmp/custom_folder (Linux/OSX) + C:/TEMP/MYNOTES (Windows - note it's forward slash, even on Windows) + */ + // "path_tempfile": "/tmp/my_notes", + /* Strips the YAML front matter header and converts title to a heading */ diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/README.md b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/README.md index 94c3e54..f430cb1 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/README.md +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/README.md @@ -1,9 +1,9 @@ -Sublime Text 2 MarkDown preview -=============================== +Sublime Text 2/3 Markdown Preview +================================= -A simple ST2 plugin to help you preview your markdown files quickly in you web browser. +Preview your markdown files quickly in you web browser from sublime text 2/3. -You can use builtin [python-markdown2][0] parser (default) or use the [github markdown API][5] for the conversion (edit your settings to select it). +You can use builtin [python-markdown][10] parser or use the [github markdown API][5] for the conversion. **NOTE:** If you choose the GitHub API for conversion (set parser: github in your settings), your code will be sent through https to github for live conversion. You'll have [Github flavored markdown][6], syntax highlighting and EMOJI support for free :heart: :octocat: :gift:. If you make more than 60 calls a day, be sure to set your GitHub API key in the settings :) @@ -11,42 +11,81 @@ You can use builtin [python-markdown2][0] parser (default) or use the [github ma ## Features : - - Markdown conversion via builtin Markdown Parser ([python-markdown2][0]) or via Github API : just choose in your settings. + - Markdown preivew using the [Python-markdown][10] or the Github API just choose select the build commands. + - Build markdown file using Sublime Text build system. The build parser are config via the `"parser"` config. - Browser preview auto reload on save if you have the [ST2 LiveReload plugin][7] installed. - - Builtin parser : Support TOC, footnotes markdown extensions - - CSS overriding if you need + - Builtin parser : supports `abbr`, `attr_list`, `def_list`, `fenced_code`, `footnotes`, `tables`, `smart_strong` and `toc` markdown extensions. + - CSS search path for local and build-in CSS files (always enabled) and/or CSS overriding if you need - YAML support thanks to @tommi - Clipboard selection and copy to clipboard thanks to @hexatrope + - MathJax support : \\(\frac{\pi}{2}\\) thanks to @bps10 ## Installation : - - you should use [sublime package manager][3] - - use `cmd+shift+P` then `Package Control: Install Package` - - look for `Markdown Preview` and install it. +### Using [Package Control][3] (*Recommanded*) + +For all Sublime Text 2/3 users we recommand installe via [Package Control][3]. + +1. [Install][11] Package Control if you haven't yet. +2. Use `cmd+shift+P` then `Package Control: Install Package` +3. Look for `Markdown Preview` and install it. + +### Manual Install + +1. Click the `Preferences > Browse Packages…` menu +2. Browse up a folder and then into the `Installed Packages/` folder +3. Download [zip package][12] rename it to `Markdown Preview.sublime-package` and copy it into the `Installed Packages/` directory +4. Restart Sublime Text ## Usage : +### To preivew : + - optionnaly select some of your markdown for conversion - - use `cmd+shift+P` then `Markdown Preview` to launch a preview + - use `cmd+shift+P` then `Markdown Preview` to show the follow commands: + - Markdown Preview: Python Markdown: Preview in Browser + - Markdown Preview: Python Markdown: Export HTML in Sublime Text + - Markdown Preview: Python Markdown: Copy to Clipboard + - Markdown Preview: Github Flavored Markdown: Preview in Browser + - Markdown Preview: Github Flavored Markdown: Export HTML in Sublime Text + - Markdown Preview: Github Flavored Markdown: Copy to Clipboard + - Markdown Preview: Open Markdown Cheat sheet - or bind some key in your user key binding, using a line like this one: - `{ "keys": ["alt+m"], "command": "markdown_preview", "args": {"target": "browser"} },` + `{ "keys": ["alt+m"], "command": "markdown_preview", "args": {"target": "browser", "parser":"markdown"} },` - once converted a first time, the output HTML will be updated on each file save (with LiveReload plugin) -## Uses : +### To build : - - [python-markdown2][0] for markdown parsing **OR** the GitHub markdown API. + - Just use `Ctrl+B` (Windows/Linux) or `cmd+B` (Mac) to build current file. + +### To config : + +Using Sublime Text menu: `Preferences`->`Package Settings`->`Markdown Preivew` + +- `Settings - User` is where you change your serrings for Markdown Preview. +- `Settings - Default` is a good reference with detail description for each setting. + + +## Support : + +- Any bugs about Markdown Preview please fell free to report [here][issue]. +- And you are welcome to fork and submit pullrequests. ## Licence : -The code is available at github [https://github.com/revolunet/sublimetext-markdown-preview][2] under MIT licence : [http://revolunet.mit-license.org][4] +The code is available at github [project][home] under [MIT licence][4]. [0]: https://github.com/trentm/python-markdown2 - [2]: https://github.com/revolunet/sublimetext-markdown-preview - [3]: http://wbond.net/sublime_packages/package_control + [home]: https://github.com/revolunet/sublimetext-markdown-preview + [3]: https://sublime.wbond.net/ [4]: http://revolunet.mit-license.org [5]: http://developer.github.com/v3/markdown [6]: http://github.github.com/github-flavored-markdown/ [7]: https://github.com/dz0ny/LiveReload-sublimetext2 [8]: https://github.com/revolunet/sublimetext-markdown-preview/issues/27#issuecomment-11772098 [9]: https://github.com/revolunet/sublimetext-markdown-preview/issues/78#issuecomment-15644727 + [10]: https://github.com/waylan/Python-Markdown + [11]: https://sublime.wbond.net/installation + [12]: https://github.com/revolunet/sublimetext-markdown-preview/archive/master.zip + [issue]: https://github.com/revolunet/sublimetext-markdown-preview/issues \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/desktop/__init__.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/desktop/__init__.py index d87486f..49e4545 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/desktop/__init__.py +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/desktop/__init__.py @@ -116,7 +116,7 @@ except ImportError: opener.wait() return opener.poll() == 0 -import commands +import subprocess # Private functions. @@ -136,7 +136,7 @@ def _is_xfce(): # XFCE detection involves testing the output of a program. try: - return _readfrom(_get_x11_vars() + "xprop -root _DT_SAVE_MODE", shell=1).strip().endswith(' = "xfce4"') + return _readfrom(_get_x11_vars() + "xprop -root _DT_SAVE_MODE", shell=1).decode("utf-8").strip().endswith(' = "xfce4"') except OSError: return 0 @@ -144,7 +144,7 @@ def _is_x11(): "Return whether the X Window System is in use." - return os.environ.has_key("DISPLAY") + return "DISPLAY" in os.environ # Introspection functions. @@ -155,14 +155,14 @@ def get_desktop(): environment. If no environment could be detected, None is returned. """ - if os.environ.has_key("KDE_FULL_SESSION") or \ - os.environ.has_key("KDE_MULTIHEAD"): + if "KDE_FULL_SESSION" in os.environ or \ + "KDE_MULTIHEAD" in os.environ: return "KDE" - elif os.environ.has_key("GNOME_DESKTOP_SESSION_ID") or \ - os.environ.has_key("GNOME_KEYRING_SOCKET"): + elif "GNOME_DESKTOP_SESSION_ID" in os.environ or \ + "GNOME_KEYRING_SOCKET" in os.environ: return "GNOME" - elif os.environ.has_key("MATE_DESKTOP_SESSION_ID") or \ - os.environ.has_key("MATE_KEYRING_SOCKET"): + elif "MATE_DESKTOP_SESSION_ID" in os.environ or \ + "MATE_KEYRING_SOCKET" in os.environ: return "MATE" elif sys.platform == "darwin": return "Mac OS X" @@ -222,7 +222,7 @@ def is_standard(): launching. """ - return os.environ.has_key("DESKTOP_LAUNCH") + return "DESKTOP_LAUNCH" in os.environ # Activity functions. @@ -255,7 +255,7 @@ def open(url, desktop=None, wait=0): desktop_in_use = use_desktop(desktop) if desktop_in_use == "standard": - arg = "".join([os.environ["DESKTOP_LAUNCH"], commands.mkarg(url)]) + arg = "".join([os.environ["DESKTOP_LAUNCH"], subprocess.mkarg(url)]) return _run(arg, 1, wait) elif desktop_in_use == "Windows": @@ -277,13 +277,16 @@ def open(url, desktop=None, wait=0): elif desktop_in_use == "Mac OS X": cmd = ["open", url] - elif desktop_in_use == "X11" and os.environ.has_key("BROWSER"): + elif desktop_in_use == "X11" and "BROWSER" in os.environ: cmd = [os.environ["BROWSER"], url] + elif desktop_in_use == "X11": + cmd = ["xdg-open", url] + # Finish with an error where no suitable desktop was identified. else: - raise OSError, "Desktop '%s' not supported (neither DESKTOP_LAUNCH nor os.startfile could be used)" % desktop_in_use + raise OSError("Desktop '%s' not supported (neither DESKTOP_LAUNCH nor os.startfile could be used)" % desktop_in_use) return _run(cmd, 0, wait) diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/desktop/dialog.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/desktop/dialog.py index 113af66..429ad06 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/desktop/dialog.py +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/desktop/dialog.py @@ -280,7 +280,7 @@ class Dialogue: try: program = self.commands[desktop_in_use] except KeyError: - raise OSError, "Desktop '%s' not supported (no known dialogue box command could be suggested)" % desktop_in_use + raise OSError("Desktop '%s' not supported (no known dialogue box command could be suggested)" % desktop_in_use) # The handler is one of the functions communicating with the subprocess. # Some handlers return boolean values, others strings. @@ -475,7 +475,7 @@ class Pulldown(Menu): "Xdialog" : (_readvalue(_readfrom), ["--stdout", "--combobox", String("text"), Integer("height"), Integer("width"), Strings("items")]), } - item = unicode + item = str number_of_titles = 2 class Input(Simple): @@ -546,6 +546,6 @@ available = [Question, Warning, Message, Error, Menu, CheckList, RadioList, Inpu # Supported desktop environments. -supported = Dialogue.commands.keys() +supported = list(Dialogue.commands.keys()) # vim: tabstop=4 expandtab shiftwidth=4 diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/desktop/windows.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/desktop/windows.py index 2b19e85..029ad34 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/desktop/windows.py +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/desktop/windows.py @@ -141,7 +141,7 @@ class Window: if match: return self._get_handle_and_name(line[:match.start()].strip()) else: - raise OSError, "Window information from %r did not contain window details." % line + raise OSError("Window information from %r did not contain window details." % line) def _descendants(self, s, fn): handles = [] @@ -258,7 +258,7 @@ def root(desktop=None): if _is_x11(): return Window(None) else: - raise OSError, "Desktop '%s' not supported" % use_desktop(desktop) + raise OSError("Desktop '%s' not supported" % use_desktop(desktop)) def find(callable, desktop=None): diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/github.css b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/github.css index 23bb92f..dc1dcbf 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/github.css +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/github.css @@ -1,364 +1,738 @@ -html { - margin: 0; - padding: 0; } - -body { +body +{ + font-size:15px; + line-height:1.7; + overflow-x:hidden; + background-color: white; border-radius: 3px; border: 3px solid #EEE; box-shadow: inset 0 0 0 1px #CECECE; - font-family: Helvetica,arial,sans-serif; - font-size: 14px; - line-height: 1.6; - width: 975px; + font-family: Helvetica, arial, freesans, clean, sans-serif; + width: 912px; padding: 30px; - margin: 2em auto; } + margin: 2em auto; + + color:#333333; +} -body > *:first-child { - margin-top: 0 !important; } -body > *:last-child { - margin-bottom: 0 !important; } -a { - color: #4183C4; - text-decoration: none; } -a:hover { - text-decoration: underline; } -a.absent { - color: #cc0000; } -a.anchor { - display: block; - padding-left: 30px; - margin-left: -30px; - cursor: pointer; - position: absolute; - top: 0; - left: 0; - bottom: 0; } +.body-classic{ + color:#444; + font-family:Georgia, Palatino, 'Palatino Linotype', Times, 'Times New Roman', "Hiragino Sans GB", "STXihei", "微软雅黑", serif; + font-size:16px; + line-height:1.5em; + background:#fefefe; + width: 45em; + margin: 10px auto; + padding: 1em; + outline: 1300px solid #FAFAFA; +} -h1, h2, h3, h4, h5, h6 { - margin: 20px 0 10px; +body>:first-child +{ + margin-top:0!important; +} + +body>:last-child +{ + margin-bottom:0!important; +} + +blockquote,dl,ol,p,pre,table,ul { + border: 0; + margin: 15px 0; padding: 0; - font-weight: bold; - -webkit-font-smoothing: antialiased; - cursor: text; - position: relative; } +} -h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor { - background: url("../../images/modules/styleguide/para.png") no-repeat 10px center; - text-decoration: none; } +body a.absent +{ + color:#c00; +} -h1 tt, h1 code { - font-size: inherit; } +body a.anchor +{ + display:block; + padding-left:30px; + margin-left:-30px; + cursor:pointer; + position:absolute; + top:0; + left:0; + bottom:0 +} -h2 tt, h2 code { - font-size: inherit; } +/*h4,h5,h6{ font-weight: bold; }*/ -h3 tt, h3 code { - font-size: inherit; } +.octicon{ + font:normal normal 16px sans-serif; + width: 1em; + height: 1em; + line-height:1; + display:inline-block; + text-decoration:none; + -webkit-font-smoothing:antialiased +} -h4 tt, h4 code { - font-size: inherit; } +.octicon-link { + background: url("data:image/svg+xml;utf8, Copyright (C) 2013 by GitHub "); + background-size: contain; + background-repeat: no-repeat; + background-position: bottom; +} -h5 tt, h5 code { - font-size: inherit; } +.octicon-link:before{ + content:'\a0'; +} -h6 tt, h6 code { - font-size: inherit; } +body h1,body h2,body h3,body h4,body h5,body h6{ + margin:1em 0 15px; + padding:0; + font-weight:bold; + line-height:1.7; + cursor:text; + position:relative +} -h1 { - font-size: 28px; - color: black; } +body h1 .octicon-link,body h2 .octicon-link,body h3 .octicon-link,body h4 .octicon-link,body h5 .octicon-link,body h6 .octicon-link{ + display:none; + color:#000 +} -h2 { - font-size: 24px; - border-bottom: 1px solid #cccccc; - color: black; } +body h1:hover a.anchor,body h2:hover a.anchor,body h3:hover a.anchor,body h4:hover a.anchor,body h5:hover a.anchor,body h6:hover a.anchor{ + text-decoration:none; + line-height:1; + padding-left:0; + margin-left:-22px; + top:15% +} -h3 { - font-size: 18px; } +body h1:hover a.anchor .octicon-link,body h2:hover a.anchor .octicon-link,body h3:hover a.anchor .octicon-link,body h4:hover a.anchor .octicon-link,body h5:hover a.anchor .octicon-link,body h6:hover a.anchor .octicon-link{ + display:inline-block +} -h4 { - font-size: 16px; } +body h1 tt,body h1 code,body h2 tt,body h2 code,body h3 tt,body h3 code,body h4 tt,body h4 code,body h5 tt,body h5 code,body h6 tt,body h6 code{ + font-size:inherit +} -h5 { - font-size: 14px; } +body h1{ + font-size:2.5em; + border-bottom:1px solid #ddd +} -h6 { - color: #777777; - font-size: 14px; } +body h2{ + font-size:2em; + border-bottom:1px solid #eee +} -p, blockquote, ul, ol, dl, li, table, pre { - margin: 15px 0; } +body h3{ + font-size:1.5em +} -hr { - background: transparent url("https://a248.e.akamai.net/assets.github.com/assets/primer/markdown/dirty-shade-0e7d81b119cc9beae17b0c98093d121fa0050a74.png") repeat-x 0 0; - border: 0 none; - color: #ccc; - height: 4px; - padding: 0; } +body h4{ + font-size:1.2em +} -body > h2:first-child { - margin-top: 0; - padding-top: 0; } -body > h1:first-child { - margin-top: 0; - padding-top: 0; } - body > h1:first-child + h2 { - margin-top: 0; - padding-top: 0; } -body > h3:first-child, body > h4:first-child, body > h5:first-child, body > h6:first-child { - margin-top: 0; - padding-top: 0; } +body h5{ + font-size:1em +} -a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 { - margin-top: 0; - padding-top: 0; } +body h6{ + color:#777; + font-size:1em +} -h1 p, h2 p, h3 p, h4 p, h5 p, h6 p { - margin-top: 0; } +body p,body blockquote,body ul,body ol,body dl,body table,body pre{ + margin:15px 0 +} -li p.first { - display: inline-block; } - -ul, ol { - padding-left: 30px; } - -ul :first-child, ol :first-child { - margin-top: 0; } - -ul :last-child, ol :last-child { - margin-bottom: 0; } - -dl { - padding: 0; } - dl dt { - font-size: 14px; - font-weight: bold; - font-style: italic; - padding: 0; - margin: 15px 0 5px; } - dl dt:first-child { - padding: 0; } - dl dt > :first-child { - margin-top: 0; } - dl dt > :last-child { - margin-bottom: 0; } - dl dd { - margin: 0 0 15px; - padding: 0 15px; } - dl dd > :first-child { - margin-top: 0; } - dl dd > :last-child { - margin-bottom: 0; } - -blockquote { - border-left: 4px solid #dddddd; - padding: 0 15px; - color: #777777; } - blockquote > :first-child { - margin-top: 0; } - blockquote > :last-child { - margin-bottom: 0; } - -table { - border-collapse: collapse; border-spacing: 0; padding: 0; } - table tr { - border-top: 1px solid #cccccc; - background-color: white; - margin: 0; - padding: 0; } - table tr:nth-child(2n) { - background-color: #f8f8f8; } - table tr th { - font-weight: bold; - border: 1px solid #cccccc; - text-align: left; - margin: 0; - padding: 6px 13px; } - table tr td { - border: 1px solid #cccccc; - text-align: left; - margin: 0; - padding: 6px 13px; } - table tr th :first-child, table tr td :first-child { - margin-top: 0; } - table tr th :last-child, table tr td :last-child { - margin-bottom: 0; } - -img { - max-width: 100%; } - -span.frame { - display: block; - overflow: hidden; } - span.frame > span { - border: 1px solid #dddddd; - display: block; - float: left; - overflow: hidden; - margin: 13px 0 0; - padding: 7px; - width: auto; } - span.frame span img { - display: block; - float: left; } - span.frame span span { - clear: both; - color: #333333; - display: block; - padding: 5px 0 0; } -span.align-center { - display: block; - overflow: hidden; - clear: both; } - span.align-center > span { - display: block; - overflow: hidden; - margin: 13px auto 0; - text-align: center; } - span.align-center span img { - margin: 0 auto; - text-align: center; } -span.align-right { - display: block; - overflow: hidden; - clear: both; } - span.align-right > span { - display: block; - overflow: hidden; - margin: 13px 0 0; - text-align: right; } - span.align-right span img { - margin: 0; - text-align: right; } -span.float-left { - display: block; - margin-right: 13px; - overflow: hidden; - float: left; } - span.float-left span { - margin: 13px 0 0; } -span.float-right { - display: block; - margin-left: 13px; - overflow: hidden; - float: right; } - span.float-right > span { - display: block; - overflow: hidden; - margin: 13px auto 0; - text-align: right; } - -code, tt { - margin: 0 2px; - padding: 0 5px; - white-space: nowrap; - border: 1px solid #eaeaea; - background-color: #f8f8f8; - border-radius: 3px; } - -pre code { - margin: 0; - padding: 0; - white-space: pre; - border: none; - background: transparent; } - -.highlight pre { - background-color: #f8f8f8; - border: 1px solid #cccccc; - font-size: 13px; - line-height: 19px; - overflow: auto; - padding: 6px 10px; - border-radius: 3px; } - -pre { - background-color: #f8f8f8; - border: 1px solid #cccccc; - font-size: 13px; - line-height: 19px; - overflow: auto; - padding: 6px 10px; - border-radius: 3px; } - pre code, pre tt { - background-color: transparent; - border: none; } +body h1 tt,body h1 code,body h2 tt,body h2 code,body h3 tt,body h3 code,body h4 tt,body h4 code,body h5 tt,body h5 code,body h6 tt,body h6 code +{ + font-size:inherit; +} -.markdown-body code,.markdown-body tt{margin:0 2px;padding:0px 5px;white-space:nowrap;border:1px solid #eaeaea;background-color:#f8f8f8;border-radius:3px} -.markdown-body pre>code{margin:0;padding:0;white-space:pre;border:none;background:transparent} -.markdown-body .highlight pre,.markdown-body pre{background-color:#f8f8f8;border:1px solid #ccc;font-size:13px;line-height:19px;overflow:auto;padding:6px 10px;border-radius:3px} -.markdown-body pre code,.markdown-body pre tt{background-color:transparent;border:none} -.highlight{background:#ffffff} -.highlight .c{color:#999988;font-style:italic} -.highlight .err{color:#a61717;background-color:#e3d2d2} -.highlight .k{font-weight:bold} -.highlight .o{font-weight:bold} -.highlight .cm{color:#999988;font-style:italic} -.highlight .cp{color:#999999;font-weight:bold} -.highlight .c1{color:#999988;font-style:italic} -.highlight .cs{color:#999999;font-weight:bold;font-style:italic} -.highlight .gd{color:#000000;background-color:#ffdddd} -.highlight .gd .x{color:#000000;background-color:#ffaaaa} -.highlight .ge{font-style:italic} -.highlight .gr{color:#aa0000} -.highlight .gh{color:#999999} -.highlight .gi{color:#000000;background-color:#ddffdd} -.highlight .gi .x{color:#000000;background-color:#aaffaa} -.highlight .go{color:#888888} -.highlight .gp{color:#555555} -.highlight .gs{font-weight:bold} -.highlight .gu{color:#800080;font-weight:bold} -.highlight .gt{color:#aa0000} -.highlight .kc{font-weight:bold} -.highlight .kd{font-weight:bold} -.highlight .kn{font-weight:bold} -.highlight .kp{font-weight:bold} -.highlight .kr{font-weight:bold} -.highlight .kt{color:#445588;font-weight:bold} -.highlight .m{color:#009999} -.highlight .s{color:#d14} -.highlight .na{color:#008080} -.highlight .nb{color:#0086B3} -.highlight .nc{color:#445588;font-weight:bold} -.highlight .no{color:#008080} -.highlight .ni{color:#800080} -.highlight .ne{color:#990000;font-weight:bold} -.highlight .nf{color:#990000;font-weight:bold} -.highlight .nn{color:#555555} -.highlight .nt{color:#000080} -.highlight .nv{color:#008080} -.highlight .ow{font-weight:bold} -.highlight .w{color:#bbbbbb} -.highlight .mf{color:#009999} -.highlight .mh{color:#009999} -.highlight .mi{color:#009999} -.highlight .mo{color:#009999} -.highlight .sb{color:#d14} -.highlight .sc{color:#d14} -.highlight .sd{color:#d14} -.highlight .s2{color:#d14} -.highlight .se{color:#d14} -.highlight .sh{color:#d14} -.highlight .si{color:#d14} -.highlight .sx{color:#d14} -.highlight .sr{color:#009926} -.highlight .s1{color:#d14} -.highlight .ss{color:#990073} -.highlight .bp{color:#999999} -.highlight .vc{color:#008080} -.highlight .vg{color:#008080} -.highlight .vi{color:#008080} -.highlight .il{color:#009999} -.highlight .gc{color:#999;background-color:#EAF2F5} -.type-csharp .highlight .k{color:#0000FF} -.type-csharp .highlight .kt{color:#0000FF} -.type-csharp .highlight .nf{color:#000000;font-weight:normal} -.type-csharp .highlight .nc{color:#2B91AF} -.type-csharp .highlight .nn{color:#000000} -.type-csharp .highlight .s{color:#A31515} -.type-csharp .highlight .sc{color:#A31515} +body hr +{ + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OENDRjNBN0E2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OENDRjNBN0I2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Q0NGM0E3ODY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Q0NGM0E3OTY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqqezsUAAAAfSURBVHjaYmRABcYwBiM2QSA4y4hNEKYDQxAEAAIMAHNGAzhkPOlYAAAAAElFTkSuQmCC); + background-repeat: repeat-x; + /*background:transparent url(http://overblown.net/files/markdown/dirty-shade.png) repeat-x 0 0;*/ + background-color: transparent; + background-position: 0; + border:0 none; + color:#ccc; + height:4px; + margin:15px 0; + padding:0; +} + +body li p.first +{ + display:inline-block; +} + +body ul,body ol +{ + padding-left:30px; +} + +body ul.no-list,body ol.no-list +{ + list-style-type:none; + padding:0; +} + +body ul ul,body ul ol,body ol ol,body ol ul +{ + margin-bottom:0; + margin-top:0; +} + +body dl +{ + padding:0; +} + +body dl dt +{ + font-size:14px; + font-style:italic; + font-weight:700; + margin-top:15px; + padding:0; +} + +body dl dd +{ + margin-bottom:15px; + padding:0 15px; +} + +body blockquote +{ + border-left:4px solid #DDD; + color:#777; + padding:0 15px; +} + +body blockquote>:first-child +{ + margin-top:0; +} + +body blockquote>:last-child +{ + margin-bottom:0; +} + +body table +{ + display:block; + overflow:auto; + width:100%; +} + +body table th +{ + font-weight:700; +} + +body table th,body table td +{ + border:1px solid #ddd; + padding:6px 13px; +} + +body table tr +{ + background-color:#fff; + border-top:1px solid #ccc; +} + +body table tr:nth-child(2n) +{ + background-color:#f8f8f8; +} + +body img +{ + -moz-box-sizing:border-box; + box-sizing:border-box; + max-width:100%; +} + +body span.frame +{ + display:block; + overflow:hidden; +} + +body span.frame>span +{ + border:1px solid #ddd; + display:block; + float:left; + margin:13px 0 0; + overflow:hidden; + padding:7px; + width:auto; +} + +body span.frame span img +{ + display:block; + float:left; +} + +body span.frame span span +{ + clear:both; + color:#333; + display:block; + padding:5px 0 0; +} + +body span.align-center +{ + clear:both; + display:block; + overflow:hidden; +} + +body span.align-center>span +{ + display:block; + margin:13px auto 0; + overflow:hidden; + text-align:center; +} + +body span.align-center span img +{ + margin:0 auto; + text-align:center; +} + +body span.align-right +{ + clear:both; + display:block; + overflow:hidden; +} + +body span.align-right>span +{ + display:block; + margin:13px 0 0; + overflow:hidden; + text-align:right; +} + +body span.align-right span img +{ + margin:0; + text-align:right; +} + +body span.float-left +{ + display:block; + float:left; + margin-right:13px; + overflow:hidden; +} + +body span.float-left span +{ + margin:13px 0 0; +} + +body span.float-right +{ + display:block; + float:right; + margin-left:13px; + overflow:hidden; +} + +body span.float-right>span +{ + display:block; + margin:13px auto 0; + overflow:hidden; + text-align:right; +} + +body code,body tt +{ + background-color:#f8f8f8; + border:1px solid #ddd; + border-radius:3px; + margin:0 2px; + padding:0 5px; +} + +body code +{ + white-space:nowrap; +} +code,pre{ + font-family:Consolas, "Liberation Mono", Courier, monospace; + font-size:12px +} + +body pre>code +{ + background:transparent; + border:none; + margin:0; + padding:0; + white-space:pre; +} + +body .highlight pre,body pre +{ + background-color:#f8f8f8; + border:1px solid #ddd; + font-size:13px; + line-height:19px; + overflow:auto; + padding:6px 10px; + border-radius:3px +} + +body pre code,body pre tt +{ + background-color:transparent; + border:none; + margin:0; + padding:0; +} + +body .task-list{ + list-style-type:none; + padding-left:10px +} + +.task-list-item{ + padding-left:20px +} + +.task-list-item label{ + font-weight:normal +} + +.task-list-item.enabled label{ + cursor:pointer +} + +.task-list-item+.task-list-item{ + margin-top:5px +} + +.task-list-item-checkbox{ + float:left; + margin-left:-20px; + margin-top:7px +} + + +.highlight{ + background:#ffffff +} + +.highlight .c{ + color:#999988; + font-style:italic +} + +.highlight .err{ + color:#a61717; + background-color:#e3d2d2 +} + +.highlight .k{ + font-weight:bold +} + +.highlight .o{ + font-weight:bold +} + +.highlight .cm{ + color:#999988; + font-style:italic +} + +.highlight .cp{ + color:#999999; + font-weight:bold +} + +.highlight .c1{ + color:#999988; + font-style:italic +} + +.highlight .cs{ + color:#999999; + font-weight:bold; + font-style:italic +} + +.highlight .gd{ + color:#000000; + background-color:#ffdddd +} + +.highlight .gd .x{ + color:#000000; + background-color:#ffaaaa +} + +.highlight .ge{ + font-style:italic +} + +.highlight .gr{ + color:#aa0000 +} + +.highlight .gh{ + color:#999999 +} + +.highlight .gi{ + color:#000000; + background-color:#ddffdd +} + +.highlight .gi .x{ + color:#000000; + background-color:#aaffaa +} + +.highlight .go{ + color:#888888 +} + +.highlight .gp{ + color:#555555 +} + +.highlight .gs{ + font-weight:bold +} + +.highlight .gu{ + color:#800080; + font-weight:bold +} + +.highlight .gt{ + color:#aa0000 +} + +.highlight .kc{ + font-weight:bold +} + +.highlight .kd{ + font-weight:bold +} + +.highlight .kn{ + font-weight:bold +} + +.highlight .kp{ + font-weight:bold +} + +.highlight .kr{ + font-weight:bold +} + +.highlight .kt{ + color:#445588; + font-weight:bold +} + +.highlight .m{ + color:#009999 +} + +.highlight .s{ + color:#d14 +} + +.highlight .n{ + color:#333333 +} + +.highlight .na{ + color:#008080 +} + +.highlight .nb{ + color:#0086B3 +} + +.highlight .nc{ + color:#445588; + font-weight:bold +} + +.highlight .no{ + color:#008080 +} + +.highlight .ni{ + color:#800080 +} + +.highlight .ne{ + color:#990000; + font-weight:bold +} + +.highlight .nf{ + color:#990000; + font-weight:bold +} + +.highlight .nn{ + color:#555555 +} + +.highlight .nt{ + color:#000080 +} + +.highlight .nv{ + color:#008080 +} + +.highlight .ow{ + font-weight:bold +} + +.highlight .w{ + color:#bbbbbb +} + +.highlight .mf{ + color:#009999 +} + +.highlight .mh{ + color:#009999 +} + +.highlight .mi{ + color:#009999 +} + +.highlight .mo{ + color:#009999 +} + +.highlight .sb{ + color:#d14 +} + +.highlight .sc{ + color:#d14 +} + +.highlight .sd{ + color:#d14 +} + +.highlight .s2{ + color:#d14 +} + +.highlight .se{ + color:#d14 +} + +.highlight .sh{ + color:#d14 +} + +.highlight .si{ + color:#d14 +} + +.highlight .sx{ + color:#d14 +} + +.highlight .sr{ + color:#009926 +} + +.highlight .s1{ + color:#d14 +} + +.highlight .ss{ + color:#990073 +} + +.highlight .bp{ + color:#999999 +} + +.highlight .vc{ + color:#008080 +} + +.highlight .vg{ + color:#008080 +} + +.highlight .vi{ + color:#008080 +} + +.highlight .il{ + color:#009999 +} + +.highlight .gc{ + color:#999; + background-color:#EAF2F5 +} + +.type-csharp .highlight .k{ + color:#0000FF +} + +.type-csharp .highlight .kt{ + color:#0000FF +} + +.type-csharp .highlight .nf{ + color:#000000; + font-weight:normal +} + +.type-csharp .highlight .nc{ + color:#2B91AF +} + +.type-csharp .highlight .nn{ + color:#000000 +} + +.type-csharp .highlight .s{ + color:#A31515 +} + +.type-csharp .highlight .sc{ + color:#A31515 +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/helper.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/helper.py new file mode 100644 index 0000000..30158a0 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/helper.py @@ -0,0 +1,49 @@ +import sublime, os, pkgutil +import os.path +import re + +''' +INSTALLED_DIRECTORY - The install directory name for this plugin. + +For ST3 + As descriped in http://www.sublimetext.com/docs/3/packages.html this script locations is one of + Zipped: + "/Packages/Markdown Preview.sublime-package/Markdown Preview.MarkdownPreview" + "/Installed Packages/Markdown Preview.sublime-package/Markdown Preview.MarkdownPreview" + Not Zipped: + "/Packages/Markdown Preview/MarkdownPreview.py" + + All passable path for ST3 are abspath (tested on windows) + +For ST2 + The __file__ will be '.\MarkdownPreview.pyc' that means when this script is loaded, + Sublime Text entered the directoy of this script. So we make use of os.path.abspath() +''' +try: + INSTALLED_DIRECTORY = re.search("[ \\\\/]Packages[\\\\/]([^\\\\/\.]+)", os.path.abspath(__file__)).group(1) +except: + print('Warning failed to detect the install directory, defaulting to: "Markdown Preview"') + INSTALLED_DIRECTORY = "Markdown Preview" + + + + +""" +Preload all python-markdown extensions (ST2 only) +""" + +# By default sublime 2 only imports python packages from the top level of the plugin directory. +# Trying to import packages from subdirectories dynamically at a later time is NOT possible. + +# This package automatically imports all packages from the extension directory +# so they are available when we need them. + +if sublime.version() < '3000': + packages_path = sublime.packages_path() + extension_module = "markdown.extensions" + + + for _, package, _ in pkgutil.walk_packages("."): + if package.startswith(extension_module): + print ("Reloading plugin extension " + os.path.join(packages_path, INSTALLED_DIRECTORY, *package.split(".")) + ".py") + __import__(package) diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/highlight.css b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/highlight.css new file mode 100644 index 0000000..54a8b92 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/highlight.css @@ -0,0 +1,129 @@ +/* + +github.com style (c) Vasily Polovnyov + +*/ + +pre code { + display: block; padding: 0.5em; + color: #333; + background: #f8f8ff +} + +pre .comment, +pre .template_comment, +pre .diff .header, +pre .javadoc { + color: #998; + font-style: italic +} + +pre .keyword, +pre .css .rule .keyword, +pre .winutils, +pre .javascript .title, +pre .nginx .title, +pre .subst, +pre .request, +pre .status { + color: #333; + font-weight: bold +} + +pre .number, +pre .hexcolor, +pre .ruby .constant { + color: #099; +} + +pre .string, +pre .tag .value, +pre .phpdoc, +pre .tex .formula { + color: #d14 +} + +pre .title, +pre .id, +pre .coffeescript .params, +pre .scss .preprocessor { + color: #900; + font-weight: bold +} + +pre .javascript .title, +pre .lisp .title, +pre .clojure .title, +pre .subst { + font-weight: normal +} + +pre .class .title, +pre .haskell .type, +pre .vhdl .literal, +pre .tex .command { + color: #458; + font-weight: bold +} + +pre .tag, +pre .tag .title, +pre .rules .property, +pre .django .tag .keyword { + color: #000080; + font-weight: normal +} + +pre .attribute, +pre .variable, +pre .lisp .body { + color: #008080 +} + +pre .regexp { + color: #009926 +} + +pre .class { + color: #458; + font-weight: bold +} + +pre .symbol, +pre .ruby .symbol .string, +pre .lisp .keyword, +pre .tex .special, +pre .prompt { + color: #990073 +} + +pre .built_in, +pre .lisp .title, +pre .clojure .built_in { + color: #0086b3 +} + +pre .preprocessor, +pre .pi, +pre .doctype, +pre .shebang, +pre .cdata { + color: #999; + font-weight: bold +} + +pre .deletion { + background: #fdd +} + +pre .addition { + background: #dfd +} + +pre .diff .change { + background: #0086b3 +} + +pre .chunk { + color: #aaa +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/highlight.js b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/highlight.js new file mode 100644 index 0000000..33d17e6 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/highlight.js @@ -0,0 +1 @@ +var hljs=new function(){function l(o){return o.replace(/&/gm,"&").replace(//gm,">")}function b(p){for(var o=p.firstChild;o;o=o.nextSibling){if(o.nodeName=="CODE"){return o}if(!(o.nodeType==3&&o.nodeValue.match(/\s+/))){break}}}function h(p,o){return Array.prototype.map.call(p.childNodes,function(q){if(q.nodeType==3){return o?q.nodeValue.replace(/\n/g,""):q.nodeValue}if(q.nodeName=="BR"){return"\n"}return h(q,o)}).join("")}function a(q){var p=(q.className+" "+q.parentNode.className).split(/\s+/);p=p.map(function(r){return r.replace(/^language-/,"")});for(var o=0;o"}while(x.length||v.length){var u=t().splice(0,1)[0];y+=l(w.substr(p,u.offset-p));p=u.offset;if(u.event=="start"){y+=s(u.node);r.push(u.node)}else{if(u.event=="stop"){var o,q=r.length;do{q--;o=r[q];y+=("")}while(o!=u.node);r.splice(q,1);while(q'+L[0]+""}else{r+=L[0]}N=A.lR.lastIndex;L=A.lR.exec(K)}return r+K.substr(N)}function z(){if(A.sL&&!e[A.sL]){return l(w)}var r=A.sL?d(A.sL,w):g(w);if(A.r>0){v+=r.keyword_count;B+=r.r}return''+r.value+""}function J(){return A.sL!==undefined?z():G()}function I(L,r){var K=L.cN?'':"";if(L.rB){x+=K;w=""}else{if(L.eB){x+=l(r)+K;w=""}else{x+=K;w=r}}A=Object.create(L,{parent:{value:A}});B+=L.r}function C(K,r){w+=K;if(r===undefined){x+=J();return 0}var L=o(r,A);if(L){x+=J();I(L,r);return L.rB?0:r.length}var M=s(A,r);if(M){if(!(M.rE||M.eE)){w+=r}x+=J();do{if(A.cN){x+=""}A=A.parent}while(A!=M.parent);if(M.eE){x+=l(r)}w="";if(M.starts){I(M.starts,"")}return M.rE?0:r.length}if(t(r,A)){throw"Illegal"}w+=r;return r.length||1}var F=e[D];f(F);var A=F;var w="";var B=0;var v=0;var x="";try{var u,q,p=0;while(true){A.t.lastIndex=p;u=A.t.exec(E);if(!u){break}q=C(E.substr(p,u.index-p),u[0]);p=u.index+q}C(E.substr(p));return{r:B,keyword_count:v,value:x,language:D}}catch(H){if(H=="Illegal"){return{r:0,keyword_count:0,value:l(E)}}else{throw H}}}function g(s){var o={keyword_count:0,r:0,value:l(s)};var q=o;for(var p in e){if(!e.hasOwnProperty(p)){continue}var r=d(p,s);r.language=p;if(r.keyword_count+r.r>q.keyword_count+q.r){q=r}if(r.keyword_count+r.r>o.keyword_count+o.r){q=o;o=r}}if(q.language){o.second_best=q}return o}function i(q,p,o){if(p){q=q.replace(/^((<[^>]+>|\t)+)/gm,function(r,v,u,t){return v.replace(/\t/g,p)})}if(o){q=q.replace(/\n/g,"
")}return q}function m(r,u,p){var v=h(r,p);var t=a(r);if(t=="no-highlight"){return}var w=t?d(t,v):g(v);t=w.language;var o=c(r);if(o.length){var q=document.createElement("pre");q.innerHTML=w.value;w.value=j(o,c(q),v)}w.value=i(w.value,u,p);var s=r.className;if(!s.match("(\\s|^)(language-)?"+t+"(\\s|$)")){s=s?(s+" "+t):t}r.innerHTML=w.value;r.className=s;r.result={language:t,kw:w.keyword_count,re:w.r};if(w.second_best){r.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function n(){if(n.called){return}n.called=true;Array.prototype.map.call(document.getElementsByTagName("pre"),b).filter(Boolean).forEach(function(o){m(o,hljs.tabReplace)})}function k(){window.addEventListener("DOMContentLoaded",n,false);window.addEventListener("load",n,false)}var e={};this.LANGUAGES=e;this.highlight=d;this.highlightAuto=g;this.fixMarkup=i;this.highlightBlock=m;this.initHighlighting=n;this.initHighlightingOnLoad=k;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.inherit=function(q,r){var o={};for(var p in q){o[p]=q[p]}if(r){for(var p in r){o[p]=r[p]}}return o}}();hljs.LANGUAGES.bash=function(a){var g="true false";var e="if then else elif fi for break continue while in do done echo exit return set declare";var c={cN:"variable",b:"\\$[a-zA-Z0-9_#]+"};var b={cN:"variable",b:"\\${([^}]|\\\\})+}"};var h={cN:"string",b:'"',e:'"',i:"\\n",c:[a.BE,c,b],r:0};var d={cN:"string",b:"'",e:"'",c:[{b:"''"}],r:0};var f={cN:"test_condition",b:"",e:"",c:[h,d,c,b],k:{literal:g},r:0};return{k:{keyword:e,literal:g},c:[{cN:"shebang",b:"(#!\\/bin\\/bash)|(#!\\/bin\\/sh)",r:10},c,b,a.HCM,h,d,a.inherit(f,{b:"\\[ ",e:" \\]",r:0}),a.inherit(f,{b:"\\[\\[ ",e:" \\]\\]"})]}}(hljs);hljs.LANGUAGES.cs=function(a){return{k:"abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while ascending descending from get group into join let orderby partial select set value var where yield",c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"///|"},{cN:"xmlDocTag",b:""}]},a.CLCM,a.CBLCLM,{cN:"preprocessor",b:"#",e:"$",k:"if else elif endif define undef warning error line region endregion pragma checksum"},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},a.ASM,a.QSM,a.CNM]}}(hljs);hljs.LANGUAGES.ruby=function(e){var a="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var j="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var g={keyword:"and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include"};var c={cN:"yardoctag",b:"@[A-Za-z]+"};var k=[{cN:"comment",b:"#",e:"$",c:[c]},{cN:"comment",b:"^\\=begin",e:"^\\=end",c:[c],r:10},{cN:"comment",b:"^__END__",e:"\\n$"}];var d={cN:"subst",b:"#\\{",e:"}",l:a,k:g};var i=[e.BE,d];var b=[{cN:"string",b:"'",e:"'",c:i,r:0},{cN:"string",b:'"',e:'"',c:i,r:0},{cN:"string",b:"%[qw]?\\(",e:"\\)",c:i},{cN:"string",b:"%[qw]?\\[",e:"\\]",c:i},{cN:"string",b:"%[qw]?{",e:"}",c:i},{cN:"string",b:"%[qw]?<",e:">",c:i,r:10},{cN:"string",b:"%[qw]?/",e:"/",c:i,r:10},{cN:"string",b:"%[qw]?%",e:"%",c:i,r:10},{cN:"string",b:"%[qw]?-",e:"-",c:i,r:10},{cN:"string",b:"%[qw]?\\|",e:"\\|",c:i,r:10}];var h={cN:"function",bWK:true,e:" |$|;",k:"def",c:[{cN:"title",b:j,l:a,k:g},{cN:"params",b:"\\(",e:"\\)",l:a,k:g}].concat(k)};var f=k.concat(b.concat([{cN:"class",bWK:true,e:"$|;",k:"class module",c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]}].concat(k)},h,{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:b.concat([{b:j}]),r:0},{cN:"symbol",b:a+":",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:k.concat([{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[e.BE,d]}]),r:0}]));d.c=f;h.c[1].c=f;return{l:a,k:g,c:f}}(hljs);hljs.LANGUAGES.diff=function(a){return{c:[{cN:"chunk",b:"^\\@\\@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +\\@\\@$",r:10},{cN:"chunk",b:"^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$",r:10},{cN:"chunk",b:"^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$",r:10},{cN:"header",b:"Index: ",e:"$"},{cN:"header",b:"=====",e:"=====$"},{cN:"header",b:"^\\-\\-\\-",e:"$"},{cN:"header",b:"^\\*{3} ",e:"$"},{cN:"header",b:"^\\+\\+\\+",e:"$"},{cN:"header",b:"\\*{5}",e:"\\*{5}$"},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"change",b:"^\\!",e:"$"}]}}(hljs);hljs.LANGUAGES.javascript=function(a){return{k:{keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const",literal:"true false null undefined NaN Infinity"},c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{b:"("+a.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[a.CLCM,a.CBLCLM,{cN:"regexp",b:"/",e:"/[gim]*",i:"\\n",c:[{b:"\\\\/"}]},{b:"<",e:">;",sL:"xml"}],r:0},{cN:"function",bWK:true,e:"{",k:"function",c:[{cN:"title",b:"[A-Za-z$_][0-9A-Za-z$_]*"},{cN:"params",b:"\\(",e:"\\)",c:[a.CLCM,a.CBLCLM],i:"[\"'\\(]"}],i:"\\[|%"}]}}(hljs);hljs.LANGUAGES.css=function(a){var b={cN:"function",b:a.IR+"\\(",e:"\\)",c:[a.NM,a.ASM,a.QSM]};return{cI:true,i:"[=/|']",c:[a.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{cN:"at_rule",b:"@",e:"[{;]",eE:true,k:"import page media charset",c:[b,a.ASM,a.QSM,a.NM]},{cN:"tag",b:a.IR,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[a.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[b,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"hexcolor",b:"\\#[0-9A-F]+"},{cN:"important",b:"!important"}]}}]}]}]}}(hljs);hljs.LANGUAGES.xml=function(a){var c="[A-Za-z0-9\\._:-]+";var b={eW:true,c:[{cN:"attribute",b:c,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"|$)",e:">",k:{title:"style"},c:[b],starts:{e:"",rE:true,sL:"css"}},{cN:"tag",b:"|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"",c:[{cN:"title",b:"[^ />]+"},b]}]}}(hljs);hljs.LANGUAGES.http=function(a){return{i:"\\S",c:[{cN:"status",b:"^HTTP/[0-9\\.]+",e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{cN:"request",b:"^[A-Z]+ (.*?) HTTP/[0-9\\.]+$",rB:true,e:"$",c:[{cN:"string",b:" ",e:" ",eB:true,eE:true}]},{cN:"attribute",b:"^\\w",e:": ",eE:true,i:"\\n|\\s|=",starts:{cN:"string",e:"$"}},{b:"\\n\\n",starts:{sL:"",eW:true}}]}}(hljs);hljs.LANGUAGES.java=function(a){return{k:"false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws",c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"@[A-Za-z]+"}],r:10},a.CLCM,a.CBLCLM,a.ASM,a.QSM,{cN:"class",bWK:true,e:"{",k:"class interface",i:":",c:[{bWK:true,k:"extends implements",r:10},{cN:"title",b:a.UIR}]},a.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}}(hljs);hljs.LANGUAGES.php=function(a){var e={cN:"variable",b:"\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"};var b=[a.inherit(a.ASM,{i:null}),a.inherit(a.QSM,{i:null}),{cN:"string",b:'b"',e:'"',c:[a.BE]},{cN:"string",b:"b'",e:"'",c:[a.BE]}];var c=[a.BNM,a.CNM];var d={cN:"title",b:a.UIR};return{cI:true,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return implements parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception php_user_filter default die require __FUNCTION__ enddeclare final try this switch continue endfor endif declare unset true false namespace trait goto instanceof insteadof __DIR__ __NAMESPACE__ __halt_compiler",c:[a.CLCM,a.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+"}]},{cN:"comment",eB:true,b:"__halt_compiler.+?;",eW:true},{cN:"string",b:"<<<['\"]?\\w+['\"]?$",e:"^\\w+;",c:[a.BE]},{cN:"preprocessor",b:"<\\?php",r:10},{cN:"preprocessor",b:"\\?>"},e,{cN:"function",bWK:true,e:"{",k:"function",i:"\\$|\\[|%",c:[d,{cN:"params",b:"\\(",e:"\\)",c:["self",e,a.CBLCLM].concat(b).concat(c)}]},{cN:"class",bWK:true,e:"{",k:"class",i:"[:\\(\\$]",c:[{bWK:true,eW:true,k:"extends",c:[d]},d]},{b:"=>"}].concat(b).concat(c)}}(hljs);hljs.LANGUAGES.python=function(a){var f={cN:"prompt",b:"^(>>>|\\.\\.\\.) "};var c=[{cN:"string",b:"(u|b)?r?'''",e:"'''",c:[f],r:10},{cN:"string",b:'(u|b)?r?"""',e:'"""',c:[f],r:10},{cN:"string",b:"(u|r|ur)'",e:"'",c:[a.BE],r:10},{cN:"string",b:'(u|r|ur)"',e:'"',c:[a.BE],r:10},{cN:"string",b:"(b|br)'",e:"'",c:[a.BE]},{cN:"string",b:'(b|br)"',e:'"',c:[a.BE]}].concat([a.ASM,a.QSM]);var e={cN:"title",b:a.UIR};var d={cN:"params",b:"\\(",e:"\\)",c:["self",a.CNM,f].concat(c)};var b={bWK:true,e:":",i:"[${=;\\n]",c:[e,d],r:10};return{k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10",built_in:"None True False Ellipsis NotImplemented"},i:"(|\\?)",c:c.concat([f,a.HCM,a.inherit(b,{cN:"function",k:"def"}),a.inherit(b,{cN:"class",k:"class"}),a.CNM,{cN:"decorator",b:"@",e:"$"},{b:"\\b(print|exec)\\("}])}}(hljs);hljs.LANGUAGES.sql=function(a){return{cI:true,c:[{cN:"operator",b:"(begin|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant)\\b(?!:)",e:";",eW:true,k:{keyword:"all partial global month current_timestamp using go revoke smallint indicator end-exec disconnect zone with character assertion to add current_user usage input local alter match collate real then rollback get read timestamp session_user not integer bit unique day minute desc insert execute like ilike|2 level decimal drop continue isolation found where constraints domain right national some module transaction relative second connect escape close system_user for deferred section cast current sqlstate allocate intersect deallocate numeric public preserve full goto initially asc no key output collation group by union session both last language constraint column of space foreign deferrable prior connection unknown action commit view or first into float year primary cascaded except restrict set references names table outer open select size are rows from prepare distinct leading create only next inner authorization schema corresponding option declare precision immediate else timezone_minute external varying translation true case exception join hour default double scroll value cursor descriptor values dec fetch procedure delete and false int is describe char as at in varchar null trailing any absolute current_time end grant privileges when cross check write current_date pad begin temporary exec time update catalog user sql date on identity timezone_hour natural whenever interval work order cascade diagnostics nchar having left call do handler load replace truncate start lock show pragma exists number",aggregate:"count sum min max avg"},c:[{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}],r:0},{cN:"string",b:'"',e:'"',c:[a.BE,{b:'""'}],r:0},{cN:"string",b:"`",e:"`",c:[a.BE]},a.CNM]},a.CBLCLM,{cN:"comment",b:"--",e:"$"}]}}(hljs);hljs.LANGUAGES.ini=function(a){return{cI:true,i:"[^\\s]",c:[{cN:"comment",b:";",e:"$"},{cN:"title",b:"^\\[",e:"\\]"},{cN:"setting",b:"^[a-z0-9\\[\\]_-]+[ \\t]*=[ \\t]*",e:"$",c:[{cN:"value",eW:true,k:"on off true false yes no",c:[a.QSM,a.NM]}]}]}}(hljs);hljs.LANGUAGES.perl=function(e){var a="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when";var d={cN:"subst",b:"[$@]\\{",e:"\\}",k:a,r:10};var b={cN:"variable",b:"\\$\\d"};var i={cN:"variable",b:"[\\$\\%\\@\\*](\\^\\w\\b|#\\w+(\\:\\:\\w+)*|[^\\s\\w{]|{\\w+}|\\w+(\\:\\:\\w*)*)"};var f=[e.BE,d,b,i];var h={b:"->",c:[{b:e.IR},{b:"{",e:"}"}]};var g={cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5};var c=[b,i,e.HCM,g,{cN:"comment",b:"^\\=\\w",e:"\\=cut",eW:true},h,{cN:"string",b:"q[qwxr]?\\s*\\(",e:"\\)",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\[",e:"\\]",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\{",e:"\\}",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\|",e:"\\|",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\<",e:"\\>",c:f,r:5},{cN:"string",b:"qw\\s+q",e:"q",c:f,r:5},{cN:"string",b:"'",e:"'",c:[e.BE],r:0},{cN:"string",b:'"',e:'"',c:f,r:0},{cN:"string",b:"`",e:"`",c:[e.BE]},{cN:"string",b:"{\\w+}",r:0},{cN:"string",b:"-?\\w+\\s*\\=\\>",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"("+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[e.HCM,g,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],r:0}]},{cN:"sub",bWK:true,e:"(\\s*\\(.*?\\))?[;{]",k:"sub",r:5},{cN:"operator",b:"-\\w\\b",r:0}];d.c=c;h.c[1].c=c;return{k:a,c:c}}(hljs);hljs.LANGUAGES.json=function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{c:d,k:e,i:"\\S"}}(hljs);hljs.LANGUAGES.cpp=function(a){var b={keyword:"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex",built_in:"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr"};return{k:b,i:"",k:b,r:10,c:["self"]}]}}(hljs); diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/lib/linux-x32/libssl-0.9.8/_ssl.so b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/lib/linux-x32/libssl-0.9.8/_ssl.so new file mode 100644 index 0000000000000000000000000000000000000000..8e3ac9ac8cdd0617962468d440f466a210de1670 GIT binary patch literal 93503 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 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/lib/linux-x32/libssl-1.0.0/_ssl.so b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/lib/linux-x32/libssl-1.0.0/_ssl.so new file mode 100644 index 0000000000000000000000000000000000000000..1ff704b4150980334fa9dea058b4126bd25c1daa GIT binary patch literal 109394 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
QT)+IE@ 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

  • `f@@2Yx>GLRpU1CTPM-$-siDM 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
      ?JL;s<&^gDRT=*uXEa7etgNtrfTO! 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

      f~276jI*Rik$$Mk$^)LRVOo? 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" + + +# a replacement for the old socket.ssl function + +def sslwrap_simple(sock, keyfile=None, certfile=None): + + """A replacement for the old socket.ssl function. Designed + for compability with Python 2.5 and earlier. Will disappear in + Python 3.0.""" + + if hasattr(sock, "_sock"): + sock = sock._sock + + ssl_sock = _ssl.sslwrap(sock, 0, keyfile, certfile, CERT_NONE, + PROTOCOL_SSLv23, None) + try: + sock.getpeername() + except: + # no, no connection yet + pass + else: + # yes, do the handshake + ssl_sock.do_handshake() + + return ssl_sock diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/LICENSE.md b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/LICENSE.md new file mode 100644 index 0000000..4cd8b14 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/LICENSE.md @@ -0,0 +1,30 @@ +Copyright 2007, 2008 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of the nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE PYTHON MARKDOWN PROJECT ''AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANY CONTRIBUTORS TO THE PYTHON MARKDOWN PROJECT +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/README.md b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/README.md new file mode 100644 index 0000000..97a44b1 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/README.md @@ -0,0 +1,30 @@ +[Python-Markdown][] +=================== + +This is a Python implementation of John Gruber's [Markdown][]. +It is almost completely compliant with the reference implementation, +though there are a few known issues. See [Features][] for information +on what exactly is supported and what is not. Additional features are +supported by the [Available Extensions][]. + +[Python-Markdown]: http://packages.python.org/Markdown/ +[Markdown]: http://daringfireball.net/projects/markdown/ +[Features]: http://packages.python.org/Markdown/index.html#Features +[Available Extensions]: http://packages.python.org/Markdown/extensions/index.html + + +Documentation +------------- + +Installation and usage documentation is available in the `docs/` directory +of the distribution and on the project website at +. + +Support +------- + +You may ask for help and discuss various other issues on the [mailing list][] and report bugs on the [bug tracker][]. + +[mailing list]: http://lists.sourceforge.net/lists/listinfo/python-markdown-discuss +[bug tracker]: http://github.com/waylan/Python-Markdown/issues + diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/__init__.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/__init__.py new file mode 100644 index 0000000..2fe68de --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/__init__.py @@ -0,0 +1,448 @@ +""" +Python Markdown +=============== + +Python Markdown converts Markdown to HTML and can be used as a library or +called from the command line. + +## Basic usage as a module: + + import markdown + html = markdown.markdown(your_text_string) + +See for more +information and instructions on how to extend the functionality of +Python Markdown. Read that before you try modifying this file. + +## Authors and License + +Started by [Manfred Stienstra](http://www.dwerg.net/). Continued and +maintained by [Yuri Takhteyev](http://www.freewisdom.org), [Waylan +Limberg](http://achinghead.com/) and [Artem Yunusov](http://blog.splyer.com). + +Contact: markdown@freewisdom.org + +Copyright 2007-2013 The Python Markdown Project (v. 1.7 and later) +Copyright 200? Django Software Foundation (OrderedDict implementation) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE for details). +""" + +from __future__ import absolute_import +from __future__ import unicode_literals +from .__version__ import version, version_info +import re +import codecs +import sys +import logging +from . import util +from .preprocessors import build_preprocessors +from .blockprocessors import build_block_parser +from .treeprocessors import build_treeprocessors +from .inlinepatterns import build_inlinepatterns +from .postprocessors import build_postprocessors +from .extensions import Extension +from .serializers import to_html_string, to_xhtml_string + +__all__ = ['Markdown', 'markdown', 'markdownFromFile'] + +logger = logging.getLogger('MARKDOWN') + + +class Markdown(object): + """Convert Markdown to HTML.""" + + doc_tag = "div" # Element used to wrap document - later removed + + option_defaults = { + 'html_replacement_text' : '[HTML_REMOVED]', + 'tab_length' : 4, + 'enable_attributes' : True, + 'smart_emphasis' : True, + 'lazy_ol' : True, + } + + output_formats = { + 'html' : to_html_string, + 'html4' : to_html_string, + 'html5' : to_html_string, + 'xhtml' : to_xhtml_string, + 'xhtml1': to_xhtml_string, + 'xhtml5': to_xhtml_string, + } + + ESCAPED_CHARS = ['\\', '`', '*', '_', '{', '}', '[', ']', + '(', ')', '>', '#', '+', '-', '.', '!'] + + def __init__(self, *args, **kwargs): + """ + Creates a new Markdown instance. + + Keyword arguments: + + * extensions: A list of extensions. + If they are of type string, the module mdx_name.py will be loaded. + If they are a subclass of markdown.Extension, they will be used + as-is. + * extension_configs: Configuration settingis for extensions. + * output_format: Format of output. Supported formats are: + * "xhtml1": Outputs XHTML 1.x. Default. + * "xhtml5": Outputs XHTML style tags of HTML 5 + * "xhtml": Outputs latest supported version of XHTML (currently XHTML 1.1). + * "html4": Outputs HTML 4 + * "html5": Outputs HTML style tags of HTML 5 + * "html": Outputs latest supported version of HTML (currently HTML 4). + Note that it is suggested that the more specific formats ("xhtml1" + and "html4") be used as "xhtml" or "html" may change in the future + if it makes sense at that time. + * safe_mode: Disallow raw html. One of "remove", "replace" or "escape". + * html_replacement_text: Text used when safe_mode is set to "replace". + * tab_length: Length of tabs in the source. Default: 4 + * enable_attributes: Enable the conversion of attributes. Default: True + * smart_emphasis: Treat `_connected_words_` intelegently Default: True + * lazy_ol: Ignore number of first item of ordered lists. Default: True + + """ + + # For backward compatibility, loop through old positional args + pos = ['extensions', 'extension_configs', 'safe_mode', 'output_format'] + c = 0 + for arg in args: + if pos[c] not in kwargs: + kwargs[pos[c]] = arg + c += 1 + if c == len(pos): + # ignore any additional args + break + + # Loop through kwargs and assign defaults + for option, default in self.option_defaults.items(): + setattr(self, option, kwargs.get(option, default)) + + self.safeMode = kwargs.get('safe_mode', False) + if self.safeMode and 'enable_attributes' not in kwargs: + # Disable attributes in safeMode when not explicitly set + self.enable_attributes = False + + self.registeredExtensions = [] + self.docType = "" + self.stripTopLevelTags = True + + self.build_parser() + + self.references = {} + self.htmlStash = util.HtmlStash() + self.set_output_format(kwargs.get('output_format', 'xhtml1')) + self.registerExtensions(extensions=kwargs.get('extensions', []), + configs=kwargs.get('extension_configs', {})) + self.reset() + + def build_parser(self): + """ Build the parser from the various parts. """ + self.preprocessors = build_preprocessors(self) + self.parser = build_block_parser(self) + self.inlinePatterns = build_inlinepatterns(self) + self.treeprocessors = build_treeprocessors(self) + self.postprocessors = build_postprocessors(self) + return self + + def registerExtensions(self, extensions, configs): + """ + Register extensions with this instance of Markdown. + + Keyword arguments: + + * extensions: A list of extensions, which can either + be strings or objects. See the docstring on Markdown. + * configs: A dictionary mapping module names to config options. + + """ + for ext in extensions: + if isinstance(ext, util.string_type): + ext = self.build_extension(ext, configs.get(ext, [])) + if isinstance(ext, Extension): + ext.extendMarkdown(self, globals()) + elif ext is not None: + raise TypeError( + 'Extension "%s.%s" must be of type: "markdown.Extension"' + % (ext.__class__.__module__, ext.__class__.__name__)) + + return self + + def build_extension(self, ext_name, configs = []): + """Build extension by name, then return the module. + + The extension name may contain arguments as part of the string in the + following format: "extname(key1=value1,key2=value2)" + + """ + + # Parse extensions config params (ignore the order) + configs = dict(configs) + pos = ext_name.find("(") # find the first "(" + if pos > 0: + ext_args = ext_name[pos+1:-1] + ext_name = ext_name[:pos] + pairs = [x.split("=") for x in ext_args.split(",")] + configs.update([(x.strip(), y.strip()) for (x, y) in pairs]) + + # Setup the module name + module_name = ext_name + if '.' not in ext_name: + import sublime + if sublime.version() >= '3000': + from ..helper import INSTALLED_DIRECTORY + module_name = '.'.join([INSTALLED_DIRECTORY, 'markdown.extensions', ext_name]) + else: + module_name = '.'.join(['markdown.extensions', ext_name]) + + # Try loading the extension first from one place, then another + try: # New style (markdown.extensons.) + module = __import__(module_name, {}, {}, [module_name.rpartition('.')[0]]) + except ImportError: + module_name_old_style = '_'.join(['mdx', ext_name]) + try: # Old style (mdx_) + module = __import__(module_name_old_style) + except ImportError as e: + message = "Failed loading extension '%s' from '%s' or '%s'" \ + % (ext_name, module_name, module_name_old_style) + e.args = (message,) + e.args[1:] + raise + + # If the module is loaded successfully, we expect it to define a + # function called makeExtension() + try: + return module.makeExtension(configs.items()) + except AttributeError as e: + message = e.args[0] + message = "Failed to initiate extension " \ + "'%s': %s" % (ext_name, message) + e.args = (message,) + e.args[1:] + raise + + def registerExtension(self, extension): + """ This gets called by the extension """ + self.registeredExtensions.append(extension) + return self + + def reset(self): + """ + Resets all state variables so that we can start with a new text. + """ + self.htmlStash.reset() + self.references.clear() + + for extension in self.registeredExtensions: + if hasattr(extension, 'reset'): + extension.reset() + + return self + + def set_output_format(self, format): + """ Set the output format for the class instance. """ + self.output_format = format.lower() + try: + self.serializer = self.output_formats[self.output_format] + except KeyError as e: + valid_formats = list(self.output_formats.keys()) + valid_formats.sort() + message = 'Invalid Output Format: "%s". Use one of %s.' \ + % (self.output_format, + '"' + '", "'.join(valid_formats) + '"') + e.args = (message,) + e.args[1:] + raise + return self + + def convert(self, source): + """ + Convert markdown to serialized XHTML or HTML. + + Keyword arguments: + + * source: Source text as a Unicode string. + + Markdown processing takes place in five steps: + + 1. A bunch of "preprocessors" munge the input text. + 2. BlockParser() parses the high-level structural elements of the + pre-processed text into an ElementTree. + 3. A bunch of "treeprocessors" are run against the ElementTree. One + such treeprocessor runs InlinePatterns against the ElementTree, + detecting inline markup. + 4. Some post-processors are run against the text after the ElementTree + has been serialized into text. + 5. The output is written to a string. + + """ + + # Fixup the source text + if not source.strip(): + return '' # a blank unicode string + + try: + source = util.text_type(source) + except UnicodeDecodeError as e: + # Customise error message while maintaining original trackback + e.reason += '. -- Note: Markdown only accepts unicode input!' + raise + + # Split into lines and run the line preprocessors. + self.lines = source.split("\n") + for prep in self.preprocessors.values(): + self.lines = prep.run(self.lines) + + # Parse the high-level elements. + root = self.parser.parseDocument(self.lines).getroot() + + # Run the tree-processors + for treeprocessor in self.treeprocessors.values(): + newRoot = treeprocessor.run(root) + if newRoot: + root = newRoot + + # Serialize _properly_. Strip top-level tags. + output = self.serializer(root) + if self.stripTopLevelTags: + try: + start = output.index('<%s>'%self.doc_tag)+len(self.doc_tag)+2 + end = output.rindex(''%self.doc_tag) + output = output[start:end].strip() + except ValueError: + if output.strip().endswith('<%s />'%self.doc_tag): + # We have an empty document + output = '' + else: + # We have a serious problem + raise ValueError('Markdown failed to strip top-level tags. Document=%r' % output.strip()) + + # Run the text post-processors + for pp in self.postprocessors.values(): + output = pp.run(output) + + return output.strip() + + def convertFile(self, input=None, output=None, encoding=None): + """Converts a markdown file and returns the HTML as a unicode string. + + Decodes the file using the provided encoding (defaults to utf-8), + passes the file content to markdown, and outputs the html to either + the provided stream or the file with provided name, using the same + encoding as the source file. The 'xmlcharrefreplace' error handler is + used when encoding the output. + + **Note:** This is the only place that decoding and encoding of unicode + takes place in Python-Markdown. (All other code is unicode-in / + unicode-out.) + + Keyword arguments: + + * input: File object or path. Reads from stdin if `None`. + * output: File object or path. Writes to stdout if `None`. + * encoding: Encoding of input and output files. Defaults to utf-8. + + """ + + encoding = encoding or "utf-8" + + # Read the source + if input: + if isinstance(input, util.string_type): + input_file = codecs.open(input, mode="r", encoding=encoding) + else: + input_file = codecs.getreader(encoding)(input) + text = input_file.read() + input_file.close() + else: + text = sys.stdin.read() + if not isinstance(text, util.text_type): + text = text.decode(encoding) + + text = text.lstrip('\ufeff') # remove the byte-order mark + + # Convert + html = self.convert(text) + + # Write to file or stdout + if output: + if isinstance(output, util.string_type): + output_file = codecs.open(output, "w", + encoding=encoding, + errors="xmlcharrefreplace") + output_file.write(html) + output_file.close() + else: + writer = codecs.getwriter(encoding) + output_file = writer(output, errors="xmlcharrefreplace") + output_file.write(html) + # Don't close here. User may want to write more. + else: + # Encode manually and write bytes to stdout. + html = html.encode(encoding, "xmlcharrefreplace") + try: + # Write bytes directly to buffer (Python 3). + sys.stdout.buffer.write(html) + except AttributeError: + # Probably Python 2, which works with bytes by default. + sys.stdout.write(html) + + return self + + +""" +EXPORTED FUNCTIONS +============================================================================= + +Those are the two functions we really mean to export: markdown() and +markdownFromFile(). +""" + +def markdown(text, *args, **kwargs): + """Convert a markdown string to HTML and return HTML as a unicode string. + + This is a shortcut function for `Markdown` class to cover the most + basic use case. It initializes an instance of Markdown, loads the + necessary extensions and runs the parser on the given text. + + Keyword arguments: + + * text: Markdown formatted text as Unicode or ASCII string. + * Any arguments accepted by the Markdown class. + + Returns: An HTML document as a string. + + """ + md = Markdown(*args, **kwargs) + return md.convert(text) + + +def markdownFromFile(*args, **kwargs): + """Read markdown code from a file and write it to a file or a stream. + + This is a shortcut function which initializes an instance of Markdown, + and calls the convertFile method rather than convert. + + Keyword arguments: + + * input: a file name or readable object. + * output: a file name or writable object. + * encoding: Encoding of input and output. + * Any arguments accepted by the Markdown class. + + """ + # For backward compatibility loop through positional args + pos = ['input', 'output', 'extensions', 'encoding'] + c = 0 + for arg in args: + if pos[c] not in kwargs: + kwargs[pos[c]] = arg + c += 1 + if c == len(pos): + break + + md = Markdown(**kwargs) + md.convertFile(kwargs.get('input', None), + kwargs.get('output', None), + kwargs.get('encoding', None)) + diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/__main__.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/__main__.py new file mode 100644 index 0000000..8ee8c82 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/__main__.py @@ -0,0 +1,87 @@ +""" +COMMAND-LINE SPECIFIC STUFF +============================================================================= + +""" + +import markdown +import sys +import optparse + +import logging +from logging import DEBUG, INFO, CRITICAL + +logger = logging.getLogger('MARKDOWN') + +def parse_options(): + """ + Define and parse `optparse` options for command-line usage. + """ + usage = """%prog [options] [INPUTFILE] + (STDIN is assumed if no INPUTFILE is given)""" + desc = "A Python implementation of John Gruber's Markdown. " \ + "http://packages.python.org/Markdown/" + ver = "%%prog %s" % markdown.version + + parser = optparse.OptionParser(usage=usage, description=desc, version=ver) + parser.add_option("-f", "--file", dest="filename", default=None, + help="Write output to OUTPUT_FILE. Defaults to STDOUT.", + metavar="OUTPUT_FILE") + parser.add_option("-e", "--encoding", dest="encoding", + help="Encoding for input and output files.",) + parser.add_option("-q", "--quiet", default = CRITICAL, + action="store_const", const=CRITICAL+10, dest="verbose", + help="Suppress all warnings.") + parser.add_option("-v", "--verbose", + action="store_const", const=INFO, dest="verbose", + help="Print all warnings.") + parser.add_option("-s", "--safe", dest="safe", default=False, + metavar="SAFE_MODE", + help="'replace', 'remove' or 'escape' HTML tags in input") + parser.add_option("-o", "--output_format", dest="output_format", + default='xhtml1', metavar="OUTPUT_FORMAT", + help="'xhtml1' (default), 'html4' or 'html5'.") + parser.add_option("--noisy", + action="store_const", const=DEBUG, dest="verbose", + help="Print debug messages.") + parser.add_option("-x", "--extension", action="append", dest="extensions", + help = "Load extension EXTENSION.", metavar="EXTENSION") + parser.add_option("-n", "--no_lazy_ol", dest="lazy_ol", + action='store_false', default=True, + help="Observe number of first item of ordered lists.") + + (options, args) = parser.parse_args() + + if len(args) == 0: + input_file = None + else: + input_file = args[0] + + if not options.extensions: + options.extensions = [] + + return {'input': input_file, + 'output': options.filename, + 'safe_mode': options.safe, + 'extensions': options.extensions, + 'encoding': options.encoding, + 'output_format': options.output_format, + 'lazy_ol': options.lazy_ol}, options.verbose + +def run(): + """Run Markdown from the command line.""" + + # Parse options and adjust logging level if necessary + options, logging_level = parse_options() + if not options: sys.exit(2) + logger.setLevel(logging_level) + logger.addHandler(logging.StreamHandler()) + + # Run + markdown.markdownFromFile(**options) + +if __name__ == '__main__': + # Support running module as a commandline command. + # Python 2.5 & 2.6 do: `python -m markdown.__main__ [options] [args]`. + # Python 2.7 & 3.x do: `python -m markdown [options] [args]`. + run() diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/__version__.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/__version__.py new file mode 100644 index 0000000..a13559c --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/__version__.py @@ -0,0 +1,28 @@ +# +# markdown/__version__.py +# +# version_info should conform to PEP 386 +# (major, minor, micro, alpha/beta/rc/final, #) +# (1, 1, 2, 'alpha', 0) => "1.1.2.dev" +# (1, 2, 0, 'beta', 2) => "1.2b2" +version_info = (2, 3, 1, 'final', 0) + +def _get_version(): + " Returns a PEP 386-compliant version number from version_info. " + assert len(version_info) == 5 + assert version_info[3] in ('alpha', 'beta', 'rc', 'final') + + parts = 2 if version_info[2] == 0 else 3 + main = '.'.join(map(str, version_info[:parts])) + + sub = '' + if version_info[3] == 'alpha' and version_info[4] == 0: + # TODO: maybe append some sort of git info here?? + sub = '.dev' + elif version_info[3] != 'final': + mapping = {'alpha': 'a', 'beta': 'b', 'rc': 'c'} + sub = mapping[version_info[3]] + str(version_info[4]) + + return str(main + sub) + +version = _get_version() diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/blockparser.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/blockparser.py new file mode 100644 index 0000000..4504a16 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/blockparser.py @@ -0,0 +1,99 @@ +from __future__ import unicode_literals +from __future__ import absolute_import +from . import util +from . import odict + +class State(list): + """ Track the current and nested state of the parser. + + This utility class is used to track the state of the BlockParser and + support multiple levels if nesting. It's just a simple API wrapped around + a list. Each time a state is set, that state is appended to the end of the + list. Each time a state is reset, that state is removed from the end of + the list. + + Therefore, each time a state is set for a nested block, that state must be + reset when we back out of that level of nesting or the state could be + corrupted. + + While all the methods of a list object are available, only the three + defined below need be used. + + """ + + def set(self, state): + """ Set a new state. """ + self.append(state) + + def reset(self): + """ Step back one step in nested state. """ + self.pop() + + def isstate(self, state): + """ Test that top (current) level is of given state. """ + if len(self): + return self[-1] == state + else: + return False + +class BlockParser: + """ Parse Markdown blocks into an ElementTree object. + + A wrapper class that stitches the various BlockProcessors together, + looping through them and creating an ElementTree object. + """ + + def __init__(self, markdown): + self.blockprocessors = odict.OrderedDict() + self.state = State() + self.markdown = markdown + + def parseDocument(self, lines): + """ Parse a markdown document into an ElementTree. + + Given a list of lines, an ElementTree object (not just a parent Element) + is created and the root element is passed to the parser as the parent. + The ElementTree object is returned. + + This should only be called on an entire document, not pieces. + + """ + # Create a ElementTree from the lines + self.root = util.etree.Element(self.markdown.doc_tag) + self.parseChunk(self.root, '\n'.join(lines)) + return util.etree.ElementTree(self.root) + + def parseChunk(self, parent, text): + """ Parse a chunk of markdown text and attach to given etree node. + + While the ``text`` argument is generally assumed to contain multiple + blocks which will be split on blank lines, it could contain only one + block. Generally, this method would be called by extensions when + block parsing is required. + + The ``parent`` etree Element passed in is altered in place. + Nothing is returned. + + """ + self.parseBlocks(parent, text.split('\n\n')) + + def parseBlocks(self, parent, blocks): + """ Process blocks of markdown text and attach to given etree node. + + Given a list of ``blocks``, each blockprocessor is stepped through + until there are no blocks left. While an extension could potentially + call this method directly, it's generally expected to be used internally. + + This is a public method as an extension may need to add/alter additional + BlockProcessors which call this method to recursively parse a nested + block. + + """ + while blocks: + for processor in self.blockprocessors.values(): + if processor.test(parent, blocks[0]): + if processor.run(parent, blocks) is not False: + # run returns True or None + break + + diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/blockprocessors.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/blockprocessors.py new file mode 100644 index 0000000..61977b4 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/blockprocessors.py @@ -0,0 +1,558 @@ +""" +CORE MARKDOWN BLOCKPARSER +=========================================================================== + +This parser handles basic parsing of Markdown blocks. It doesn't concern itself +with inline elements such as **bold** or *italics*, but rather just catches +blocks, lists, quotes, etc. + +The BlockParser is made up of a bunch of BlockProssors, each handling a +different type of block. Extensions may add/replace/remove BlockProcessors +as they need to alter how markdown blocks are parsed. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import unicode_literals +import logging +import re +from . import util +from .blockparser import BlockParser + +logger = logging.getLogger('MARKDOWN') + + +def build_block_parser(md_instance, **kwargs): + """ Build the default block parser used by Markdown. """ + parser = BlockParser(md_instance) + parser.blockprocessors['empty'] = EmptyBlockProcessor(parser) + parser.blockprocessors['indent'] = ListIndentProcessor(parser) + parser.blockprocessors['code'] = CodeBlockProcessor(parser) + parser.blockprocessors['hashheader'] = HashHeaderProcessor(parser) + parser.blockprocessors['setextheader'] = SetextHeaderProcessor(parser) + parser.blockprocessors['hr'] = HRProcessor(parser) + parser.blockprocessors['olist'] = OListProcessor(parser) + parser.blockprocessors['ulist'] = UListProcessor(parser) + parser.blockprocessors['quote'] = BlockQuoteProcessor(parser) + parser.blockprocessors['paragraph'] = ParagraphProcessor(parser) + return parser + + +class BlockProcessor: + """ Base class for block processors. + + Each subclass will provide the methods below to work with the source and + tree. Each processor will need to define it's own ``test`` and ``run`` + methods. The ``test`` method should return True or False, to indicate + whether the current block should be processed by this processor. If the + test passes, the parser will call the processors ``run`` method. + + """ + + def __init__(self, parser): + self.parser = parser + self.tab_length = parser.markdown.tab_length + + def lastChild(self, parent): + """ Return the last child of an etree element. """ + if len(parent): + return parent[-1] + else: + return None + + def detab(self, text): + """ Remove a tab from the front of each line of the given text. """ + newtext = [] + lines = text.split('\n') + for line in lines: + if line.startswith(' '*self.tab_length): + newtext.append(line[self.tab_length:]) + elif not line.strip(): + newtext.append('') + else: + break + return '\n'.join(newtext), '\n'.join(lines[len(newtext):]) + + def looseDetab(self, text, level=1): + """ Remove a tab from front of lines but allowing dedented lines. """ + lines = text.split('\n') + for i in range(len(lines)): + if lines[i].startswith(' '*self.tab_length*level): + lines[i] = lines[i][self.tab_length*level:] + return '\n'.join(lines) + + def test(self, parent, block): + """ Test for block type. Must be overridden by subclasses. + + As the parser loops through processors, it will call the ``test`` method + on each to determine if the given block of text is of that type. This + method must return a boolean ``True`` or ``False``. The actual method of + testing is left to the needs of that particular block type. It could + be as simple as ``block.startswith(some_string)`` or a complex regular + expression. As the block type may be different depending on the parent + of the block (i.e. inside a list), the parent etree element is also + provided and may be used as part of the test. + + Keywords: + + * ``parent``: A etree element which will be the parent of the block. + * ``block``: A block of text from the source which has been split at + blank lines. + """ + pass + + def run(self, parent, blocks): + """ Run processor. Must be overridden by subclasses. + + When the parser determines the appropriate type of a block, the parser + will call the corresponding processor's ``run`` method. This method + should parse the individual lines of the block and append them to + the etree. + + Note that both the ``parent`` and ``etree`` keywords are pointers + to instances of the objects which should be edited in place. Each + processor must make changes to the existing objects as there is no + mechanism to return new/different objects to replace them. + + This means that this method should be adding SubElements or adding text + to the parent, and should remove (``pop``) or add (``insert``) items to + the list of blocks. + + Keywords: + + * ``parent``: A etree element which is the parent of the current block. + * ``blocks``: A list of all remaining blocks of the document. + """ + pass + + +class ListIndentProcessor(BlockProcessor): + """ Process children of list items. + + Example: + * a list item + process this part + + or this part + + """ + + ITEM_TYPES = ['li'] + LIST_TYPES = ['ul', 'ol'] + + def __init__(self, *args): + BlockProcessor.__init__(self, *args) + self.INDENT_RE = re.compile(r'^(([ ]{%s})+)'% self.tab_length) + + def test(self, parent, block): + return block.startswith(' '*self.tab_length) and \ + not self.parser.state.isstate('detabbed') and \ + (parent.tag in self.ITEM_TYPES or \ + (len(parent) and parent[-1] and \ + (parent[-1].tag in self.LIST_TYPES) + ) + ) + + def run(self, parent, blocks): + block = blocks.pop(0) + level, sibling = self.get_level(parent, block) + block = self.looseDetab(block, level) + + self.parser.state.set('detabbed') + if parent.tag in self.ITEM_TYPES: + # It's possible that this parent has a 'ul' or 'ol' child list + # with a member. If that is the case, then that should be the + # parent. This is intended to catch the edge case of an indented + # list whose first member was parsed previous to this point + # see OListProcessor + if len(parent) and parent[-1].tag in self.LIST_TYPES: + self.parser.parseBlocks(parent[-1], [block]) + else: + # The parent is already a li. Just parse the child block. + self.parser.parseBlocks(parent, [block]) + elif sibling.tag in self.ITEM_TYPES: + # The sibling is a li. Use it as parent. + self.parser.parseBlocks(sibling, [block]) + elif len(sibling) and sibling[-1].tag in self.ITEM_TYPES: + # The parent is a list (``ol`` or ``ul``) which has children. + # Assume the last child li is the parent of this block. + if sibling[-1].text: + # If the parent li has text, that text needs to be moved to a p + # The p must be 'inserted' at beginning of list in the event + # that other children already exist i.e.; a nested sublist. + p = util.etree.Element('p') + p.text = sibling[-1].text + sibling[-1].text = '' + sibling[-1].insert(0, p) + self.parser.parseChunk(sibling[-1], block) + else: + self.create_item(sibling, block) + self.parser.state.reset() + + def create_item(self, parent, block): + """ Create a new li and parse the block with it as the parent. """ + li = util.etree.SubElement(parent, 'li') + self.parser.parseBlocks(li, [block]) + + def get_level(self, parent, block): + """ Get level of indent based on list level. """ + # Get indent level + m = self.INDENT_RE.match(block) + if m: + indent_level = len(m.group(1))/self.tab_length + else: + indent_level = 0 + if self.parser.state.isstate('list'): + # We're in a tightlist - so we already are at correct parent. + level = 1 + else: + # We're in a looselist - so we need to find parent. + level = 0 + # Step through children of tree to find matching indent level. + while indent_level > level: + child = self.lastChild(parent) + if child and (child.tag in self.LIST_TYPES or child.tag in self.ITEM_TYPES): + if child.tag in self.LIST_TYPES: + level += 1 + parent = child + else: + # No more child levels. If we're short of indent_level, + # we have a code block. So we stop here. + break + return level, parent + + +class CodeBlockProcessor(BlockProcessor): + """ Process code blocks. """ + + def test(self, parent, block): + return block.startswith(' '*self.tab_length) + + def run(self, parent, blocks): + sibling = self.lastChild(parent) + block = blocks.pop(0) + theRest = '' + if sibling and sibling.tag == "pre" and len(sibling) \ + and sibling[0].tag == "code": + # The previous block was a code block. As blank lines do not start + # new code blocks, append this block to the previous, adding back + # linebreaks removed from the split into a list. + code = sibling[0] + block, theRest = self.detab(block) + code.text = util.AtomicString('%s\n%s\n' % (code.text, block.rstrip())) + else: + # This is a new codeblock. Create the elements and insert text. + pre = util.etree.SubElement(parent, 'pre') + code = util.etree.SubElement(pre, 'code') + block, theRest = self.detab(block) + code.text = util.AtomicString('%s\n' % block.rstrip()) + if theRest: + # This block contained unindented line(s) after the first indented + # line. Insert these lines as the first block of the master blocks + # list for future processing. + blocks.insert(0, theRest) + + +class BlockQuoteProcessor(BlockProcessor): + + RE = re.compile(r'(^|\n)[ ]{0,3}>[ ]?(.*)') + + def test(self, parent, block): + return bool(self.RE.search(block)) + + def run(self, parent, blocks): + block = blocks.pop(0) + m = self.RE.search(block) + if m: + before = block[:m.start()] # Lines before blockquote + # Pass lines before blockquote in recursively for parsing forst. + self.parser.parseBlocks(parent, [before]) + # Remove ``> `` from begining of each line. + block = '\n'.join([self.clean(line) for line in + block[m.start():].split('\n')]) + sibling = self.lastChild(parent) + if sibling and sibling.tag == "blockquote": + # Previous block was a blockquote so set that as this blocks parent + quote = sibling + else: + # This is a new blockquote. Create a new parent element. + quote = util.etree.SubElement(parent, 'blockquote') + # Recursively parse block with blockquote as parent. + # change parser state so blockquotes embedded in lists use p tags + self.parser.state.set('blockquote') + self.parser.parseChunk(quote, block) + self.parser.state.reset() + + def clean(self, line): + """ Remove ``>`` from beginning of a line. """ + m = self.RE.match(line) + if line.strip() == ">": + return "" + elif m: + return m.group(2) + else: + return line + +class OListProcessor(BlockProcessor): + """ Process ordered list blocks. """ + + TAG = 'ol' + # Detect an item (``1. item``). ``group(1)`` contains contents of item. + RE = re.compile(r'^[ ]{0,3}\d+\.[ ]+(.*)') + # Detect items on secondary lines. they can be of either list type. + CHILD_RE = re.compile(r'^[ ]{0,3}((\d+\.)|[*+-])[ ]+(.*)') + # Detect indented (nested) items of either type + INDENT_RE = re.compile(r'^[ ]{4,7}((\d+\.)|[*+-])[ ]+.*') + # The integer (python string) with which the lists starts (default=1) + # Eg: If list is intialized as) + # 3. Item + # The ol tag will get starts="3" attribute + STARTSWITH = '1' + # List of allowed sibling tags. + SIBLING_TAGS = ['ol', 'ul'] + + def test(self, parent, block): + return bool(self.RE.match(block)) + + def run(self, parent, blocks): + # Check fr multiple items in one block. + items = self.get_items(blocks.pop(0)) + sibling = self.lastChild(parent) + + if sibling and sibling.tag in self.SIBLING_TAGS: + # Previous block was a list item, so set that as parent + lst = sibling + # make sure previous item is in a p- if the item has text, then it + # it isn't in a p + if lst[-1].text: + # since it's possible there are other children for this sibling, + # we can't just SubElement the p, we need to insert it as the + # first item + p = util.etree.Element('p') + p.text = lst[-1].text + lst[-1].text = '' + lst[-1].insert(0, p) + # if the last item has a tail, then the tail needs to be put in a p + # likely only when a header is not followed by a blank line + lch = self.lastChild(lst[-1]) + if lch is not None and lch.tail: + p = util.etree.SubElement(lst[-1], 'p') + p.text = lch.tail.lstrip() + lch.tail = '' + + # parse first block differently as it gets wrapped in a p. + li = util.etree.SubElement(lst, 'li') + self.parser.state.set('looselist') + firstitem = items.pop(0) + self.parser.parseBlocks(li, [firstitem]) + self.parser.state.reset() + elif parent.tag in ['ol', 'ul']: + # this catches the edge case of a multi-item indented list whose + # first item is in a blank parent-list item: + # * * subitem1 + # * subitem2 + # see also ListIndentProcessor + lst = parent + else: + # This is a new list so create parent with appropriate tag. + lst = util.etree.SubElement(parent, self.TAG) + # Check if a custom start integer is set + if not self.parser.markdown.lazy_ol and self.STARTSWITH !='1': + lst.attrib['start'] = self.STARTSWITH + + self.parser.state.set('list') + # Loop through items in block, recursively parsing each with the + # appropriate parent. + for item in items: + if item.startswith(' '*self.tab_length): + # Item is indented. Parse with last item as parent + self.parser.parseBlocks(lst[-1], [item]) + else: + # New item. Create li and parse with it as parent + li = util.etree.SubElement(lst, 'li') + self.parser.parseBlocks(li, [item]) + self.parser.state.reset() + + def get_items(self, block): + """ Break a block into list items. """ + items = [] + for line in block.split('\n'): + m = self.CHILD_RE.match(line) + if m: + # This is a new list item + # Check first item for the start index + if not items and self.TAG=='ol': + # Detect the integer value of first list item + INTEGER_RE = re.compile('(\d+)') + self.STARTSWITH = INTEGER_RE.match(m.group(1)).group() + # Append to the list + items.append(m.group(3)) + elif self.INDENT_RE.match(line): + # This is an indented (possibly nested) item. + if items[-1].startswith(' '*self.tab_length): + # Previous item was indented. Append to that item. + items[-1] = '%s\n%s' % (items[-1], line) + else: + items.append(line) + else: + # This is another line of previous item. Append to that item. + items[-1] = '%s\n%s' % (items[-1], line) + return items + + +class UListProcessor(OListProcessor): + """ Process unordered list blocks. """ + + TAG = 'ul' + RE = re.compile(r'^[ ]{0,3}[*+-][ ]+(.*)') + + +class HashHeaderProcessor(BlockProcessor): + """ Process Hash Headers. """ + + # Detect a header at start of any line in block + RE = re.compile(r'(^|\n)(?P#{1,6})(?P

      .*?)#*(\n|$)') + + def test(self, parent, block): + return bool(self.RE.search(block)) + + def run(self, parent, blocks): + block = blocks.pop(0) + m = self.RE.search(block) + if m: + before = block[:m.start()] # All lines before header + after = block[m.end():] # All lines after header + if before: + # As the header was not the first line of the block and the + # lines before the header must be parsed first, + # recursively parse this lines as a block. + self.parser.parseBlocks(parent, [before]) + # Create header using named groups from RE + h = util.etree.SubElement(parent, 'h%d' % len(m.group('level'))) + h.text = m.group('header').strip() + if after: + # Insert remaining lines as first block for future parsing. + blocks.insert(0, after) + else: + # This should never happen, but just in case... + logger.warn("We've got a problem header: %r" % block) + + +class SetextHeaderProcessor(BlockProcessor): + """ Process Setext-style Headers. """ + + # Detect Setext-style header. Must be first 2 lines of block. + RE = re.compile(r'^.*?\n[=-]+[ ]*(\n|$)', re.MULTILINE) + + def test(self, parent, block): + return bool(self.RE.match(block)) + + def run(self, parent, blocks): + lines = blocks.pop(0).split('\n') + # Determine level. ``=`` is 1 and ``-`` is 2. + if lines[1].startswith('='): + level = 1 + else: + level = 2 + h = util.etree.SubElement(parent, 'h%d' % level) + h.text = lines[0].strip() + if len(lines) > 2: + # Block contains additional lines. Add to master blocks for later. + blocks.insert(0, '\n'.join(lines[2:])) + + +class HRProcessor(BlockProcessor): + """ Process Horizontal Rules. """ + + RE = r'^[ ]{0,3}((-+[ ]{0,2}){3,}|(_+[ ]{0,2}){3,}|(\*+[ ]{0,2}){3,})[ ]*' + # Detect hr on any line of a block. + SEARCH_RE = re.compile(RE, re.MULTILINE) + + def test(self, parent, block): + m = self.SEARCH_RE.search(block) + # No atomic grouping in python so we simulate it here for performance. + # The regex only matches what would be in the atomic group - the HR. + # Then check if we are at end of block or if next char is a newline. + if m and (m.end() == len(block) or block[m.end()] == '\n'): + # Save match object on class instance so we can use it later. + self.match = m + return True + return False + + def run(self, parent, blocks): + block = blocks.pop(0) + # Check for lines in block before hr. + prelines = block[:self.match.start()].rstrip('\n') + if prelines: + # Recursively parse lines before hr so they get parsed first. + self.parser.parseBlocks(parent, [prelines]) + # create hr + util.etree.SubElement(parent, 'hr') + # check for lines in block after hr. + postlines = block[self.match.end():].lstrip('\n') + if postlines: + # Add lines after hr to master blocks for later parsing. + blocks.insert(0, postlines) + + + +class EmptyBlockProcessor(BlockProcessor): + """ Process blocks that are empty or start with an empty line. """ + + def test(self, parent, block): + return not block or block.startswith('\n') + + def run(self, parent, blocks): + block = blocks.pop(0) + filler = '\n\n' + if block: + # Starts with empty line + # Only replace a single line. + filler = '\n' + # Save the rest for later. + theRest = block[1:] + if theRest: + # Add remaining lines to master blocks for later. + blocks.insert(0, theRest) + sibling = self.lastChild(parent) + if sibling and sibling.tag == 'pre' and len(sibling) and sibling[0].tag == 'code': + # Last block is a codeblock. Append to preserve whitespace. + sibling[0].text = util.AtomicString('%s%s' % (sibling[0].text, filler)) + + +class ParagraphProcessor(BlockProcessor): + """ Process Paragraph blocks. """ + + def test(self, parent, block): + return True + + def run(self, parent, blocks): + block = blocks.pop(0) + if block.strip(): + # Not a blank block. Add to parent, otherwise throw it away. + if self.parser.state.isstate('list'): + # The parent is a tight-list. + # + # Check for any children. This will likely only happen in a + # tight-list when a header isn't followed by a blank line. + # For example: + # + # * # Header + # Line 2 of list item - not part of header. + sibling = self.lastChild(parent) + if sibling is not None: + # Insetrt after sibling. + if sibling.tail: + sibling.tail = '%s\n%s' % (sibling.tail, block) + else: + sibling.tail = '\n%s' % block + else: + # Append to parent.text + if parent.text: + parent.text = '%s\n%s' % (parent.text, block) + else: + parent.text = block.lstrip() + else: + # Create a regular paragraph + p = util.etree.SubElement(parent, 'p') + p.text = block.lstrip() diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/__init__.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/__init__.py new file mode 100644 index 0000000..184c4d1 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/__init__.py @@ -0,0 +1,53 @@ +""" +Extensions +----------------------------------------------------------------------------- +""" + +from __future__ import unicode_literals + +class Extension(object): + """ Base class for extensions to subclass. """ + def __init__(self, configs = {}): + """Create an instance of an Extention. + + Keyword arguments: + + * configs: A dict of configuration setting used by an Extension. + """ + self.config = configs + + def getConfig(self, key, default=''): + """ Return a setting for the given key or an empty string. """ + if key in self.config: + return self.config[key][0] + else: + return default + + def getConfigs(self): + """ Return all configs settings as a dict. """ + return dict([(key, self.getConfig(key)) for key in self.config.keys()]) + + def getConfigInfo(self): + """ Return all config descriptions as a list of tuples. """ + return [(key, self.config[key][1]) for key in self.config.keys()] + + def setConfig(self, key, value): + """ Set a config setting for `key` with the given `value`. """ + self.config[key][0] = value + + def extendMarkdown(self, md, md_globals): + """ + Add the various proccesors and patterns to the Markdown Instance. + + This method must be overriden by every extension. + + Keyword arguments: + + * md: The Markdown instance. + + * md_globals: Global variables in the markdown module namespace. + + """ + raise NotImplementedError('Extension "%s.%s" must define an "extendMarkdown"' \ + 'method.' % (self.__class__.__module__, self.__class__.__name__)) + diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/abbr.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/abbr.py new file mode 100644 index 0000000..5e46f1d --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/abbr.py @@ -0,0 +1,96 @@ +''' +Abbreviation Extension for Python-Markdown +========================================== + +This extension adds abbreviation handling to Python-Markdown. + +Simple Usage: + + >>> import markdown + >>> text = """ + ... Some text with an ABBR and a REF. Ignore REFERENCE and ref. + ... + ... *[ABBR]: Abbreviation + ... *[REF]: Abbreviation Reference + ... """ + >>> print markdown.markdown(text, ['abbr']) +

      Some text with an ABBR and a REF. Ignore REFERENCE and ref.

      + +Copyright 2007-2008 +* [Waylan Limberg](http://achinghead.com/) +* [Seemant Kulleen](http://www.kulleen.org/) + + +''' + +from __future__ import absolute_import +from __future__ import unicode_literals +from . import Extension +from ..preprocessors import Preprocessor +from ..inlinepatterns import Pattern +from ..util import etree +import re + +# Global Vars +ABBR_REF_RE = re.compile(r'[*]\[(?P[^\]]*)\][ ]?:\s*(?P.*)') + +class AbbrExtension(Extension): + """ Abbreviation Extension for Python-Markdown. """ + + def extendMarkdown(self, md, md_globals): + """ Insert AbbrPreprocessor before ReferencePreprocessor. """ + md.preprocessors.add('abbr', AbbrPreprocessor(md), '<reference') + + +class AbbrPreprocessor(Preprocessor): + """ Abbreviation Preprocessor - parse text for abbr references. """ + + def run(self, lines): + ''' + Find and remove all Abbreviation references from the text. + Each reference is set as a new AbbrPattern in the markdown instance. + + ''' + new_text = [] + for line in lines: + m = ABBR_REF_RE.match(line) + if m: + abbr = m.group('abbr').strip() + title = m.group('title').strip() + self.markdown.inlinePatterns['abbr-%s'%abbr] = \ + AbbrPattern(self._generate_pattern(abbr), title) + else: + new_text.append(line) + return new_text + + def _generate_pattern(self, text): + ''' + Given a string, returns an regex pattern to match that string. + + 'HTML' -> r'(?P<abbr>[H][T][M][L])' + + Note: we force each char as a literal match (in brackets) as we don't + know what they will be beforehand. + + ''' + chars = list(text) + for i in range(len(chars)): + chars[i] = r'[%s]' % chars[i] + return r'(?P<abbr>\b%s\b)' % (r''.join(chars)) + + +class AbbrPattern(Pattern): + """ Abbreviation inline pattern. """ + + def __init__(self, pattern, title): + super(AbbrPattern, self).__init__(pattern) + self.title = title + + def handleMatch(self, m): + abbr = etree.Element('abbr') + abbr.text = m.group('abbr') + abbr.set('title', self.title) + return abbr + +def makeExtension(configs=None): + return AbbrExtension(configs=configs) diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/admonition.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/admonition.py new file mode 100644 index 0000000..9a45b92 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/admonition.py @@ -0,0 +1,118 @@ +""" +Admonition extension for Python-Markdown +======================================== + +Adds rST-style admonitions. Inspired by [rST][] feature with the same name. + +The syntax is (followed by an indented block with the contents): + !!! [type] [optional explicit title] + +Where `type` is used as a CSS class name of the div. If not present, `title` +defaults to the capitalized `type`, so "note" -> "Note". + +rST suggests the following `types`, but you're free to use whatever you want: + attention, caution, danger, error, hint, important, note, tip, warning + + +A simple example: + !!! note + This is the first line inside the box. + +Outputs: + <div class="admonition note"> + <p class="admonition-title">Note</p> + <p>This is the first line inside the box</p> + </div> + +You can also specify the title and CSS class of the admonition: + !!! custom "Did you know?" + Another line here. + +Outputs: + <div class="admonition custom"> + <p class="admonition-title">Did you know?</p> + <p>Another line here.</p> + </div> + +[rST]: http://docutils.sourceforge.net/docs/ref/rst/directives.html#specific-admonitions + +By [Tiago Serafim](http://www.tiagoserafim.com/). + +""" + +from __future__ import absolute_import +from __future__ import unicode_literals +from . import Extension +from ..blockprocessors import BlockProcessor +from ..util import etree +import re + + +class AdmonitionExtension(Extension): + """ Admonition extension for Python-Markdown. """ + + def extendMarkdown(self, md, md_globals): + """ Add Admonition to Markdown instance. """ + md.registerExtension(self) + + md.parser.blockprocessors.add('admonition', + AdmonitionProcessor(md.parser), + '_begin') + + +class AdmonitionProcessor(BlockProcessor): + + CLASSNAME = 'admonition' + CLASSNAME_TITLE = 'admonition-title' + RE = re.compile(r'(?:^|\n)!!!\ ?([\w\-]+)(?:\ "(.*?)")?') + + def test(self, parent, block): + sibling = self.lastChild(parent) + return self.RE.search(block) or \ + (block.startswith(' ' * self.tab_length) and sibling and \ + sibling.get('class', '').find(self.CLASSNAME) != -1) + + def run(self, parent, blocks): + sibling = self.lastChild(parent) + block = blocks.pop(0) + m = self.RE.search(block) + + if m: + block = block[m.end() + 1:] # removes the first line + + block, theRest = self.detab(block) + + if m: + klass, title = self.get_class_and_title(m) + div = etree.SubElement(parent, 'div') + div.set('class', '%s %s' % (self.CLASSNAME, klass)) + if title: + p = etree.SubElement(div, 'p') + p.text = title + p.set('class', self.CLASSNAME_TITLE) + else: + div = sibling + + self.parser.parseChunk(div, block) + + if theRest: + # This block contained unindented line(s) after the first indented + # line. Insert these lines as the first block of the master blocks + # list for future processing. + blocks.insert(0, theRest) + + def get_class_and_title(self, match): + klass, title = match.group(1).lower(), match.group(2) + if title is None: + # no title was provided, use the capitalized classname as title + # e.g.: `!!! note` will render `<p class="admonition-title">Note</p>` + title = klass.capitalize() + elif title == '': + # an explicit blank title should not be rendered + # e.g.: `!!! warning ""` will *not* render `p` with a title + title = None + return klass, title + + +def makeExtension(configs={}): + return AdmonitionExtension(configs=configs) diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/attr_list.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/attr_list.py new file mode 100644 index 0000000..c98aa85 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/attr_list.py @@ -0,0 +1,140 @@ +""" +Attribute List Extension for Python-Markdown +============================================ + +Adds attribute list syntax. Inspired by +[maruku](http://maruku.rubyforge.org/proposal.html#attribute_lists)'s +feature of the same name. + +Copyright 2011 [Waylan Limberg](http://achinghead.com/). + +Contact: markdown@freewisdom.org + +License: BSD (see ../LICENSE.md for details) + +Dependencies: +* [Python 2.4+](http://python.org) +* [Markdown 2.1+](http://packages.python.org/Markdown/) + +""" + +from __future__ import absolute_import +from __future__ import unicode_literals +from . import Extension +from ..treeprocessors import Treeprocessor +from ..util import isBlockLevel +import re + +try: + Scanner = re.Scanner +except AttributeError: + # must be on Python 2.4 + from sre import Scanner + +def _handle_double_quote(s, t): + k, v = t.split('=') + return k, v.strip('"') + +def _handle_single_quote(s, t): + k, v = t.split('=') + return k, v.strip("'") + +def _handle_key_value(s, t): + return t.split('=') + +def _handle_word(s, t): + if t.startswith('.'): + return '.', t[1:] + if t.startswith('#'): + return 'id', t[1:] + return t, t + +_scanner = Scanner([ + (r'[^ ]+=".*?"', _handle_double_quote), + (r"[^ ]+='.*?'", _handle_single_quote), + (r'[^ ]+=[^ ]*', _handle_key_value), + (r'[^ ]+', _handle_word), + (r' ', None) +]) + +def get_attrs(str): + """ Parse attribute list and return a list of attribute tuples. """ + return _scanner.scan(str)[0] + +def isheader(elem): + return elem.tag in ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] + +class AttrListTreeprocessor(Treeprocessor): + + BASE_RE = r'\{\:?([^\}]*)\}' + HEADER_RE = re.compile(r'[ ]*%s[ ]*$' % BASE_RE) + BLOCK_RE = re.compile(r'\n[ ]*%s[ ]*$' % BASE_RE) + INLINE_RE = re.compile(r'^%s' % BASE_RE) + NAME_RE = re.compile(r'[^A-Z_a-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02ff\u0370-\u037d' + r'\u037f-\u1fff\u200c-\u200d\u2070-\u218f\u2c00-\u2fef' + r'\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd' + r'\:\-\.0-9\u00b7\u0300-\u036f\u203f-\u2040]+') + + def run(self, doc): + for elem in doc.getiterator(): + if isBlockLevel(elem.tag): + # Block level: check for attrs on last line of text + RE = self.BLOCK_RE + if isheader(elem): + # header: check for attrs at end of line + RE = self.HEADER_RE + if len(elem) and elem[-1].tail: + # has children. Get from tail of last child + m = RE.search(elem[-1].tail) + if m: + self.assign_attrs(elem, m.group(1)) + elem[-1].tail = elem[-1].tail[:m.start()] + if isheader(elem): + # clean up trailing #s + elem[-1].tail = elem[-1].tail.rstrip('#').rstrip() + elif elem.text: + # no children. Get from text. + m = RE.search(elem.text) + if m: + self.assign_attrs(elem, m.group(1)) + elem.text = elem.text[:m.start()] + if isheader(elem): + # clean up trailing #s + elem.text = elem.text.rstrip('#').rstrip() + else: + # inline: check for attrs at start of tail + if elem.tail: + m = self.INLINE_RE.match(elem.tail) + if m: + self.assign_attrs(elem, m.group(1)) + elem.tail = elem.tail[m.end():] + + def assign_attrs(self, elem, attrs): + """ Assign attrs to element. """ + for k, v in get_attrs(attrs): + if k == '.': + # add to class + cls = elem.get('class') + if cls: + elem.set('class', '%s %s' % (cls, v)) + else: + elem.set('class', v) + else: + # assign attr k with v + elem.set(self.sanitize_name(k), v) + + def sanitize_name(self, name): + """ + Sanitize name as 'an XML Name, minus the ":"'. + See http://www.w3.org/TR/REC-xml-names/#NT-NCName + """ + return self.NAME_RE.sub('_', name) + + +class AttrListExtension(Extension): + def extendMarkdown(self, md, md_globals): + md.treeprocessors.add('attr_list', AttrListTreeprocessor(md), '>prettify') + + +def makeExtension(configs={}): + return AttrListExtension(configs=configs) diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/codehilite.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/codehilite.py new file mode 100644 index 0000000..72b40fd --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/codehilite.py @@ -0,0 +1,240 @@ +""" +CodeHilite Extension for Python-Markdown +======================================== + +Adds code/syntax highlighting to standard Python-Markdown code blocks. + +Copyright 2006-2008 [Waylan Limberg](http://achinghead.com/). + +Project website: <http://packages.python.org/Markdown/extensions/code_hilite.html> +Contact: markdown@freewisdom.org + +License: BSD (see ../LICENSE.md for details) + +Dependencies: +* [Python 2.3+](http://python.org/) +* [Markdown 2.0+](http://packages.python.org/Markdown/) +* [Pygments](http://pygments.org/) + +""" + +from __future__ import absolute_import +from __future__ import unicode_literals +from . import Extension +from ..treeprocessors import Treeprocessor +import warnings +try: + from pygments import highlight + from pygments.lexers import get_lexer_by_name, guess_lexer, TextLexer + from pygments.formatters import HtmlFormatter + pygments = True +except ImportError: + pygments = False + +# ------------------ The Main CodeHilite Class ---------------------- +class CodeHilite(object): + """ + Determine language of source code, and pass it into the pygments hilighter. + + Basic Usage: + >>> code = CodeHilite(src = 'some text') + >>> html = code.hilite() + + * src: Source string or any object with a .readline attribute. + + * linenums: (Boolean) Set line numbering to 'on' (True), 'off' (False) or 'auto'(None). + Set to 'auto' by default. + + * guess_lang: (Boolean) Turn language auto-detection 'on' or 'off' (on by default). + + * css_class: Set class name of wrapper div ('codehilite' by default). + + Low Level Usage: + >>> code = CodeHilite() + >>> code.src = 'some text' # String or anything with a .readline attr. + >>> code.linenos = True # True or False; Turns line numbering on or of. + >>> html = code.hilite() + + """ + + def __init__(self, src=None, linenums=None, guess_lang=True, + css_class="codehilite", lang=None, style='default', + noclasses=False, tab_length=4): + self.src = src + self.lang = lang + self.linenums = linenums + self.guess_lang = guess_lang + self.css_class = css_class + self.style = style + self.noclasses = noclasses + self.tab_length = tab_length + + def hilite(self): + """ + Pass code to the [Pygments](http://pygments.pocoo.org/) highliter with + optional line numbers. The output should then be styled with css to + your liking. No styles are applied by default - only styling hooks + (i.e.: <span class="k">). + + returns : A string of html. + + """ + + self.src = self.src.strip('\n') + + if self.lang is None: + self._getLang() + + if pygments: + try: + lexer = get_lexer_by_name(self.lang) + except ValueError: + try: + if self.guess_lang: + lexer = guess_lexer(self.src) + else: + lexer = TextLexer() + except ValueError: + lexer = TextLexer() + formatter = HtmlFormatter(linenos=self.linenums, + cssclass=self.css_class, + style=self.style, + noclasses=self.noclasses) + return highlight(self.src, lexer, formatter) + else: + # just escape and build markup usable by JS highlighting libs + txt = self.src.replace('&', '&') + txt = txt.replace('<', '<') + txt = txt.replace('>', '>') + txt = txt.replace('"', '"') + classes = [] + if self.lang: + classes.append('language-%s' % self.lang) + if self.linenums: + classes.append('linenums') + class_str = '' + if classes: + class_str = ' class="%s"' % ' '.join(classes) + return '<pre class="%s"><code%s>%s</code></pre>\n'% \ + (self.css_class, class_str, txt) + + def _getLang(self): + """ + Determines language of a code block from shebang line and whether said + line should be removed or left in place. If the sheband line contains a + path (even a single /) then it is assumed to be a real shebang line and + left alone. However, if no path is given (e.i.: #!python or :::python) + then it is assumed to be a mock shebang for language identifitation of a + code fragment and removed from the code block prior to processing for + code highlighting. When a mock shebang (e.i: #!python) is found, line + numbering is turned on. When colons are found in place of a shebang + (e.i.: :::python), line numbering is left in the current state - off + by default. + + """ + + import re + + #split text into lines + lines = self.src.split("\n") + #pull first line to examine + fl = lines.pop(0) + + c = re.compile(r''' + (?:(?:^::+)|(?P<shebang>^[#]!)) # Shebang or 2 or more colons. + (?P<path>(?:/\w+)*[/ ])? # Zero or 1 path + (?P<lang>[\w+-]*) # The language + ''', re.VERBOSE) + # search first line for shebang + m = c.search(fl) + if m: + # we have a match + try: + self.lang = m.group('lang').lower() + except IndexError: + self.lang = None + if m.group('path'): + # path exists - restore first line + lines.insert(0, fl) + if self.linenums is None and m.group('shebang'): + # Overridable and Shebang exists - use line numbers + self.linenums = True + else: + # No match + lines.insert(0, fl) + + self.src = "\n".join(lines).strip("\n") + + + +# ------------------ The Markdown Extension ------------------------------- +class HiliteTreeprocessor(Treeprocessor): + """ Hilight source code in code blocks. """ + + def run(self, root): + """ Find code blocks and store in htmlStash. """ + blocks = root.getiterator('pre') + for block in blocks: + children = block.getchildren() + if len(children) == 1 and children[0].tag == 'code': + code = CodeHilite(children[0].text, + linenums=self.config['linenums'], + guess_lang=self.config['guess_lang'], + css_class=self.config['css_class'], + style=self.config['pygments_style'], + noclasses=self.config['noclasses'], + tab_length=self.markdown.tab_length) + placeholder = self.markdown.htmlStash.store(code.hilite(), + safe=True) + # Clear codeblock in etree instance + block.clear() + # Change to p element which will later + # be removed when inserting raw html + block.tag = 'p' + block.text = placeholder + + +class CodeHiliteExtension(Extension): + """ Add source code hilighting to markdown codeblocks. """ + + def __init__(self, configs): + # define default configs + self.config = { + 'linenums': [None, "Use lines numbers. True=yes, False=no, None=auto"], + 'force_linenos' : [False, "Depreciated! Use 'linenums' instead. Force line numbers - Default: False"], + 'guess_lang' : [True, "Automatic language detection - Default: True"], + 'css_class' : ["codehilite", + "Set class name for wrapper <div> - Default: codehilite"], + 'pygments_style' : ['default', 'Pygments HTML Formatter Style (Colorscheme) - Default: default'], + 'noclasses': [False, 'Use inline styles instead of CSS classes - Default false'] + } + + # Override defaults with user settings + for key, value in configs: + # convert strings to booleans + if value == 'True': value = True + if value == 'False': value = False + if value == 'None': value = None + + if key == 'force_linenos': + warnings.warn('The "force_linenos" config setting' + ' to the CodeHilite extension is deprecrecated.' + ' Use "linenums" instead.', PendingDeprecationWarning) + if value: + # Carry 'force_linenos' over to new 'linenos'. + self.setConfig('linenums', True) + + self.setConfig(key, value) + + def extendMarkdown(self, md, md_globals): + """ Add HilitePostprocessor to Markdown instance. """ + hiliter = HiliteTreeprocessor(md) + hiliter.config = self.getConfigs() + md.treeprocessors.add("hilite", hiliter, "<inline") + + md.registerExtension(self) + + +def makeExtension(configs={}): + return CodeHiliteExtension(configs=configs) + diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/def_list.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/def_list.py new file mode 100644 index 0000000..8684652 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/def_list.py @@ -0,0 +1,118 @@ +""" +Definition List Extension for Python-Markdown +============================================= + +Added parsing of Definition Lists to Python-Markdown. + +A simple example: + + Apple + : Pomaceous fruit of plants of the genus Malus in + the family Rosaceae. + : An american computer company. + + Orange + : The fruit of an evergreen tree of the genus Citrus. + +Copyright 2008 - [Waylan Limberg](http://achinghead.com) + +""" + +from __future__ import absolute_import +from __future__ import unicode_literals +from . import Extension +from ..blockprocessors import BlockProcessor, ListIndentProcessor +from ..util import etree +import re + + +class DefListProcessor(BlockProcessor): + """ Process Definition Lists. """ + + RE = re.compile(r'(^|\n)[ ]{0,3}:[ ]{1,3}(.*?)(\n|$)') + NO_INDENT_RE = re.compile(r'^[ ]{0,3}[^ :]') + + def test(self, parent, block): + return bool(self.RE.search(block)) + + def run(self, parent, blocks): + + raw_block = blocks.pop(0) + m = self.RE.search(raw_block) + terms = [l.strip() for l in raw_block[:m.start()].split('\n') if l.strip()] + block = raw_block[m.end():] + no_indent = self.NO_INDENT_RE.match(block) + if no_indent: + d, theRest = (block, None) + else: + d, theRest = self.detab(block) + if d: + d = '%s\n%s' % (m.group(2), d) + else: + d = m.group(2) + sibling = self.lastChild(parent) + if not terms and sibling is None: + # This is not a definition item. Most likely a paragraph that + # starts with a colon at the begining of a document or list. + blocks.insert(0, raw_block) + return False + if not terms and sibling.tag == 'p': + # The previous paragraph contains the terms + state = 'looselist' + terms = sibling.text.split('\n') + parent.remove(sibling) + # Aquire new sibling + sibling = self.lastChild(parent) + else: + state = 'list' + + if sibling and sibling.tag == 'dl': + # This is another item on an existing list + dl = sibling + if len(dl) and dl[-1].tag == 'dd' and len(dl[-1]): + state = 'looselist' + else: + # This is a new list + dl = etree.SubElement(parent, 'dl') + # Add terms + for term in terms: + dt = etree.SubElement(dl, 'dt') + dt.text = term + # Add definition + self.parser.state.set(state) + dd = etree.SubElement(dl, 'dd') + self.parser.parseBlocks(dd, [d]) + self.parser.state.reset() + + if theRest: + blocks.insert(0, theRest) + +class DefListIndentProcessor(ListIndentProcessor): + """ Process indented children of definition list items. """ + + ITEM_TYPES = ['dd'] + LIST_TYPES = ['dl'] + + def create_item(self, parent, block): + """ Create a new dd and parse the block with it as the parent. """ + dd = etree.SubElement(parent, 'dd') + self.parser.parseBlocks(dd, [block]) + + + +class DefListExtension(Extension): + """ Add definition lists to Markdown. """ + + def extendMarkdown(self, md, md_globals): + """ Add an instance of DefListProcessor to BlockParser. """ + md.parser.blockprocessors.add('defindent', + DefListIndentProcessor(md.parser), + '>indent') + md.parser.blockprocessors.add('deflist', + DefListProcessor(md.parser), + '>ulist') + + +def makeExtension(configs={}): + return DefListExtension(configs=configs) + diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/extra.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/extra.py new file mode 100644 index 0000000..e6a1e82 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/extra.py @@ -0,0 +1,54 @@ +""" +Python-Markdown Extra Extension +=============================== + +A compilation of various Python-Markdown extensions that imitates +[PHP Markdown Extra](http://michelf.com/projects/php-markdown/extra/). + +Note that each of the individual extensions still need to be available +on your PYTHONPATH. This extension simply wraps them all up as a +convenience so that only one extension needs to be listed when +initiating Markdown. See the documentation for each individual +extension for specifics about that extension. + +In the event that one or more of the supported extensions are not +available for import, Markdown will issue a warning and simply continue +without that extension. + +There may be additional extensions that are distributed with +Python-Markdown that are not included here in Extra. Those extensions +are not part of PHP Markdown Extra, and therefore, not part of +Python-Markdown Extra. If you really would like Extra to include +additional extensions, we suggest creating your own clone of Extra +under a differant name. You could also edit the `extensions` global +variable defined below, but be aware that such changes may be lost +when you upgrade to any future version of Python-Markdown. + +""" + +from __future__ import absolute_import +from __future__ import unicode_literals +from . import Extension + +extensions = ['smart_strong', + 'fenced_code', + 'footnotes', + 'attr_list', + 'def_list', + 'tables', + 'abbr', + ] + + +class ExtraExtension(Extension): + """ Add various extensions to Markdown class.""" + + def extendMarkdown(self, md, md_globals): + """ Register extension instances. """ + md.registerExtensions(extensions, self.config) + if not md.safeMode: + # Turn on processing of markdown text within raw html + md.preprocessors['html_block'].markdown_in_raw = True + +def makeExtension(configs={}): + return ExtraExtension(configs=dict(configs)) diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/fenced_code.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/fenced_code.py new file mode 100644 index 0000000..ecdb20d --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/fenced_code.py @@ -0,0 +1,161 @@ +""" +Fenced Code Extension for Python Markdown +========================================= + +This extension adds Fenced Code Blocks to Python-Markdown. + + >>> import markdown + >>> text = ''' + ... A paragraph before a fenced code block: + ... + ... ~~~ + ... Fenced code block + ... ~~~ + ... ''' + >>> html = markdown.markdown(text, extensions=['fenced_code']) + >>> print html + <p>A paragraph before a fenced code block:</p> + <pre><code>Fenced code block + </code></pre> + +Works with safe_mode also (we check this because we are using the HtmlStash): + + >>> print markdown.markdown(text, extensions=['fenced_code'], safe_mode='replace') + <p>A paragraph before a fenced code block:</p> + <pre><code>Fenced code block + </code></pre> + +Include tilde's in a code block and wrap with blank lines: + + >>> text = ''' + ... ~~~~~~~~ + ... + ... ~~~~ + ... ~~~~~~~~''' + >>> print markdown.markdown(text, extensions=['fenced_code']) + <pre><code> + ~~~~ + </code></pre> + +Language tags: + + >>> text = ''' + ... ~~~~{.python} + ... # Some python code + ... ~~~~''' + >>> print markdown.markdown(text, extensions=['fenced_code']) + <pre><code class="python"># Some python code + </code></pre> + +Optionally backticks instead of tildes as per how github's code block markdown is identified: + + >>> text = ''' + ... ````` + ... # Arbitrary code + ... ~~~~~ # these tildes will not close the block + ... `````''' + >>> print markdown.markdown(text, extensions=['fenced_code']) + <pre><code># Arbitrary code + ~~~~~ # these tildes will not close the block + </code></pre> + +Copyright 2007-2008 [Waylan Limberg](http://achinghead.com/). + +Project website: <http://packages.python.org/Markdown/extensions/fenced_code_blocks.html> +Contact: markdown@freewisdom.org + +License: BSD (see ../docs/LICENSE for details) + +Dependencies: +* [Python 2.4+](http://python.org) +* [Markdown 2.0+](http://packages.python.org/Markdown/) +* [Pygments (optional)](http://pygments.org) + +""" + +from __future__ import absolute_import +from __future__ import unicode_literals +from . import Extension +from ..preprocessors import Preprocessor +from .codehilite import CodeHilite, CodeHiliteExtension +import re + +# Global vars +FENCED_BLOCK_RE = re.compile( \ + r'(?P<fence>^(?:~{3,}|`{3,}))[ ]*(\{?\.?(?P<lang>[a-zA-Z0-9_+-]*)\}?)?[ ]*\n(?P<code>.*?)(?<=\n)(?P=fence)[ ]*$', + re.MULTILINE|re.DOTALL + ) +CODE_WRAP = '<pre><code%s>%s</code></pre>' +LANG_TAG = ' class="%s"' + +class FencedCodeExtension(Extension): + + def extendMarkdown(self, md, md_globals): + """ Add FencedBlockPreprocessor to the Markdown instance. """ + md.registerExtension(self) + + md.preprocessors.add('fenced_code_block', + FencedBlockPreprocessor(md), + ">normalize_whitespace") + + +class FencedBlockPreprocessor(Preprocessor): + + def __init__(self, md): + super(FencedBlockPreprocessor, self).__init__(md) + + self.checked_for_codehilite = False + self.codehilite_conf = {} + + def run(self, lines): + """ Match and store Fenced Code Blocks in the HtmlStash. """ + + # Check for code hilite extension + if not self.checked_for_codehilite: + for ext in self.markdown.registeredExtensions: + if isinstance(ext, CodeHiliteExtension): + self.codehilite_conf = ext.config + break + + self.checked_for_codehilite = True + + text = "\n".join(lines) + while 1: + m = FENCED_BLOCK_RE.search(text) + if m: + lang = '' + if m.group('lang'): + lang = LANG_TAG % m.group('lang') + + # If config is not empty, then the codehighlite extension + # is enabled, so we call it to highlite the code + if self.codehilite_conf: + highliter = CodeHilite(m.group('code'), + linenums=self.codehilite_conf['linenums'][0], + guess_lang=self.codehilite_conf['guess_lang'][0], + css_class=self.codehilite_conf['css_class'][0], + style=self.codehilite_conf['pygments_style'][0], + lang=(m.group('lang') or None), + noclasses=self.codehilite_conf['noclasses'][0]) + + code = highliter.hilite() + else: + code = CODE_WRAP % (lang, self._escape(m.group('code'))) + + placeholder = self.markdown.htmlStash.store(code, safe=True) + text = '%s\n%s\n%s'% (text[:m.start()], placeholder, text[m.end():]) + else: + break + return text.split("\n") + + def _escape(self, txt): + """ basic html escaping """ + txt = txt.replace('&', '&') + txt = txt.replace('<', '<') + txt = txt.replace('>', '>') + txt = txt.replace('"', '"') + return txt + + +def makeExtension(configs=None): + return FencedCodeExtension(configs=configs) diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/footnotes.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/footnotes.py new file mode 100644 index 0000000..65ed597 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/footnotes.py @@ -0,0 +1,313 @@ +""" +========================= FOOTNOTES ================================= + +This section adds footnote handling to markdown. It can be used as +an example for extending python-markdown with relatively complex +functionality. While in this case the extension is included inside +the module itself, it could just as easily be added from outside the +module. Not that all markdown classes above are ignorant about +footnotes. All footnote functionality is provided separately and +then added to the markdown instance at the run time. + +Footnote functionality is attached by calling extendMarkdown() +method of FootnoteExtension. The method also registers the +extension to allow it's state to be reset by a call to reset() +method. + +Example: + Footnotes[^1] have a label[^label] and a definition[^!DEF]. + + [^1]: This is a footnote + [^label]: A footnote on "label" + [^!DEF]: The footnote for definition + +""" + +from __future__ import absolute_import +from __future__ import unicode_literals +from . import Extension +from ..preprocessors import Preprocessor +from ..inlinepatterns import Pattern +from ..treeprocessors import Treeprocessor +from ..postprocessors import Postprocessor +from ..util import etree, text_type +from ..odict import OrderedDict +import re + +FN_BACKLINK_TEXT = "zz1337820767766393qq" +NBSP_PLACEHOLDER = "qq3936677670287331zz" +DEF_RE = re.compile(r'[ ]{0,3}\[\^([^\]]*)\]:\s*(.*)') +TABBED_RE = re.compile(r'((\t)|( ))(.*)') + +class FootnoteExtension(Extension): + """ Footnote Extension. """ + + def __init__ (self, configs): + """ Setup configs. """ + self.config = {'PLACE_MARKER': + ["///Footnotes Go Here///", + "The text string that marks where the footnotes go"], + 'UNIQUE_IDS': + [False, + "Avoid name collisions across " + "multiple calls to reset()."], + "BACKLINK_TEXT": + ["↩", + "The text string that links from the footnote to the reader's place."] + } + + for key, value in configs: + self.config[key][0] = value + + # In multiple invocations, emit links that don't get tangled. + self.unique_prefix = 0 + + self.reset() + + def extendMarkdown(self, md, md_globals): + """ Add pieces to Markdown. """ + md.registerExtension(self) + self.parser = md.parser + self.md = md + self.sep = ':' + if self.md.output_format in ['html5', 'xhtml5']: + self.sep = '-' + # Insert a preprocessor before ReferencePreprocessor + md.preprocessors.add("footnote", FootnotePreprocessor(self), + "<reference") + # Insert an inline pattern before ImageReferencePattern + FOOTNOTE_RE = r'\[\^([^\]]*)\]' # blah blah [^1] blah + md.inlinePatterns.add("footnote", FootnotePattern(FOOTNOTE_RE, self), + "<reference") + # Insert a tree-processor that would actually add the footnote div + # This must be before all other treeprocessors (i.e., inline and + # codehilite) so they can run on the the contents of the div. + md.treeprocessors.add("footnote", FootnoteTreeprocessor(self), + "_begin") + # Insert a postprocessor after amp_substitute oricessor + md.postprocessors.add("footnote", FootnotePostprocessor(self), + ">amp_substitute") + + def reset(self): + """ Clear the footnotes on reset, and prepare for a distinct document. """ + self.footnotes = OrderedDict() + self.unique_prefix += 1 + + def findFootnotesPlaceholder(self, root): + """ Return ElementTree Element that contains Footnote placeholder. """ + def finder(element): + for child in element: + if child.text: + if child.text.find(self.getConfig("PLACE_MARKER")) > -1: + return child, element, True + if child.tail: + if child.tail.find(self.getConfig("PLACE_MARKER")) > -1: + return child, element, False + finder(child) + return None + + res = finder(root) + return res + + def setFootnote(self, id, text): + """ Store a footnote for later retrieval. """ + self.footnotes[id] = text + + def makeFootnoteId(self, id): + """ Return footnote link id. """ + if self.getConfig("UNIQUE_IDS"): + return 'fn%s%d-%s' % (self.sep, self.unique_prefix, id) + else: + return 'fn%s%s' % (self.sep, id) + + def makeFootnoteRefId(self, id): + """ Return footnote back-link id. """ + if self.getConfig("UNIQUE_IDS"): + return 'fnref%s%d-%s' % (self.sep, self.unique_prefix, id) + else: + return 'fnref%s%s' % (self.sep, id) + + def makeFootnotesDiv(self, root): + """ Return div of footnotes as et Element. """ + + if not list(self.footnotes.keys()): + return None + + div = etree.Element("div") + div.set('class', 'footnote') + etree.SubElement(div, "hr") + ol = etree.SubElement(div, "ol") + + for id in self.footnotes.keys(): + li = etree.SubElement(ol, "li") + li.set("id", self.makeFootnoteId(id)) + self.parser.parseChunk(li, self.footnotes[id]) + backlink = etree.Element("a") + backlink.set("href", "#" + self.makeFootnoteRefId(id)) + if self.md.output_format not in ['html5', 'xhtml5']: + backlink.set("rev", "footnote") # Invalid in HTML5 + backlink.set("class", "footnote-backref") + backlink.set("title", "Jump back to footnote %d in the text" % \ + (self.footnotes.index(id)+1)) + backlink.text = FN_BACKLINK_TEXT + + if li.getchildren(): + node = li[-1] + if node.tag == "p": + node.text = node.text + NBSP_PLACEHOLDER + node.append(backlink) + else: + p = etree.SubElement(li, "p") + p.append(backlink) + return div + + +class FootnotePreprocessor(Preprocessor): + """ Find all footnote references and store for later use. """ + + def __init__ (self, footnotes): + self.footnotes = footnotes + + def run(self, lines): + """ + Loop through lines and find, set, and remove footnote definitions. + + Keywords: + + * lines: A list of lines of text + + Return: A list of lines of text with footnote definitions removed. + + """ + newlines = [] + i = 0 + while True: + m = DEF_RE.match(lines[i]) + if m: + fn, _i = self.detectTabbed(lines[i+1:]) + fn.insert(0, m.group(2)) + i += _i-1 # skip past footnote + self.footnotes.setFootnote(m.group(1), "\n".join(fn)) + else: + newlines.append(lines[i]) + if len(lines) > i+1: + i += 1 + else: + break + return newlines + + def detectTabbed(self, lines): + """ Find indented text and remove indent before further proccesing. + + Keyword arguments: + + * lines: an array of strings + + Returns: a list of post processed items and the index of last line. + + """ + items = [] + blank_line = False # have we encountered a blank line yet? + i = 0 # to keep track of where we are + + def detab(line): + match = TABBED_RE.match(line) + if match: + return match.group(4) + + for line in lines: + if line.strip(): # Non-blank line + detabbed_line = detab(line) + if detabbed_line: + items.append(detabbed_line) + i += 1 + continue + elif not blank_line and not DEF_RE.match(line): + # not tabbed but still part of first par. + items.append(line) + i += 1 + continue + else: + return items, i+1 + + else: # Blank line: _maybe_ we are done. + blank_line = True + i += 1 # advance + + # Find the next non-blank line + for j in range(i, len(lines)): + if lines[j].strip(): + next_line = lines[j]; break + else: + break # There is no more text; we are done. + + # Check if the next non-blank line is tabbed + if detab(next_line): # Yes, more work to do. + items.append("") + continue + else: + break # No, we are done. + else: + i += 1 + + return items, i + + +class FootnotePattern(Pattern): + """ InlinePattern for footnote markers in a document's body text. """ + + def __init__(self, pattern, footnotes): + super(FootnotePattern, self).__init__(pattern) + self.footnotes = footnotes + + def handleMatch(self, m): + id = m.group(2) + if id in self.footnotes.footnotes.keys(): + sup = etree.Element("sup") + a = etree.SubElement(sup, "a") + sup.set('id', self.footnotes.makeFootnoteRefId(id)) + a.set('href', '#' + self.footnotes.makeFootnoteId(id)) + if self.footnotes.md.output_format not in ['html5', 'xhtml5']: + a.set('rel', 'footnote') # invalid in HTML5 + a.set('class', 'footnote-ref') + a.text = text_type(self.footnotes.footnotes.index(id) + 1) + return sup + else: + return None + + +class FootnoteTreeprocessor(Treeprocessor): + """ Build and append footnote div to end of document. """ + + def __init__ (self, footnotes): + self.footnotes = footnotes + + def run(self, root): + footnotesDiv = self.footnotes.makeFootnotesDiv(root) + if footnotesDiv: + result = self.footnotes.findFootnotesPlaceholder(root) + if result: + child, parent, isText = result + ind = parent.getchildren().index(child) + if isText: + parent.remove(child) + parent.insert(ind, footnotesDiv) + else: + parent.insert(ind + 1, footnotesDiv) + child.tail = None + else: + root.append(footnotesDiv) + +class FootnotePostprocessor(Postprocessor): + """ Replace placeholders with html entities. """ + def __init__(self, footnotes): + self.footnotes = footnotes + + def run(self, text): + text = text.replace(FN_BACKLINK_TEXT, self.footnotes.getConfig("BACKLINK_TEXT")) + return text.replace(NBSP_PLACEHOLDER, " ") + +def makeExtension(configs=[]): + """ Return an instance of the FootnoteExtension """ + return FootnoteExtension(configs=configs) + diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/headerid.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/headerid.py new file mode 100644 index 0000000..428ee3a --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/headerid.py @@ -0,0 +1,207 @@ +""" +HeaderID Extension for Python-Markdown +====================================== + +Auto-generate id attributes for HTML headers. + +Basic usage: + + >>> import markdown + >>> text = "# Some Header #" + >>> md = markdown.markdown(text, ['headerid']) + >>> print md + <h1 id="some-header">Some Header</h1> + +All header IDs are unique: + + >>> text = ''' + ... #Header + ... #Header + ... #Header''' + >>> md = markdown.markdown(text, ['headerid']) + >>> print md + <h1 id="header">Header</h1> + <h1 id="header_1">Header</h1> + <h1 id="header_2">Header</h1> + +To fit within a html template's hierarchy, set the header base level: + + >>> text = ''' + ... #Some Header + ... ## Next Level''' + >>> md = markdown.markdown(text, ['headerid(level=3)']) + >>> print md + <h3 id="some-header">Some Header</h3> + <h4 id="next-level">Next Level</h4> + +Works with inline markup. + + >>> text = '#Some *Header* with [markup](http://example.com).' + >>> md = markdown.markdown(text, ['headerid']) + >>> print md + <h1 id="some-header-with-markup">Some <em>Header</em> with <a href="http://example.com">markup</a>.</h1> + +Turn off auto generated IDs: + + >>> text = ''' + ... # Some Header + ... # Another Header''' + >>> md = markdown.markdown(text, ['headerid(forceid=False)']) + >>> print md + <h1>Some Header</h1> + <h1>Another Header</h1> + +Use with MetaData extension: + + >>> text = '''header_level: 2 + ... header_forceid: Off + ... + ... # A Header''' + >>> md = markdown.markdown(text, ['headerid', 'meta']) + >>> print md + <h2>A Header</h2> + +Copyright 2007-2011 [Waylan Limberg](http://achinghead.com/). + +Project website: <http://packages.python.org/Markdown/extensions/header_id.html> +Contact: markdown@freewisdom.org + +License: BSD (see ../docs/LICENSE for details) + +Dependencies: +* [Python 2.3+](http://python.org) +* [Markdown 2.0+](http://packages.python.org/Markdown/) + +""" + +from __future__ import absolute_import +from __future__ import unicode_literals +from . import Extension +from ..treeprocessors import Treeprocessor +import re +import logging +try: + import unicodedata + has_unicodedata = True +except: + has_unicodedata = False + DISALLOWED_RE = re.compile(r'[^a-z0-9]') + +logger = logging.getLogger('MARKDOWN') + +IDCOUNT_RE = re.compile(r'^(.*)_([0-9]+)$') + + +def slugify(value, separator): + """ Slugify a string, to make it URL friendly. """ + if has_unicodedata: + value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore') + value = re.sub('[^\w\s-]', '', value.decode('ascii')).strip().lower() + return re.sub('[%s\s]+' % separator, separator, value) + else: + return separator.join(filter(None, re.split(DISALLOWED_RE, value.lower()))) + + +def unique(id, ids): + """ Ensure id is unique in set of ids. Append '_1', '_2'... if not """ + while id in ids or not id: + m = IDCOUNT_RE.match(id) + if m: + id = '%s_%d'% (m.group(1), int(m.group(2))+1) + else: + id = '%s_%d'% (id, 1) + ids.add(id) + return id + + +def itertext(elem): + """ Loop through all children and return text only. + + Reimplements method of same name added to ElementTree in Python 2.7 + + """ + if elem.text: + yield elem.text + for e in elem: + for s in itertext(e): + yield s + if e.tail: + yield e.tail + + +class HeaderIdTreeprocessor(Treeprocessor): + """ Assign IDs to headers. """ + + IDs = set() + + def run(self, doc): + start_level, force_id = self._get_meta() + slugify = self.config['slugify'] + sep = self.config['separator'] + for elem in doc.getiterator(): + if elem.tag in ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']: + if force_id: + if "id" in elem.attrib: + id = elem.get('id') + else: + id = slugify(''.join(itertext(elem)), sep) + elem.set('id', unique(id, self.IDs)) + if start_level: + level = int(elem.tag[-1]) + start_level + if level > 6: + level = 6 + elem.tag = 'h%d' % level + + + def _get_meta(self): + """ Return meta data suported by this ext as a tuple """ + level = int(self.config['level']) - 1 + force = self._str2bool(self.config['forceid']) + if hasattr(self.md, 'Meta'): + if 'header_level' in self.md.Meta: + level = int(self.md.Meta['header_level'][0]) - 1 + if 'header_forceid' in self.md.Meta: + force = self._str2bool(self.md.Meta['header_forceid'][0]) + return level, force + + def _str2bool(self, s, default=False): + """ Convert a string to a booleen value. """ + s = str(s) + if s.lower() in ['0', 'f', 'false', 'off', 'no', 'n']: + return False + elif s.lower() in ['1', 't', 'true', 'on', 'yes', 'y']: + return True + return default + + +class HeaderIdExtension(Extension): + def __init__(self, configs): + # set defaults + self.config = { + 'level' : ['1', 'Base level for headers.'], + 'forceid' : ['True', 'Force all headers to have an id.'], + 'separator' : ['-', 'Word separator.'], + 'slugify' : [slugify, 'Callable to generate anchors'], + } + + for key, value in configs: + self.setConfig(key, value) + + def extendMarkdown(self, md, md_globals): + md.registerExtension(self) + self.processor = HeaderIdTreeprocessor() + self.processor.md = md + self.processor.config = self.getConfigs() + if 'attr_list' in md.treeprocessors.keys(): + # insert after attr_list treeprocessor + md.treeprocessors.add('headerid', self.processor, '>attr_list') + else: + # insert after 'prettify' treeprocessor. + md.treeprocessors.add('headerid', self.processor, '>prettify') + + def reset(self): + self.processor.IDs = set() + + +def makeExtension(configs=None): + return HeaderIdExtension(configs=configs) diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/meta.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/meta.py new file mode 100644 index 0000000..aaff436 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/meta.py @@ -0,0 +1,93 @@ +""" +Meta Data Extension for Python-Markdown +======================================= + +This extension adds Meta Data handling to markdown. + +Basic Usage: + + >>> import markdown + >>> text = '''Title: A Test Doc. + ... Author: Waylan Limberg + ... John Doe + ... Blank_Data: + ... + ... The body. This is paragraph one. + ... ''' + >>> md = markdown.Markdown(['meta']) + >>> print md.convert(text) + <p>The body. This is paragraph one.</p> + >>> print md.Meta + {u'blank_data': [u''], u'author': [u'Waylan Limberg', u'John Doe'], u'title': [u'A Test Doc.']} + +Make sure text without Meta Data still works (markdown < 1.6b returns a <p>). + + >>> text = ' Some Code - not extra lines of meta data.' + >>> md = markdown.Markdown(['meta']) + >>> print md.convert(text) + <pre><code>Some Code - not extra lines of meta data. + </code></pre> + >>> md.Meta + {} + +Copyright 2007-2008 [Waylan Limberg](http://achinghead.com). + +Project website: <http://packages.python.org/Markdown/meta_data.html> +Contact: markdown@freewisdom.org + +License: BSD (see ../LICENSE.md for details) + +""" + +from __future__ import absolute_import +from __future__ import unicode_literals +from . import Extension +from ..preprocessors import Preprocessor +import re + +# Global Vars +META_RE = re.compile(r'^[ ]{0,3}(?P<key>[A-Za-z0-9_-]+):\s*(?P<value>.*)') +META_MORE_RE = re.compile(r'^[ ]{4,}(?P<value>.*)') + +class MetaExtension (Extension): + """ Meta-Data extension for Python-Markdown. """ + + def extendMarkdown(self, md, md_globals): + """ Add MetaPreprocessor to Markdown instance. """ + + md.preprocessors.add("meta", MetaPreprocessor(md), "_begin") + + +class MetaPreprocessor(Preprocessor): + """ Get Meta-Data. """ + + def run(self, lines): + """ Parse Meta-Data and store in Markdown.Meta. """ + meta = {} + key = None + while 1: + line = lines.pop(0) + if line.strip() == '': + break # blank line - done + m1 = META_RE.match(line) + if m1: + key = m1.group('key').lower().strip() + value = m1.group('value').strip() + try: + meta[key].append(value) + except KeyError: + meta[key] = [value] + else: + m2 = META_MORE_RE.match(line) + if m2 and key: + # Add another line to existing key + meta[key].append(m2.group('value').strip()) + else: + lines.insert(0, line) + break # no meta data - done + self.markdown.Meta = meta + return lines + + +def makeExtension(configs={}): + return MetaExtension(configs=configs) diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/nl2br.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/nl2br.py new file mode 100644 index 0000000..da4b339 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/nl2br.py @@ -0,0 +1,38 @@ +""" +NL2BR Extension +=============== + +A Python-Markdown extension to treat newlines as hard breaks; like +GitHub-flavored Markdown does. + +Usage: + + >>> import markdown + >>> print markdown.markdown('line 1\\nline 2', extensions=['nl2br']) + <p>line 1<br /> + line 2</p> + +Copyright 2011 [Brian Neal](http://deathofagremmie.com/) + +Dependencies: +* [Python 2.4+](http://python.org) +* [Markdown 2.1+](http://packages.python.org/Markdown/) + +""" + +from __future__ import absolute_import +from __future__ import unicode_literals +from . import Extension +from ..inlinepatterns import SubstituteTagPattern + +BR_RE = r'\n' + +class Nl2BrExtension(Extension): + + def extendMarkdown(self, md, md_globals): + br_tag = SubstituteTagPattern(BR_RE, 'br') + md.inlinePatterns.add('nl', br_tag, '_end') + + +def makeExtension(configs=None): + return Nl2BrExtension(configs) diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/sane_lists.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/sane_lists.py new file mode 100644 index 0000000..23e9a7f --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/sane_lists.py @@ -0,0 +1,51 @@ +""" +Sane List Extension for Python-Markdown +======================================= + +Modify the behavior of Lists in Python-Markdown t act in a sane manor. + +In standard Markdown sytex, the following would constitute a single +ordered list. However, with this extension, the output would include +two lists, the first an ordered list and the second and unordered list. + + 1. ordered + 2. list + + * unordered + * list + +Copyright 2011 - [Waylan Limberg](http://achinghead.com) + +""" + +from __future__ import absolute_import +from __future__ import unicode_literals +from . import Extension +from ..blockprocessors import OListProcessor, UListProcessor +import re + + +class SaneOListProcessor(OListProcessor): + + CHILD_RE = re.compile(r'^[ ]{0,3}((\d+\.))[ ]+(.*)') + SIBLING_TAGS = ['ol'] + + +class SaneUListProcessor(UListProcessor): + + CHILD_RE = re.compile(r'^[ ]{0,3}(([*+-]))[ ]+(.*)') + SIBLING_TAGS = ['ul'] + + +class SaneListExtension(Extension): + """ Add sane lists to Markdown. """ + + def extendMarkdown(self, md, md_globals): + """ Override existing Processors. """ + md.parser.blockprocessors['olist'] = SaneOListProcessor(md.parser) + md.parser.blockprocessors['ulist'] = SaneUListProcessor(md.parser) + + +def makeExtension(configs={}): + return SaneListExtension(configs=configs) + diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/smart_strong.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/smart_strong.py new file mode 100644 index 0000000..4818cf9 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/smart_strong.py @@ -0,0 +1,42 @@ +''' +Smart_Strong Extension for Python-Markdown +========================================== + +This extention adds smarter handling of double underscores within words. + +Simple Usage: + + >>> import markdown + >>> print markdown.markdown('Text with double__underscore__words.', + ... extensions=['smart_strong']) + <p>Text with double__underscore__words.</p> + >>> print markdown.markdown('__Strong__ still works.', + ... extensions=['smart_strong']) + <p><strong>Strong</strong> still works.</p> + >>> print markdown.markdown('__this__works__too__.', + ... extensions=['smart_strong']) + <p><strong>this__works__too</strong>.</p> + +Copyright 2011 +[Waylan Limberg](http://achinghead.com) + +''' + +from __future__ import absolute_import +from __future__ import unicode_literals +from . import Extension +from ..inlinepatterns import SimpleTagPattern + +SMART_STRONG_RE = r'(?<!\w)(_{2})(?!_)(.+?)(?<!_)\2(?!\w)' +STRONG_RE = r'(\*{2})(.+?)\2' + +class SmartEmphasisExtension(Extension): + """ Add smart_emphasis extension to Markdown class.""" + + def extendMarkdown(self, md, md_globals): + """ Modify inline patterns. """ + md.inlinePatterns['strong'] = SimpleTagPattern(STRONG_RE, 'strong') + md.inlinePatterns.add('strong2', SimpleTagPattern(SMART_STRONG_RE, 'strong'), '>emphasis2') + +def makeExtension(configs={}): + return SmartEmphasisExtension(configs=dict(configs)) diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/tables.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/tables.py new file mode 100644 index 0000000..ad52ec1 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/tables.py @@ -0,0 +1,100 @@ +""" +Tables Extension for Python-Markdown +==================================== + +Added parsing of tables to Python-Markdown. + +A simple example: + + First Header | Second Header + ------------- | ------------- + Content Cell | Content Cell + Content Cell | Content Cell + +Copyright 2009 - [Waylan Limberg](http://achinghead.com) +""" + +from __future__ import absolute_import +from __future__ import unicode_literals +from . import Extension +from ..blockprocessors import BlockProcessor +from ..util import etree + +class TableProcessor(BlockProcessor): + """ Process Tables. """ + + def test(self, parent, block): + rows = block.split('\n') + return (len(rows) > 2 and '|' in rows[0] and + '|' in rows[1] and '-' in rows[1] and + rows[1].strip()[0] in ['|', ':', '-']) + + def run(self, parent, blocks): + """ Parse a table block and build table. """ + block = blocks.pop(0).split('\n') + header = block[0].strip() + seperator = block[1].strip() + rows = block[2:] + # Get format type (bordered by pipes or not) + border = False + if header.startswith('|'): + border = True + # Get alignment of columns + align = [] + for c in self._split_row(seperator, border): + if c.startswith(':') and c.endswith(':'): + align.append('center') + elif c.startswith(':'): + align.append('left') + elif c.endswith(':'): + align.append('right') + else: + align.append(None) + # Build table + table = etree.SubElement(parent, 'table') + thead = etree.SubElement(table, 'thead') + self._build_row(header, thead, align, border) + tbody = etree.SubElement(table, 'tbody') + for row in rows: + self._build_row(row.strip(), tbody, align, border) + + def _build_row(self, row, parent, align, border): + """ Given a row of text, build table cells. """ + tr = etree.SubElement(parent, 'tr') + tag = 'td' + if parent.tag == 'thead': + tag = 'th' + cells = self._split_row(row, border) + # We use align here rather than cells to ensure every row + # contains the same number of columns. + for i, a in enumerate(align): + c = etree.SubElement(tr, tag) + try: + c.text = cells[i].strip() + except IndexError: + c.text = "" + if a: + c.set('align', a) + + def _split_row(self, row, border): + """ split a row of text into list of cells. """ + if border: + if row.startswith('|'): + row = row[1:] + if row.endswith('|'): + row = row[:-1] + return row.split('|') + + +class TableExtension(Extension): + """ Add tables to Markdown. """ + + def extendMarkdown(self, md, md_globals): + """ Add an instance of TableProcessor to BlockParser. """ + md.parser.blockprocessors.add('table', + TableProcessor(md.parser), + '<hashheader') + + +def makeExtension(configs={}): + return TableExtension(configs=configs) diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/toc.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/toc.py new file mode 100644 index 0000000..73b0844 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/toc.py @@ -0,0 +1,221 @@ +""" +Table of Contents Extension for Python-Markdown +* * * + +(c) 2008 [Jack Miller](http://codezen.org) + +Dependencies: +* [Markdown 2.1+](http://packages.python.org/Markdown/) + +""" + +from __future__ import absolute_import +from __future__ import unicode_literals +from . import Extension +from ..treeprocessors import Treeprocessor +from ..util import etree +from .headerid import slugify, unique, itertext +import re + + +def order_toc_list(toc_list): + """Given an unsorted list with errors and skips, return a nested one. + [{'level': 1}, {'level': 2}] + => + [{'level': 1, 'children': [{'level': 2, 'children': []}]}] + + A wrong list is also converted: + [{'level': 2}, {'level': 1}] + => + [{'level': 2, 'children': []}, {'level': 1, 'children': []}] + """ + + def build_correct(remaining_list, prev_elements=[{'level': 1000}]): + + if not remaining_list: + return [], [] + + current = remaining_list.pop(0) + if not 'children' in current.keys(): + current['children'] = [] + + if not prev_elements: + # This happens for instance with [8, 1, 1], ie. when some + # header level is outside a scope. We treat it as a + # top-level + next_elements, children = build_correct(remaining_list, [current]) + current['children'].append(children) + return [current] + next_elements, [] + + prev_element = prev_elements.pop() + children = [] + next_elements = [] + # Is current part of the child list or next list? + if current['level'] > prev_element['level']: + #print "%d is a child of %d" % (current['level'], prev_element['level']) + prev_elements.append(prev_element) + prev_elements.append(current) + prev_element['children'].append(current) + next_elements2, children2 = build_correct(remaining_list, prev_elements) + children += children2 + next_elements += next_elements2 + else: + #print "%d is ancestor of %d" % (current['level'], prev_element['level']) + if not prev_elements: + #print "No previous elements, so appending to the next set" + next_elements.append(current) + prev_elements = [current] + next_elements2, children2 = build_correct(remaining_list, prev_elements) + current['children'].extend(children2) + else: + #print "Previous elements, comparing to those first" + remaining_list.insert(0, current) + next_elements2, children2 = build_correct(remaining_list, prev_elements) + children.extend(children2) + next_elements += next_elements2 + + return next_elements, children + + ordered_list, __ = build_correct(toc_list) + return ordered_list + + +class TocTreeprocessor(Treeprocessor): + + # Iterator wrapper to get parent and child all at once + def iterparent(self, root): + for parent in root.getiterator(): + for child in parent: + yield parent, child + + def add_anchor(self, c, elem_id): #@ReservedAssignment + if self.use_anchors: + anchor = etree.Element("a") + anchor.text = c.text + anchor.attrib["href"] = "#" + elem_id + anchor.attrib["class"] = "toclink" + c.text = "" + for elem in c.getchildren(): + anchor.append(elem) + c.remove(elem) + c.append(anchor) + + def build_toc_etree(self, div, toc_list): + # Add title to the div + if self.config["title"]: + header = etree.SubElement(div, "span") + header.attrib["class"] = "toctitle" + header.text = self.config["title"] + + def build_etree_ul(toc_list, parent): + ul = etree.SubElement(parent, "ul") + for item in toc_list: + # List item link, to be inserted into the toc div + li = etree.SubElement(ul, "li") + link = etree.SubElement(li, "a") + link.text = item.get('name', '') + link.attrib["href"] = '#' + item.get('id', '') + if item['children']: + build_etree_ul(item['children'], li) + return ul + + return build_etree_ul(toc_list, div) + + def run(self, doc): + + div = etree.Element("div") + div.attrib["class"] = "toc" + header_rgx = re.compile("[Hh][123456]") + + self.use_anchors = self.config["anchorlink"] in [1, '1', True, 'True', 'true'] + + # Get a list of id attributes + used_ids = set() + for c in doc.getiterator(): + if "id" in c.attrib: + used_ids.add(c.attrib["id"]) + + toc_list = [] + marker_found = False + for (p, c) in self.iterparent(doc): + text = ''.join(itertext(c)).strip() + if not text: + continue + + # To keep the output from screwing up the + # validation by putting a <div> inside of a <p> + # we actually replace the <p> in its entirety. + # We do not allow the marker inside a header as that + # would causes an enless loop of placing a new TOC + # inside previously generated TOC. + if c.text and c.text.strip() == self.config["marker"] and \ + not header_rgx.match(c.tag) and c.tag not in ['pre', 'code']: + for i in range(len(p)): + if p[i] == c: + p[i] = div + break + marker_found = True + + if header_rgx.match(c.tag): + + # Do not override pre-existing ids + if not "id" in c.attrib: + elem_id = unique(self.config["slugify"](text, '-'), used_ids) + c.attrib["id"] = elem_id + else: + elem_id = c.attrib["id"] + + tag_level = int(c.tag[-1]) + + toc_list.append({'level': tag_level, + 'id': elem_id, + 'name': text}) + + self.add_anchor(c, elem_id) + + toc_list_nested = order_toc_list(toc_list) + self.build_toc_etree(div, toc_list_nested) + prettify = self.markdown.treeprocessors.get('prettify') + if prettify: prettify.run(div) + if not marker_found: + # serialize and attach to markdown instance. + toc = self.markdown.serializer(div) + for pp in self.markdown.postprocessors.values(): + toc = pp.run(toc) + self.markdown.toc = toc + + +class TocExtension(Extension): + + TreeProcessorClass = TocTreeprocessor + + def __init__(self, configs=[]): + self.config = { "marker" : ["[TOC]", + "Text to find and replace with Table of Contents -" + "Defaults to \"[TOC]\""], + "slugify" : [slugify, + "Function to generate anchors based on header text-" + "Defaults to the headerid ext's slugify function."], + "title" : [None, + "Title to insert into TOC <div> - " + "Defaults to None"], + "anchorlink" : [0, + "1 if header should be a self link" + "Defaults to 0"]} + + for key, value in configs: + self.setConfig(key, value) + + def extendMarkdown(self, md, md_globals): + tocext = self.TreeProcessorClass(md) + tocext.config = self.getConfigs() + # Headerid ext is set to '>prettify'. With this set to '_end', + # it should always come after headerid ext (and honor ids assinged + # by the header id extension) if both are used. Same goes for + # attr_list extension. This must come last because we don't want + # to redefine ids after toc is created. But we do want toc prettified. + md.treeprocessors.add("toc", tocext, "_end") + + +def makeExtension(configs={}): + return TocExtension(configs=configs) diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/wikilinks.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/wikilinks.py new file mode 100644 index 0000000..877890b --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/extensions/wikilinks.py @@ -0,0 +1,151 @@ +''' +WikiLinks Extension for Python-Markdown +====================================== + +Converts [[WikiLinks]] to relative links. Requires Python-Markdown 2.0+ + +Basic usage: + + >>> import markdown + >>> text = "Some text with a [[WikiLink]]." + >>> html = markdown.markdown(text, ['wikilinks']) + >>> print html + <p>Some text with a <a class="wikilink" href="/WikiLink/">WikiLink</a>.</p> + +Whitespace behavior: + + >>> print markdown.markdown('[[ foo bar_baz ]]', ['wikilinks']) + <p><a class="wikilink" href="/foo_bar_baz/">foo bar_baz</a></p> + >>> print markdown.markdown('foo [[ ]] bar', ['wikilinks']) + <p>foo bar</p> + +To define custom settings the simple way: + + >>> print markdown.markdown(text, + ... ['wikilinks(base_url=/wiki/,end_url=.html,html_class=foo)'] + ... ) + <p>Some text with a <a class="foo" href="/wiki/WikiLink.html">WikiLink</a>.</p> + +Custom settings the complex way: + + >>> md = markdown.Markdown( + ... extensions = ['wikilinks'], + ... extension_configs = {'wikilinks': [ + ... ('base_url', 'http://example.com/'), + ... ('end_url', '.html'), + ... ('html_class', '') ]}, + ... safe_mode = True) + >>> print md.convert(text) + <p>Some text with a <a href="http://example.com/WikiLink.html">WikiLink</a>.</p> + +Use MetaData with mdx_meta.py (Note the blank html_class in MetaData): + + >>> text = """wiki_base_url: http://example.com/ + ... wiki_end_url: .html + ... wiki_html_class: + ... + ... Some text with a [[WikiLink]].""" + >>> md = markdown.Markdown(extensions=['meta', 'wikilinks']) + >>> print md.convert(text) + <p>Some text with a <a href="http://example.com/WikiLink.html">WikiLink</a>.</p> + +MetaData should not carry over to next document: + + >>> print md.convert("No [[MetaData]] here.") + <p>No <a class="wikilink" href="/MetaData/">MetaData</a> here.</p> + +Define a custom URL builder: + + >>> def my_url_builder(label, base, end): + ... return '/bar/' + >>> md = markdown.Markdown(extensions=['wikilinks'], + ... extension_configs={'wikilinks' : [('build_url', my_url_builder)]}) + >>> print md.convert('[[foo]]') + <p><a class="wikilink" href="/bar/">foo</a></p> + +From the command line: + + python markdown.py -x wikilinks(base_url=http://example.com/,end_url=.html,html_class=foo) src.txt + +By [Waylan Limberg](http://achinghead.com/). + +License: [BSD](http://www.opensource.org/licenses/bsd-license.php) + +Dependencies: +* [Python 2.3+](http://python.org) +* [Markdown 2.0+](http://packages.python.org/Markdown/) +''' + +from __future__ import absolute_import +from __future__ import unicode_literals +from . import Extension +from ..inlinepatterns import Pattern +from ..util import etree +import re + +def build_url(label, base, end): + """ Build a url from the label, a base, and an end. """ + clean_label = re.sub(r'([ ]+_)|(_[ ]+)|([ ]+)', '_', label) + return '%s%s%s'% (base, clean_label, end) + + +class WikiLinkExtension(Extension): + def __init__(self, configs): + # set extension defaults + self.config = { + 'base_url' : ['/', 'String to append to beginning or URL.'], + 'end_url' : ['/', 'String to append to end of URL.'], + 'html_class' : ['wikilink', 'CSS hook. Leave blank for none.'], + 'build_url' : [build_url, 'Callable formats URL from label.'], + } + + # Override defaults with user settings + for key, value in configs : + self.setConfig(key, value) + + def extendMarkdown(self, md, md_globals): + self.md = md + + # append to end of inline patterns + WIKILINK_RE = r'\[\[([\w0-9_ -]+)\]\]' + wikilinkPattern = WikiLinks(WIKILINK_RE, self.getConfigs()) + wikilinkPattern.md = md + md.inlinePatterns.add('wikilink', wikilinkPattern, "<not_strong") + + +class WikiLinks(Pattern): + def __init__(self, pattern, config): + super(WikiLinks, self).__init__(pattern) + self.config = config + + def handleMatch(self, m): + if m.group(2).strip(): + base_url, end_url, html_class = self._getMeta() + label = m.group(2).strip() + url = self.config['build_url'](label, base_url, end_url) + a = etree.Element('a') + a.text = label + a.set('href', url) + if html_class: + a.set('class', html_class) + else: + a = '' + return a + + def _getMeta(self): + """ Return meta data or config data. """ + base_url = self.config['base_url'] + end_url = self.config['end_url'] + html_class = self.config['html_class'] + if hasattr(self.md, 'Meta'): + if 'wiki_base_url' in self.md.Meta: + base_url = self.md.Meta['wiki_base_url'][0] + if 'wiki_end_url' in self.md.Meta: + end_url = self.md.Meta['wiki_end_url'][0] + if 'wiki_html_class' in self.md.Meta: + html_class = self.md.Meta['wiki_html_class'][0] + return base_url, end_url, html_class + + +def makeExtension(configs=None) : + return WikiLinkExtension(configs=configs) diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/inlinepatterns.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/inlinepatterns.py new file mode 100644 index 0000000..de957ef --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/inlinepatterns.py @@ -0,0 +1,483 @@ +""" +INLINE PATTERNS +============================================================================= + +Inline patterns such as *emphasis* are handled by means of auxiliary +objects, one per pattern. Pattern objects must be instances of classes +that extend markdown.Pattern. Each pattern object uses a single regular +expression and needs support the following methods: + + pattern.getCompiledRegExp() # returns a regular expression + + pattern.handleMatch(m) # takes a match object and returns + # an ElementTree element or just plain text + +All of python markdown's built-in patterns subclass from Pattern, +but you can add additional patterns that don't. + +Also note that all the regular expressions used by inline must +capture the whole block. For this reason, they all start with +'^(.*)' and end with '(.*)!'. In case with built-in expression +Pattern takes care of adding the "^(.*)" and "(.*)!". + +Finally, the order in which regular expressions are applied is very +important - e.g. if we first replace http://.../ links with <a> tags +and _then_ try to replace inline html, we would end up with a mess. +So, we apply the expressions in the following order: + +* escape and backticks have to go before everything else, so + that we can preempt any markdown patterns by escaping them. + +* then we handle auto-links (must be done before inline html) + +* then we handle inline HTML. At this point we will simply + replace all inline HTML strings with a placeholder and add + the actual HTML to a hash. + +* then inline images (must be done before links) + +* then bracketed links, first regular then reference-style + +* finally we apply strong and emphasis +""" + +from __future__ import absolute_import +from __future__ import unicode_literals +from . import util +from . import odict +import re +try: + from urllib.parse import urlparse, urlunparse +except ImportError: + from urlparse import urlparse, urlunparse +try: + from html import entities +except ImportError: + import htmlentitydefs as entities + + +def build_inlinepatterns(md_instance, **kwargs): + """ Build the default set of inline patterns for Markdown. """ + inlinePatterns = odict.OrderedDict() + inlinePatterns["backtick"] = BacktickPattern(BACKTICK_RE) + inlinePatterns["escape"] = EscapePattern(ESCAPE_RE, md_instance) + inlinePatterns["reference"] = ReferencePattern(REFERENCE_RE, md_instance) + inlinePatterns["link"] = LinkPattern(LINK_RE, md_instance) + inlinePatterns["image_link"] = ImagePattern(IMAGE_LINK_RE, md_instance) + inlinePatterns["image_reference"] = \ + ImageReferencePattern(IMAGE_REFERENCE_RE, md_instance) + inlinePatterns["short_reference"] = \ + ReferencePattern(SHORT_REF_RE, md_instance) + inlinePatterns["autolink"] = AutolinkPattern(AUTOLINK_RE, md_instance) + inlinePatterns["automail"] = AutomailPattern(AUTOMAIL_RE, md_instance) + inlinePatterns["linebreak"] = SubstituteTagPattern(LINE_BREAK_RE, 'br') + if md_instance.safeMode != 'escape': + inlinePatterns["html"] = HtmlPattern(HTML_RE, md_instance) + inlinePatterns["entity"] = HtmlPattern(ENTITY_RE, md_instance) + inlinePatterns["not_strong"] = SimpleTextPattern(NOT_STRONG_RE) + inlinePatterns["strong_em"] = DoubleTagPattern(STRONG_EM_RE, 'strong,em') + inlinePatterns["strong"] = SimpleTagPattern(STRONG_RE, 'strong') + inlinePatterns["emphasis"] = SimpleTagPattern(EMPHASIS_RE, 'em') + if md_instance.smart_emphasis: + inlinePatterns["emphasis2"] = SimpleTagPattern(SMART_EMPHASIS_RE, 'em') + else: + inlinePatterns["emphasis2"] = SimpleTagPattern(EMPHASIS_2_RE, 'em') + return inlinePatterns + +""" +The actual regular expressions for patterns +----------------------------------------------------------------------------- +""" + +NOBRACKET = r'[^\]\[]*' +BRK = ( r'\[(' + + (NOBRACKET + r'(\[')*6 + + (NOBRACKET+ r'\])*')*6 + + NOBRACKET + r')\]' ) +NOIMG = r'(?<!\!)' + +BACKTICK_RE = r'(?<!\\)(`+)(.+?)(?<!`)\2(?!`)' # `e=f()` or ``e=f("`")`` +ESCAPE_RE = r'\\(.)' # \< +EMPHASIS_RE = r'(\*)([^\*]+)\2' # *emphasis* +STRONG_RE = r'(\*{2}|_{2})(.+?)\2' # **strong** +STRONG_EM_RE = r'(\*{3}|_{3})(.+?)\2' # ***strong*** +SMART_EMPHASIS_RE = r'(?<!\w)(_)(?!_)(.+?)(?<!_)\2(?!\w)' # _smart_emphasis_ +EMPHASIS_2_RE = r'(_)(.+?)\2' # _emphasis_ +LINK_RE = NOIMG + BRK + \ +r'''\(\s*(<.*?>|((?:(?:\(.*?\))|[^\(\)]))*?)\s*((['"])(.*?)\12\s*)?\)''' +# [text](url) or [text](<url>) or [text](url "title") + +IMAGE_LINK_RE = r'\!' + BRK + r'\s*\((<.*?>|([^\)]*))\)' +# ![alttxt](http://x.com/) or ![alttxt](<http://x.com/>) +REFERENCE_RE = NOIMG + BRK+ r'\s?\[([^\]]*)\]' # [Google][3] +SHORT_REF_RE = NOIMG + r'\[([^\]]+)\]' # [Google] +IMAGE_REFERENCE_RE = r'\!' + BRK + '\s?\[([^\]]*)\]' # ![alt text][2] +NOT_STRONG_RE = r'((^| )(\*|_)( |$))' # stand-alone * or _ +AUTOLINK_RE = r'<((?:[Ff]|[Hh][Tt])[Tt][Pp][Ss]?://[^>]*)>' # <http://www.123.com> +AUTOMAIL_RE = r'<([^> \!]*@[^> ]*)>' # <me@example.com> + +HTML_RE = r'(\<([a-zA-Z/][^\>]*?|\!--.*?--)\>)' # <...> +ENTITY_RE = r'(&[\#a-zA-Z0-9]*;)' # & +LINE_BREAK_RE = r' \n' # two spaces at end of line + + +def dequote(string): + """Remove quotes from around a string.""" + if ( ( string.startswith('"') and string.endswith('"')) + or (string.startswith("'") and string.endswith("'")) ): + return string[1:-1] + else: + return string + +ATTR_RE = re.compile("\{@([^\}]*)=([^\}]*)}") # {@id=123} + +def handleAttributes(text, parent): + """Set values of an element based on attribute definitions ({@id=123}).""" + def attributeCallback(match): + parent.set(match.group(1), match.group(2).replace('\n', ' ')) + return ATTR_RE.sub(attributeCallback, text) + + +""" +The pattern classes +----------------------------------------------------------------------------- +""" + +class Pattern(object): + """Base class that inline patterns subclass. """ + + def __init__(self, pattern, markdown_instance=None): + """ + Create an instant of an inline pattern. + + Keyword arguments: + + * pattern: A regular expression that matches a pattern + + """ + self.pattern = pattern + self.compiled_re = re.compile("^(.*?)%s(.*?)$" % pattern, + re.DOTALL | re.UNICODE) + + # Api for Markdown to pass safe_mode into instance + self.safe_mode = False + if markdown_instance: + self.markdown = markdown_instance + + def getCompiledRegExp(self): + """ Return a compiled regular expression. """ + return self.compiled_re + + def handleMatch(self, m): + """Return a ElementTree element from the given match. + + Subclasses should override this method. + + Keyword arguments: + + * m: A re match object containing a match of the pattern. + + """ + pass + + def type(self): + """ Return class name, to define pattern type """ + return self.__class__.__name__ + + def unescape(self, text): + """ Return unescaped text given text with an inline placeholder. """ + try: + stash = self.markdown.treeprocessors['inline'].stashed_nodes + except KeyError: + return text + def itertext(el): + ' Reimplement Element.itertext for older python versions ' + tag = el.tag + if not isinstance(tag, util.string_type) and tag is not None: + return + if el.text: + yield el.text + for e in el: + for s in itertext(e): + yield s + if e.tail: + yield e.tail + def get_stash(m): + id = m.group(1) + if id in stash: + value = stash.get(id) + if isinstance(value, util.string_type): + return value + else: + # An etree Element - return text content only + return ''.join(itertext(value)) + return util.INLINE_PLACEHOLDER_RE.sub(get_stash, text) + + +class SimpleTextPattern(Pattern): + """ Return a simple text of group(2) of a Pattern. """ + def handleMatch(self, m): + text = m.group(2) + if text == util.INLINE_PLACEHOLDER_PREFIX: + return None + return text + + +class EscapePattern(Pattern): + """ Return an escaped character. """ + + def handleMatch(self, m): + char = m.group(2) + if char in self.markdown.ESCAPED_CHARS: + return '%s%s%s' % (util.STX, ord(char), util.ETX) + else: + return '\\%s' % char + + +class SimpleTagPattern(Pattern): + """ + Return element of type `tag` with a text attribute of group(3) + of a Pattern. + + """ + def __init__ (self, pattern, tag): + Pattern.__init__(self, pattern) + self.tag = tag + + def handleMatch(self, m): + el = util.etree.Element(self.tag) + el.text = m.group(3) + return el + + +class SubstituteTagPattern(SimpleTagPattern): + """ Return an element of type `tag` with no children. """ + def handleMatch (self, m): + return util.etree.Element(self.tag) + + +class BacktickPattern(Pattern): + """ Return a `<code>` element containing the matching text. """ + def __init__ (self, pattern): + Pattern.__init__(self, pattern) + self.tag = "code" + + def handleMatch(self, m): + el = util.etree.Element(self.tag) + el.text = util.AtomicString(m.group(3).strip()) + return el + + +class DoubleTagPattern(SimpleTagPattern): + """Return a ElementTree element nested in tag2 nested in tag1. + + Useful for strong emphasis etc. + + """ + def handleMatch(self, m): + tag1, tag2 = self.tag.split(",") + el1 = util.etree.Element(tag1) + el2 = util.etree.SubElement(el1, tag2) + el2.text = m.group(3) + return el1 + + +class HtmlPattern(Pattern): + """ Store raw inline html and return a placeholder. """ + def handleMatch (self, m): + rawhtml = self.unescape(m.group(2)) + place_holder = self.markdown.htmlStash.store(rawhtml) + return place_holder + + def unescape(self, text): + """ Return unescaped text given text with an inline placeholder. """ + try: + stash = self.markdown.treeprocessors['inline'].stashed_nodes + except KeyError: + return text + def get_stash(m): + id = m.group(1) + value = stash.get(id) + if value is not None: + try: + return self.markdown.serializer(value) + except: + return '\%s' % value + + return util.INLINE_PLACEHOLDER_RE.sub(get_stash, text) + + +class LinkPattern(Pattern): + """ Return a link element from the given match. """ + def handleMatch(self, m): + el = util.etree.Element("a") + el.text = m.group(2) + title = m.group(13) + href = m.group(9) + + if href: + if href[0] == "<": + href = href[1:-1] + el.set("href", self.sanitize_url(self.unescape(href.strip()))) + else: + el.set("href", "") + + if title: + title = dequote(self.unescape(title)) + el.set("title", title) + return el + + def sanitize_url(self, url): + """ + Sanitize a url against xss attacks in "safe_mode". + + Rather than specifically blacklisting `javascript:alert("XSS")` and all + its aliases (see <http://ha.ckers.org/xss.html>), we whitelist known + safe url formats. Most urls contain a network location, however some + are known not to (i.e.: mailto links). Script urls do not contain a + location. Additionally, for `javascript:...`, the scheme would be + "javascript" but some aliases will appear to `urlparse()` to have no + scheme. On top of that relative links (i.e.: "foo/bar.html") have no + scheme. Therefore we must check "path", "parameters", "query" and + "fragment" for any literal colons. We don't check "scheme" for colons + because it *should* never have any and "netloc" must allow the form: + `username:password@host:port`. + + """ + url = url.replace(' ', '%20') + if not self.markdown.safeMode: + # Return immediately bipassing parsing. + return url + + try: + scheme, netloc, path, params, query, fragment = url = urlparse(url) + except ValueError: + # Bad url - so bad it couldn't be parsed. + return '' + + locless_schemes = ['', 'mailto', 'news'] + allowed_schemes = locless_schemes + ['http', 'https', 'ftp', 'ftps'] + if scheme not in allowed_schemes: + # Not a known (allowed) scheme. Not safe. + return '' + + if netloc == '' and scheme not in locless_schemes: + # This should not happen. Treat as suspect. + return '' + + for part in url[2:]: + if ":" in part: + # A colon in "path", "parameters", "query" or "fragment" is suspect. + return '' + + # Url passes all tests. Return url as-is. + return urlunparse(url) + +class ImagePattern(LinkPattern): + """ Return a img element from the given match. """ + def handleMatch(self, m): + el = util.etree.Element("img") + src_parts = m.group(9).split() + if src_parts: + src = src_parts[0] + if src[0] == "<" and src[-1] == ">": + src = src[1:-1] + el.set('src', self.sanitize_url(self.unescape(src))) + else: + el.set('src', "") + if len(src_parts) > 1: + el.set('title', dequote(self.unescape(" ".join(src_parts[1:])))) + + if self.markdown.enable_attributes: + truealt = handleAttributes(m.group(2), el) + else: + truealt = m.group(2) + + el.set('alt', self.unescape(truealt)) + return el + +class ReferencePattern(LinkPattern): + """ Match to a stored reference and return link element. """ + + NEWLINE_CLEANUP_RE = re.compile(r'[ ]?\n', re.MULTILINE) + + def handleMatch(self, m): + try: + id = m.group(9).lower() + except IndexError: + id = None + if not id: + # if we got something like "[Google][]" or "[Goggle]" + # we'll use "google" as the id + id = m.group(2).lower() + + # Clean up linebreaks in id + id = self.NEWLINE_CLEANUP_RE.sub(' ', id) + if not id in self.markdown.references: # ignore undefined refs + return None + href, title = self.markdown.references[id] + + text = m.group(2) + return self.makeTag(href, title, text) + + def makeTag(self, href, title, text): + el = util.etree.Element('a') + + el.set('href', self.sanitize_url(href)) + if title: + el.set('title', title) + + el.text = text + return el + + +class ImageReferencePattern(ReferencePattern): + """ Match to a stored reference and return img element. """ + def makeTag(self, href, title, text): + el = util.etree.Element("img") + el.set("src", self.sanitize_url(href)) + if title: + el.set("title", title) + + if self.markdown.enable_attributes: + text = handleAttributes(text, el) + + el.set("alt", self.unescape(text)) + return el + + +class AutolinkPattern(Pattern): + """ Return a link Element given an autolink (`<http://example/com>`). """ + def handleMatch(self, m): + el = util.etree.Element("a") + el.set('href', self.unescape(m.group(2))) + el.text = util.AtomicString(m.group(2)) + return el + +class AutomailPattern(Pattern): + """ + Return a mailto link Element given an automail link (`<foo@example.com>`). + """ + def handleMatch(self, m): + el = util.etree.Element('a') + email = self.unescape(m.group(2)) + if email.startswith("mailto:"): + email = email[len("mailto:"):] + + def codepoint2name(code): + """Return entity definition by code, or the code if not defined.""" + entity = entities.codepoint2name.get(code) + if entity: + return "%s%s;" % (util.AMP_SUBSTITUTE, entity) + else: + return "%s#%d;" % (util.AMP_SUBSTITUTE, code) + + letters = [codepoint2name(ord(letter)) for letter in email] + el.text = util.AtomicString(''.join(letters)) + + mailto = "mailto:" + email + mailto = "".join([util.AMP_SUBSTITUTE + '#%d;' % + ord(letter) for letter in mailto]) + el.set('href', mailto) + return el + diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/odict.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/odict.py new file mode 100644 index 0000000..8089ece --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/odict.py @@ -0,0 +1,194 @@ +from __future__ import unicode_literals +from __future__ import absolute_import +from . import util + +from copy import deepcopy + +def iteritems_compat(d): + """Return an iterator over the (key, value) pairs of a dictionary. + Copied from `six` module.""" + return iter(getattr(d, _iteritems)()) + +class OrderedDict(dict): + """ + A dictionary that keeps its keys in the order in which they're inserted. + + Copied from Django's SortedDict with some modifications. + + """ + def __new__(cls, *args, **kwargs): + instance = super(OrderedDict, cls).__new__(cls, *args, **kwargs) + instance.keyOrder = [] + return instance + + def __init__(self, data=None): + if data is None or isinstance(data, dict): + data = data or [] + super(OrderedDict, self).__init__(data) + self.keyOrder = list(data) if data else [] + else: + super(OrderedDict, self).__init__() + super_set = super(OrderedDict, self).__setitem__ + for key, value in data: + # Take the ordering from first key + if key not in self: + self.keyOrder.append(key) + # But override with last value in data (dict() does this) + super_set(key, value) + + def __deepcopy__(self, memo): + return self.__class__([(key, deepcopy(value, memo)) + for key, value in self.items()]) + + def __copy__(self): + # The Python's default copy implementation will alter the state + # of self. The reason for this seems complex but is likely related to + # subclassing dict. + return self.copy() + + def __setitem__(self, key, value): + if key not in self: + self.keyOrder.append(key) + super(OrderedDict, self).__setitem__(key, value) + + def __delitem__(self, key): + super(OrderedDict, self).__delitem__(key) + self.keyOrder.remove(key) + + def __iter__(self): + return iter(self.keyOrder) + + def __reversed__(self): + return reversed(self.keyOrder) + + def pop(self, k, *args): + result = super(OrderedDict, self).pop(k, *args) + try: + self.keyOrder.remove(k) + except ValueError: + # Key wasn't in the dictionary in the first place. No problem. + pass + return result + + def popitem(self): + result = super(OrderedDict, self).popitem() + self.keyOrder.remove(result[0]) + return result + + def _iteritems(self): + for key in self.keyOrder: + yield key, self[key] + + def _iterkeys(self): + for key in self.keyOrder: + yield key + + def _itervalues(self): + for key in self.keyOrder: + yield self[key] + + if util.PY3: + items = _iteritems + keys = _iterkeys + values = _itervalues + else: + iteritems = _iteritems + iterkeys = _iterkeys + itervalues = _itervalues + + def items(self): + return [(k, self[k]) for k in self.keyOrder] + + def keys(self): + return self.keyOrder[:] + + def values(self): + return [self[k] for k in self.keyOrder] + + def update(self, dict_): + for k, v in iteritems_compat(dict_): + self[k] = v + + def setdefault(self, key, default): + if key not in self: + self.keyOrder.append(key) + return super(OrderedDict, self).setdefault(key, default) + + def value_for_index(self, index): + """Returns the value of the item at the given zero-based index.""" + return self[self.keyOrder[index]] + + def insert(self, index, key, value): + """Inserts the key, value pair before the item with the given index.""" + if key in self.keyOrder: + n = self.keyOrder.index(key) + del self.keyOrder[n] + if n < index: + index -= 1 + self.keyOrder.insert(index, key) + super(OrderedDict, self).__setitem__(key, value) + + def copy(self): + """Returns a copy of this object.""" + # This way of initializing the copy means it works for subclasses, too. + return self.__class__(self) + + def __repr__(self): + """ + Replaces the normal dict.__repr__ with a version that returns the keys + in their Ordered order. + """ + return '{%s}' % ', '.join(['%r: %r' % (k, v) for k, v in iteritems_compat(self)]) + + def clear(self): + super(OrderedDict, self).clear() + self.keyOrder = [] + + def index(self, key): + """ Return the index of a given key. """ + try: + return self.keyOrder.index(key) + except ValueError: + raise ValueError("Element '%s' was not found in OrderedDict" % key) + + def index_for_location(self, location): + """ Return index or None for a given location. """ + if location == '_begin': + i = 0 + elif location == '_end': + i = None + elif location.startswith('<') or location.startswith('>'): + i = self.index(location[1:]) + if location.startswith('>'): + if i >= len(self): + # last item + i = None + else: + i += 1 + else: + raise ValueError('Not a valid location: "%s". Location key ' + 'must start with a ">" or "<".' % location) + return i + + def add(self, key, value, location): + """ Insert by key location. """ + i = self.index_for_location(location) + if i is not None: + self.insert(i, key, value) + else: + self.__setitem__(key, value) + + def link(self, key, location): + """ Change location of an existing item. """ + n = self.keyOrder.index(key) + del self.keyOrder[n] + try: + i = self.index_for_location(location) + if i is not None: + self.keyOrder.insert(i, key) + else: + self.keyOrder.append(key) + except Exception as e: + # restore to prevent data loss and reraise + self.keyOrder.insert(n, key) + raise e diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/postprocessors.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/postprocessors.py new file mode 100644 index 0000000..5f3f032 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/postprocessors.py @@ -0,0 +1,104 @@ +""" +POST-PROCESSORS +============================================================================= + +Markdown also allows post-processors, which are similar to preprocessors in +that they need to implement a "run" method. However, they are run after core +processing. + +""" + +from __future__ import absolute_import +from __future__ import unicode_literals +from . import util +from . import odict +import re + + +def build_postprocessors(md_instance, **kwargs): + """ Build the default postprocessors for Markdown. """ + postprocessors = odict.OrderedDict() + postprocessors["raw_html"] = RawHtmlPostprocessor(md_instance) + postprocessors["amp_substitute"] = AndSubstitutePostprocessor() + postprocessors["unescape"] = UnescapePostprocessor() + return postprocessors + + +class Postprocessor(util.Processor): + """ + Postprocessors are run after the ElementTree it converted back into text. + + Each Postprocessor implements a "run" method that takes a pointer to a + text string, modifies it as necessary and returns a text string. + + Postprocessors must extend markdown.Postprocessor. + + """ + + def run(self, text): + """ + Subclasses of Postprocessor should implement a `run` method, which + takes the html document as a single text string and returns a + (possibly modified) string. + + """ + pass + + +class RawHtmlPostprocessor(Postprocessor): + """ Restore raw html to the document. """ + + def run(self, text): + """ Iterate over html stash and restore "safe" html. """ + for i in range(self.markdown.htmlStash.html_counter): + html, safe = self.markdown.htmlStash.rawHtmlBlocks[i] + if self.markdown.safeMode and not safe: + if str(self.markdown.safeMode).lower() == 'escape': + html = self.escape(html) + elif str(self.markdown.safeMode).lower() == 'remove': + html = '' + else: + html = self.markdown.html_replacement_text + if self.isblocklevel(html) and (safe or not self.markdown.safeMode): + text = text.replace("<p>%s</p>" % + (self.markdown.htmlStash.get_placeholder(i)), + html + "\n") + text = text.replace(self.markdown.htmlStash.get_placeholder(i), + html) + return text + + def escape(self, html): + """ Basic html escaping """ + html = html.replace('&', '&') + html = html.replace('<', '<') + html = html.replace('>', '>') + return html.replace('"', '"') + + def isblocklevel(self, html): + m = re.match(r'^\<\/?([^ >]+)', html) + if m: + if m.group(1)[0] in ('!', '?', '@', '%'): + # Comment, php etc... + return True + return util.isBlockLevel(m.group(1)) + return False + + +class AndSubstitutePostprocessor(Postprocessor): + """ Restore valid entities """ + + def run(self, text): + text = text.replace(util.AMP_SUBSTITUTE, "&") + return text + + +class UnescapePostprocessor(Postprocessor): + """ Restore escaped chars """ + + RE = re.compile('%s(\d+)%s' % (util.STX, util.ETX)) + + def unescape(self, m): + return util.int2str(int(m.group(1))) + + def run(self, text): + return self.RE.sub(self.unescape, text) diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/preprocessors.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/preprocessors.py new file mode 100644 index 0000000..72b2ed6 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/preprocessors.py @@ -0,0 +1,298 @@ +""" +PRE-PROCESSORS +============================================================================= + +Preprocessors work on source text before we start doing anything too +complicated. +""" + +from __future__ import absolute_import +from __future__ import unicode_literals +from . import util +from . import odict +import re + + +def build_preprocessors(md_instance, **kwargs): + """ Build the default set of preprocessors used by Markdown. """ + preprocessors = odict.OrderedDict() + preprocessors['normalize_whitespace'] = NormalizeWhitespace(md_instance) + if md_instance.safeMode != 'escape': + preprocessors["html_block"] = HtmlBlockPreprocessor(md_instance) + preprocessors["reference"] = ReferencePreprocessor(md_instance) + return preprocessors + + +class Preprocessor(util.Processor): + """ + Preprocessors are run after the text is broken into lines. + + Each preprocessor implements a "run" method that takes a pointer to a + list of lines of the document, modifies it as necessary and returns + either the same pointer or a pointer to a new list. + + Preprocessors must extend markdown.Preprocessor. + + """ + def run(self, lines): + """ + Each subclass of Preprocessor should override the `run` method, which + takes the document as a list of strings split by newlines and returns + the (possibly modified) list of lines. + + """ + pass + + +class NormalizeWhitespace(Preprocessor): + """ Normalize whitespace for consistant parsing. """ + + def run(self, lines): + source = '\n'.join(lines) + source = source.replace(util.STX, "").replace(util.ETX, "") + source = source.replace("\r\n", "\n").replace("\r", "\n") + "\n\n" + source = source.expandtabs(self.markdown.tab_length) + source = re.sub(r'(?<=\n) +\n', '\n', source) + return source.split('\n') + + +class HtmlBlockPreprocessor(Preprocessor): + """Remove html blocks from the text and store them for later retrieval.""" + + right_tag_patterns = ["</%s>", "%s>"] + attrs_pattern = r""" + \s+(?P<attr>[^>"'/= ]+)=(?P<q>['"])(?P<value>.*?)(?P=q) # attr="value" + | # OR + \s+(?P<attr1>[^>"'/= ]+)=(?P<value1>[^> ]+) # attr=value + | # OR + \s+(?P<attr2>[^>"'/= ]+) # attr + """ + left_tag_pattern = r'^\<(?P<tag>[^> ]+)(?P<attrs>(%s)*)\s*\/?\>?' % attrs_pattern + attrs_re = re.compile(attrs_pattern, re.VERBOSE) + left_tag_re = re.compile(left_tag_pattern, re.VERBOSE) + markdown_in_raw = False + + def _get_left_tag(self, block): + m = self.left_tag_re.match(block) + if m: + tag = m.group('tag') + raw_attrs = m.group('attrs') + attrs = {} + if raw_attrs: + for ma in self.attrs_re.finditer(raw_attrs): + if ma.group('attr'): + if ma.group('value'): + attrs[ma.group('attr').strip()] = ma.group('value') + else: + attrs[ma.group('attr').strip()] = "" + elif ma.group('attr1'): + if ma.group('value1'): + attrs[ma.group('attr1').strip()] = ma.group('value1') + else: + attrs[ma.group('attr1').strip()] = "" + elif ma.group('attr2'): + attrs[ma.group('attr2').strip()] = "" + return tag, len(m.group(0)), attrs + else: + tag = block[1:].split(">", 1)[0].lower() + return tag, len(tag)+2, {} + + def _recursive_tagfind(self, ltag, rtag, start_index, block): + while 1: + i = block.find(rtag, start_index) + if i == -1: + return -1 + j = block.find(ltag, start_index) + # if no ltag, or rtag found before another ltag, return index + if (j > i or j == -1): + return i + len(rtag) + # another ltag found before rtag, use end of ltag as starting + # point and search again + j = block.find('>', j) + start_index = self._recursive_tagfind(ltag, rtag, j + 1, block) + if start_index == -1: + # HTML potentially malformed- ltag has no corresponding + # rtag + return -1 + + def _get_right_tag(self, left_tag, left_index, block): + for p in self.right_tag_patterns: + tag = p % left_tag + i = self._recursive_tagfind("<%s" % left_tag, tag, left_index, block) + if i > 2: + return tag.lstrip("<").rstrip(">"), i + return block.rstrip()[-left_index:-1].lower(), len(block) + + def _equal_tags(self, left_tag, right_tag): + if left_tag[0] in ['?', '@', '%']: # handle PHP, etc. + return True + if ("/" + left_tag) == right_tag: + return True + if (right_tag == "--" and left_tag == "--"): + return True + elif left_tag == right_tag[1:] \ + and right_tag[0] == "/": + return True + else: + return False + + def _is_oneliner(self, tag): + return (tag in ['hr', 'hr/']) + + def run(self, lines): + text = "\n".join(lines) + new_blocks = [] + text = text.rsplit("\n\n") + items = [] + left_tag = '' + right_tag = '' + in_tag = False # flag + + while text: + block = text[0] + if block.startswith("\n"): + block = block[1:] + text = text[1:] + + if block.startswith("\n"): + block = block[1:] + + if not in_tag: + if block.startswith("<") and len(block.strip()) > 1: + + if block[1] == "!": + # is a comment block + left_tag, left_index, attrs = "--", 2, {} + else: + left_tag, left_index, attrs = self._get_left_tag(block) + right_tag, data_index = self._get_right_tag(left_tag, + left_index, + block) + # keep checking conditions below and maybe just append + + if data_index < len(block) \ + and (util.isBlockLevel(left_tag) + or left_tag == '--'): + text.insert(0, block[data_index:]) + block = block[:data_index] + + if not (util.isBlockLevel(left_tag) \ + or block[1] in ["!", "?", "@", "%"]): + new_blocks.append(block) + continue + + if self._is_oneliner(left_tag): + new_blocks.append(block.strip()) + continue + + if block.rstrip().endswith(">") \ + and self._equal_tags(left_tag, right_tag): + if self.markdown_in_raw and 'markdown' in attrs.keys(): + start = re.sub(r'\smarkdown(=[\'"]?[^> ]*[\'"]?)?', + '', block[:left_index]) + end = block[-len(right_tag)-2:] + block = block[left_index:-len(right_tag)-2] + new_blocks.append( + self.markdown.htmlStash.store(start)) + new_blocks.append(block) + new_blocks.append( + self.markdown.htmlStash.store(end)) + else: + new_blocks.append( + self.markdown.htmlStash.store(block.strip())) + continue + else: + # if is block level tag and is not complete + + if util.isBlockLevel(left_tag) or left_tag == "--" \ + and not block.rstrip().endswith(">"): + items.append(block.strip()) + in_tag = True + else: + new_blocks.append( + self.markdown.htmlStash.store(block.strip())) + + continue + + new_blocks.append(block) + + else: + items.append(block) + + right_tag, data_index = self._get_right_tag(left_tag, 0, block) + + if self._equal_tags(left_tag, right_tag): + # if find closing tag + + if data_index < len(block): + # we have more text after right_tag + items[-1] = block[:data_index] + text.insert(0, block[data_index:]) + + in_tag = False + if self.markdown_in_raw and 'markdown' in attrs.keys(): + start = re.sub(r'\smarkdown(=[\'"]?[^> ]*[\'"]?)?', + '', items[0][:left_index]) + items[0] = items[0][left_index:] + end = items[-1][-len(right_tag)-2:] + items[-1] = items[-1][:-len(right_tag)-2] + new_blocks.append( + self.markdown.htmlStash.store(start)) + new_blocks.extend(items) + new_blocks.append( + self.markdown.htmlStash.store(end)) + else: + new_blocks.append( + self.markdown.htmlStash.store('\n\n'.join(items))) + items = [] + + if items: + if self.markdown_in_raw and 'markdown' in attrs.keys(): + start = re.sub(r'\smarkdown(=[\'"]?[^> ]*[\'"]?)?', + '', items[0][:left_index]) + items[0] = items[0][left_index:] + end = items[-1][-len(right_tag)-2:] + items[-1] = items[-1][:-len(right_tag)-2] + new_blocks.append( + self.markdown.htmlStash.store(start)) + new_blocks.extend(items) + if end.strip(): + new_blocks.append( + self.markdown.htmlStash.store(end)) + else: + new_blocks.append( + self.markdown.htmlStash.store('\n\n'.join(items))) + #new_blocks.append(self.markdown.htmlStash.store('\n\n'.join(items))) + new_blocks.append('\n') + + new_text = "\n\n".join(new_blocks) + return new_text.split("\n") + + +class ReferencePreprocessor(Preprocessor): + """ Remove reference definitions from text and store for later use. """ + + TITLE = r'[ ]*(\"(.*)\"|\'(.*)\'|\((.*)\))[ ]*' + RE = re.compile(r'^[ ]{0,3}\[([^\]]*)\]:\s*([^ ]*)[ ]*(%s)?$' % TITLE, re.DOTALL) + TITLE_RE = re.compile(r'^%s$' % TITLE) + + def run (self, lines): + new_text = []; + while lines: + line = lines.pop(0) + m = self.RE.match(line) + if m: + id = m.group(1).strip().lower() + link = m.group(2).lstrip('<').rstrip('>') + t = m.group(5) or m.group(6) or m.group(7) + if not t: + # Check next line for title + tm = self.TITLE_RE.match(lines[0]) + if tm: + lines.pop(0) + t = tm.group(2) or tm.group(3) or tm.group(4) + self.markdown.references[id] = (link, t) + else: + new_text.append(line) + + return new_text #+ "\n" diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/serializers.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/serializers.py new file mode 100644 index 0000000..b19d61c --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/serializers.py @@ -0,0 +1,277 @@ +# markdown/searializers.py +# +# Add x/html serialization to Elementree +# Taken from ElementTree 1.3 preview with slight modifications +# +# Copyright (c) 1999-2007 by Fredrik Lundh. All rights reserved. +# +# fredrik@pythonware.com +# http://www.pythonware.com +# +# -------------------------------------------------------------------- +# The ElementTree toolkit is +# +# Copyright (c) 1999-2007 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY +# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS +# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE +# OF THIS SOFTWARE. +# -------------------------------------------------------------------- + + +from __future__ import absolute_import +from __future__ import unicode_literals +from . import util +ElementTree = util.etree.ElementTree +QName = util.etree.QName +if hasattr(util.etree, 'test_comment'): + Comment = util.etree.test_comment +else: + Comment = util.etree.Comment +PI = util.etree.PI +ProcessingInstruction = util.etree.ProcessingInstruction + +__all__ = ['to_html_string', 'to_xhtml_string'] + +HTML_EMPTY = ("area", "base", "basefont", "br", "col", "frame", "hr", + "img", "input", "isindex", "link", "meta" "param") + +try: + HTML_EMPTY = set(HTML_EMPTY) +except NameError: + pass + +_namespace_map = { + # "well-known" namespace prefixes + "http://www.w3.org/XML/1998/namespace": "xml", + "http://www.w3.org/1999/xhtml": "html", + "http://www.w3.org/1999/02/22-rdf-syntax-ns#": "rdf", + "http://schemas.xmlsoap.org/wsdl/": "wsdl", + # xml schema + "http://www.w3.org/2001/XMLSchema": "xs", + "http://www.w3.org/2001/XMLSchema-instance": "xsi", + # dublic core + "http://purl.org/dc/elements/1.1/": "dc", +} + + +def _raise_serialization_error(text): + raise TypeError( + "cannot serialize %r (type %s)" % (text, type(text).__name__) + ) + +def _encode(text, encoding): + try: + return text.encode(encoding, "xmlcharrefreplace") + except (TypeError, AttributeError): + _raise_serialization_error(text) + +def _escape_cdata(text): + # escape character data + try: + # it's worth avoiding do-nothing calls for strings that are + # shorter than 500 character, or so. assume that's, by far, + # the most common case in most applications. + if "&" in text: + text = text.replace("&", "&") + if "<" in text: + text = text.replace("<", "<") + if ">" in text: + text = text.replace(">", ">") + return text + except (TypeError, AttributeError): + _raise_serialization_error(text) + + +def _escape_attrib(text): + # escape attribute value + try: + if "&" in text: + text = text.replace("&", "&") + if "<" in text: + text = text.replace("<", "<") + if ">" in text: + text = text.replace(">", ">") + if "\"" in text: + text = text.replace("\"", """) + if "\n" in text: + text = text.replace("\n", " ") + return text + except (TypeError, AttributeError): + _raise_serialization_error(text) + +def _escape_attrib_html(text): + # escape attribute value + try: + if "&" in text: + text = text.replace("&", "&") + if "<" in text: + text = text.replace("<", "<") + if ">" in text: + text = text.replace(">", ">") + if "\"" in text: + text = text.replace("\"", """) + return text + except (TypeError, AttributeError): + _raise_serialization_error(text) + + +def _serialize_html(write, elem, qnames, namespaces, format): + tag = elem.tag + text = elem.text + if tag is Comment: + write("<!--%s-->" % _escape_cdata(text)) + elif tag is ProcessingInstruction: + write("<?%s?>" % _escape_cdata(text)) + else: + tag = qnames[tag] + if tag is None: + if text: + write(_escape_cdata(text)) + for e in elem: + _serialize_html(write, e, qnames, None, format) + else: + write("<" + tag) + items = elem.items() + if items or namespaces: + items.sort() # lexical order + for k, v in items: + if isinstance(k, QName): + k = k.text + if isinstance(v, QName): + v = qnames[v.text] + else: + v = _escape_attrib_html(v) + if qnames[k] == v and format == 'html': + # handle boolean attributes + write(" %s" % v) + else: + write(" %s=\"%s\"" % (qnames[k], v)) + if namespaces: + items = namespaces.items() + items.sort(key=lambda x: x[1]) # sort on prefix + for v, k in items: + if k: + k = ":" + k + write(" xmlns%s=\"%s\"" % (k, _escape_attrib(v))) + if format == "xhtml" and tag in HTML_EMPTY: + write(" />") + else: + write(">") + tag = tag.lower() + if text: + if tag == "script" or tag == "style": + write(text) + else: + write(_escape_cdata(text)) + for e in elem: + _serialize_html(write, e, qnames, None, format) + if tag not in HTML_EMPTY: + write("</" + tag + ">") + if elem.tail: + write(_escape_cdata(elem.tail)) + +def _write_html(root, + encoding=None, + default_namespace=None, + format="html"): + assert root is not None + data = [] + write = data.append + qnames, namespaces = _namespaces(root, default_namespace) + _serialize_html(write, root, qnames, namespaces, format) + if encoding is None: + return "".join(data) + else: + return _encode("".join(data)) + + +# -------------------------------------------------------------------- +# serialization support + +def _namespaces(elem, default_namespace=None): + # identify namespaces used in this tree + + # maps qnames to *encoded* prefix:local names + qnames = {None: None} + + # maps uri:s to prefixes + namespaces = {} + if default_namespace: + namespaces[default_namespace] = "" + + def add_qname(qname): + # calculate serialized qname representation + try: + if qname[:1] == "{": + uri, tag = qname[1:].split("}", 1) + prefix = namespaces.get(uri) + if prefix is None: + prefix = _namespace_map.get(uri) + if prefix is None: + prefix = "ns%d" % len(namespaces) + if prefix != "xml": + namespaces[uri] = prefix + if prefix: + qnames[qname] = "%s:%s" % (prefix, tag) + else: + qnames[qname] = tag # default element + else: + if default_namespace: + raise ValueError( + "cannot use non-qualified names with " + "default_namespace option" + ) + qnames[qname] = qname + except TypeError: + _raise_serialization_error(qname) + + # populate qname and namespaces table + try: + iterate = elem.iter + except AttributeError: + iterate = elem.getiterator # cET compatibility + for elem in iterate(): + tag = elem.tag + if isinstance(tag, QName) and tag.text not in qnames: + add_qname(tag.text) + elif isinstance(tag, util.string_type): + if tag not in qnames: + add_qname(tag) + elif tag is not None and tag is not Comment and tag is not PI: + _raise_serialization_error(tag) + for key, value in elem.items(): + if isinstance(key, QName): + key = key.text + if key not in qnames: + add_qname(key) + if isinstance(value, QName) and value.text not in qnames: + add_qname(value.text) + text = elem.text + if isinstance(text, QName) and text.text not in qnames: + add_qname(text.text) + return qnames, namespaces + +def to_html_string(element): + return _write_html(ElementTree(element).getroot(), format="html") + +def to_xhtml_string(element): + return _write_html(ElementTree(element).getroot(), format="xhtml") diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/treeprocessors.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/treeprocessors.py new file mode 100644 index 0000000..e6d3dc9 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/treeprocessors.py @@ -0,0 +1,360 @@ +from __future__ import unicode_literals +from __future__ import absolute_import +from . import util +from . import odict +from . import inlinepatterns + + +def build_treeprocessors(md_instance, **kwargs): + """ Build the default treeprocessors for Markdown. """ + treeprocessors = odict.OrderedDict() + treeprocessors["inline"] = InlineProcessor(md_instance) + treeprocessors["prettify"] = PrettifyTreeprocessor(md_instance) + return treeprocessors + + +def isString(s): + """ Check if it's string """ + if not isinstance(s, util.AtomicString): + return isinstance(s, util.string_type) + return False + + +class Treeprocessor(util.Processor): + """ + Treeprocessors are run on the ElementTree object before serialization. + + Each Treeprocessor implements a "run" method that takes a pointer to an + ElementTree, modifies it as necessary and returns an ElementTree + object. + + Treeprocessors must extend markdown.Treeprocessor. + + """ + def run(self, root): + """ + Subclasses of Treeprocessor should implement a `run` method, which + takes a root ElementTree. This method can return another ElementTree + object, and the existing root ElementTree will be replaced, or it can + modify the current tree and return None. + """ + pass + + +class InlineProcessor(Treeprocessor): + """ + A Treeprocessor that traverses a tree, applying inline patterns. + """ + + def __init__(self, md): + self.__placeholder_prefix = util.INLINE_PLACEHOLDER_PREFIX + self.__placeholder_suffix = util.ETX + self.__placeholder_length = 4 + len(self.__placeholder_prefix) \ + + len(self.__placeholder_suffix) + self.__placeholder_re = util.INLINE_PLACEHOLDER_RE + self.markdown = md + + def __makePlaceholder(self, type): + """ Generate a placeholder """ + id = "%04d" % len(self.stashed_nodes) + hash = util.INLINE_PLACEHOLDER % id + return hash, id + + def __findPlaceholder(self, data, index): + """ + Extract id from data string, start from index + + Keyword arguments: + + * data: string + * index: index, from which we start search + + Returns: placeholder id and string index, after the found placeholder. + + """ + m = self.__placeholder_re.search(data, index) + if m: + return m.group(1), m.end() + else: + return None, index + 1 + + def __stashNode(self, node, type): + """ Add node to stash """ + placeholder, id = self.__makePlaceholder(type) + self.stashed_nodes[id] = node + return placeholder + + def __handleInline(self, data, patternIndex=0): + """ + Process string with inline patterns and replace it + with placeholders + + Keyword arguments: + + * data: A line of Markdown text + * patternIndex: The index of the inlinePattern to start with + + Returns: String with placeholders. + + """ + if not isinstance(data, util.AtomicString): + startIndex = 0 + while patternIndex < len(self.markdown.inlinePatterns): + data, matched, startIndex = self.__applyPattern( + self.markdown.inlinePatterns.value_for_index(patternIndex), + data, patternIndex, startIndex) + if not matched: + patternIndex += 1 + return data + + def __processElementText(self, node, subnode, isText=True): + """ + Process placeholders in Element.text or Element.tail + of Elements popped from self.stashed_nodes. + + Keywords arguments: + + * node: parent node + * subnode: processing node + * isText: bool variable, True - it's text, False - it's tail + + Returns: None + + """ + if isText: + text = subnode.text + subnode.text = None + else: + text = subnode.tail + subnode.tail = None + + childResult = self.__processPlaceholders(text, subnode) + + if not isText and node is not subnode: + pos = node.getchildren().index(subnode) + node.remove(subnode) + else: + pos = 0 + + childResult.reverse() + for newChild in childResult: + node.insert(pos, newChild) + + def __processPlaceholders(self, data, parent): + """ + Process string with placeholders and generate ElementTree tree. + + Keyword arguments: + + * data: string with placeholders instead of ElementTree elements. + * parent: Element, which contains processing inline data + + Returns: list with ElementTree elements with applied inline patterns. + + """ + def linkText(text): + if text: + if result: + if result[-1].tail: + result[-1].tail += text + else: + result[-1].tail = text + else: + if parent.text: + parent.text += text + else: + parent.text = text + result = [] + strartIndex = 0 + while data: + index = data.find(self.__placeholder_prefix, strartIndex) + if index != -1: + id, phEndIndex = self.__findPlaceholder(data, index) + + if id in self.stashed_nodes: + node = self.stashed_nodes.get(id) + + if index > 0: + text = data[strartIndex:index] + linkText(text) + + if not isString(node): # it's Element + for child in [node] + node.getchildren(): + if child.tail: + if child.tail.strip(): + self.__processElementText(node, child,False) + if child.text: + if child.text.strip(): + self.__processElementText(child, child) + else: # it's just a string + linkText(node) + strartIndex = phEndIndex + continue + + strartIndex = phEndIndex + result.append(node) + + else: # wrong placeholder + end = index + len(self.__placeholder_prefix) + linkText(data[strartIndex:end]) + strartIndex = end + else: + text = data[strartIndex:] + if isinstance(data, util.AtomicString): + # We don't want to loose the AtomicString + text = util.AtomicString(text) + linkText(text) + data = "" + + return result + + def __applyPattern(self, pattern, data, patternIndex, startIndex=0): + """ + Check if the line fits the pattern, create the necessary + elements, add it to stashed_nodes. + + Keyword arguments: + + * data: the text to be processed + * pattern: the pattern to be checked + * patternIndex: index of current pattern + * startIndex: string index, from which we start searching + + Returns: String with placeholders instead of ElementTree elements. + + """ + match = pattern.getCompiledRegExp().match(data[startIndex:]) + leftData = data[:startIndex] + + if not match: + return data, False, 0 + + node = pattern.handleMatch(match) + + if node is None: + return data, True, len(leftData)+match.span(len(match.groups()))[0] + + if not isString(node): + if not isinstance(node.text, util.AtomicString): + # We need to process current node too + for child in [node] + node.getchildren(): + if not isString(node): + if child.text: + child.text = self.__handleInline(child.text, + patternIndex + 1) + if child.tail: + child.tail = self.__handleInline(child.tail, + patternIndex) + + placeholder = self.__stashNode(node, pattern.type()) + + return "%s%s%s%s" % (leftData, + match.group(1), + placeholder, match.groups()[-1]), True, 0 + + def run(self, tree): + """Apply inline patterns to a parsed Markdown tree. + + Iterate over ElementTree, find elements with inline tag, apply inline + patterns and append newly created Elements to tree. If you don't + want to process your data with inline paterns, instead of normal string, + use subclass AtomicString: + + node.text = markdown.AtomicString("This will not be processed.") + + Arguments: + + * tree: ElementTree object, representing Markdown tree. + + Returns: ElementTree object with applied inline patterns. + + """ + self.stashed_nodes = {} + + stack = [tree] + + while stack: + currElement = stack.pop() + insertQueue = [] + for child in currElement.getchildren(): + if child.text and not isinstance(child.text, util.AtomicString): + text = child.text + child.text = None + lst = self.__processPlaceholders(self.__handleInline( + text), child) + stack += lst + insertQueue.append((child, lst)) + if child.tail: + tail = self.__handleInline(child.tail) + dumby = util.etree.Element('d') + tailResult = self.__processPlaceholders(tail, dumby) + if dumby.text: + child.tail = dumby.text + else: + child.tail = None + pos = currElement.getchildren().index(child) + 1 + tailResult.reverse() + for newChild in tailResult: + currElement.insert(pos, newChild) + if child.getchildren(): + stack.append(child) + + for element, lst in insertQueue: + if self.markdown.enable_attributes: + if element.text and isString(element.text): + element.text = \ + inlinepatterns.handleAttributes(element.text, + element) + i = 0 + for newChild in lst: + if self.markdown.enable_attributes: + # Processing attributes + if newChild.tail and isString(newChild.tail): + newChild.tail = \ + inlinepatterns.handleAttributes(newChild.tail, + element) + if newChild.text and isString(newChild.text): + newChild.text = \ + inlinepatterns.handleAttributes(newChild.text, + newChild) + element.insert(i, newChild) + i += 1 + return tree + + +class PrettifyTreeprocessor(Treeprocessor): + """ Add linebreaks to the html document. """ + + def _prettifyETree(self, elem): + """ Recursively add linebreaks to ElementTree children. """ + + i = "\n" + if util.isBlockLevel(elem.tag) and elem.tag not in ['code', 'pre']: + if (not elem.text or not elem.text.strip()) \ + and len(elem) and util.isBlockLevel(elem[0].tag): + elem.text = i + for e in elem: + if util.isBlockLevel(e.tag): + self._prettifyETree(e) + if not elem.tail or not elem.tail.strip(): + elem.tail = i + if not elem.tail or not elem.tail.strip(): + elem.tail = i + + def run(self, root): + """ Add linebreaks to ElementTree root object. """ + + self._prettifyETree(root) + # Do <br />'s seperately as they are often in the middle of + # inline content and missed by _prettifyETree. + brs = root.getiterator('br') + for br in brs: + if not br.tail or not br.tail.strip(): + br.tail = '\n' + else: + br.tail = '\n%s' % br.tail + # Clean up extra empty lines at end of code blocks. + pres = root.getiterator('pre') + for pre in pres: + if len(pre) and pre[0].tag == 'code': + pre[0].text = pre[0].text.rstrip() + '\n' diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/util.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/util.py new file mode 100644 index 0000000..1036197 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/markdown/util.py @@ -0,0 +1,136 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals +import re +import sys + + +""" +Python 3 Stuff +============================================================================= +""" +PY3 = sys.version_info[0] == 3 + +if PY3: + string_type = str + text_type = str + int2str = chr +else: + string_type = basestring + text_type = unicode + int2str = unichr + + +""" +Constants you might want to modify +----------------------------------------------------------------------------- +""" + +BLOCK_LEVEL_ELEMENTS = re.compile("^(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul" + "|script|noscript|form|fieldset|iframe|math" + "|hr|hr/|style|li|dt|dd|thead|tbody" + "|tr|th|td|section|footer|header|group|figure" + "|figcaption|aside|article|canvas|output" + "|progress|video)$", re.IGNORECASE) +# Placeholders +STX = '\u0002' # Use STX ("Start of text") for start-of-placeholder +ETX = '\u0003' # Use ETX ("End of text") for end-of-placeholder +INLINE_PLACEHOLDER_PREFIX = STX+"klzzwxh:" +INLINE_PLACEHOLDER = INLINE_PLACEHOLDER_PREFIX + "%s" + ETX +INLINE_PLACEHOLDER_RE = re.compile(INLINE_PLACEHOLDER % r'([0-9]{4})') +AMP_SUBSTITUTE = STX+"amp"+ETX + +""" +Constants you probably do not need to change +----------------------------------------------------------------------------- +""" + +RTL_BIDI_RANGES = ( ('\u0590', '\u07FF'), + # Hebrew (0590-05FF), Arabic (0600-06FF), + # Syriac (0700-074F), Arabic supplement (0750-077F), + # Thaana (0780-07BF), Nko (07C0-07FF). + ('\u2D30', '\u2D7F'), # Tifinagh + ) + +# Extensions should use "markdown.util.etree" instead of "etree" (or do `from +# markdown.util import etree`). Do not import it by yourself. + +try: # Is the C implemenation of ElementTree available? + import xml.etree.cElementTree as etree + from xml.etree.ElementTree import Comment + # Serializers (including ours) test with non-c Comment + etree.test_comment = Comment + if etree.VERSION < "1.0.5": + raise RuntimeError("cElementTree version 1.0.5 or higher is required.") +except (ImportError, RuntimeError): + # Use the Python implementation of ElementTree? + import xml.etree.ElementTree as etree + if etree.VERSION < "1.1": + raise RuntimeError("ElementTree version 1.1 or higher is required") + + +""" +AUXILIARY GLOBAL FUNCTIONS +============================================================================= +""" + + +def isBlockLevel(tag): + """Check if the tag is a block level HTML tag.""" + if isinstance(tag, string_type): + return BLOCK_LEVEL_ELEMENTS.match(tag) + # Some ElementTree tags are not strings, so return False. + return False + +""" +MISC AUXILIARY CLASSES +============================================================================= +""" + +class AtomicString(text_type): + """A string which should not be further processed.""" + pass + + +class Processor(object): + def __init__(self, markdown_instance=None): + if markdown_instance: + self.markdown = markdown_instance + + +class HtmlStash(object): + """ + This class is used for stashing HTML objects that we extract + in the beginning and replace with place-holders. + """ + + def __init__ (self): + """ Create a HtmlStash. """ + self.html_counter = 0 # for counting inline html segments + self.rawHtmlBlocks=[] + + def store(self, html, safe=False): + """ + Saves an HTML segment for later reinsertion. Returns a + placeholder string that needs to be inserted into the + document. + + Keyword arguments: + + * html: an html segment + * safe: label an html segment as safe for safemode + + Returns : a placeholder string + + """ + self.rawHtmlBlocks.append((html, safe)) + placeholder = self.get_placeholder(self.html_counter) + self.html_counter += 1 + return placeholder + + def reset(self): + self.html_counter = 0 + self.rawHtmlBlocks = [] + + def get_placeholder(self, key): + return "%swzxhzdk:%d%s" % (STX, key, ETX) + diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/mathjax.html b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/mathjax.html new file mode 100644 index 0000000..cefec1c --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/mathjax.html @@ -0,0 +1,26 @@ +<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> +<script> +MathJax.Hub.Config({ + config: ["MMLorHTML.js"], + extensions: ["tex2jax.js"], + jax: ["input/TeX"], + tex2jax: { + inlineMath: [ ['$','$'], ["\\(","\\)"] ], + displayMath: [ ['$$','$$'], ["\\[","\\]"] ], + processEscapes: false + }, + TeX: { + extensions: ["AMSmath.js", "AMSsymbols.js"], + TagSide: "right", + TagIndent: ".8em", + MultLineWidth: "85%", + equationNumbers: { + autoNumber: "AMS", + }, + unicode: { + fonts: "STIXGeneral,'Arial Unicode MS'" + } + }, + showProcessingMessages: false +}); +</script> diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/messages.json b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/messages.json new file mode 100644 index 0000000..9e8458b --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/messages.json @@ -0,0 +1,4 @@ +{ + "install": "README.md", + "1.0.2": "CHANGES.md" +} diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/package-metadata.json b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/package-metadata.json index 94a33d4..83265a8 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/package-metadata.json +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/package-metadata.json @@ -1 +1 @@ -{"url": "https://github.com/revolunet/sublimetext-markdown-preview", "version": "2013.04.01.18.50.45", "description": "markdown preview plugin for sublime text 2"} \ No newline at end of file +{"url": "https://github.com/revolunet/sublimetext-markdown-preview", "version": "1.0.3", "description": "markdown preview and build plugin for sublime text 2/3"} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/sample.html b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/sample.html index c63eacd..afe1c51 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/sample.html +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/sample.html @@ -1,108 +1,80 @@ <h1 id="sample-markdown-cheat-sheet">Sample Markdown Cheat Sheet</h1> - <p>This is a sample markdown file to help you write Markdown quickly :)</p> - -<p>If you use the fabulous <a href="http://sublimetext.com">Sublime Text 2 editor</a> along with the <a href="https://github.com/revolunet/sublimetext-markdown-preview">Markdown Preview plugin</a>, open your ST2 Palette with <code>CMD+P</code> then choose <code>Markdown Preview in browser</code> to see the result in your browser.</p> - +<p>If you use the fabulous <a href="http://sublimetext.com">Sublime Text 2/3 editor</a> along with the <a href="https://github.com/revolunet/sublimetext-markdown-preview">Markdown Preview plugin</a>, open your ST2 Palette with <code>CMD+P</code> then choose <code>Markdown Preview in browser</code> to see the result in your browser.</p> <h2 id="text-basics">Text basics</h2> - <p>this is <em>italic</em> and this is <strong>bold</strong> . another <em>italic</em> and another <strong>bold</strong></p> - <p>this is <code>important</code> text. and percentage signs : % and <code>%</code></p> - -<p>This is a paragraph with a footnote (builtin parser only). <sup class="footnote-ref" id="fnref-note-id"><a href="#fn-note-id">1</a></sup> </p> - -<p>Insert <code>[ toc ]</code> without spaces to generate a table of contents (builtin parser only).</p> - +<p>This is a paragraph with a footnote (builtin parser only). <sup id="fnref:note-id"><a class="footnote-ref" href="#fn:note-id" rel="footnote">1</a></sup></p> +<p>Insert <code>[ toc ]</code> without spaces to generate a table of contents (builtin parsers only).</p> <h2 id="indentation">Indentation</h2> - <blockquote> - <p>Here is some indented text</p> - - <blockquote> - <p>even more indented</p> - </blockquote> +<p>Here is some indented text</p> +<blockquote> +<p>even more indented</p> +</blockquote> </blockquote> - <h2 id="titles">Titles</h2> - <h1 id="big-title-h1">Big title (h1)</h1> - <h2 id="middle-title-h2">Middle title (h2)</h2> - <h3 id="smaller-title-h3">Smaller title (h3)</h3> - <h4 id="and-so-on-hx">and so on (hX)</h4> - -<h5 id="and-so-on-hx-2">and so on (hX)</h5> - -<h6 id="and-so-on-hx-3">and so on (hX)</h6> - +<h5 id="and-so-on-hx_1">and so on (hX)</h5> +<h6 id="and-so-on-hx_2">and so on (hX)</h6> <h2 id="example-lists-1">Example lists (1)</h2> - <ul> <li>bullets can be <code>-</code>, <code>+</code>, or <code>*</code></li> <li>bullet list 1</li> -<li><p>bullet list 2</p> - +<li> +<p>bullet list 2</p> <ul> <li>sub item 1</li> -<li><p>sub item 2</p> - -<p>with indented text inside</p></li> -</ul></li> -<li><p>bullet list 3</p></li> +<li> +<p>sub item 2</p> +<p>with indented text inside</p> +</li> +</ul> +</li> +<li> +<p>bullet list 3</p> +</li> <li>bullet list 4</li> <li>bullet list 5</li> </ul> - <h2 id="links">Links</h2> - <p>This is an <a href="http://lmgtfy.com/">example inline link</a> and <a href="http://lmgtfy.com/" title="Hello, world">another one with a title</a>.</p> - <p>Links can also be reference based : <a href="http://revolunet.com">reference 1</a> or <a href="http://revolunet.com" title="rich web apps">reference 2 with title</a>.</p> - <p>References are usually placed at the bottom of the document</p> - <h2 id="images">Images</h2> - <p>A sample image :</p> - -<p><img src="http://www.revolunet.com/static/parisjs8/img/logo-revolunet-carre.jpg" alt="revolunet logo" title="revolunet logo" /></p> - +<p><img alt="revolunet logo" src="http://www.revolunet.com/static/parisjs8/img/logo-revolunet-carre.jpg" title="revolunet logo" /></p> <p>As links, images can also use references instead of inline links :</p> - -<p><img src="http://www.revolunet.com/static/parisjs8/img/logo-revolunet-carre.jpg" alt="revolunet logo" title="revolunet logo" /></p> - +<p><img alt="revolunet logo" src="http://www.revolunet.com/static/parisjs8/img/logo-revolunet-carre.jpg" title="revolunet logo" /></p> <h2 id="code">Code</h2> - <p>It's quite easy to show code in markdown files.</p> - <p>Backticks can be used to <code>highlight</code> some words.</p> - -<p>Also, any indented block is considered a code block.</p> - +<p>Also, any indented block is considered a code block. If <code>enable_highlight</code> is <code>true</code>, syntax highlighting will be included (for the builtin parser - the github parser does this automatically).</p> <pre><code><script> document.location = 'http://lmgtfy.com/?q=markdown+cheat+sheet'; </script> </code></pre> - +<h2 id="math">Math</h2> +<p>When <code>enable_mathjax</code> is <code>true</code>, inline math can be included \(\frac{\pi}{2}\) $\pi$</p> +<p>Alternatively, math can be written on its own line:</p> +<p>$$F(\omega) = \frac{1}{\sqrt{2\pi}} \int_{-\infty}^{\infty} f(t) \, e^{ - i \omega t}dt$$</p> +<p>\[\int_0^1 f(t) \mathrm{d}t\]</p> +<p>\[\sum_j \gamma_j^2/d_j\]</p> <h2 id="github-flavored-markdown">GitHub Flavored Markdown</h2> - <p>If you use the Github parser, you can use some of <a href="http://github.github.com/github-flavored-markdown/">Github Flavored Markdown</a> syntax :</p> - <ul> <li>User/Project@SHA: revolunet/sublimetext-markdown-preview@7da61badeda468b5019869d11000307e07e07401</li> <li>User/Project#Issue: revolunet/sublimetext-markdown-preview#1</li> <li>User : @revolunet</li> </ul> - <p>Some Python code :</p> - -<pre><code>import random +<pre><code class="python">import random class CardGame(object): - """ a sample python class """ + """ a sample python class """ NB_CARDS = 32 def __init__(self, cards=5): self.cards = random.sample(range(self.NB_CARDS), 5) @@ -110,8 +82,7 @@ class CardGame(object): </code></pre> <p>Some Javascript code :</p> - -<pre><code>var config = { +<pre><code class="js">var config = { duration: 5, comment: 'WTF' } @@ -127,15 +98,175 @@ async_call('/path/to/api', function(json) { }) </code></pre> +<p>The Github Markdown also brings some <a href="http://www.emoji-cheat-sheet.com/">nice Emoji support</a> : :+1: :heart: :beer:</p> +<h2 id="parsers-and-extensions">Parsers and Extensions</h2> +<p>Markdown Preview comes with <strong>Python-Markdown</strong> and <strong>Markdown2</strong> preloaded.</p> +<h3 id="python-markdown"><em>Python-Markdown</em></h3> +<p>The <a href="https://github.com/waylan/Python-Markdown">Python-Markdown Parser</a> provides support for several extensions.</p> +<h4 id="extra-extensions">Extra Extensions</h4> +<ul> +<li><code>abbr</code> -- <a href="http://pythonhosted.org/Markdown/extensions/abbreviations.html">Abbreviations</a></li> +<li><code>attr_list</code> -- <a href="http://pythonhosted.org/Markdown/extensions/attr_list.html">Attribute Lists</a></li> +<li><code>def_list</code> -- <a href="http://pythonhosted.org/Markdown/extensions/definition_lists.html">Definition Lists</a></li> +<li><code>fenced_code</code> -- <a href="http://pythonhosted.org/Markdown/extensions/fenced_code_blocks.html">Fenced Code Blocks</a></li> +<li><code>footnotes</code> -- <a href="http://pythonhosted.org/Markdown/extensions/footnotes.html">Footnotes</a></li> +<li><code>tables</code> -- <a href="http://pythonhosted.org/Markdown/extensions/tables.html">Tables</a></li> +<li><code>smart_strong</code> -- <a href="http://pythonhosted.org/Markdown/extensions/smart_strong.html">Smart Strong</a></li> +</ul> +<p>You can enable them all at once using the <code>extra</code> keyword.</p> +<pre><code>extensions: [ 'extra' ] +</code></pre> +<p>If you want all the extras plus the <code>toc</code> extension, +your settings would look like this:</p> +<pre><code>{ + ... + parser: 'markdown', + extensions: ['extra', 'toc'], + ... +} +</code></pre> +<h4 id="other-extensions">Other Extensions</h4> +<p>There are also some extensions that are not included in Markdown Extra +but come in the standard Python-Markdown library.</p> +<ul> +<li><code>code-hilite</code> -- <a href="http://pythonhosted.org/Markdown/extensions/code_hilite.html">CodeHilite</a></li> +<li><code>html-tidy</code> -- <a href="http://pythonhosted.org/Markdown/extensions/html_tidy.html">HTML Tidy</a></li> +<li><code>header-id</code> -- <a href="http://pythonhosted.org/Markdown/extensions/header_id.html">HeaderId</a></li> +<li><code>meta_data</code> -- <a href="http://pythonhosted.org/Markdown/extensions/meta_data.html">Meta-Data</a></li> +<li><code>nl2br</code> -- <a href="http://pythonhosted.org/Markdown/extensions/nl2br.html">New Line to Break</a></li> +<li><code>rss</code> -- <a href="http://pythonhosted.org/Markdown/extensions/rss.html">RSS</a></li> +<li><code>sane_lists</code> -- <a href="http://pythonhosted.org/Markdown/extensions/sane_lists.html">Sane Lists</a></li> +<li><code>toc</code> -- <a href="http://pythonhosted.org/Markdown/extensions/toc.html">Table of Contents</a></li> +<li><code>wikilinks</code> -- <a href="http://pythonhosted.org/Markdown/extensions/wikilinks.html">WikiLinks</a></li> +</ul> +<h4 id="3rd-party-extensions">3rd Party Extensions</h4> +<p><em>Python-Markdown</em> is designed to be extended. +Just fork this repo and add your extensions inside the <code>.../Packages/Markdown Preview/markdown/extensions/</code> folder.</p> +<p>Check out the list of <a href="https://github.com/waylan/Python-Markdown/wiki/Third-Party-Extensions">3rd Party extensions</a>.</p> +<h4 id="default-extensions">Default Extensions</h4> +<p>The default extensions are:</p> +<ul> +<li><code>footnotes</code> -- <a href="http://pythonhosted.org/Markdown/extensions/footnotes.html">Footnotes</a></li> +<li><code>toc</code> -- <a href="http://pythonhosted.org/Markdown/extensions/toc.html">Table of Contents</a></li> +<li><code>fenced_code</code> -- <a href="http://pythonhosted.org/Markdown/extensions/fenced_code_blocks.html">Fenced Code Blocks</a> </li> +<li><code>tables</code> -- <a href="http://pythonhosted.org/Markdown/extensions/tables.html">Tables</a></li> +</ul> +<p>Use the <code>default</code> keyword, to select them all. +If you want all the defaults plus the <code>definition_lists</code> extension, +your settings would look like this:</p> +<pre><code>{ + ... + parser: 'markdown', + extensions: ['default', 'definition_lists'], + ... +} +</code></pre> +<h3 id="markdown2"><em>Markdown2</em></h3> +<p>The <a href="https://github.com/trentm/python-markdown2">Markdown2 Parser</a> also provides support for extensions, known as <a href="https://github.com/trentm/python-markdown2/wiki/Extras">Extras</a>. <br /> +You can configure the list of extras you want to use inside the package settings.</p> +<h4 id="default-extras">Default Extras</h4> +<p>The default extras are:</p> +<ul> +<li><code>footnotes</code> -- <a href="https://github.com/trentm/python-markdown2/wiki/footnotes">Footnotes</a></li> +<li><code>toc</code> -- Table of Contents</li> +<li><code>fenced-code-blocks</code> -- <a href="https://github.com/trentm/python-markdown2/wiki/fenced-code-blocks">Fenced CodeBlocks</a></li> +<li><code>cuddled-lists</code> -- <a href="https://github.com/trentm/python-markdown2/wiki/cuddled-lists">Cuddled Lists</a></li> +</ul> +<p>You can enable all default extras at once using the <code>default</code> keyword. +If you want all the default extras plus the 'wiki-table' extra, +your settings would look like this:</p> +<pre><code>{ + ... + parser: 'markdown2', + extensions: ['default', 'wiki-table'], + ... +} +</code></pre> +<h4 id="other-extras">Other Extras</h4> +<p>For a complete list of extras please checkout the <a href="https://github.com/trentm/python-markdown2/wiki/Extras">Extras Wiki Page</a>.</p> +<h2 id="examples">Examples</h2> +<h3 id="tables">Tables</h3> +<p>The <code>tables</code> extension of the <em>Python-Markdown</em> parser is activated by default, +but is currently <strong>not</strong> available in <em>Markdown2</em>.</p> +<p>The syntax was adopted from the <a href="http://michelf.ca/projects/php-markdown/extra/#table">php markdown project</a>, +and is also used in github flavoured markdown.</p> +<table> +<thead> +<tr> +<th>Year</th> +<th>Temperature (low)</th> +<th>Temperature (high)</th> +</tr> +</thead> +<tbody> +<tr> +<td>1900</td> +<td>-10</td> +<td>25</td> +</tr> +<tr> +<td>1910</td> +<td>-15</td> +<td>30</td> +</tr> +<tr> +<td>1920</td> +<td>-10</td> +<td>32</td> +</tr> +</tbody> +</table> +<h3 id="wiki-tables">Wiki Tables</h3> +<p>If you are using <em>Markdown2</em> with the <code>wiki-tables</code> extra activated you should see a table below:</p> +<table> +<thead> +<tr> +<th></th> +<th><em>Year</em></th> +<th></th> +<th><em>Temperature (low)</em></th> +<th></th> +<th><em>Temperature (high)</em></th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td></td> +<td>1910</td> +<td></td> +<td>-15</td> +<td></td> +<td>30</td> +<td></td> +</tr> +<tr> +<td></td> +<td>1920</td> +<td></td> +<td>-10</td> +<td></td> +<td>32</td> +<td></td> +</tr> +</tbody> +</table> +<h3 id="definition-lists">Definition Lists</h3> +<p>This example requires <em>Python Markdown</em>'s <code>def_list</code> extension.</p> +<dl> +<dt>Apple</dt> +<dd>Pomaceous fruit of plants of the genus Malus in +the family Rosaceae.</dd> +<dt>Orange</dt> +<dd>The fruit of an evergreen tree of the genus Citrus.</dd> +</dl> <h2 id="about">About</h2> - <p>This plugin and this sample file is proudly brought to you by the <a href="http://revolunet.com">revolunet team</a></p> - -<div class="footnotes"> +<div class="footnote"> <hr /> <ol> -<li id="fn-note-id"> -<p>This is the text of the note. <a href="#fnref-note-id" class="footnoteBackLink" title="Jump back to footnote 1 in the text.">↩</a></p> +<li id="fn:note-id"> +<p>This is the text of the note.  <a class="footnote-backref" href="#fnref:note-id" rev="footnote" title="Jump back to footnote 1 in the text">↩</a></p> </li> </ol> -</div> +</div> \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/sample.md b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/sample.md index abf7b25..f3fafc4 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/sample.md +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Markdown Preview/sample.md @@ -3,16 +3,16 @@ Sample Markdown Cheat Sheet This is a sample markdown file to help you write Markdown quickly :) -If you use the fabulous [Sublime Text 2 editor][ST2] along with the [Markdown Preview plugin][MarkdownPreview], open your ST2 Palette with `CMD+P` then choose `Markdown Preview in browser` to see the result in your browser. +If you use the fabulous [Sublime Text 2/3 editor][ST] along with the [Markdown Preview plugin][MarkdownPreview], open your ST2 Palette with `CMD+P` then choose `Markdown Preview in browser` to see the result in your browser. ## Text basics this is *italic* and this is **bold** . another _italic_ and another __bold__ this is `important` text. and percentage signs : % and `%` -This is a paragraph with a footnote (builtin parser only). [^note-id] +This is a paragraph with a footnote (builtin parser only). [^note-id] -Insert `[ toc ]` without spaces to generate a table of contents (builtin parser only). +Insert `[ toc ]` without spaces to generate a table of contents (builtin parsers only). ## Indentation > Here is some indented text @@ -65,12 +65,26 @@ It's quite easy to show code in markdown files. Backticks can be used to `highlight` some words. -Also, any indented block is considered a code block. +Also, any indented block is considered a code block. If `enable_highlight` is `true`, syntax highlighting will be included (for the builtin parser - the github parser does this automatically). <script> document.location = 'http://lmgtfy.com/?q=markdown+cheat+sheet'; </script> +## Math + +When `enable_mathjax` is `true`, inline math can be included \\(\frac{\pi}{2}\\) $\pi$ + +Alternatively, math can be written on its own line: + +$$F(\omega) = \frac{1}{\sqrt{2\pi}} \int_{-\infty}^{\infty} f(t) \, e^{ - i \omega t}dt$$ + +\\[\int_0^1 f(t) \mathrm{d}t\\] + +\\[\sum_j \gamma_j^2/d_j\\] + + + ## GitHub Flavored Markdown If you use the Github parser, you can use some of [Github Flavored Markdown][gfm] syntax : @@ -115,6 +129,187 @@ The Github Markdown also brings some [nice Emoji support][emoji] : :+1: :heart: [^note-id]: This is the text of the note. +## Parsers and Extensions + +Markdown Preview comes with **Python-Markdown** and **Markdown2** preloaded. + +### *Python-Markdown* + +The [Python-Markdown Parser][] provides support for several extensions. + +[Python-Markdown Parser]: https://github.com/waylan/Python-Markdown + +#### Extra Extensions + +* `abbr` -- [Abbreviations][] +* `attr_list` -- [Attribute Lists][] +* `def_list` -- [Definition Lists][] +* `fenced_code` -- [Fenced Code Blocks][] +* `footnotes` -- [Footnotes][] +* `tables` -- [Tables][] +* `smart_strong` -- [Smart Strong][] + +[Abbreviations]: http://pythonhosted.org/Markdown/extensions/abbreviations.html +[Attribute Lists]: http://pythonhosted.org/Markdown/extensions/attr_list.html +[Definition Lists]: http://pythonhosted.org/Markdown/extensions/definition_lists.html +[Fenced Code Blocks]: http://pythonhosted.org/Markdown/extensions/fenced_code_blocks.html +[Footnotes]: http://pythonhosted.org/Markdown/extensions/footnotes.html +[Tables]: http://pythonhosted.org/Markdown/extensions/tables.html +[Smart Strong]: http://pythonhosted.org/Markdown/extensions/smart_strong.html + + +You can enable them all at once using the `extra` keyword. + + extensions: [ 'extra' ] + +If you want all the extras plus the `toc` extension, +your settings would look like this: + + { + ... + parser: 'markdown', + extensions: ['extra', 'toc'], + ... + } + + +#### Other Extensions + +There are also some extensions that are not included in Markdown Extra +but come in the standard Python-Markdown library. + +* `code-hilite` -- [CodeHilite][] +* `html-tidy` -- [HTML Tidy][] +* `header-id` -- [HeaderId][] +* `meta_data` -- [Meta-Data][] +* `nl2br` -- [New Line to Break][] +* `rss` -- [RSS][] +* `sane_lists` -- [Sane Lists][] +* `toc` -- [Table of Contents][] +* `wikilinks` -- [WikiLinks][] + +[CodeHilite]: http://pythonhosted.org/Markdown/extensions/code_hilite.html +[HTML Tidy]: http://pythonhosted.org/Markdown/extensions/html_tidy.html +[HeaderId]: http://pythonhosted.org/Markdown/extensions/header_id.html +[Meta-Data]: http://pythonhosted.org/Markdown/extensions/meta_data.html +[New Line to Break]: http://pythonhosted.org/Markdown/extensions/nl2br.html +[RSS]: http://pythonhosted.org/Markdown/extensions/rss.html +[Sane Lists]: http://pythonhosted.org/Markdown/extensions/sane_lists.html +[Table of Contents]: http://pythonhosted.org/Markdown/extensions/toc.html +[WikiLinks]: http://pythonhosted.org/Markdown/extensions/wikilinks.html + +#### 3rd Party Extensions + + +*Python-Markdown* is designed to be extended. +Just fork this repo and add your extensions inside the `.../Packages/Markdown Preview/markdown/extensions/` folder. + +Check out the list of [3rd Party extensions]( +https://github.com/waylan/Python-Markdown/wiki/Third-Party-Extensions). + + +#### Default Extensions + +The default extensions are: + +* `footnotes` -- [Footnotes] +* `toc` -- [Table of Contents] +* `fenced_code` -- [Fenced Code Blocks] +* `tables` -- [Tables] + +Use the `default` keyword, to select them all. +If you want all the defaults plus the `definition_lists` extension, +your settings would look like this: + + { + ... + parser: 'markdown', + extensions: ['default', 'definition_lists'], + ... + } + + +### *Markdown2* + +The [Markdown2 Parser][] also provides support for extensions, known as [Extras][]. +You can configure the list of extras you want to use inside the package settings. + +[Markdown2 Parser]: https://github.com/trentm/python-markdown2 + + +#### Default Extras + +The default extras are: + +* `footnotes` -- [Footnotes][Footnotes Extra] +* `toc` -- Table of Contents +* `fenced-code-blocks` -- [Fenced CodeBlocks][] +* `cuddled-lists` -- [Cuddled Lists][] + +[Footnotes Extra]: https://github.com/trentm/python-markdown2/wiki/footnotes +[Fenced CodeBlocks]: https://github.com/trentm/python-markdown2/wiki/fenced-code-blocks +[Cuddled Lists]: https://github.com/trentm/python-markdown2/wiki/cuddled-lists + + +You can enable all default extras at once using the `default` keyword. +If you want all the default extras plus the 'wiki-table' extra, +your settings would look like this: + + { + ... + parser: 'markdown2', + extensions: ['default', 'wiki-table'], + ... + } + + +#### Other Extras + +For a complete list of extras please checkout the [Extras Wiki Page][Extras]. + +[Extras]: https://github.com/trentm/python-markdown2/wiki/Extras + + +## Examples + + +### Tables + +The `tables` extension of the *Python-Markdown* parser is activated by default, +but is currently **not** available in *Markdown2*. + +The syntax was adopted from the [php markdown project](http://michelf.ca/projects/php-markdown/extra/#table), +and is also used in github flavoured markdown. + +| Year | Temperature (low) | Temperature (high) | +| ---- | ----------------- | -------------------| +| 1900 | -10 | 25 | +| 1910 | -15 | 30 | +| 1920 | -10 | 32 | + + +### Wiki Tables + +If you are using *Markdown2* with the `wiki-tables` extra activated you should see a table below: + +|| *Year* || *Temperature (low)* || *Temperature (high)* || +|| 1900 || -10 || 25 || +|| 1910 || -15 || 30 || +|| 1920 || -10 || 32 || + + +### Definition Lists + +This example requires *Python Markdown*'s `def_list` extension. + +Apple +: Pomaceous fruit of plants of the genus Malus in + the family Rosaceae. + +Orange +: The fruit of an evergreen tree of the genus Citrus. + + ## About This plugin and this sample file is proudly brought to you by the [revolunet team][revolunet] @@ -123,7 +318,7 @@ This plugin and this sample file is proudly brought to you by the [revolunet tea [ref2]: http://revolunet.com "rich web apps" [MarkdownREF]: http://daringfireball.net/projects/markdown/basics [MarkdownPreview]: https://github.com/revolunet/sublimetext-markdown-preview - [ST2]: http://sublimetext.com + [ST]: http://sublimetext.com [revolunet]: http://revolunet.com [revolunet-logo]: http://www.revolunet.com/static/parisjs8/img/logo-revolunet-carre.jpg "revolunet logo" [gfm]: http://github.github.com/github-flavored-markdown/ diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Missing Palette Commands/Missing.sublime-commands b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Missing Palette Commands/Missing.sublime-commands index 6fdf4ab..0477d93 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Missing Palette Commands/Missing.sublime-commands +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Missing Palette Commands/Missing.sublime-commands @@ -99,6 +99,7 @@ // Tools Menu { "caption": "Cancel Build", "command": "exec", "args": {"kill": true} }, { "caption": "Show Build Results Panel", "command": "show_panel", "args": {"panel": "output.exec"} }, + { "caption": "Tools: New Snippet", "command": "new_snippet" }, // Project Menu { "caption": "Switch Project in Window", "command": "prompt_select_project" }, @@ -111,5 +112,11 @@ { "caption": "Preferences: Syntax Specific – User", "command": "open_file_settings" }, { "caption": "Font: Increase Font Size", "command": "increase_font_size" }, { "caption": "Font: Decrease Font Size", "command": "decrease_font_size" }, - { "caption": "Font: Reset Font Size", "command": "reset_font_size" } + { "caption": "Font: Reset Font Size", "command": "reset_font_size" }, + + // Misc (not in menu) + { "caption": "View: Toggle Gutter", "command": "toggle_setting", "args": {"setting": "gutter"} }, + { "caption": "View: Toggle Line Numbers", "command": "toggle_setting", "args": {"setting": "line_numbers"} }, + { "caption": "Check for Updates", "command": "update_check" }, + { "caption": "Reveal Current File in Side Bar", "command": "reveal_in_side_bar" } ] diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Missing Palette Commands/package-metadata.json b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Missing Palette Commands/package-metadata.json index e558006..3035f07 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Missing Palette Commands/package-metadata.json +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Missing Palette Commands/package-metadata.json @@ -1 +1 @@ -{"url": "https://github.com/fjl/Sublime-Missing-Palette-Commands", "version": "2012.08.08.06.49.39", "description": "Menu Commands that are missing from the Sublime Text 2 Command Palette"} \ No newline at end of file +{"url": "https://github.com/fjl/Sublime-Missing-Palette-Commands", "version": "2013.08.26.09.50.09", "description": "Menu Commands that are missing from the Sublime Text 2 Command Palette"} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Related Files/package-metadata.json b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Related Files/package-metadata.json index b709a77..ba1647e 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Related Files/package-metadata.json +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Related Files/package-metadata.json @@ -1 +1 @@ -{"url": "https://github.com/fabiokr/sublime-related-files", "version": "2013.03.15.08.29.58", "description": "A Sublime Text 2 plugin to list related files"} \ No newline at end of file +{"url": "https://github.com/fabiokr/sublime-related-files", "version": "2013.03.15.12.29.58", "description": "A Sublime Text 2 plugin to list related files"} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/Default (Linux).sublime-keymap b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/Default (Linux).sublime-keymap index a773003..0e09a91 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/Default (Linux).sublime-keymap +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/Default (Linux).sublime-keymap @@ -22,5 +22,10 @@ [ { "key": "selector", "operator": "equal", "operand": "text.html.markdown" } ] + }, + { "keys": ["ctrl+enter"], "command": "smart_new_line", "context": + [ + { "key": "selector", "operator": "equal", "operand": "markup.heading.markdown" } + ] } ] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/Default (OSX).sublime-keymap b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/Default (OSX).sublime-keymap index 0d7fb6e..8d78de9 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/Default (OSX).sublime-keymap +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/Default (OSX).sublime-keymap @@ -22,5 +22,10 @@ [ { "key": "selector", "operator": "equal", "operand": "text.html.markdown" } ] + }, + { "keys": ["ctrl+enter"], "command": "smart_new_line", "context": + [ + { "key": "selector", "operator": "equal", "operand": "markup.heading.markdown" } + ] } ] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/Default (Windows).sublime-keymap b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/Default (Windows).sublime-keymap index a773003..0e09a91 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/Default (Windows).sublime-keymap +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/Default (Windows).sublime-keymap @@ -22,5 +22,10 @@ [ { "key": "selector", "operator": "equal", "operand": "text.html.markdown" } ] + }, + { "keys": ["ctrl+enter"], "command": "smart_new_line", "context": + [ + { "key": "selector", "operator": "equal", "operand": "markup.heading.markdown" } + ] } ] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/package-metadata.json b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/package-metadata.json index b5e2cd5..7273997 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/package-metadata.json +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/package-metadata.json @@ -1 +1 @@ -{"url": "https://github.com/demon386/SmartMarkdown", "version": "2013.03.23.12.24.10", "description": "A plugin for facilitating editing markdown in Sublime Text 2. Features are borrowed from Org mode of Emacs."} \ No newline at end of file +{"url": "https://github.com/demon386/SmartMarkdown", "version": "2013.06.16.12.00.50", "description": "A plugin for facilitating editing markdown in Sublime Text 2. Features are borrowed from Org mode of Emacs."} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/readme.md b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/readme.md index 6b0d6a0..f4b3769 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/readme.md +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/readme.md @@ -5,6 +5,21 @@ Author: Muchenxuan Tong (demon386@gmail.com) ## Introduction The plugin is aimed at making editing Markdown in Sublime Text 2 easier and more powerful. Ideally, I hope we can bring several amazing features of [Org-mode](http://org-mode.org) of Emacs into Sublime Text. +## What's new +### v0.3: Adjust the position of folding mark to the end of headline. (added by [vovkkk](https://github.com/vovkkk) and [alehandrof](https://github.com/alehandrof)) +### v0.2: Support for Sublime Text 3 (added by [UNOwen](https://github.com/UNOwen).) +### v0.1.6: Add support and bindings for headline level changing. (added by [David Smith](https://github.com/djs070).) The key bindings are: **Super+Shift+,** for decreasing and **Super+Shift+.** for increasing. +### v0.1.5: Basic smart table (grid table) support added. Basic Pandoc intergration (added by [DanielMe](https://github.com/DanielMe/).) +### v0.1.3: Add support for global headling folding / unfolding. +### v0.1.2: Move between headlines supported! +- Use **Ctrl+c Ctrl+n** to move to the next headline (any level); **Ctrl+c Ctrl+p** to the previous one. +- Use **Ctrl+c Ctrl+f** to move to the next headline (same level or higher level); **Ctrl+c Ctrl+b** to the previous one. +- Fixed a bug on bullet list. Thanks to quodlibet (fixed in v0.1.1). + +### v0.1.0: Created! +- Smart Headline folding / unfolding is supported. +- Smart Lists is supported. + ## Done - **Smart Headline folding / unfolding**. Right now you can fold / unfold headlines by pressing **TAB** on it. I assume you use the following formats: # Section; ## Subsection; ### Subsubsection ... - **Global Headline Folding / unfolding**. **Shift+Tab** to Fold / Unfold all at any position. @@ -27,19 +42,6 @@ The plugin is aimed at making editing Markdown in Sublime Text 2 easier and more - **Better Pandoc integration** Actual support for different Pandoc command line options etc. - ... -## What's new -### v0.2: Support for Sublime Text 3 (added by [UNOwen](https://github.com/UNOwen).) -### v0.1.6: Add support and bindings for headline level changing. (added by [David Smith](https://github.com/djs070).) The key bindings are: **Super+Shift+,** for decreasing and **Super+Shift+.** for increasing. -### v0.1.5: Basic smart table (grid table) support added. Basic Pandoc intergration (added by [DanielMe](https://github.com/DanielMe/).) -### v0.1.3: Add support for global headling folding / unfolding. -### v0.1.2: Move between headlines supported! -- Use **Ctrl+c Ctrl+n** to move to the next headline (any level); **Ctrl+c Ctrl+p** to the previous one. -- Use **Ctrl+c Ctrl+f** to move to the next headline (same level or higher level); **Ctrl+c Ctrl+b** to the previous one. -- Fixed a bug on bullet list. Thanks to quodlibet (fixed in v0.1.1). - -### v0.1.0: Created! -- Smart Headline folding / unfolding is supported. -- Smart Lists is supported. ## For Developers - Whenever possible, please obey the [PEP 8](http://www.python.org/dev/peps/pep-0008/) style guide. This can be checked easily with the plugin SublimeLinter. diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/smart_folding.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/smart_folding.py index 350e11d..466eae3 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/smart_folding.py +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/SmartMarkdown/smart_folding.py @@ -24,6 +24,25 @@ except ValueError: HEADLINE_PATTERN = re.compile(r'^(#+)\s.*') +class SmartNewLineCommand(sublime_plugin.TextCommand): + """Changes behavior of default 'insert line after' + Puts new line after folding mark if any. + """ + def run(self, edit): + points = [] + for s in self.view.sel(): + r = self.view.full_line(s) + if headline._is_region_folded(r.b + 1, self.view): + i = headline.region_of_content_of_headline_at_point(self.view, s.b) + else: + i = sublime.Region(r.a, r.b - 1) + points.append(i) + self.view.insert(edit, i.b, '\n') + self.view.sel().clear() + for p in points: + self.view.sel().add(p.b + 1) + + class SmartFoldingCommand(sublime_plugin.TextCommand): """Smart folding is used to fold / unfold headline at the point. @@ -65,7 +84,7 @@ class SmartFoldingCommand(sublime_plugin.TextCommand): if self.is_region_totally_folded(content_region): self.unfold_yet_fold_subheads(content_region, level) else: - self.view.fold(content_region) + self.view.fold(sublime.Region(content_region.a - 1, content_region.b)) return True def is_region_totally_folded(self, region): @@ -90,7 +109,7 @@ class SmartFoldingCommand(sublime_plugin.TextCommand): child_content_region = headline.region_of_content_of_headline_at_point(self.view, child_headline_region.a) if child_content_region is not None: - self.view.fold(child_content_region) + self.view.fold(sublime.Region(child_content_region.a - 1, child_content_region.b)) search_start_point = child_content_region.b else: search_start_point = child_headline_region.b @@ -162,7 +181,7 @@ class GlobalFoldingCommand(SmartFoldingCommand): point) if not is_region_void(region): point = region.b - self.view.fold(region) + self.view.fold(sublime.Region(region.a - 1, region.b)) region, level = headline.find_headline(self.view, point, \ headline.ANY_LEVEL, True, \ diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/Solarized (dark).tmTheme b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/Solarized (dark).tmTheme index b15208e..5e88a48 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/Solarized (dark).tmTheme +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/Solarized (dark).tmTheme @@ -346,9 +346,9 @@ </dict> <dict> <key>name</key> - <string>CSS: Property</string> + <string>CSS: Property name (body)</string> <key>scope</key> - <string>entity.name.tag.css, support.type.property-name.css, meta.property-name.css</string> + <string>entity.name.tag.css, support.type.property-name.css, meta.property-name.css, support.type.property-name.scss</string> <key>settings</key> <dict> <key>fontStyle</key> @@ -359,44 +359,20 @@ </dict> <dict> <key>name</key> - <string>CSS: @font-face</string> + <string>CSS: @ rules (purple)</string> <key>scope</key> - <string>source.css</string> + <string>punctuation.definition.keyword.scss, punctuation.definition.keyword.css, keyword.control.at-rule.charset.css, keyword.control.at-rule.charset.scss, keyword.control.each.css, keyword.control.each.scss, keyword.control.else.css, keyword.control.else.scss, keyword.control.at-rule.import.css, keyword.control.at-rule.import.scss, keyword.control.at-rule.fontface.css, keyword.control.at-rule.fontface.scss, keyword.control.for.css, keyword.control.for.scss, keyword.control.at-rule.function.css, keyword.control.at-rule.function.scss, keyword.control.if.css, keyword.control.if.scss, keyword.control.at-rule.include.scss, keyword.control.at-rule.media.css, keyword.control.at-rule.media.scss, keyword.control.at-rule.font-face.css, keyword.control.at-rule.font-face.scss, meta.at-rule.import.css, variable.other.less, variable.declaration.less, variable.interpolation.less, meta.at-rule.media.scss</string> <key>settings</key> <dict> <key>foreground</key> - <string>#268BD2</string> + <string>#6C71c4</string> </dict> </dict> <dict> <key>name</key> - <string>CSS: Selector</string> + <string>CSS: Numeric Value (blue)</string> <key>scope</key> - <string>meta.selector.css</string> - <key>settings</key> - <dict> - <key>fontStyle</key> - <string></string> - <key>foreground</key> - <string>#839496</string> - </dict> - </dict> - <dict> - <key>name</key> - <string>CSS: {}</string> - <key>scope</key> - <string>punctuation.section.property-list.css</string> - <key>settings</key> - <dict> - <key>foreground</key> - <string>#268BD2</string> - </dict> - </dict> - <dict> - <key>name</key> - <string>CSS: Numeric Value</string> - <key>scope</key> - <string>meta.property-value.css constant.numeric.css, keyword.other.unit.css,constant.other.color.rgb-value.css</string> + <string>constant.numeric.css, keyword.other.unit.css, keyword.unit.css, constant.other.color.rgb-value.css, constant.numeric.scss, constant.other.color.rgb-value.scss, keyword.other.unit.scss, punctuation.definition.constant.scss, punctuation.definition.constant.css, constant.other.rgb-value.css</string> <key>settings</key> <dict> <key>fontStyle</key> @@ -407,9 +383,9 @@ </dict> <dict> <key>name</key> - <string>CSS: Value</string> + <string>CSS: String, value and constants (azure)</string> <key>scope</key> - <string>meta.property-value.css</string> + <string>variable.parameter.url.scss, meta.property-value.css, meta.property-value.scss, support.constant.property-value.scss, support.constant.font-name.scss, string.quoted.single.css, string.quoted.double.css, constant.character.escaped.css, string.quoted.variable.parameter.url, punctuation.definition.string.begin.scss, punctuation.definition.string.begin.css, punctuation.definition.string.end.scss, punctuation.definition.string.end.css, support.constant.property-value.css</string> <key>settings</key> <dict> <key>fontStyle</key> @@ -420,7 +396,7 @@ </dict> <dict> <key>name</key> - <string>CSS: !Important</string> + <string>CSS: !Important (red)</string> <key>scope</key> <string>keyword.other.important.css</string> <key>settings</key> @@ -431,44 +407,59 @@ </dict> <dict> <key>name</key> - <string>CSS: Standard Value</string> + <string>CSS: Standard color value (orange)</string> <key>scope</key> - <string>support.constant.color</string> + <string>support.constant.color, invalid.deprecated.color.w3c-non-standard-color-name.scss</string> <key>settings</key> <dict> <key>foreground</key> - <string>#6C71C4</string> + <string>#CB4b16</string> </dict> </dict> <dict> <key>name</key> - <string>CSS: Tag</string> + <string>CSS: : , () (body)</string> <key>scope</key> - <string>entity.name.tag.css</string> + <string>punctuation.terminator.rule.css, punctuation.section.function.css, punctuation.section.function.scss, punctuation.separator.key-value.csspunctuation.scss, punctuation.css, keyword.operator.less, entity.name.tag.wildcard.scss, entity.name.tag.wildcard.css, entity.name.tag.reference.scss</string> <key>settings</key> <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#657B83</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS: Selector > [] and non-spec tags (body)</string> + <key>scope</key> + <string>meta.selector.css</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#657B83</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS: Tag (green)</string> + <key>scope</key> + <string>entity.name.tag.css, entity.name.tag.scss</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> <key>foreground</key> <string>#859900</string> </dict> </dict> <dict> <key>name</key> - <string>CSS: : ,</string> + <string>CSS .class (yellow)</string> <key>scope</key> - <string>punctuation.separator.key-value.css, punctuation.terminator.rule.css</string> - <key>settings</key> - <dict> - <key>fontStyle</key> - <string></string> - <key>foreground</key> - <string>#839496</string> - </dict> - </dict> - <dict> - <key>name</key> - <string>CSS .class</string> - <key>scope</key> - <string>entity.other.attribute-name.class.css</string> + <string>entity.other.attribute-name.class.css, entity.other.less.mixin</string> <key>settings</key> <dict> <key>fontStyle</key> @@ -479,7 +470,20 @@ </dict> <dict> <key>name</key> - <string>CSS :pseudo</string> + <string>CSS: #id (yellow)</string> + <key>scope</key> + <string>source.css entity.other.attribute-name.id</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#B58900</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS :pseudo (orange)</string> <key>scope</key> <string>entity.other.attribute-name.pseudo-element.css, entity.other.attribute-name.pseudo-class.css</string> <key>settings</key> @@ -492,15 +496,13 @@ </dict> <dict> <key>name</key> - <string>CSS: #id</string> + <string>SCSS: Variables (pink)</string> <key>scope</key> - <string>entity.other.attribute-name.id.css</string> + <string>variable, variable.scss</string> <key>settings</key> <dict> - <key>fontStyle</key> - <string>bold</string> <key>foreground</key> - <string>#B58900</string> + <string>#D33682</string> </dict> </dict> <dict> @@ -590,7 +592,7 @@ <key>settings</key> <dict> <key>foreground</key> - <string>#268BD2</string> + <string>#839496</string> </dict> </dict> <dict> @@ -732,7 +734,7 @@ <key>name</key> <string>HTML: {}</string> <key>scope</key> - <string>text.html.basic punctuation.section.property-list.css</string> + <string>text.html.basic, punctuation.section.property-list.css</string> <key>settings</key> <dict> <key>fontStyle</key> @@ -1282,7 +1284,7 @@ <key>fontStyle</key> <string></string> <key>foreground</key> - <string>#586E75</string> + <string>#93A1A1</string> </dict> </dict> <dict> @@ -1369,30 +1371,6 @@ <string>#2AA198</string> </dict> </dict> - <dict> - <key>name</key> - <string>Markdown: Linebreak</string> - <key>scope</key> - <string>text.html.markdown meta.dummy.line-break</string> - <key>settings</key> - <dict> - <key>background</key> - <string>#B58900</string> - <key>foreground</key> - <string>#EEE8D5</string> - </dict> - </dict> - <dict> - <key>name</key> - <string>Markdown: Raw</string> - <key>scope</key> - <string>text.html.markdown markup.raw.inline</string> - <key>settings</key> - <dict> - <key>foreground</key> - <string>#2AA198</string> - </dict> - </dict> <dict> <key>name</key> <string>reST raw</string> @@ -1876,166 +1854,82 @@ <string>#DC322F</string> </dict> </dict> - <dict> - <key>name</key> - <string>Markdown: Headings</string> + <key>Name</key> + <string>Markdown punctuation</string> <key>scope</key> - <string>markup.heading.markdown, markup.heading.1.markdown, markup.heading.2.markdown, markup.heading.3.markdown, markup.heading.4.markdown, markup.heading.5.markdown, markup.heading.6.markdown</string> + <string>markup.list, text.html.markdown punctuation.definition, meta.separator.markdown</string> <key>settings</key> - <dict> - <key>foreground</key> - <string>#268BD2</string> - </dict> + <dict> + <key>foreground</key> + <string>#CB4b16</string> + </dict> </dict> <dict> - <key>name</key> - <string>Markdown: Bold</string> + <key>Name</key> + <string>Markdown heading</string> <key>scope</key> - <string>markup.bold.markdown</string> + <string>markup.heading</string> <key>settings</key> - <dict> - <key>fontStyle</key> - <string>bold</string> - <key>foreground</key> - <string>#839496</string> - </dict> + <dict> + <key>foreground</key> + <string>#268BD2</string> + </dict> </dict> <dict> - <key>name</key> - <string>Markdown: Italic</string> + <key>Name</key> + <string>Markdown text inside some block element</string> <key>scope</key> - <string>markup.italic.markdown</string> + <string>markup.quote, meta.paragraph.list</string> <key>settings</key> - <dict> - <key>fontStyle</key> - <string>italic</string> - <key>foreground</key> - <string>#839496</string> - </dict> + <dict> + <key>foreground</key> + <string>#2AA198</string> + </dict> </dict> <dict> - <key>name</key> - <string>Markdown: Punctuation for Bold, Italic, and Inline Block</string> + <key>Name</key> + <string>Markdown em</string> <key>scope</key> - <string>punctuation.definition.bold.markdown, punctuation.definition.italic.markdown, punctuation.definition.raw.markdown</string> + <string>markup.italic</string> <key>settings</key> - <dict> - <key>foreground</key> - <string>#DC322F</string> - </dict> + <dict> + <key>fontStyle</key> + <string>italic</string> + </dict> </dict> <dict> - <key>name</key> - <string>Markdown: Bulleted List</string> + <key>Name</key> + <string>Markdown strong</string> <key>scope</key> - <string>markup.list.unnumbered.markdown</string> + <string>markup.bold</string> <key>settings</key> - <dict> - <key>foreground</key> - <string>#B58900</string> - </dict> + <dict> + <key>fontStyle</key> + <string>bold</string> + </dict> </dict> <dict> - <key>name</key> - <string>Markdown: Numbered List</string> + <key>Name</key> + <string>Markdown reference</string> <key>scope</key> - <string>markup.list.numbered.markdown</string> + <string>markup.underline.link.markdown, meta.link.inline punctuation.definition.metadata, meta.link.reference.markdown punctuation.definition.constant, meta.link.reference.markdown constant.other.reference</string> <key>settings</key> - <dict> - <key>foreground</key> - <string>#859900</string> - </dict> + <dict> + <key>foreground</key> + <string>#B58900</string> + </dict> </dict> <dict> - <key>name</key> - <string>Markdown: Block and Inline Block</string> + <key>Name</key> + <string>Markdown linebreak</string> <key>scope</key> - <string>markup.raw.block.markdown, markup.raw.inline.markdown</string> + <string>meta.paragraph.markdown meta.dummy.line-break</string> <key>settings</key> - <dict> - <key>foreground</key> - <string>#2AA198</string> - </dict> - </dict> - <dict> - <key>name</key> - <string>Markdown: Quote Block and Punctuation</string> - <key>scope</key> - <string>markup.quote.markdown, punctuation.definition.blockquote.markdown</string> - <key>settings</key> - <dict> - <key>foreground</key> - <string>#6C71C4</string> - </dict> - </dict> - <dict> - <key>name</key> - <string>Markdown: Seperator</string> - <key>scope</key> - <string>meta.separator.markdown</string> - <key>settings</key> - <dict> - <key>foreground</key> - <string>#D33682</string> - </dict> - </dict> - <dict> - <key>name</key> - <string>Markdown: Link and Reference URL</string> - <key>scope</key> - <string>meta.image.inline.markdown, markup.underline.link.markdown</string> - <key>settings</key> - <dict> - <key>fontStyle</key> - <string>italic</string> - <key>foreground</key> - <string>#586E75</string> - </dict> - </dict> - <dict> - <key>name</key> - <string>Markdown: Link Title, Image Description</string> - <key>scope</key> - <string>string.other.link.title.markdown, string.other.link.description.markdown</string> - <key>settings</key> - <dict> - <key>foreground</key> - <string>#93A1A1</string> - </dict> - </dict> - <dict> - <key>name</key> - <string>Markdown: Angle Brakets on Link and Image</string> - <key>scope</key> - <string>punctuation.definition.link.markdown</string> - <key>settings</key> - <dict> - <key>foreground</key> - <string>#586E75</string> - </dict> - </dict> - <dict> - <key>name</key> - <string>Markdown: Parens on Link and Image </string> - <key>scope</key> - <string>punctuation.definition.metadata.markdown</string> - <key>settings</key> - <dict> - <key>foreground</key> - <string>#586E75</string> - </dict> - </dict> - <dict> - <key>name</key> - <string>Markdown: Square Brakets on Link, Image, and Reference</string> - <key>scope</key> - <string>punctuation.definition.string.begin.markdown, punctuation.definition.string.end.markdown, punctuation.definition.constant.markdown</string> - <key>settings</key> - <dict> - <key>foreground</key> - <string>#586E75</string> - </dict> + <dict> + <key>background</key> + <string>#6C71c4</string> + </dict> </dict> <dict> <key>name</key> diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/Solarized (light).tmTheme b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/Solarized (light).tmTheme index b51af59..3123aa1 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/Solarized (light).tmTheme +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/Solarized (light).tmTheme @@ -12,9 +12,9 @@ <key>background</key> <string>#FDF6E3</string> <key>caret</key> - <string>#002B36</string> + <string>#657B83</string> <key>foreground</key> - <string>#586E75</string> + <string>#657B83</string> <key>invisibles</key> <string>#EEE8D5</string> <key>lineHighlight</key> @@ -346,9 +346,9 @@ </dict> <dict> <key>name</key> - <string>CSS: Property</string> + <string>CSS: Property name (body)</string> <key>scope</key> - <string>entity.name.tag.css, support.type.property-name.css, meta.property-name.css</string> + <string>entity.name.tag.css, support.type.property-name.css, meta.property-name.css, support.type.property-name.scss</string> <key>settings</key> <dict> <key>fontStyle</key> @@ -359,18 +359,79 @@ </dict> <dict> <key>name</key> - <string>CSS: @font-face</string> + <string>CSS: @ rules (purple)</string> <key>scope</key> - <string>source.css</string> + <string>punctuation.definition.keyword.scss, punctuation.definition.keyword.css, keyword.control.at-rule.charset.css, keyword.control.at-rule.charset.scss, keyword.control.each.css, keyword.control.each.scss, keyword.control.else.css, keyword.control.else.scss, keyword.control.at-rule.import.css, keyword.control.at-rule.import.scss, keyword.control.at-rule.fontface.css, keyword.control.at-rule.fontface.scss, keyword.control.for.css, keyword.control.for.scss, keyword.control.at-rule.function.css, keyword.control.at-rule.function.scss, keyword.control.if.css, keyword.control.if.scss, keyword.control.at-rule.include.scss, keyword.control.at-rule.media.css, keyword.control.at-rule.media.scss, keyword.control.at-rule.font-face.css, keyword.control.at-rule.font-face.scss, meta.at-rule.import.css, variable.other.less, variable.declaration.less, variable.interpolation.less, meta.at-rule.media.scss</string> <key>settings</key> <dict> + <key>foreground</key> + <string>#6C71c4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS: Numeric Value (blue)</string> + <key>scope</key> + <string>constant.numeric.css, keyword.other.unit.css, keyword.unit.css, constant.other.color.rgb-value.css, constant.numeric.scss, constant.other.color.rgb-value.scss, keyword.other.unit.scss, punctuation.definition.constant.scss, punctuation.definition.constant.css, constant.other.rgb-value.css</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> <key>foreground</key> <string>#268BD2</string> </dict> </dict> <dict> <key>name</key> - <string>CSS: Selector</string> + <string>CSS: String, value and constants (azure)</string> + <key>scope</key> + <string>variable.parameter.url.scss, meta.property-value.css, meta.property-value.scss, support.constant.property-value.scss, support.constant.font-name.scss, string.quoted.single.css, string.quoted.double.css, constant.character.escaped.css, string.quoted.variable.parameter.url, punctuation.definition.string.begin.scss, punctuation.definition.string.begin.css, punctuation.definition.string.end.scss, punctuation.definition.string.end.css, support.constant.property-value.css</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#2AA198</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS: !Important (red)</string> + <key>scope</key> + <string>keyword.other.important.css</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#DC322F</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS: Standard color value (orange)</string> + <key>scope</key> + <string>support.constant.color, invalid.deprecated.color.w3c-non-standard-color-name.scss</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#CB4b16</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS: : , () (body)</string> + <key>scope</key> + <string>punctuation.terminator.rule.css, punctuation.section.function.css, punctuation.section.function.scss, punctuation.separator.key-value.csspunctuation.scss, punctuation.css, keyword.operator.less, entity.name.tag.wildcard.scss, entity.name.tag.wildcard.css, entity.name.tag.reference.scss</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#657B83</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS: Selector > [] and non-spec tags (body)</string> <key>scope</key> <string>meta.selector.css</string> <key>settings</key> @@ -383,92 +444,22 @@ </dict> <dict> <key>name</key> - <string>CSS: {}</string> + <string>CSS: Tag (green)</string> <key>scope</key> - <string>punctuation.section.property-list.css</string> - <key>settings</key> - <dict> - <key>foreground</key> - <string>#268BD2</string> - </dict> - </dict> - <dict> - <key>name</key> - <string>CSS: Numeric Value</string> - <key>scope</key> - <string>meta.property-value.css constant.numeric.css, keyword.other.unit.css,constant.other.color.rgb-value.css</string> + <string>entity.name.tag.css, entity.name.tag.scss</string> <key>settings</key> <dict> <key>fontStyle</key> <string></string> - <key>foreground</key> - <string>#268BD2</string> - </dict> - </dict> - <dict> - <key>name</key> - <string>CSS: Value</string> - <key>scope</key> - <string>meta.property-value.css</string> - <key>settings</key> - <dict> - <key>fontStyle</key> - <string></string> - <key>foreground</key> - <string>#2AA198</string> - </dict> - </dict> - <dict> - <key>name</key> - <string>CSS: !Important</string> - <key>scope</key> - <string>keyword.other.important.css</string> - <key>settings</key> - <dict> - <key>foreground</key> - <string>#DC322F</string> - </dict> - </dict> - <dict> - <key>name</key> - <string>CSS: Standard Value</string> - <key>scope</key> - <string>support.constant.color</string> - <key>settings</key> - <dict> - <key>foreground</key> - <string>#6C71C4</string> - </dict> - </dict> - <dict> - <key>name</key> - <string>CSS: Tag</string> - <key>scope</key> - <string>entity.name.tag.css</string> - <key>settings</key> - <dict> <key>foreground</key> <string>#859900</string> </dict> </dict> <dict> <key>name</key> - <string>CSS: : ,</string> + <string>CSS .class (yellow)</string> <key>scope</key> - <string>punctuation.separator.key-value.css, punctuation.terminator.rule.css</string> - <key>settings</key> - <dict> - <key>fontStyle</key> - <string></string> - <key>foreground</key> - <string>#657B83</string> - </dict> - </dict> - <dict> - <key>name</key> - <string>CSS .class</string> - <key>scope</key> - <string>entity.other.attribute-name.class.css</string> + <string>entity.other.attribute-name.class.css, entity.other.less.mixin</string> <key>settings</key> <dict> <key>fontStyle</key> @@ -479,7 +470,20 @@ </dict> <dict> <key>name</key> - <string>CSS :pseudo</string> + <string>CSS: #id (yellow)</string> + <key>scope</key> + <string>source.css entity.other.attribute-name.id</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#B58900</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS :pseudo (orange)</string> <key>scope</key> <string>entity.other.attribute-name.pseudo-element.css, entity.other.attribute-name.pseudo-class.css</string> <key>settings</key> @@ -492,15 +496,13 @@ </dict> <dict> <key>name</key> - <string>CSS: #id</string> + <string>SCSS: Variables (pink)</string> <key>scope</key> - <string>entity.other.attribute-name.id.css</string> + <string>variable, variable.scss</string> <key>settings</key> <dict> - <key>fontStyle</key> - <string>bold</string> <key>foreground</key> - <string>#B58900</string> + <string>#D33682</string> </dict> </dict> <dict> @@ -590,7 +592,7 @@ <key>settings</key> <dict> <key>foreground</key> - <string>#268BD2</string> + <string>#657B83</string> </dict> </dict> <dict> @@ -732,7 +734,7 @@ <key>name</key> <string>HTML: {}</string> <key>scope</key> - <string>text.html.basic punctuation.section.property-list.css</string> + <string>text.html.basic, punctuation.section.property-list.css</string> <key>settings</key> <dict> <key>fontStyle</key> @@ -1369,30 +1371,6 @@ <string>#2AA198</string> </dict> </dict> - <dict> - <key>name</key> - <string>Markdown: Linebreak</string> - <key>scope</key> - <string>text.html.markdown meta.dummy.line-break</string> - <key>settings</key> - <dict> - <key>background</key> - <string>#B58900</string> - <key>foreground</key> - <string>#EEE8D5</string> - </dict> - </dict> - <dict> - <key>name</key> - <string>Markdown: Raw</string> - <key>scope</key> - <string>text.html.markdown markup.raw.inline</string> - <key>settings</key> - <dict> - <key>foreground</key> - <string>#2AA198</string> - </dict> - </dict> <dict> <key>name</key> <string>reST raw</string> @@ -1876,170 +1854,82 @@ <string>#DC322F</string> </dict> </dict> - <dict> - <key>name</key> - <string>Markdown: Headings</string> + <key>Name</key> + <string>Markdown punctuation</string> <key>scope</key> - <string>markup.heading.markdown, markup.heading.1.markdown, markup.heading.2.markdown, markup.heading.3.markdown, markup.heading.4.markdown, markup.heading.5.markdown, markup.heading.6.markdown</string> + <string>markup.list, text.html.markdown punctuation.definition, meta.separator.markdown</string> <key>settings</key> - <dict> - <key>foreground</key> - <string>#268BD2</string> - </dict> + <dict> + <key>foreground</key> + <string>#CB4b16</string> + </dict> </dict> <dict> - <key>name</key> - <string>Markdown: Bold</string> + <key>Name</key> + <string>Markdown heading</string> <key>scope</key> - <string>markup.bold.markdown</string> + <string>markup.heading</string> <key>settings</key> - <dict> - <key>fontStyle</key> - <string>bold</string> - <key>foreground</key> - <string>#586E75</string> - </dict> + <dict> + <key>foreground</key> + <string>#268BD2</string> + </dict> </dict> <dict> - <key>name</key> - <string>Markdown: Italic</string> + <key>Name</key> + <string>Markdown text inside some block element</string> <key>scope</key> - <string>markup.italic.markdown</string> + <string>markup.quote, meta.paragraph.list</string> <key>settings</key> - <dict> - <key>fontStyle</key> - <string>italic</string> - <key>foreground</key> - <string>#586E75</string> - </dict> + <dict> + <key>foreground</key> + <string>#2AA198</string> + </dict> </dict> <dict> - <key>name</key> - <string>Markdown: Punctuation for Bold, Italic, and Inline Block</string> + <key>Name</key> + <string>Markdown em</string> <key>scope</key> - <string>punctuation.definition.bold.markdown, punctuation.definition.italic.markdown, punctuation.definition.raw.markdown</string> + <string>markup.italic</string> <key>settings</key> - <dict> - <key>foreground</key> - <string>#DC322F</string> - </dict> + <dict> + <key>fontStyle</key> + <string>italic</string> + </dict> </dict> <dict> - <key>name</key> - <string>Markdown: Bulleted List</string> + <key>Name</key> + <string>Markdown strong</string> <key>scope</key> - <string>markup.list.unnumbered.markdown</string> + <string>markup.bold</string> <key>settings</key> - <dict> - <key>foreground</key> - <string>#B58900</string> - </dict> + <dict> + <key>fontStyle</key> + <string>bold</string> + </dict> </dict> <dict> - <key>name</key> - <string>Markdown: Numbered List</string> + <key>Name</key> + <string>Markdown reference</string> <key>scope</key> - <string>markup.list.numbered.markdown</string> + <string>markup.underline.link.markdown, meta.link.inline punctuation.definition.metadata, meta.link.reference.markdown punctuation.definition.constant, meta.link.reference.markdown constant.other.reference</string> <key>settings</key> - <dict> - <key>foreground</key> - <string>#859900</string> - </dict> + <dict> + <key>foreground</key> + <string>#B58900</string> + </dict> </dict> <dict> - <key>name</key> - <string>Markdown: Block and Inline Block</string> + <key>Name</key> + <string>Markdown linebreak</string> <key>scope</key> - <string>markup.raw.block.markdown, markup.raw.inline.markdown</string> + <string>meta.paragraph.markdown meta.dummy.line-break</string> <key>settings</key> - <dict> - <key>foreground</key> - <string>#2AA198</string> - </dict> - </dict> - <dict> - <key>name</key> - <string>markup.quote.markdown</string> - <key>scope</key> - <string>markup.quote.markdown</string> - <key>settings</key> - <dict> - <key>foreground</key> - <string>#6C71C4</string> - </dict> - </dict> - - <dict> - <key>name</key> - <string>punctuation.definition.blockquote.markdown</string> - <key>scope</key> - <string>punctuation.definition.blockquote.markdown</string> - <key>settings</key> - <dict> - <key>foreground</key> - <string>#6C71C4</string> - </dict> - </dict> - - <dict> - <key>name</key> - <string>Markdown: Seperator</string> - <key>scope</key> - <string>meta.separator.markdown</string> - <key>settings</key> - <dict> - <key>foreground</key> - <string>#D33682</string> - </dict> - </dict> - - <dict> - <key>name</key> - <string>Markdown: Link URL, Reference</string> - <key>scope</key> - <string>markup.underline.link.markdown</string> - <key>settings</key> - <dict> - <key>foreground</key> - <string>#839496</string> - </dict> - </dict> - - <dict> - <key>name</key> - <string>Markdown: Link Title</string> - <key>scope</key> - <string>markup.underline.link.markdown</string> - <key>settings</key> - <dict> - <key>foreground</key> - <string>#839496</string> - </dict> - </dict> - - <dict> - <key>name</key> - <string>Markdown: Link Punctuation</string> - <key>scope</key> - <string>meta.link.inet.markdown, meta.link.email.lt-gt.markdown, punctuation.definition.string.begin.markdown, punctuation.definition.string.end.markdown, punctuation.definition.link.markdown</string> - <key>settings</key> - <dict> - <key>foreground</key> - <string>#DC322F</string> - </dict> - </dict> - - <dict> - <key>name</key> - <string>text plain</string> - <key>scope</key> - <string>text.plain</string> - <key>settings</key> - <dict> - <key>foreground</key> - <string>#657B83</string> - </dict> + <dict> + <key>background</key> + <string>#6C71c4</string> + </dict> </dict> <dict> <key>name</key> diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/package-metadata.json b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/package-metadata.json index 8806a64..e725fe4 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/package-metadata.json +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/package-metadata.json @@ -1 +1 @@ -{"url": "https://github.com/SublimeColors/Solarized", "version": "2012.11.02.15.06.04", "description": "A port of the popular Solarized Theme for Sublime Text 2"} \ No newline at end of file +{"url": "https://github.com/SublimeColors/Solarized", "version": "2013.05.31.15.52.59", "description": "A port of the popular Solarized Theme for Sublime Text 2"} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/README.md b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/README.md new file mode 100644 index 0000000..7f2c162 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/README.md @@ -0,0 +1,2 @@ +Included here are a number of samples that can be used to verify +the color scheme. diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.c b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.c new file mode 100644 index 0000000..7e88404 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.c @@ -0,0 +1,26 @@ +#define UNICODE +#include <windows.h> + +int main(int argc, char **argv) { + int speed = 0, speed1 = 0, speed2 = 0; // 1-20 + printf("Set Mouse Speed by Maverick\n"); + + SystemParametersInfo(SPI_GETMOUSESPEED, 0, &speed, 0); + printf("Current speed: %2d\n", speed); + + if (argc == 1) return 0; + if (argc >= 2) sscanf(argv[1], "%d", &speed1); + if (argc >= 3) sscanf(argv[2], "%d", &speed2); + + if (argc == 2) // set speed to first value + speed = speed1; + else if (speed == speed1 || speed == speed2) // alternate + speed = speed1 + speed2 - speed; + else + speed = speed1; // start with first value + + SystemParametersInfo(SPI_SETMOUSESPEED, 0, speed, 0); + SystemParametersInfo(SPI_GETMOUSESPEED, 0, &speed, 0); + printf("New speed: %2d\n", speed); + return 0; +} diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.coffee b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.coffee new file mode 100644 index 0000000..9dbe6cb --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.coffee @@ -0,0 +1,23 @@ +undefined +xui +window = this +string = new String('string') +document = window.document +simpleExpr = /^#?([\w-]+)$/ +idExpr = /^#/ +tagExpr = /<([\w:]+)/ + +slice = (e) -> + [].slice.call(e, 0) + +try + a = slice(document.documentElement.childNodes)[0].nodeType +catch e + slice = (e) -> + ret = [] + for i in e[i] + ret.push(e[i]) + return ret + +window.x$ = window.xui = xui = (q, context) -> + new xui.fn.find(q, context) diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.html b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.html new file mode 100644 index 0000000..e4d5f3b --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.html @@ -0,0 +1,20 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html><head> +<title>A Tiny Page + + + +

      abc

      +

      def

      +

      Testing page

      + diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.js b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.js new file mode 100644 index 0000000..49d110a --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.js @@ -0,0 +1,42 @@ +// Generated by CoffeeScript 1.4.0 +var a, document, idExpr, simpleExpr, slice, string, tagExpr, window, xui; + +void 0; + +xui; + + +window = this; + +string = new String('string'); + +document = window.document; + +simpleExpr = /^#?([\w-]+)$/; + +idExpr = /^#/; + +tagExpr = /<([\w:]+)/; + +slice = function(e) { + return [].slice.call(e, 0); +}; + +try { + a = slice(document.documentElement.childNodes)[0].nodeType; +} catch (e) { + slice = function(e) { + var i, ret, _i, _len, _ref; + ret = []; + _ref = e[i]; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + i = _ref[_i]; + ret.push(e[i]); + } + return ret; + }; +} + +window.x$ = window.xui = xui = function(q, context) { + return new xui.fn.find(q, context); +}; diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.md b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.md new file mode 100644 index 0000000..d24fb37 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.md @@ -0,0 +1,26 @@ +% Pandoc Test File +% Ethan Schoonover +% March 22, 2011 + +%% format: markdown+lhs + +> import Hakyll +> main :: IO () +> main = hakyll $ do +> compile "css/*" $ byExtension (error "Not a (S)CSS file") + +Using *Pandoc* +============= + +In this document the technical terms `water` and `ice` will be replaced by +H~2~O.^[a contrived footnote] + +## Heading styles can be mixed + +And matched, and they still fold **properly** + +* * * * + +Some code: + + a verbatim or "code" block diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.py new file mode 100644 index 0000000..92a68e0 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +# encoding: utf-8 +""" +""" + +import string + +module_variable = 0 + + +def functionName(self, int): + local = 5 + 5 + module_variable = 5*5 + return module_variable + + +class my_class(object): + + def __init__(self, arg1, string): + self.value = True + return + + def method1(self, str): + self.s = str + return self.value + + def method2(self): + return + print 'How did we get here?' + + def method1(self): + return self.value + 1 + method2 = method1 + +class my_subclass(my_class): + + def __init__(self, arg1, string): + self.value = arg1 + return diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.rb b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.rb new file mode 100644 index 0000000..2658f37 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/Solarized Color Scheme/samples/test.rb @@ -0,0 +1,49 @@ +# ruby test file ruby.rb + +include Enumerable + +def initialize(rbconfig) +@rbconfig = rbconfig +@no_harm = false +end + +def load_savefile +begin + File.foreach(savefile()) do |line| + k, v = *line.split(/=//, 2) + self[k] = v.strip + end +rescue Errno::ENOENT + setup_rb_error $!.message + "\n#{File.basename($0)} config first" +end +end + +if c['rubylibdir'] + # V > 1.6.3 + libruby = "#{c['prefix']}/lib/ruby" + siterubyverarch = c['sitearchdir'] +end +parameterize = lambda {|path| + path.sub(/\A#{Regexp.quote(c['prefix'])}/, '$prefix') +} + +if arg = c['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg } + makeprog = arg.sub(/'/, '').split(/=//, 2)[1] +else + makeprog = 'make' +end + +def setup_rb_error(msg) + raise SetupError, msg +end + +if $0 == __FILE__ + begin + ToplevelInstaller.invoke + rescue SetupError + raise if $DEBUG + $stderr.puts $!.message + $stderr.puts "Try 'ruby #{$0} --help' for detailed usage." + exit 1 + end +end diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/Default.sublime-commands b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/Default.sublime-commands index e98178c..1b65db2 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/Default.sublime-commands +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/Default.sublime-commands @@ -62,5 +62,13 @@ { "caption": "StringEncode: Hexadecimal to Decimal", "command": "hex_dec" + }, + { + "caption": "StringEncode: Unicode to Hexadecimal", + "command": "unicode_hex" + }, + { + "caption": "StringEncode: Hexadecimal to Unicode", + "command": "hex_unicode" } ] diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/LICENSE b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/LICENSE new file mode 100644 index 0000000..8da8c54 --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/LICENSE @@ -0,0 +1,26 @@ +Copyright (c) 2012, Colin T.A. Gray +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of this project. diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/README.md b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/README.md index 18aa332..71ae8bb 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/README.md +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/README.md @@ -1,5 +1,5 @@ -StringEncode plugin for Sublime Text 2 -====================================== +StringEncode +============ Converts characters from one "encoding" to another using a transformation (think HTML entities, not character encodings). @@ -10,13 +10,22 @@ Installation Or: -1. Open the Sublime Text 2 Packages folder - - OS X: ~/Library/Application Support/Sublime Text 2/Packages/ - - Windows: %APPDATA%/Sublime Text 2/Packages/ - - Linux: ~/.Sublime Text 2/Packages/ +1. Open the Sublime Text Packages folder + + - OS X: ~/Library/Application Support/Sublime Text 3/Packages/ + - Windows: %APPDATA%/Sublime Text 3/Packages/ + - Linux: ~/.Sublime Text 3/Packages/ + 2. clone this repo 3. Install keymaps for the commands (see Example.sublime-keymap for my preferred keys) +### Sublime Text 2 + +1. Open the Sublime Text 2 Packages folder +2. clone this repo, but use the `st2` branch + + git clone -b st2 git@github.com:colinta/SublimeStringEncode + Commands -------- diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/package-metadata.json b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/package-metadata.json index f32ec30..667df99 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/package-metadata.json +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/package-metadata.json @@ -1 +1 @@ -{"url": "https://github.com/colinta/SublimeStringEncode", "version": "1.5.1", "description": "Converts characters from one encoding to another using a transformation (think HTML entities, not character encodings)."} \ No newline at end of file +{"url": "https://github.com/colinta/SublimeStringEncode", "version": "2013.08.20.19.57.08", "description": "Converts characters from one encoding to another using a transformation (think HTML entities, not character encodings)."} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/package.json b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/package.json index 1da7f07..96ab65f 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/package.json +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/package.json @@ -1,7 +1,17 @@ { - "repo": "SublimeStringEncode", "name": "StringEncode", "description": "Converts characters from one encoding to another using a transformation (think HTML entities, not character encodings).", - "author": "Colin Thomas-Arnold (colinta)", - "homepage": "https://github.com/colinta/SublimeStringEncode" + "author": "Colin T.A. Gray (colinta)", + "details": "https://github.com/colinta/SublimeStringEncode", + "labels": ["text manipulation"], + "releases": [ + { + "details": "https://github.com/colinta/SublimeStringEncode/tree/master", + "sublime_text": "<3000" + }, + { + "details": "https://github.com/colinta/SublimeStringEncode/tags", + "sublime_text": ">=3000" + } + ] } \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/string_encode.py b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/string_encode.py index efadd24..ca753e7 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/string_encode.py +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/StringEncode/string_encode.py @@ -1,33 +1,25 @@ # coding: utf8 - -import sublime_plugin import urllib import base64 import re import json +import sys + +import sublime_plugin class StringEncode(sublime_plugin.TextCommand): def run(self, edit): - e = self.view.begin_edit('encode') - regions = [region for region in self.view.sel()] - - # sort by region.end() DESC - def get_end(region): - return region.end() - regions.sort(key=get_end, reverse=True) - - for region in regions: + for region in self.view.sel(): if region.empty(): continue text = self.view.substr(region) replacement = self.encode(text) self.view.replace(edit, region, replacement) - self.view.end_edit(e) html_escape_table = { - u"\"": """, u"'": "'", u"<": "<", u">": ">", u"¡": "¡", u"¢": "¢", u"£": "£", u"¤": "¤", u"¥": "¥", u"¦": "¦", u"§": "§", u"¨": "¨", u"©": "©", u"ª": "ª", u"«": "«", u"¬": "¬", u"®": "®", u"¯": "¯", u"°": "°", u"±": "±", u"²": "²", u"³": "³", u"´": "´", u"µ": "µ", u"¶": "¶", u"·": "·", u"¸": "¸", u"¹": "¹", u"º": "º", u"»": "»", u"¼": "¼", u"½": "½", u"¾": "¾", u"¿": "¿", u"À": "À", u"Á": "Á", u"Â": "Â", u"Ã": "Ã", u"Ä": "Ä", u"Å": "Å", u"Æ": "Æ", u"Ç": "Ç", u"È": "È", u"É": "É", u"Ê": "Ê", u"Ë": "Ë", u"Ì": "Ì", u"Í": "Í", u"Î": "Î", u"Ï": "Ï", u"Ð": "Ð", u"Ñ": "Ñ", u"Ò": "Ò", u"Ó": "Ó", u"Ô": "Ô", u"Õ": "Õ", u"Ö": "Ö", u"×": "×", u"Ø": "Ø", u"Ù": "Ù", u"Ú": "Ú", u"Û": "Û", u"Ü": "Ü", u"Ý": "Ý", u"Þ": "Þ", u"ß": "ß", u"à": "à", u"á": "á", u"â": "â", u"ã": "ã", u"ä": "ä", u"å": "å", u"æ": "æ", u"ç": "ç", u"è": "è", u"é": "é", u"ê": "ê", u"ë": "ë", u"ì": "ì", u"í": "í", u"î": "î", u"ï": "ï", u"ð": "ð", u"ñ": "ñ", u"ò": "ò", u"ó": "ó", u"ô": "ô", u"õ": "õ", u"ö": "ö", u"÷": "÷", u"ø": "ø", u"ù": "ù", u"ú": "ú", u"û": "û", u"ü": "ü", u"ý": "ý", u"þ": "þ", u"ÿ": "ÿ", u"Œ": "Œ", u"œ": "œ", u"Š": "Š", u"š": "š", u"Ÿ": "Ÿ", u"ƒ": "ƒ", u"ˆ": "ˆ", u"˜": "˜", u"Α": "Α", u"Β": "Β", u"Γ": "Γ", u"Δ": "Δ", u"Ε": "Ε", u"Ζ": "Ζ", u"Η": "Η", u"Θ": "Θ", u"Ι": "Ι", u"Κ": "Κ", u"Λ": "Λ", u"Μ": "Μ", u"Ν": "Ν", u"Ξ": "Ξ", u"Ο": "Ο", u"Π": "Π", u"Ρ": "Ρ", u"Σ": "Σ", u"Τ": "Τ", u"Υ": "Υ", u"Φ": "Φ", u"Χ": "Χ", u"Ψ": "Ψ", u"Ω": "Ω", u"α": "α", u"β": "β", u"γ": "γ", u"δ": "δ", u"ε": "ε", u"ζ": "ζ", u"η": "η", u"θ": "θ", u"ι": "ι", u"κ": "κ", u"λ": "λ", u"μ": "μ", u"ν": "ν", u"ξ": "ξ", u"ο": "ο", u"π": "π", u"ρ": "ρ", u"ς": "ς", u"σ": "σ", u"τ": "τ", u"υ": "υ", u"φ": "φ", u"χ": "χ", u"ψ": "ψ", u"ω": "ω", u"ϑ": "ϑ", u"ϒ": "ϒ", u"ϖ": "ϖ", u"–": "–", u"—": "—", u"‘": "‘", u"’": "’", u"‚": "‚", u"“": "“", u"”": "”", u"„": "„", u"†": "†", u"‡": "‡", u"•": "•", u"…": "…", u"‰": "‰", u"′": "′", u"″": "″", u"‹": "‹", u"›": "›", u"‾": "‾", u"⁄": "⁄", u"€": "€", u"ℑ": "ℑ", u"℘": "℘", u"ℜ": "ℜ", u"™": "™", u"ℵ": "ℵ", u"←": "←", u"↑": "↑", u"→": "→", u"↓": "↓", u"↔": "↔", u"↵": "↵", u"⇐": "⇐", u"⇑": "⇑", u"⇒": "⇒", u"⇓": "⇓", u"⇔": "⇔", u"∀": "∀", u"∂": "∂", u"∃": "∃", u"∅": "∅", u"∇": "∇", u"∈": "∈", u"∉": "∉", u"∋": "∋", u"∏": "∏", u"∑": "∑", u"−": "−", u"∗": "∗", u"√": "√", u"∝": "∝", u"∞": "∞", u"∠": "∠", u"∧": "∧", u"∨": "∨", u"∩": "∩", u"∪": "∪", u"∫": "∫", u"∴": "∴", u"∼": "∼", u"≅": "≅", u"≈": "≈", u"≠": "≠", u"≡": "≡", u"≤": "≤", u"≥": "≥", u"⊂": "⊂", u"⊃": "⊃", u"⊄": "⊄", u"⊆": "⊆", u"⊇": "⊇", u"⊕": "⊕", u"⊗": "⊗", u"⊥": "⊥", u"⋅": "⋅", u"⌈": "⌈", u"⌉": "⌉", u"⌊": "⌊", u"⌋": "⌋", u"〈": "⟨", u"〉": "⟩", u"◊": "◊", u"♠": "♠", u"♣": "♣", u"♥": "♥", u"♦": "♦", + u"\"": """, u"'": "'", u"<": "<", u">": ">", u"¡": "¡", u"¢": "¢", u"£": "£", u"¤": "¤", u"¥": "¥", u"¦": "¦", u"§": "§", u"¨": "¨", u"©": "©", u"ª": "ª", u"«": "«", u"¬": "¬", u"®": "®", u"¯": "¯", u"°": "°", u"±": "±", u"²": "²", u"³": "³", u"´": "´", u"µ": "µ", u"¶": "¶", u"·": "·", u"¸": "¸", u"¹": "¹", u"º": "º", u"»": "»", u"¼": "¼", u"½": "½", u"¾": "¾", u"¿": "¿", u"À": "À", u"Á": "Á", u"Â": "Â", u"Ã": "Ã", u"Ä": "Ä", u"Å": "Å", u"Æ": "Æ", u"Ç": "Ç", u"È": "È", u"É": "É", u"Ê": "Ê", u"Ë": "Ë", u"Ì": "Ì", u"Í": "Í", u"Î": "Î", u"Ï": "Ï", u"Ð": "Ð", u"Ñ": "Ñ", u"Ò": "Ò", u"Ó": "Ó", u"Ô": "Ô", u"Õ": "Õ", u"Ö": "Ö", u"×": "×", u"Ø": "Ø", u"Ù": "Ù", u"Ú": "Ú", u"Û": "Û", u"Ü": "Ü", u"Ý": "Ý", u"Þ": "Þ", u"ß": "ß", u"à": "à", u"á": "á", u"â": "â", u"ã": "ã", u"ä": "ä", u"å": "å", u"æ": "æ", u"ç": "ç", u"è": "è", u"é": "é", u"ê": "ê", u"ë": "ë", u"ì": "ì", u"í": "í", u"î": "î", u"ï": "ï", u"ð": "ð", u"ñ": "ñ", u"ò": "ò", u"ó": "ó", u"ô": "ô", u"õ": "õ", u"ö": "ö", u"÷": "÷", u"ø": "ø", u"ù": "ù", u"ú": "ú", u"û": "û", u"ü": "ü", u"ý": "ý", u"þ": "þ", u"ÿ": "ÿ", u"Œ": "Œ", u"œ": "œ", u"Š": "Š", u"š": "š", u"Ÿ": "Ÿ", u"ƒ": "ƒ", u"ˆ": "ˆ", u"˜": "˜", u"Α": "Α", u"Β": "Β", u"Γ": "Γ", u"Δ": "Δ", u"Ε": "Ε", u"Ζ": "Ζ", u"Η": "Η", u"Θ": "Θ", u"Ι": "Ι", u"Κ": "Κ", u"Λ": "Λ", u"Μ": "Μ", u"Ν": "Ν", u"Ξ": "Ξ", u"Ο": "Ο", u"Π": "Π", u"Ρ": "Ρ", u"Σ": "Σ", u"Τ": "Τ", u"Υ": "Υ", u"Φ": "Φ", u"Χ": "Χ", u"Ψ": "Ψ", u"Ω": "Ω", u"α": "α", u"β": "β", u"γ": "γ", u"δ": "δ", u"ε": "ε", u"ζ": "ζ", u"η": "η", u"θ": "θ", u"ι": "ι", u"κ": "κ", u"λ": "λ", u"μ": "μ", u"ν": "ν", u"ξ": "ξ", u"ο": "ο", u"π": "π", u"ρ": "ρ", u"ς": "ς", u"σ": "σ", u"τ": "τ", u"υ": "υ", u"φ": "φ", u"χ": "χ", u"ψ": "ψ", u"ω": "ω", u"ϑ": "ϑ", u"ϒ": "ϒ", u"ϖ": "ϖ", u"–": "–", u"—": "—", u"‘": "‘", u"’": "’", u"‚": "‚", u"“": "“", u"”": "”", u"„": "„", u"†": "†", u"‡": "‡", u"•": "•", u"…": "…", u"‰": "‰", u"′": "′", u"″": "″", u"‹": "‹", u"›": "›", u"‾": "‾", u"⁄": "⁄", u"€": "€", u"ℑ": "ℑ", u"℘": "℘", u"ℜ": "ℜ", u"™": "™", u"ℵ": "ℵ", u"←": "←", u"↑": "↑", u"→": "→", u"↓": "↓", u"↔": "↔", u"↵": "↵", u"⇐": "⇐", u"⇑": "⇑", u"⇒": "⇒", u"⇓": "⇓", u"⇔": "⇔", u"∀": "∀", u"∂": "∂", u"∃": "∃", u"∅": "∅", u"∇": "∇", u"∈": "∈", u"∉": "∉", u"∋": "∋", u"∏": "∏", u"∑": "∑", u"−": "−", u"∗": "∗", u"√": "√", u"∝": "∝", u"∞": "∞", u"∠": "∠", u"∧": "∧", u"∨": "∨", u"∩": "∩", u"∪": "∪", u"∫": "∫", u"∴": "∴", u"∼": "∼", u"≅": "≅", u"≈": "≈", u"≠": "≠", u"≡": "≡", u"≤": "≤", u"≥": "≥", u"⊂": "⊂", u"⊃": "⊃", u"⊄": "⊄", u"⊆": "⊆", u"⊇": "⊇", u"⊕": "⊕", u"⊗": "⊗", u"⊥": "⊥", u"⋅": "⋅", u"⌈": "⌈", u"⌉": "⌉", u"⌊": "⌊", u"⌋": "⌋", u"〈": "⟨", u"〉": "⟩", u"◊": "◊", u"♠": "♠", u"♣": "♣", u"♥": "♥", u"♦": "♦", u"\xa0": " ", } xml_escape_table = { u"\"": """, u"'": "'", u"<": "<", u">": ">" @@ -100,7 +92,13 @@ class XmlEntitizeCommand(StringEncode): for k in xml_escape_table: v = xml_escape_table[k] text = text.replace(k, v) - return text + ret = '' + for i, c in enumerate(text): + if ord(c) > 127: + ret += hex(ord(c)).replace('0x', '&#x') + ';' + else: + ret += c + return ret class XmlDeentitizeCommand(StringEncode): @@ -124,12 +122,12 @@ class JsonUnescapeCommand(StringEncode): class UrlEncodeCommand(StringEncode): def encode(self, text): - return urllib.quote(text) + return urllib.parse.quote(text) class UrlDecodeCommand(StringEncode): def encode(self, text): - return urllib.unquote(text) + return urllib.parse.unquote(text) class Base64EncodeCommand(StringEncode): @@ -163,3 +161,130 @@ class HexDecCommand(StringEncode): class DecHexCommand(StringEncode): def encode(self, text): return hex(int(text)) + + +class UnicodeHexCommand(StringEncode): + def encode(self, text): + hex_text = u'' + text_bytes = bytes(text, 'utf-16') + + if text_bytes[0:2] == b'\xff\xfe': + endian = 'little' + text_bytes = text_bytes[2:] + elif text_bytes[0:2] == b'\xfe\xff': + endian = 'big' + text_bytes = text_bytes[2:] + + char_index = 0 + for c in text_bytes: + if char_index == 0: + c1 = c + char_index += 1 + elif char_index == 1: + c2 = c + if endian == 'little': + c1, c2 = c2, c1 + tmp = (c1 << 8) + c2 + if tmp < 0x80: + hex_text += chr(tmp) + char_index = 0 + elif tmp >= 0xd800 and tmp <= 0xdbff: + char_index += 1 + else: + hex_text += '\\u' + '{0:04x}'.format(tmp) + char_index = 0 + elif char_index == 2: + c3 = c + char_index += 1 + elif char_index == 3: + c4 = c + if endian == 'little': + c3, c4 = c4, c3 + tmp1 = ((c1 << 8) + c2) - 0xd800 + tmp2 = ((c3 << 8) + c4) - 0xdc00 + tmp = (tmp1 * 0x400) + tmp2 + 0x10000 + hex_text += '\\U' + '{0:08x}'.format(tmp) + char_index = 0 + return hex_text + + +class HexUnicodeCommand(StringEncode): + def encode(self, text): + uni_text = text + + endian = sys.byteorder + + r = re.compile(r'\\u([0-9a-fA-F]{2})([0-9a-fA-F]{2})') + rr = r.search(uni_text) + while rr: + first_byte = int(rr.group(1), 16) + + if first_byte >= 0xd8 and first_byte <= 0xdf: + # Surrogate pair + pass + else: + if endian == 'little': + b1 = int(rr.group(2), 16) + b2 = int(rr.group(1), 16) + else: + b1 = int(rr.group(1), 16) + b2 = int(rr.group(2), 16) + + ch = bytes([b1, b2]).decode('utf-16') + + uni_text = uni_text.replace(rr.group(0), ch) + rr = r.search(uni_text, rr.start(0)+1) + + # Surrogate pair (2 bytes + 2 bytes) + r = re.compile(r'\\u([0-9a-fA-F]{2})([0-9a-fA-F]{2})\\u([0-9a-fA-F]{2})([0-9a-fA-F]{2})') + rr = r.search(uni_text) + while rr: + if endian == 'little': + b1 = int(rr.group(2), 16) + b2 = int(rr.group(1), 16) + b3 = int(rr.group(4), 16) + b4 = int(rr.group(3), 16) + else: + b1 = int(rr.group(1), 16) + b2 = int(rr.group(2), 16) + b3 = int(rr.group(3), 16) + b4 = int(rr.group(4), 16) + + ch = bytes([b1, b2, b3, b4]).decode('utf-16') + + uni_text = uni_text.replace(rr.group(0), ch) + rr = r.search(uni_text) + + # Surrogate pair (4 bytes) + r = re.compile(r'\\U([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})') + rr = r.search(uni_text) + while rr: + tmp = (int(rr.group(1), 16) << 24) \ + + (int(rr.group(2), 16) << 16) \ + + (int(rr.group(3), 16) << 8) \ + + (int(rr.group(4), 16)) + + if (tmp <= 0xffff): + ch = chr(tmp) + else: + tmp -= 0x10000 + c1 = 0xd800 + int(tmp / 0x400) + c2 = 0xdc00 + int(tmp % 0x400) + if endian == 'little': + b1 = c1 & 0xff + b2 = c1 >> 8 + b3 = c2 & 0xff + b4 = c2 >> 8 + else: + b1 = c1 >> 8 + b2 = c1 & 0xff + b3 = c2 >> 8 + b4 = c2 & 0xff + + ch = bytes([b1, b2, b3, b4]).decode('utf-16') + + uni_text = uni_text.replace(rr.group(0), ch) + rr = r.search(uni_text) + + return uni_text + diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/TrailingSpaces/README.md b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/TrailingSpaces/README.md index 0627b55..b5fb775 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/TrailingSpaces/README.md +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/TrailingSpaces/README.md @@ -6,6 +6,30 @@ A [Sublime Text 2](http://www.sublimetext.com/2) and **highlight trailing spaces and delete them in a flash!** +--- + +- [Synopsis](#synopsis) +- [Installation](#installation) + - [Alternative installation methods](#alternative-installation-methods) + - [From github](#from-github) + - [Manually](#manually) +- [Usage](#usage) + - [Deletion](#deletion) + - [Toggling highlighting](#toggling-highlighting) +- [Options](#options) + - [Changing the highlighting color](#changing-the-highlighting-color) + - [Keeping trailing spaces invisible](#keeping-trailing-spaces-invisible) + - [Include Current Line](#include-current-line) + - [Include Empty Lines](#include-empty-lines) + - [Modified Lines Only](#modified-lines-only) + - [Trim On Save](#trim-on-save) + - [Save After Trim](#save-after-trim) + - [Live Matching vs On-demand Matching](#live-matching-vs-on-demand-matching) + - [For power-users only!](#for-power-users-only) + - [Disabled for large files](#disabled-for-large-files) + - [The matching pattern](#the-matching-pattern) +- [About Sublime Text's built-in features](#about-sublime-texts-built-in-features) + Synopsis -------- diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/TrailingSpaces/package-metadata.json b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/TrailingSpaces/package-metadata.json index 52d06dd..38e6ff6 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/TrailingSpaces/package-metadata.json +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/TrailingSpaces/package-metadata.json @@ -1 +1 @@ -{"url": "https://github.com/SublimeText/TrailingSpaces", "version": "2013.03.07.20.09.52", "description": "Highlight trailing spaces and delete them in a flash."} \ No newline at end of file +{"url": "https://github.com/SublimeText/TrailingSpaces", "version": "2013.07.31.14.53.02", "description": "Highlight trailing spaces and delete them in a flash."} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Editor/Default (OSX).sublime-keymap b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Editor/Default (OSX).sublime-keymap new file mode 100644 index 0000000..54262bb --- /dev/null +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Editor/Default (OSX).sublime-keymap @@ -0,0 +1,442 @@ + [ + // since we assign super+Shift+V to clipboard manager, use paste / indent with default super+v + { "keys": ["super+v"], "command": "paste_and_indent" }, + + //HACK: override the vertical column selections to use Ctrl+Shift in RDP + { "keys": ["ctrl+shift+up"], "command": "select_lines", "args": {"forward": false} }, + { "keys": ["ctrl+shift+down"], "command": "select_lines", "args": {"forward": true} }, + + //HACK: restore default shift+tab keybindings because SmartMarkdown messes with them too much + { "keys": ["shift+tab"], "command": "insert", "args": {"characters": "\t"} }, + { "keys": ["shift+tab"], "command": "unindent", "context": + [ + { "key": "setting.shift_tab_unindent", "operator": "equal", "operand": true } + ] + }, + { "keys": ["shift+tab"], "command": "unindent", "context": + [ + { "key": "preceding_text", "operator": "regex_match", "operand": "^[\t ]*" } + ] + }, + { "keys": ["shift+tab"], "command": "unindent", "context": + [ + { "key": "text", "operator": "regex_contains", "operand": "\n" } + ] + }, + { "keys": ["shift+tab"], "command": "prev_field", "context": + [ + { "key": "has_prev_field", "operator": "equal", "operand": true } + ] + }, + + //Abacus - https://github.com/khiltd/Abacus + { "keys": ["ctrl+alt+\\"], "command": "abacus" }, + + // Bracketeer - https://github.com/colinta/SublimeBracketeer + { "keys": ["super+]"], "command": "bracketeer_indent" }, + { "keys": ["ctrl+shift+["], "command": "bracketeer_select" }, + { "keys": ["ctrl+["], "command": "bracketeer_goto", "args": { "goto": "left" } }, + { "keys": ["ctrl+]"], "command": "bracketeer_goto", "args": { "goto": "right" } }, + { "keys": ["ctrl+alt+["], "command": "bracketeer_goto", "args": { "goto": "both" } }, + { "keys": ["ctrl+alt+]"], "command": "bracketeer_goto", "args": { "goto": "both" } }, + //| + //| BRACKETEER + //| + { "keys": ["{"], "command": "bracketeer", "args": { "braces": "{}", "unindent": true } }, + { "keys": ["}"], "command": "bracketeer", "args": { "braces": "{}", "pressed": "}", "unindent": true } }, + { "keys": ["["], "command": "bracketeer", "args": { "braces": "[]" } }, + { "keys": ["]"], "command": "bracketeer", "args": { "braces": "[]", "pressed": "]" } }, + { "keys": ["("], "command": "bracketeer", "args": { "braces": "()" } }, + { "keys": [")"], "command": "bracketeer", "args": { "braces": "()", "pressed": ")" } }, + //| reStructured Text + { "keys": ["alt+`"], "command": "bracketeer", "args": { "braces": "````", "pressed": "``" }, "context": + [ + { "key": "selector", "operator": "equal", "operand": "text.restructuredtext" } + ] + }, + { "keys": ["*"], "command": "bracketeer", "args": { "braces": "**", "pressed": "*" }, "context": + [ + { "key": "selector", "operator": "equal", "operand": "text.restructuredtext" } + ] + }, + //| DJANGO CURLIES + // For django, liquid, jinja. All the grammars *I* have list 'source.smarty' as + // when the cursor is inside "{}"s + { "keys": ["{"], "command": "bracketeer", "args": { "braces": "{ }" }, "context": + [{ "key": "selector", "operator": "equal", "operand": "source.smarty" }] + }, + { "keys": ["{"], "command": "bracketeer", "args": { "braces": "{ }" }, "context": + [{ "key": "selector", "operator": "equal", "operand": "meta.brace.curly" }] + }, + { "keys": ["%"], "command": "bracketeer", "args": { "braces": "% %" }, "context": + [{ "key": "selector", "operator": "equal", "operand": "source.smarty" }] + }, + { "keys": ["%"], "command": "bracketeer", "args": { "braces": "% %" }, "context": + [ + { "key": "selector", "operator": "equal", "operand": "meta.brace.curly" }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "<$", "match_all": true } + ] + }, + { "keys": ["%"], "command": "insert_snippet", "args": { "contents": " $1 %>$0" }, "context": + [ + { "key": "selector", "operator": "equal", "operand": "source.ruby" }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "<%$", "match_all": true } + ] + }, + { "keys": [">"], "command": "insert_snippet", "args": { "contents": ">$1<% $0" }, "context": + [ + { "key": "selector", "operator": "equal", "operand": "source.ruby" }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "%$", "match_all": true } + ] + }, + { "keys": ["="], "command": "insert_snippet", "args": { "contents": "= $1 %>$0" }, "context": + [ + { "key": "selector", "operator": "equal", "operand": "source.ruby" }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "<%$", "match_all": true } + ] + }, + { "keys": ["-"], "command": "insert_snippet", "args": { "contents": "- $1 %>$0" }, "context": + [ + { "key": "selector", "operator": "equal", "operand": "source.ruby" }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "<%$", "match_all": true } + ] + }, + { "keys": ["#"], "command": "bracketeer", "args": { "braces": "# #" }, "context": + [{ "key": "selector", "operator": "equal", "operand": "source.smarty" }] + }, + //| QUOTES + { "keys": ["\""], "command": "bracketeer", "args": { "braces": "\"\"", "pressed": "\"" } }, + { "keys": ["ctrl+'","ctrl+'"], "command": "bracketeer", "args": { "braces": "\"\"\"\n\n\"\"\"" } }, + { "keys": ["'"], "command": "bracketeer", "args": { "braces": "''", "pressed": "'" } }, + { "keys": ["ctrl+'","'"], "command": "bracketeer", "args": { "braces": "'''\n\n'''" } }, + { "keys": ["`"], "command": "bracketeer", "args": { "braces": "``", "pressed": "`" } }, + { "keys": ["ctrl+'","`"], "command": "insert_snippet", "args": { "contents": "```${1:syntax}\n$0\n```" } }, + { "keys": ["«"], "command": "bracketeer", "args": { "braces": "«»" } }, + { "keys": ["»"], "command": "bracketeer", "args": { "braces": "«»", "pressed": "»" } }, + { "keys": ["‹"], "command": "bracketeer", "args": { "braces": "‹›" } }, + { "keys": ["›"], "command": "bracketeer", "args": { "braces": "‹›", "pressed": "›" } }, + { "keys": ["“"], "command": "bracketeer", "args": { "braces": "“”" } }, + { "keys": ["”"], "command": "bracketeer", "args": { "braces": "“”", "pressed": "”" } }, + { "keys": ["‘"], "command": "bracketeer", "args": { "braces": "‘’" } }, + { "keys": ["’"], "command": "bracketeer", "args": { "braces": "‘’", "pressed": "’" } }, + //| + //| AUTO DELETE MATCHING '', "", [], etc. + //| + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "\"$" }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\"" } + ] + }, + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "'$" }, + { "key": "following_text", "operator": "regex_contains", "operand": "^'" } + ] + }, + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "`$" }, + { "key": "following_text", "operator": "regex_contains", "operand": "^`" } + ] + }, + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "«$" }, + { "key": "following_text", "operator": "regex_contains", "operand": "^»" } + ] + }, + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "‹$" }, + { "key": "following_text", "operator": "regex_contains", "operand": "^›" } + ] + }, + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "“$" }, + { "key": "following_text", "operator": "regex_contains", "operand": "^”" } + ] + }, + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "‘$" }, + { "key": "following_text", "operator": "regex_contains", "operand": "^’" } + ] + }, + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "selector", "operator": "equal", "operand": "text.restructuredtext" }, + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "\\*$" }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\*" } + ] + }, + //| + //| Bracket and select + //| + { "keys": ["ctrl+alt+[", "backspace"], "command": "bracketeer", "args": { "braces": "", "select": true, "replace": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+[", "{"], "command": "bracketeer", "args": { "braces": "{}", "select": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+alt+[", "{"], "command": "bracketeer", "args": { "braces": "{}", "select": true, "replace": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+[", " "], "command": "bracketeer", "args": { "braces": " ", "select": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+alt+[", " "], "command": "bracketeer", "args": { "braces": " ", "select": true, "replace": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+[", "["], "command": "bracketeer", "args": { "braces": "[]", "select": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+alt+[", "["], "command": "bracketeer", "args": { "braces": "[]", "select": true, "replace": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+[", "("], "command": "bracketeer", "args": { "braces": "()", "select": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+alt+[", "("], "command": "bracketeer", "args": { "braces": "()", "select": true, "replace": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+[", "\""], "command": "bracketeer", "args": { "braces": "\"\"", "select": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+alt+[", "\""], "command": "bracketeer", "args": { "braces": "\"\"", "select": true, "replace": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+[", "ctrl+shift+'"], "command": "bracketeer", "args": { "braces": "\"\"\"\"\"\"", "select": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+alt+[", "ctrl+shift+'"], "command": "bracketeer", "args": { "braces": "\"\"\"\"\"\"", "select": true, "replace": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+[", "'"], "command": "bracketeer", "args": { "braces": "''", "select": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+alt+[", "'"], "command": "bracketeer", "args": { "braces": "''", "select": true, "replace": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+[", "ctrl+'"], "command": "bracketeer", "args": { "braces": "''''''", "select": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+alt+[", "ctrl+'"], "command": "bracketeer", "args": { "braces": "''''''", "select": true, "replace": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+[", "`"], "command": "bracketeer", "args": { "braces": "``", "select": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+alt+[", "`"], "command": "bracketeer", "args": { "braces": "``", "select": true, "replace": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+[", "ctrl+`"], "command": "bracketeer", "args": { "braces": "``````", "select": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+alt+[", "ctrl+`"], "command": "bracketeer", "args": { "braces": "``````", "select": true, "replace": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+[", "«"], "command": "bracketeer", "args": { "braces": "«»", "select": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+alt+[", "«"], "command": "bracketeer", "args": { "braces": "«»", "select": true, "replace": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+[", "‹"], "command": "bracketeer", "args": { "braces": "‹›", "select": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+alt+[", "‹"], "command": "bracketeer", "args": { "braces": "‹›", "select": true, "replace": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+[", "“"], "command": "bracketeer", "args": { "braces": "“”", "select": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+alt+[", "“"], "command": "bracketeer", "args": { "braces": "“”", "select": true, "replace": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+[", "‘"], "command": "bracketeer", "args": { "braces": "‘’", "select": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+alt+[", "‘"], "command": "bracketeer", "args": { "braces": "‘’", "select": true, "replace": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+[", "alt+`"], "command": "bracketeer", "args": { "braces": "````", "select": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+alt+[", "alt+`"], "command": "bracketeer", "args": { "braces": "````", "select": true, "replace": true }, "context": + [{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }] + }, + { "keys": ["ctrl+[", "*"], "command": "bracketeer", "args": { "braces": "**", "select": true }, "context": + [ + { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }, + { "key": "selector", "operator": "equal", "operand": "text.restructuredtext" } + ] + }, + { "keys": ["ctrl+alt+[", "*"], "command": "bracketeer", "args": { "braces": "**", "select": true, "replace": true }, "context": + [ + { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }, + { "key": "selector", "operator": "equal", "operand": "text.restructuredtext" } + ] + }, + + //BracketHighlighter - https://github.com/facelessuser/BracketHighlighter/ + + // ClipboardManager - https://github.com/colinta/SublimeClipboardManager + { "keys": ["super+x"], "command": "clipboard_manager_cut" }, + { "keys": ["super+c"], "command": "clipboard_manager_copy" }, + { "keys": ["super+v"], "command": "clipboard_manager_paste", "args": { "indent": true } }, + { "keys": ["super+alt+v"], "command": "clipboard_manager_next_and_paste" }, + { "keys": ["super+shift+alt+v"], "command": "clipboard_manager_previous_and_paste" }, + //{ "keys": ["super+pageup"], "command": "clipboard_manager_next" }, + //{ "keys": ["super+pagedown"], "command": "clipboard_manager_previous" }, + //{ "keys": ["super+home"], "command": "clipboard_manager_show" }, + { "keys": ["super+shift+v"], "command": "clipboard_manager_choose_and_paste" }, + + // EasyMotion - https://github.com/tednaleid/sublime-EasyMotion + { + "keys": ["super+;", ""], + "command": "easy_motion", + "args": {"select_text": false} + }, + { + "keys": ["super+;", "enter"], + "command": "easy_motion", + "args": {"select_text": false, "character": "enter"} + }, + { + "keys": ["super+shift+;", ""], + "command": "easy_motion", + "args": {"select_text": true} + }, + { + "keys": ["super+shift+;", "enter"], + "command": "easy_motion", + "args": {"select_text": true, "character": "enter"} + } + + // ExportHTML - https://github.com/facelessuser/ExportHtml + // use defaults + + // FileDiffs - https://github.com/colinta/SublimeFileDiffs + { "keys": ["ctrl+shift+d"], "command": "file_diff_menu" }, + + // Smart Markdown - https://github.com/demon386/SmartMarkdown + // accept all the defaults for building lists and tables + { "keys": ["tab"], "command": "smart_folding", "context": + [{ "key": "selector", "operator": "equal", "operand": "markup.heading.markdown" }] + }, + { "keys": ["shift+tab"], "command": "global_folding", "context": + [{ "key": "selector", "operator": "equal", "operand": "text.html.markdown" }] + }, + { "keys": ["enter"], "command": "smart_list", "context": [ + { "key": "selector", "operator": "equal", "operand": "text.html.markdown" }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "^\\s*([-+\\**]|\\d+\\.+)\\s+" } + ]}, + { "keys": ["enter"], "command": "smart_list", "context": [ + { "key": "selector", "operator": "equal", "operand": "text.html.markdown" }, + { "key": "selector", "operator": "equal", "operand": "markup.list" } + ]}, + { "keys": ["tab"], "command": "smart_table", "args": {"forward": true}, "context": [ + { "key": "selector", "operator": "equal", "operand": "text.html.markdown" }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "^\\s*(\\||\\+[-=])", "match_all": true} + ]}, + { "keys": ["tab"], "command": "smart_table", "args": {"forward": true}, "context": [ + { "key": "selector", "operator": "equal", "operand": "text.html.markdown" }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "^\\s*" }, + { "key": "following_text", "operator": "regex_contains", "operand": "\\s*(\\||\\+[-=])", "match_all": true} + ]}, + { "keys": ["shift+tab"], "command": "smart_table", "args": {"forward": false}, "context": [ + { "key": "selector", "operator": "equal", "operand": "text.html.markdown" }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "^\\s*(\\||\\+[-=])", + "match_all": true} + ]}, + { "keys": ["shift+tab"], "command": "smart_table", "args": {"forward": false}, "context": [ + { "key": "selector", "operator": "equal", "operand": "text.html.markdown" }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "^\\s*" }, + { "key": "following_text", "operator": "regex_contains", "operand": "\\s*(\\||\\+[-=])", "match_all": true} + ]}, + { + "keys": ["super+shift+."], "command": "change_heading_level", "args": {"up": true}, "context": [ + {"key": "selector", "operator": "equal", "operand": "text.html.markdown"} + ]}, + { + "keys": ["super+shift+,"], "command": "change_heading_level", "args": {"up": false}, "context": [ + {"key": "selector", "operator": "equal", "operand": "text.html.markdown"} + ]}, + + //Sublime Text 2 - Related Files - https://github.com/fabiokr/sublime-related-files + { "keys": ["ctrl+alt+t"], "command": "related_files" }, + + //SublimeTODO - https://github.com/robcowie/SublimeTODO + // { + // "keys": ["n"], "command": "goto_next_result", + // "context": [{ "key": "setting.todo_results", "operator": "equal", "operand": true }] + // } + { + "keys": ["n"], "command": "navigate_results", + //// {"key": "setting.todo_results"} + "context": [ {"key": "setting.command_mode", "operand": true}], + "args": {"direction": "forward"} + }, + { + "keys": ["down"], "command": "navigate_results", + // {"key": "setting.todo_results"} + "context": [{"key": "setting.command_mode", "operand": true}], + "args": {"direction": "forward"} + }, + { + "keys": ["j"], "command": "navigate_results", + "context": [{"key": "setting.command_mode", "operand": true}], + // {"key": "setting.todo_results"} + "args": {"direction": "forward"} + }, + { + "keys": ["p"], "command": "navigate_results", + // {"key": "setting.todo_results"} + "context": [{"key": "setting.command_mode", "operand": true}], + "args": {"direction": "backward"} + }, + { + "keys": ["up"], "command": "navigate_results", + //{"key": "setting.todo_results"} + "context": [{"key": "setting.command_mode", "operand": true}], + "args": {"direction": "backward"} + }, + { + "keys": ["k"], "command": "navigate_results", + "context": [{"key": "setting.command_mode", "operand": true}], + //{"key": "setting.todo_results"} + "args": {"direction": "backward"} + }, + { + "keys": ["c"], "command": "clear_selection", + // {"key": "setting.todo_results"} + "context": [{"key": "setting.command_mode", "operand": true}] + }, + { + "keys": ["enter"], "command": "goto_comment", + // {"key": "setting.todo_results"} + "context": [{"key": "setting.command_mode", "operand": true}] + }, + + //Snippet Browsing Keybindings + { "keys": ["shift+f1"], "command": "show_overlay", + "args": {"overlay": "command_palette", "text": "snippet"} } +] diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Editor/Default (Windows).sublime-keymap b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Editor/Default (Windows).sublime-keymap index adac1a1..42196a3 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Editor/Default (Windows).sublime-keymap +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Editor/Default (Windows).sublime-keymap @@ -297,90 +297,6 @@ }, //BracketHighlighter - https://github.com/facelessuser/BracketHighlighter/ - { - "keys": ["ctrl+shift+b", "ctrl+shift+b"], "command": "bracket_highlighter_key", - "args": {"lines": true} - }, - { - "keys": ["alt+up"], "command": "bracket_highlighter_key", - "args": - { - "lines" : true, - "plugin": - { - "type": ["quote","bracket","tag"], - "command": "bracket_plugins.select_bracket", - "args": {"select": "left"} - } - } - }, - { - "keys": ["alt+down"], "command": "bracket_highlighter_key", - "args": - { - "lines" : true, - "plugin": - { - "type": ["quote","bracket","tag"], - "command": "bracket_plugins.select_bracket", - "args": {"select": "right"} - } - } - }, - { - "keys": ["ctrl+shift+b","ctrl+shift+s"], "command": "bracket_highlighter_key", - "args": - { - "lines" : true, - "plugin": - { - "type": ["quote","bracket","tag"], - "command": "bracket_plugins.select_bracket" - } - } - }, - { - "keys": ["ctrl+shift+b","ctrl+shift+t"], "command": "bracket_highlighter_key", - "args": - { - "ignore": ["quote"], - "plugin": - { - "type": ["tag"], - "command": "bracket_plugins.select_tag" - } - } - }, - { - "keys": ["ctrl+shift+b","ctrl+shift+n"], "command": "bracket_highlighter_key", - "args": - { - "ignore": ["quote"], - "plugin": - { - "type": ["tag"], - "command": "bracket_plugins.select_attr", - "args": {"direction": "right"} - } - } - }, - { - "keys": ["ctrl+shift+b","ctrl+shift+q"], "command": "bracket_highlighter_key", - "args": - { - "plugin": {"type": ["quote"],"command" : "bracket_plugins.swap_quotes"} - } - }, - { - "keys": ["ctrl+shift+b","ctrl+shift+j"], "command": "swap_brackets" - }, - { - "keys": ["ctrl+shift+b","ctrl+shift+["], "command": "bracket_highlighter_key", - "args": - { - "plugin": {"type": ["quote", "tag", "bracket"],"command" : "bracket_plugins.fold_bracket"} - } - }, // ClipboardManager - https://github.com/colinta/SublimeClipboardManager { "keys": ["ctrl+x"], "command": "clipboard_manager_cut" }, @@ -417,14 +333,14 @@ // FileDiffs - https://github.com/colinta/SublimeFileDiffs { "keys": ["ctrl+shift+d"], "command": "file_diff_menu" }, - // MarkDown Preview - https://github.com/revolunet/sublimetext-markdown-preview - { "keys": ["ctrl+alt+m"], "command": "markdown_preview", "args": {"target": "browser"} }, - // Smart Markdown - https://github.com/demon386/SmartMarkdown // accept all the defaults for building lists and tables { "keys": ["tab"], "command": "smart_folding", "context": [{ "key": "selector", "operator": "equal", "operand": "markup.heading.markdown" }] }, + { "keys": ["shift+tab"], "command": "global_folding", "context": + [{ "key": "selector", "operator": "equal", "operand": "text.html.markdown" }] + }, { "keys": ["enter"], "command": "smart_list", "context": [ { "key": "selector", "operator": "equal", "operand": "text.html.markdown" }, { "key": "preceding_text", "operator": "regex_contains", "operand": "^\\s*([-+\\**]|\\d+\\.+)\\s+" } diff --git a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Editor/package-metadata.json b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Editor/package-metadata.json index 2745b25..2e40fc5 100644 --- a/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Editor/package-metadata.json +++ b/EthanBrown.SublimeText2.EditorPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Editor/package-metadata.json @@ -1 +1 @@ -{"url": "https://github.com/Iristyle/SublimeKeyMap.Editor", "version": "2013.03.26.11.48.08", "description": "A simple repository used to host / share my customized Sublime Text 2 key bindings for Sublime editor enhancement plugins"} \ No newline at end of file +{"url": "https://github.com/Iristyle/SublimeKeyMap.Editor", "version": "2013.09.17.02.08.40", "description": "A simple repository used to host / share my customized Sublime Text 2 key bindings for Sublime editor enhancement plugins"} \ No newline at end of file