summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathieu Pasquet <mathieui@mathieui.net>2013-11-28 21:22:17 +0100
committerMathieu Pasquet <mathieui@mathieui.net>2013-11-28 21:22:17 +0100
commitc2b673308f5d8ef7a295d03d1a1fa72b8b947c12 (patch)
treec13a53d73e4d68f326e775b69f60f80c723595e9
parent0ad9712d0c7421c4d9b2d9ebb4b7d328c90e2253 (diff)
downloadpoezio-c2b673308f5d8ef7a295d03d1a1fa72b8b947c12.tar.gz
poezio-c2b673308f5d8ef7a295d03d1a1fa72b8b947c12.tar.bz2
poezio-c2b673308f5d8ef7a295d03d1a1fa72b8b947c12.tar.xz
poezio-c2b673308f5d8ef7a295d03d1a1fa72b8b947c12.zip
Add an “autocorrect” plugin with a sed-like syntax
TODO (eventually): - correct words when using “word*” or “*word” using levenshtein distance - allow regular expressions for replacement
-rw-r--r--doc/source/plugins/autocorrect.rst6
-rw-r--r--doc/source/plugins/index.rst8
-rw-r--r--plugins/autocorrect.py67
3 files changed, 81 insertions, 0 deletions
diff --git a/doc/source/plugins/autocorrect.rst b/doc/source/plugins/autocorrect.rst
new file mode 100644
index 00000000..f637678e
--- /dev/null
+++ b/doc/source/plugins/autocorrect.rst
@@ -0,0 +1,6 @@
+.. _autocorrect-plugin:
+
+Autocorrect
+===========
+
+.. automodule:: autocorrect
diff --git a/doc/source/plugins/index.rst b/doc/source/plugins/index.rst
index ce758537..e8307e7e 100644
--- a/doc/source/plugins/index.rst
+++ b/doc/source/plugins/index.rst
@@ -212,6 +212,13 @@ Plugin index
Insert dots in your messages.
+ Autocorrect
+ :ref:`Documentation <autocorrect-plugin>`
+
+ Add new ways to correct messages.
+
+
+
.. toctree::
:hidden:
@@ -246,3 +253,4 @@ Plugin index
iq_show
regex_admin
pointpoint
+ autocorrect
diff --git a/plugins/autocorrect.py b/plugins/autocorrect.py
new file mode 100644
index 00000000..61795b79
--- /dev/null
+++ b/plugins/autocorrect.py
@@ -0,0 +1,67 @@
+"""
+This plugin lets you perform simple replacements on the last message.
+
+Installation
+------------
+
+Load the plugin::
+
+ /load autocorrect
+
+Usage
+-----
+
+.. note:: This plugin only performs *simple* replacements, not with
+ regular expressions, despite the syntax. Although it would be
+ possible, that would be even less useful.
+
+Once the plugin is loaded, any message matching the following regex::
+
+ ^s/(.+?)/(.*?)(/|/g)?$
+
+will be interpreted as a replacement, and the substitution will be
+applied to the last sent message.
+
+For example, if you sent the message::
+
+ This tab lists all public rooms on a MUC service. It is currently very limited but will be improved in the future. There currently is no way to search a room.
+
+And you now want to replace “MUC” with “multi-user chat”, you input::
+
+ s/MUC/multi-user chat
+
+And poezio will correct the message for you.
+"""
+
+from plugin import BasePlugin
+import re
+
+sed_re = re.compile('^s/(.+?)/(.*?)(/|/g)?$')
+
+class Plugin(BasePlugin):
+ def init(self):
+ self.api.add_event_handler('muc_say', self.sed_fix)
+ self.api.add_event_handler('conversation_say', self.sed_fix)
+ self.api.add_event_handler('private_say', self.sed_fix)
+
+ def sed_fix(self, msg, tab):
+ if not tab.last_sent_message:
+ return
+ body = tab.last_sent_message['body']
+ match = sed_re.match(msg['body'])
+ if not match:
+ return
+ remove, put, matchall = match.groups()
+
+ replace_all = False
+ if matchall == '/g':
+ replace_all = True
+
+ if replace_all:
+ new_body = body.replace(remove, put)
+ else:
+ new_body = body.replace(remove, put, 1)
+
+ if body != new_body:
+ msg['body'] = new_body
+ msg['replace']['id'] = tab.last_sent_message['id']