aboutsummaryrefslogtreecommitdiff
path: root/vim/bundle/vim-snippets/UltiSnips/rst.snippets
diff options
context:
space:
mode:
Diffstat (limited to 'vim/bundle/vim-snippets/UltiSnips/rst.snippets')
-rw-r--r--vim/bundle/vim-snippets/UltiSnips/rst.snippets293
1 files changed, 293 insertions, 0 deletions
diff --git a/vim/bundle/vim-snippets/UltiSnips/rst.snippets b/vim/bundle/vim-snippets/UltiSnips/rst.snippets
new file mode 100644
index 0000000..0596eee
--- /dev/null
+++ b/vim/bundle/vim-snippets/UltiSnips/rst.snippets
@@ -0,0 +1,293 @@
+# -*- coding: utf-8 -*-
+
+priority -50
+
+###########################################################################
+# General Stuff #
+###########################################################################
+global !p
+import vim
+from os import path as ospath
+from string import Template
+import re
+from collections import Counter
+
+from vimsnippets import complete
+
+#http://docutils.sourceforge.net/docs/ref/rst/roles.html
+TEXT_ROLES = ['emphasis','literal','code','math',
+ 'pep-reference','rfc-reference',
+ 'strong','subscript','superscript',
+ 'title-reference','raw']
+TEXT_ROLES_REGEX = r'\.\.\srole::?\s(w+)'
+
+#http://docutils.sourceforge.net/docs/ref/rst/directives.html#specific-admonitions
+SPECIFIC_ADMONITIONS = ["attention", "caution", "danger",
+ "error", "hint", "important", "note",
+ "tip", "warning"]
+#http://docutils.sourceforge.net/docs/ref/rst/directives.html
+DIRECTIVES = ['topic','sidebar','math','epigraph',
+ 'parsed-literal','code','highlights',
+ 'pull-quote','compound','container',
+ 'list-table','class','sectnum',
+ 'role','default-role','unicode',
+ 'raw']
+
+NONE_CONTENT_DIRECTIVES = ['rubric', 'contents', 'header',
+ 'footer', 'date', 'include', 'title']
+
+INCLUDABLE_DIRECTIVES = ['image', 'figure', 'include']
+# CJK chars
+# http://stackoverflow.com/questions/2718196/find-all-chinese-text-in-a-string-using-python-and-regex
+CJK_RE = re.compile(u'[⺀-⺙⺛-⻳⼀-⿕々〇〡-〩〸-〺〻㐀-䶵一-鿃豈-鶴侮-頻並-龎]', re.UNICODE)
+
+
+def has_cjk(s):
+ """Detect if s contains CJK characters."""
+ return CJK_RE.search(s) is not None
+
+def real_filename(filename):
+ """pealeextension name off if possible
+ # i.e. "foo.bar.png will return "foo.bar"
+ """
+ return ospath.splitext(filename)[0]
+
+def check_file_exist(rst_path, relative_path):
+ """
+ For RST file, it can just include files as relative path.
+
+ :param rst_path: absolute path to rst file
+ :param relative_path: path related to rst file
+ :return: relative file's absolute path if file exist
+ """
+ abs_path = ospath.join(ospath.dirname(rst_path), relative_path)
+ if ospath.isfile(abs_path):
+ return abs_path
+
+
+try:
+ rst_char_len = vim.strwidth # Requires Vim 7.3+
+except AttributeError:
+ from unicodedata import east_asian_width
+ def rst_char_len(s):
+ """Return the required over-/underline length for s."""
+ result = 0
+ for c in s:
+ result += 2 if east_asian_width(c) in ('W', 'F') else 1
+ return result
+
+
+def make_items(times, leading='+'):
+ """
+ make lines with leading char multitimes
+
+ :param: times, how many times you need
+ :param: leading, leading character
+ """
+ times = int(times)
+ if leading == 1:
+ msg = ""
+ for x in range(1, times+1):
+ msg += "%s. Item\n" % x
+ return msg
+ else:
+ return ("%s Item\n" % leading) * times
+
+
+def look_up_directives(regex, fpath):
+ """
+ find all directive args in given file
+ :param: regex, the regex that needs to match
+ :param: path, to path to rst file
+
+ :return: list, empty list if nothing match
+ """
+ try:
+ with open(fpath) as source:
+ match = re.findall(regex, source.read())
+ except IOError:
+ match = []
+ return match
+
+
+def get_popular_code_type():
+ """
+ find most popular code type in the given rst
+
+ :param path: file to detect
+
+ :return: string, most popular code type in file
+ """
+ buf = "".join(vim.current.buffer)
+ types = re.findall(r'[:|\.\.\s]code::?\s(\w+)', buf)
+ try:
+ popular_type = Counter(types).most_common()[0][0]
+ except IndexError:
+ popular_type = "lua" # Don't break default
+ return popular_type
+endglobal
+
+snippet part "Part" b
+`!p snip.rv = rst_char_len(t[1])*'#'`
+${1:${VISUAL:Part name}}
+`!p snip.rv = rst_char_len(t[1])*'#'`
+
+$0
+endsnippet
+
+snippet chap "Chapter" b
+`!p snip.rv = rst_char_len(t[1])*'*'`
+${1:${VISUAL:Chapter name}}
+`!p snip.rv = rst_char_len(t[1])*'*'`
+
+$0
+endsnippet
+
+snippet sec "Section" b
+${1:${VISUAL:Section name}}
+`!p snip.rv = rst_char_len(t[1])*'='`
+
+$0
+endsnippet
+
+snippet ssec "Subsection" b
+${1:${VISUAL:Subsection name}}
+`!p snip.rv = rst_char_len(t[1])*'-'`
+
+$0
+endsnippet
+
+snippet sssec "Subsubsection" b
+${1:${VISUAL:Subsubsection name}}
+`!p snip.rv = rst_char_len(t[1])*'^'`
+
+$0
+endsnippet
+
+snippet para "Paragraph" b
+${1:${VISUAL:Paragraph name}}
+`!p snip.rv = rst_char_len(t[1])*'"'`
+
+$0
+endsnippet
+
+snippet em "Emphasize string" i
+`!p
+# dirty but works with CJK character detection
+if has_cjk(vim.current.line):
+ snip.rv ="\ "`*${1:${VISUAL:Em}}*`!p
+if has_cjk(vim.current.line):
+ snip.rv ="\ "
+else:
+ snip.rv = " "
+`$0
+endsnippet
+
+snippet st "Strong string" i
+`!p
+if has_cjk(vim.current.line):
+ snip.rv ="\ "`**${1:${VISUAL:Strong}}**`!p
+if has_cjk(vim.current.line):
+ snip.rv ="\ "
+else:
+ snip.rv = " "
+`$0
+endsnippet
+
+snippet "li(st)? (?P<num>\d+)" "List" br
+$0
+`!p
+# usage: li 4<tab>
+# which will extand into a unordered list contains 4 items
+snip.rv = make_items(match.groupdict()['num'])
+`
+endsnippet
+
+snippet "ol(st)? (?P<num>\d+)" "Order List" br
+$0
+`!p
+# usage: ol 4<tab>
+# which will extand into a ordered list contains 4 items
+snip.rv = make_items(match.groupdict()['num'], 1)
+`
+endsnippet
+###########################################################################
+# More Specialized Stuff. #
+###########################################################################
+snippet cb "Code Block" b
+.. code-block:: ${1:`!p snip.rv = get_popular_code_type()`}
+
+ ${2:${VISUAL:code}}
+
+$0
+endsnippet
+
+# match snippets :
+# img, inc, fig
+snippet id "Includable Directives" b
+`!p
+real_name=real_filename(ospath.basename(t[2]))
+di=t[1][:2]
+
+link=""
+content=""
+
+if di == 'im':
+ link = "|{0}|".format(real_name)
+
+if di == 'fi':
+ content="""
+ :alt: {0}
+ {0}""".format(real_name)
+`
+..`!p snip.rv = " %s" % link if link else ""` $1`!p
+snip.rv=complete(t[1], INCLUDABLE_DIRECTIVES)
+`:: ${2:${VISUAL:file}}`!p
+if content:
+ snip.rv +=" "+content`
+`!p
+# Tip of whether file is exist in comment type
+if not check_file_exist(path, t[2]):
+ snip.rv='.. FILE {0} does not exist'.format(t[2])
+else:
+ snip.rv=""
+`$0
+endsnippet
+
+snippet di "Directives" b
+.. $1`!p snip.rv=complete(t[1], DIRECTIVES)`:: $2
+
+ ${3:${VISUAL:Content}}
+$0
+endsnippet
+
+snippet nd "None Content Directives" b
+.. $1`!p snip.rv=complete(t[1], NONE_CONTENT_DIRECTIVES)`:: $2
+$0
+endsnippet
+
+snippet sa "Specific Admonitions" b
+.. $1`!p snip.rv =complete(t[1], SPECIFIC_ADMONITIONS)`::
+
+ ${2:${VISUAL:Content}}
+
+$0
+endsnippet
+
+#it will be trigger at start of line or after a word
+snippet ro "Text Roles" w
+\ :$1`!p snip.rv=complete(t[1],
+ TEXT_ROLES+look_up_directives(TEXT_ROLES_REGEX,
+ path))`:\`$2\`\
+endsnippet
+
+############
+# Sphinx #
+############
+
+snippet sid "SideBar" b
+.. sidebar:: ${1:SideBar Title}
+
+ ${2:${VISUAL:SideBar Content}}
+endsnippet
+# vim:ft=snippets: