A docstring

C change img/inc/fig snippet into id
U update em/st with CJK detection
This commit is contained in:
Meng Zhuo 2013-06-26 09:48:50 +08:00
parent 8e1e176998
commit 9ab873b6ea

View File

@ -4,6 +4,7 @@
# General Stuff #
###########################################################################
global !p
import vim
from os import path as ospath
from string import Template
import re
@ -29,17 +30,32 @@ DIRECTIVES = ['topic','sidebar','math','epigraph',
'raw']
NONE_CONTENT_DIRECTIVES = ['rubric', 'contents', 'header',
'footer', 'date', 'include', 'title'
]
INCLUDABLE_DIRECTIVES_INDEX = {'img':'image',
'fig':'figure',
'inc':'include'}
'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(char):
"""
Detect char contains CJK character
:param char: characters needs to be detect
"""
try:
CJK_RE.finditer(char).next()
except StopIteration:
return False
else:
return True
def real_filename(filename):
# peal extension name off if possible
"""peal extension name off if possible
# i.e. "foo.bar.png will return "foo.bar"
names=filename.split('.')
return ".".join(names[:-1]) if len(names) > 1 else filename
"""
return ospath.splitext(filename)[0]
def check_file_exist(rst_path, relative_path):
"""
@ -53,8 +69,6 @@ def check_file_exist(rst_path, relative_path):
if ospath.isfile(abs_path):
return abs_path
#TODO: File preview
#TODO: File list complete
def rst_char_len(char):
"""
@ -91,23 +105,40 @@ def look_up_directives(regex, fpath):
: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(path):
# find most popular code type in the given rst
types = look_up_directives(r'[:|\.\.\s]code::?\s(\w+)', path)
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
def complete(t, opts):
"""
get options that start with t
:param t: query string
:param opts: list that needs to be completed
:return: a string that start with t
"""
msg = "({0})"
if t:
opts = [ m[len(t):] for m in opts if m.startswith(t) ]
@ -165,22 +196,26 @@ $0
endsnippet
snippet em "Emphasize string" i
*${1:${VISUAL:Em}}* $0
endsnippet
# the CJK characters doesn't had space to sperate them, like "我强调"
# should be "我\ *强调*\ "
# Therefor we need special snippet
snippet ec "Emphasize string (CJK)" w
\ *${1:${VISUAL:Em}}*\ $0
`!p
# dirty but works with CJK charactor 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
**${1:${VISUAL:Strong}}** $0
endsnippet
snippet sc "Strong string (CJK)" w
\ **${1:${VISUAL:Strong}}**\ $0
`!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
@ -201,7 +236,7 @@ endsnippet
# More Specialized Stuff. #
###########################################################################
snippet cb "Code Block" b
.. code-block:: ${1:`!p snip.rv = get_popular_code_type(path)`}
.. code-block:: ${1:`!p snip.rv = get_popular_code_type()`}
${2:code}
@ -210,29 +245,28 @@ endsnippet
# match snippets :
# img, inc, fig
snippet "(?P<shortcut>^img|inc|fig)" "Includable Block" !br
snippet id "Includable Directives" b
`!p
#TODO: Import img.template in rst relative path?
real_name=real_filename(ospath.basename(t[1]))
di=INCLUDABLE_DIRECTIVES_INDEX.get(match.groupdict()['shortcut'], 'include')
real_name=real_filename(ospath.basename(t[2]))
di=t[1][:2]
link=""
content=""
if di in ['image']:
link = "|{0}| ".format(real_name)
if di == 'im':
link = "|{0}|".format(real_name)
if di == 'figure':
if di == 'fi':
content="""
:alt: {0}
{0}""".format(real_name)
snip.rv = ".. {link}{di}:: ".format(di=di,link=link)
`${1:file}`!p if content:
`
..`!p snip.rv = " %s" % link if link else ""` $1`!p snip.rv=complete(t[1], INCLUDABLE_DIRECTIVES)`:: ${2:file}`!p if content:
snip.rv +=" "+content`
`!p
# Tip of whether file is exist in comment type
if not check_file_exist(path, t[1]):
snip.rv='.. FILE {0} does not exist'.format(t[1])
if not check_file_exist(path, t[2]):
snip.rv='.. FILE {0} does not exist'.format(t[2])
else:
snip.rv=""
`$0
@ -259,7 +293,7 @@ $0
endsnippet
#it will be trigger at start of line or after a word
snippet ro "Text Roles" b
snippet ro "Text Roles" w
\ :$1`!p snip.rv=complete(t[1],
TEXT_ROLES+look_up_directives(TEXT_ROLES_REGEX,
path))`:\`$2\`\