summaryrefslogtreecommitdiffstats
path: root/odk/examples/python/Text/BookmarkInsertion.py
diff options
context:
space:
mode:
Diffstat (limited to 'odk/examples/python/Text/BookmarkInsertion.py')
-rw-r--r--odk/examples/python/Text/BookmarkInsertion.py160
1 files changed, 160 insertions, 0 deletions
diff --git a/odk/examples/python/Text/BookmarkInsertion.py b/odk/examples/python/Text/BookmarkInsertion.py
new file mode 100644
index 0000000000..5b801f6121
--- /dev/null
+++ b/odk/examples/python/Text/BookmarkInsertion.py
@@ -0,0 +1,160 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+import officehelper
+import sys
+import traceback
+
+
+FIRST_PARAGRAPH = (
+ "He heard quiet steps behind him. That didn't bode well. Who could be following "
+ "him this late at night and in this deadbeat part of town? And at this "
+ "particular moment, just after he pulled off the big time and was making off "
+ "with the greenbacks. Was there another crook who'd had the same idea, and was "
+ "now watching him and waiting for a chance to grab the fruit of his labor?"
+)
+
+SECOND_PARAGRAPH = (
+ "Or did the steps behind him mean that one of many bloody officers in town was "
+ "on to him and just waiting to pounce and snap those cuffs on his wrists? He "
+ "nervously looked all around. Suddenly he saw the alley. Like lightning he "
+ "darted off to the left and disappeared between the two warehouses almost "
+ "falling over the trash can lying in the middle of the sidewalk. He tried to "
+ "nervously tap his way along in the inky darkness and suddenly stiffened: it was "
+ "a dead-end, he would have to go back the way he had come"
+)
+
+THIRD_PARAGRAPH = (
+ "The steps got louder and louder, he saw the black outline of a figure coming "
+ "around the corner. Is this the end of the line? he thought pressing himself "
+ "back against the wall trying to make himself invisible in the dark, was all "
+ "that planning and energy wasted? He was dripping with sweat now, cold and wet, "
+ "he could smell the brilliant fear coming off his clothes. Suddenly next to him, "
+ "with a barely noticeable squeak, a door swung quietly to and fro in the night's "
+ "breeze."
+)
+
+
+def create_example_text(component):
+ """Create example text
+
+ :param component: object which implements com.sun.star.text.XTextDocument interface.
+ """
+ try:
+ cursor = component.getText().createTextCursor()
+ cursor.setString(FIRST_PARAGRAPH)
+ cursor.collapseToEnd()
+ cursor.setString(SECOND_PARAGRAPH)
+ cursor.collapseToEnd()
+ cursor.setString(THIRD_PARAGRAPH)
+ cursor.gotoStart(False)
+ except:
+ traceback.print_exc()
+
+
+def find_first(document, search_str):
+ """Find the text
+
+ :param document: object which implements com.sun.star.text.XTextDocument interface.
+ :param str search_str: the search string.
+ :return: object representing the searched text, which implements com.sun.star.text.XTextRange interface.
+ :rtype: com.sun.star.uno.XInterface
+ """
+ try:
+ descriptor = document.createSearchDescriptor()
+ descriptor.setSearchString(search_str)
+ descriptor.setPropertyValue("SearchRegularExpression", True)
+ return document.findFirst(descriptor)
+ except:
+ traceback.print_exc()
+ return None
+
+
+def insert_bookmark(document, text_range, bookmark_name):
+ """Insert bookmark
+
+ :param document: object which implements om.sun.star.text.XTextDocument interface.
+ :param text_range: object representing the text range bookmark is inserted for.
+ This object should implement com.sun.star.text.XTextRange interface.
+ :param str bookmark_name: bookmark name.
+ """
+ try:
+ bookmark = document.createInstance("com.sun.star.text.Bookmark")
+ bookmark.setName(bookmark_name)
+ document.getText().insertTextContent(text_range, bookmark, True)
+ print("Insert bookmark:", bookmark_name)
+ except:
+ traceback.print_exc()
+
+
+def mark_list(component, mlist, prefix):
+ """Mark the matched text
+
+ :param component: object which implements com.sun.star.text.XTextDocument interface.
+ :param list[str] mlist: list of patterns to search text from document.
+ :param str prefix: prefix used to construct bookmark name.
+ """
+ try:
+ for i, search_str in enumerate(mlist):
+ search = find_first(component, search_str)
+ if not search:
+ continue
+ insert_bookmark(component, search, f"{prefix}{i}")
+ except:
+ traceback.print_exc()
+ sys.exit(1)
+
+
+def get_desktop():
+ desktop = None
+ try:
+ remote_context = officehelper.bootstrap()
+ srv_mgr = remote_context.getServiceManager()
+ if srv_mgr is None:
+ print("Can't create a desktop. No connection, no remote office servicemanager available!")
+ else:
+ desktop = srv_mgr.createInstanceWithContext("com.sun.star.frame.Desktop", remote_context)
+ print("Connected to a running office ...")
+ except:
+ traceback.print_exc()
+ sys.exit(1)
+ return desktop
+
+
+def main():
+ desktop = get_desktop()
+ if desktop is None:
+ return
+
+ # Open an empty text document.
+ try:
+ doc = desktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, tuple([]))
+ except:
+ traceback.print_exc()
+ sys.exit(1)
+
+ create_example_text(doc)
+
+ mOffending = ["negro(e|es)?", "bor(ed|ing)?", "bloody?", "bleed(ing)?"]
+ mBad = ["possib(le|ilit(y|ies))", "real(ly)+", "brilliant"]
+
+ sOffendPrefix = "Offending"
+ sBadPrefix = "BadStyle"
+
+ mark_list(doc, mOffending, sOffendPrefix)
+ mark_list(doc, mBad, sBadPrefix)
+
+ print("Done")
+
+
+if __name__ == "__main__":
+ main()
+
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab: