Merge branch 'master' of git://github.com/rgiot/ultisnips into rgiot-master

This commit is contained in:
Holger Rapp 2013-10-21 06:30:38 +02:00
commit ef2c657721
4 changed files with 56 additions and 8 deletions

View File

@ -58,7 +58,7 @@ endsnippet
snippet part "Part" b snippet part "Part" b
\part{${1:part name}} \part{${1:part name}}
\label{prt:${2:${1/(\w+)|\W+/(?1:\L$0\E:_)/g}}} \label{prt:${2:${1/(\w+)|\W+/(?1:\L$0\E:_)/ga}}}
${0} ${0}
@ -67,7 +67,7 @@ endsnippet
snippet cha "Chapter" b snippet cha "Chapter" b
\chapter{${1:chapter name}} \chapter{${1:chapter name}}
\label{cha:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/g}}} \label{cha:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}
${0} ${0}
@ -76,7 +76,7 @@ endsnippet
snippet sec "Section" b snippet sec "Section" b
\section{${1:section name}} \section{${1:section name}}
\label{sec:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/g}}} \label{sec:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}
${0} ${0}
@ -86,7 +86,7 @@ endsnippet
snippet sub "Subsection" b snippet sub "Subsection" b
\subsection{${1:subsection name}} \subsection{${1:subsection name}}
\label{sub:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/g}}} \label{sub:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}
${0} ${0}
@ -95,7 +95,7 @@ endsnippet
snippet ssub "Subsubsection" b snippet ssub "Subsubsection" b
\subsubsection{${1:subsubsection name}} \subsubsection{${1:subsubsection name}}
\label{ssub:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/g}}} \label{ssub:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}
${0} ${0}
@ -105,7 +105,7 @@ endsnippet
snippet par "Paragraph" b snippet par "Paragraph" b
\paragraph{${1:paragraph name}} \paragraph{${1:paragraph name}}
\label{par:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/g}}} \label{par:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}
${0} ${0}
@ -115,7 +115,7 @@ endsnippet
snippet subp "Subparagraph" b snippet subp "Subparagraph" b
\subparagraph{${1:subparagraph name}} \subparagraph{${1:subparagraph name}}
\label{par:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/g}}} \label{par:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}
${0} ${0}

View File

@ -1155,6 +1155,11 @@ The options can be any combination of >
i - case insensitive i - case insensitive
By default, regular expression matching is case sensitive. With this By default, regular expression matching is case sensitive. With this
option, matching is done without regard to case. option, matching is done without regard to case.
a - ascii conversion
By default, transformation are made on the raw utf-8 string. With
this option, matching is done on the corresponding ASCII string
instead, for example 'à' will become 'a'.
This option required the python package 'unidecode'.
The syntax of regular expressions is beyond the scope of this document. Python The syntax of regular expressions is beyond the scope of this document. Python
regular expressions are used internally, so the python 're' module can be used regular expressions are used internally, so the python 're' module can be used
@ -1214,6 +1219,18 @@ this is a title
This Is A Title This Is A Title
Demo: ASCII transformation
------------------- SNIP -------------------
snippet ascii "Replace non ascii chars"
${1: an accentued text}
${1/.*/$0/a}
endsnippet
------------------- SNAP -------------------
ascii<tab>à la pêche aux moules
à la pêche aux moules
a la peche aux moules
Demo: Regular expression grouping Demo: Regular expression grouping
This is a clever c-like printf snippet, the second tabstop is only shown This is a clever c-like printf snippet, the second tabstop is only shown
when there is a format (%) character in the first tabstop. when there is a format (%) character in the first tabstop.

View File

@ -2,9 +2,12 @@
# encoding: utf-8 # encoding: utf-8
import re import re
import sys
from UltiSnips.text_objects._mirror import Mirror from UltiSnips.text_objects._mirror import Mirror
# flag used to display only one time the lack of unidecode
UNIDECODE_ALERT_RAISED = False
class _CleverReplace(object): class _CleverReplace(object):
""" """
This class mimics TextMates replace syntax This class mimics TextMates replace syntax
@ -108,16 +111,28 @@ class TextObjectTransformation(object):
flags = 0 flags = 0
self._match_this_many = 1 self._match_this_many = 1
self._convert_to_ascii = False
if token.options: if token.options:
if "g" in token.options: if "g" in token.options:
self._match_this_many = 0 self._match_this_many = 0
if "i" in token.options: if "i" in token.options:
flags |= re.IGNORECASE flags |= re.IGNORECASE
if "a" in token.options:
self._convert_to_ascii = True
self._find = re.compile(token.search, flags | re.DOTALL) self._find = re.compile(token.search, flags | re.DOTALL)
self._replace = _CleverReplace(token.replace) self._replace = _CleverReplace(token.replace)
def _transform(self, text): def _transform(self, text):
global UNIDECODE_ALERT_RAISED
if self._convert_to_ascii:
try:
import unidecode
text = unidecode.unidecode(text)
except Exception, e:
if UNIDECODE_ALERT_RAISED == False:
UNIDECODE_ALERT_RAISED = True
sys.stderr.write("Please install unidecode python package in order to be able to make ascii conversions.\n")
if self._find is None: if self._find is None:
return text return text
return self._find.subn(self._replace.replace, text, self._match_this_many)[0] return self._find.subn(self._replace.replace, text, self._match_this_many)[0]

16
test.py
View File

@ -40,6 +40,12 @@ import subprocess
from textwrap import dedent from textwrap import dedent
try:
import unidecode
UNIDECODE_IMPORTED = True
except ImportError:
UNIDECODE_IMPORTED = False
# Some constants for better reading # Some constants for better reading
BS = '\x7f' BS = '\x7f'
ESC = '\x1b' ESC = '\x1b'
@ -1473,6 +1479,16 @@ class Transformation_CleverTransformLongLower_ExceptCorrectResult(_VimTest):
keys = "test" + EX + "HALLO" keys = "test" + EX + "HALLO"
wanted = "HALLO hallo" wanted = "HALLO hallo"
if UNIDECODE_IMPORTED:
class Transformation_SimpleCaseAsciiResult(_VimTest):
snippets = ("ascii", "$1 ${1/(.*)/$1/a}")
keys = "ascii" + EX + "éèàçôïÉÈÀÇÔÏ€"
wanted = "éèàçôïÉÈÀÇÔÏ€ eeacoiEEACOIEU"
class Transformation_LowerCaseAsciiResult(_VimTest):
snippets = ("ascii", "$1 ${1/(.*)/\L$1\E/a}")
keys = "ascii" + EX + "éèàçôïÉÈÀÇÔÏ€"
wanted = "éèàçôïÉÈÀÇÔÏ€ eeacoieeacoieu"
class Transformation_ConditionalInsertionSimple_ExceptCorrectResult(_VimTest): class Transformation_ConditionalInsertionSimple_ExceptCorrectResult(_VimTest):
snippets = ("test", "$1 ${1/(^a).*/(?0:began with an a)/}") snippets = ("test", "$1 ${1/(^a).*/(?0:began with an a)/}")
keys = "test" + EX + "a some more text" keys = "test" + EX + "a some more text"