Addon to send text to PasteAll (www.pasteall.org)
authorDalai Felinto <dfelinto@gmail.com>
Wed, 25 Aug 2010 08:13:28 +0000 (08:13 +0000)
committerDalai Felinto <dfelinto@gmail.com>
Wed, 25 Aug 2010 08:13:28 +0000 (08:13 +0000)
You can find it under the property panel in the Text Editor (Ctrl+F)

text_editor_pasteall.py [new file with mode: 0644]

diff --git a/text_editor_pasteall.py b/text_editor_pasteall.py
new file mode 100644 (file)
index 0000000..7e08ed8
--- /dev/null
@@ -0,0 +1,215 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  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 Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# ########################################################
+# PasteAll.org Text Sender Script
+#
+# Dalai Felinto (dfelinto)
+# blenderecia.orgfree.com
+#
+# Rio de Janeiro - Brasil
+# Vancouver - Canada
+#
+# Original code: 23rd August 2010 (Blender 2.5.3 rev. 31525)
+#
+# Important Note:
+# This script is not official. I did it for fun and for my own usage.
+# And please do not abuse of their generosity - use it wisely (a.k.a no flood).
+#
+# ########################################################
+
+bl_addon_info = {
+    "name": "Text Editor: PasteAll",
+    "author": "Dalai Felinto (dfelinto)",
+    "version": "0.5",
+    "blender": (2, 5, 3),
+    "location": "text editor > properties panel",
+    "description": "Send your selection or text to www.pasteall.org",
+    "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.5/Py/"\
+    "Scripts/Text_Editor/PasteAll",
+    "tracker_url": "https://projects.blender.org/tracker/index.php?"\
+       "func=detail&aid=23493&group_id=153&atid=468",
+    "category": "Text editor"}
+
+import bpy
+import urllib
+import urllib.request
+import webbrowser
+
+class TEXT_PT_pasteall(bpy.types.Panel):
+    bl_space_type = 'TEXT_EDITOR'
+    bl_region_type = 'UI'
+    bl_label = "PasteAll.org"
+
+    def draw(self, context):
+        layout = self.layout        
+        layout.operator("text.PasteAll", icon='URL')
+        layout.prop(context.scene, "use_webbrowser")
+
+class PasteAllOperator(bpy.types.Operator):
+    ''''''
+    bl_idname = "text.PasteAll"
+    bl_label = "PasteAll.org"
+    bl_description = "Send the current text or selection to www.pasteall.org"
+
+    @classmethod
+    def poll(cls, context):
+        if context.area.type != 'TEXT_EDITOR':
+            return False
+        else:
+            return context.space_data.text != None
+
+    def invoke(self, context, event):
+        import webbrowser
+        st = context.space_data
+
+        # get the selected text
+        text = self.get_selected_text(st.text)
+        # if no text is selected send the whole file
+        if text == None: text = st.text.as_string()
+
+        # get the file type based on the extension
+        format = self.get_file_format(st.text)
+
+        # send the text and receive the returned page
+        html = self.send_text(text, format)
+
+        if html == None:
+            self.report('ERROR', "Error in sending the text to the server.")
+            return {'CANCELLED'}
+
+        # get the link of the posted page
+        page = self.get_page(str(html))
+        
+        if page == None or page == "":
+            self.report('ERROR', "Error in retrieving the page.")
+            return {'CANCELLED'}
+        else:
+            self.report('INFO', page)
+
+        # store the link in the clipboard
+        bpy.context.manager.clipboard = page
+
+        if context.scene.use_webbrowser:
+            try:
+                webbrowser.open_new_tab(page)
+            except:
+                self.report('WARNING', "Error in opening the page %s." % (page))
+
+        return {'FINISHED'}
+            
+    def send_text(self, text, format):
+        ''''''
+        import urllib
+        url = "http://www.pasteall.org/index.php"
+        values = {  'action' : 'savepaste',
+                    'parent_id' : '0',
+                    'language_id': format,
+                    'code' : text }
+
+        try:
+            data = urllib.parse.urlencode(values)
+            req = urllib.request.Request(url, data)
+            response = urllib.request.urlopen(req)
+            page_source = response.read()
+        except:
+            return None
+        else:
+            return page_source
+
+    def get_page(self, html):
+        ''''''
+        id = html.find('directlink')
+        id_begin = id + 12 # hardcoded: directlink">
+        id_end = html[id_begin:].find("</a>")
+
+        if id != -1 and id_end != -1:
+            return html[id_begin:id_begin + id_end]
+        else:
+            return None
+
+    def get_selected_text(self, text):
+        ''''''
+        current_line = text.current_line
+        select_end_line = text.select_end_line
+        
+        current_character = text.current_character
+        select_end_character = text.select_end_character
+        
+        # if there is no selected text return None
+        if current_line == select_end_line:
+            if current_character == select_end_character:
+                return None
+            else:
+                return current_line.body[min(current_character,select_end_character):max(current_character,select_end_character)]
+
+        text_return = None
+        writing = False
+        normal_order = True # selection from top to bottom
+
+        for line in text.lines:
+            if not writing:
+                if line == current_line:
+                    text_return = current_line.body[current_character:] + "\n"
+                    writing = True
+                    continue
+                elif line == select_end_line:
+                    text_return =  select_end_line.body[select_end_character:] + "\n"
+                    writing = True
+                    normal_order = False
+                    continue
+            else:
+                if normal_order:
+                    if line == select_end_line:
+                        text_return += select_end_line.body[:select_end_character]
+                        break
+                    else:
+                        text_return += line.body + "\n"
+                        continue
+                else:
+                    if line == current_line:
+                        text_return += current_line.body[:current_character]
+                        break
+                    else:
+                        text_return += line.body + "\n"
+                        continue
+
+        return text_return
+    
+    def get_file_format(self, text):
+        '''Try to guess what is the format based on the file extension'''
+        extensions =   {'diff':'24',
+                        'patch':'24',
+                        'py':'62',
+                        'c':'12',
+                        'cpp':'18'}
+
+        type = text.name.split(".")[-1]
+        return extensions.get(type, '0')
+
+def register():
+    bpy.types.Scene.BoolProperty(attr='use_webbrowser',
+        name='Launch Browser',
+        description='Opens the page with the submitted text.',
+        default=True)
+
+def unregister():
+    bpy.types.Scene.RemoveProperty("use_webbrowser")
+
+if __name__ == "__main__":
+    register()
\ No newline at end of file