summaryrefslogtreecommitdiffstats
path: root/plugins/snippets/snippets/helper.py
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/snippets/snippets/helper.py')
-rw-r--r--plugins/snippets/snippets/helper.py204
1 files changed, 204 insertions, 0 deletions
diff --git a/plugins/snippets/snippets/helper.py b/plugins/snippets/snippets/helper.py
new file mode 100644
index 0000000..2fa3b3f
--- /dev/null
+++ b/plugins/snippets/snippets/helper.py
@@ -0,0 +1,204 @@
+# Gedit snippets plugin
+# Copyright (C) 2005-2006 Jesse van den Kieboom <jesse@icecrew.nl>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+from xml.sax import saxutils
+import xml.etree.ElementTree as et
+import re
+import codecs
+
+from gi.repository import Gtk
+
+def message_dialog(par, typ, msg):
+ d = Gtk.MessageDialog(par, Gtk.DialogFlags.MODAL, typ, Gtk.ButtonsType.OK, msg)
+ d.set_property('use-markup', True)
+
+ d.run()
+ d.destroy()
+
+def compute_indentation(view, piter):
+ line = piter.get_line()
+ start = view.get_buffer().get_iter_at_line(line)
+ end = start.copy()
+
+ ch = end.get_char()
+
+ while (ch.isspace() and ch != '\r' and ch != '\n' and \
+ end.compare(piter) < 0):
+ if not end.forward_char():
+ break;
+
+ ch = end.get_char()
+
+ if start.equal(end):
+ return ''
+
+ return start.get_slice(end)
+
+def markup_escape(text):
+ return saxutils.escape(text)
+
+def spaces_instead_of_tabs(view, text):
+ if not view.get_insert_spaces_instead_of_tabs():
+ return text
+
+ return text.replace("\t", view.get_tab_width() * ' ')
+
+def insert_with_indent(view, piter, text, indentfirst = True, context = None):
+ text = spaces_instead_of_tabs(view, text)
+ lines = text.split('\n')
+ buf = view.get_buffer()
+
+ buf._snippets_context = context
+
+ if len(lines) == 1:
+ view.get_buffer().insert(piter, text)
+ else:
+ # Compute indentation
+ indent = compute_indentation(view, piter)
+ text = ''
+
+ for i in range(0, len(lines)):
+ if indentfirst or i > 0:
+ text += indent + lines[i] + '\n'
+ else:
+ text += lines[i] + '\n'
+
+ buf.insert(piter, text[:-1])
+
+ buf._snippets_context = None
+
+def get_buffer_context(buf):
+ if hasattr(buf, "_snippets_context"):
+ return buf._snippets_context
+ return None
+
+def snippets_debug(*s):
+ return
+
+def write_xml(node, f, cdata_nodes=()):
+ assert node is not None
+
+ if not hasattr(f, "write"):
+ f = codecs.open(f, "wb", encoding="utf-8")
+
+ # Encoding
+ f.write("<?xml version='1.0' encoding='utf-8'?>\n")
+
+ _write_node(node, f, cdata_nodes)
+
+def _write_indent(file, text, indent):
+ file.write(' ' * indent + text)
+
+def _write_node(node, file, cdata_nodes=(), indent=0):
+ # write XML to file
+ tag = node.tag
+
+ if node is et.Comment:
+ _write_indent(file, "<!-- %s -->\n" % saxutils.escape(node.text), indent)
+ elif node is et.ProcessingInstruction:
+ _write_indent(file, "<?%s?>\n" % saxutils.escape(node.text), indent)
+ else:
+ items = node.items()
+
+ if items or node.text or len(node):
+ _write_indent(file, "<" + tag, indent)
+
+ if items:
+ items.sort() # lexical order
+ for k, v in items:
+ file.write(" %s=%s" % (k, saxutils.quoteattr(v)))
+ if node.text or len(node):
+ file.write(">")
+ if node.text and node.text.strip() != "":
+ if tag in cdata_nodes:
+ file.write(_cdata(node.text))
+ else:
+ file.write(saxutils.escape(node.text))
+ else:
+ file.write("\n")
+
+ for n in node:
+ _write_node(n, file, cdata_nodes, indent + 1)
+
+ if not len(node):
+ file.write("</" + tag + ">\n")
+ else:
+ _write_indent(file, "</" + tag + ">\n", \
+ indent)
+ else:
+ file.write(" />\n")
+
+ if node.tail and node.tail.strip() != "":
+ file.write(saxutils.escape(node.tail))
+
+def _cdata(text):
+ return '<![CDATA[' + text.replace(']]>', ']]]]><![CDATA[>') + ']]>'
+
+def is_tab_trigger(w):
+ if len(w) == 1 and not (w.isalnum() or w.isspace()):
+ return True
+
+ if not is_first_tab_trigger_character(w[0]):
+ return False
+
+ for c in w:
+ if not is_tab_trigger_character(c):
+ return False
+
+ return True
+
+def is_first_tab_trigger_character(c):
+ return c.isalpha() or c in '_:.'
+
+def is_tab_trigger_character(c):
+ return c.isalnum() or c in '_:.'
+
+def buffer_word_boundary(buf):
+ iter = buf.get_iter_at_mark(buf.get_insert())
+ start = iter.copy()
+
+ if not iter.starts_word() and (iter.inside_word() or iter.ends_word()):
+ start.backward_word_start()
+
+ if not iter.ends_word() and iter.inside_word():
+ iter.forward_word_end()
+
+ return (start, iter)
+
+def buffer_line_boundary(buf):
+ iter = buf.get_iter_at_mark(buf.get_insert())
+ start = iter.copy()
+ start.set_line_offset(0)
+
+ if not iter.ends_line():
+ iter.forward_to_line_end()
+
+ return (start, iter)
+
+def drop_get_uris(selection):
+ uris = []
+ if selection.targets_include_uri():
+ data = selection.get_data()
+ lines = re.split('\\s*[\\n\\r]+\\s*', data.strip())
+
+ for line in lines:
+ if not line.startswith('#'):
+ uris.append(line)
+
+ return uris
+
+# ex:ts=4:et: