# This file contains snippets that are always defined. I personally
# have snippets for signatures and often needed texts

# sligthly lower priority than everything else since specialized versions
# should overwrite. The user needs to adjust her priority in her snippets to
# ~-55 so that other filetypes will still overwrite.
priority -60

##############
# NICE BOXES #
##############
global !p
import string, vim

""" Maps a filetype to comment format used for boxes.
Automatically filled during usage"""
_commentDict = { }

def _parse_comments(s):
	""" Parses vim's comments option to extract comment format """
	i = iter(s.split(","))

	rv = []
	try:
		while True:
			# get the flags and text of a comment part
			flags, text = next(i).split(':', 1)

			if len(flags) == 0:
				rv.append((text, text, text, ""))
			# parse 3-part comment, but ignore those with O flag
			elif 's' in flags and 'O' not in flags:
				ctriple = []
				indent = ""

				if flags[-1] in string.digits:
					indent = " " * int(flags[-1])
				ctriple.append(text)

				flags,text = next(i).split(':', 1)
				assert(flags[0] == 'm')
				ctriple.append(text)

				flags,text = next(i).split(':', 1)
				assert(flags[0] == 'e')
				ctriple.append(text)
				ctriple.append(indent)

				rv.append(ctriple)
			elif 'b' in flags:
				if len(text) == 1:
					rv.insert(0, (text,text,text, ""))
	except StopIteration:
		return rv

def _get_comment_format():
	""" Returns a 4-element tuple representing the comment format for
	the current file. """
	return _parse_comments(vim.eval("&comments"))[0]


def make_box(twidth, bwidth=None):
	b, m, e, i = _get_comment_format()
	bwidth_inner = bwidth - 3 - max(len(b), len(i + e)) if bwidth else twidth + 2
	sline = b + m + bwidth_inner * m[0] + 2 * m[0]
	nspaces = (bwidth_inner - twidth) // 2
	mlines = i + m + " " + " " * nspaces
	mlinee = " " + " "*(bwidth_inner - twidth - nspaces) + m
	eline = i + m + bwidth_inner * m[0] + 2 * m[0] + e
	return sline, mlines, mlinee, eline

def foldmarker():
	"Return a tuple of (open fold marker, close fold marker)"
	return vim.eval("&foldmarker").split(",")

endglobal

snippet box "A nice box with the current comment symbol" b
`!p
box = make_box(len(t[1]))
snip.rv = box[0]
snip += box[1]
`${1:content}`!p
box = make_box(len(t[1]))
snip.rv = box[2]
snip += box[3]`
$0
endsnippet

snippet bbox "A nice box over the full width" b
`!p
if not snip.c:
	width = int(vim.eval("&textwidth - (virtcol('.') == 1 ? 0 : virtcol('.'))")) or 71
box = make_box(len(t[1]), width)
snip.rv = box[0]
snip += box[1]
`${1:content}`!p
box = make_box(len(t[1]), width)
snip.rv = box[2]
snip += box[3]`
$0
endsnippet

snippet fold "Insert a vim fold marker" b
`!p snip.rv = _get_comment_format()[0]` ${1:Fold description} `!p snip.rv = foldmarker()[0]`${2:1} `!p snip.rv = _get_comment_format()[2]`
endsnippet

snippet foldc "Insert a vim fold close marker" b
`!p snip.rv = _get_comment_format()[0]` ${2:1}`!p snip.rv = foldmarker()[1]` `!p snip.rv = _get_comment_format()[2]`
endsnippet

snippet foldp "Insert a vim fold marker pair" b
`!p snip.rv = _get_comment_format()[0]` ${1:Fold description} `!p snip.rv = foldmarker()[0]` `!p snip.rv = _get_comment_format()[2]`
${2:${VISUAL:Content}}
`!p snip.rv = _get_comment_format()[0]` `!p snip.rv = foldmarker()[1]` $1 `!p snip.rv = _get_comment_format()[2]`
endsnippet

##########################
# LOREM IPSUM GENERATORS #
##########################
snippet lorem "Lorem Ipsum - 50 Words" b
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At
vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,
no sea takimata sanctus est Lorem ipsum dolor sit amet.
endsnippet

##########################
# VIM MODELINE GENERATOR #
##########################
# See advice on `:help 'tabstop'` for why these values are set. Uses second
# modeline form ('set') to work in languages with comment terminators
# (/* like C */).
snippet modeline "Vim modeline"
vim`!v ':set '. (&expandtab ? printf('et sw=%i ts=%i', &sw, &ts) : printf('noet sts=%i sw=%i ts=%i', &sts, &sw, &ts)) . (&tw ? ' tw='. &tw : '') . ':'`
endsnippet

# vim:ft=snippets:
