mirror of
https://github.com/blender/blender-addons-contrib.git
synced 2025-07-25 16:09:05 +00:00
172 lines
5.5 KiB
Python
172 lines
5.5 KiB
Python
# ##### 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 #####
|
|
|
|
bl_info = {
|
|
"name": "hastebin",
|
|
"author": "Dalai Felinto (dfelinto)",
|
|
"version": (0, 8),
|
|
"blender": (2, 80, 0),
|
|
"location": "Text editor > Properties panel",
|
|
"description": "Send your selection or text to hastebin.com",
|
|
"doc_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/"
|
|
"Scripts/Text_Editor/hastebin",
|
|
"tracker_url": "https://developer.blender.org/maniphest/task/edit/form/2/",
|
|
"category": "Development"}
|
|
|
|
|
|
import bpy
|
|
|
|
class TEXT_PT_hastebin(bpy.types.Panel):
|
|
bl_space_type = 'TEXT_EDITOR'
|
|
bl_region_type = 'UI'
|
|
bl_label = "hastebin.com"
|
|
bl_category = 'Dev'
|
|
bl_options = {'DEFAULT_CLOSED'}
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator("text.hastebin", icon='URL')
|
|
layout.prop(context.scene, "use_webbrowser")
|
|
|
|
|
|
class TEXT_OT_hastebin(bpy.types.Operator):
|
|
""""""
|
|
bl_idname = "text.hastebin"
|
|
bl_label = "hastebin.com"
|
|
bl_description = "Send the current text or selection to http://hastebin.com"
|
|
|
|
@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 is None: text = st.text.as_string()
|
|
|
|
# send the text and receive the returned page
|
|
page = self.send_text(text)
|
|
|
|
if page is None:
|
|
return {'CANCELLED'}
|
|
|
|
# store the link in the clipboard
|
|
bpy.context.window_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):
|
|
""""""
|
|
import requests
|
|
base_url = "https://hastebin.com"
|
|
|
|
try:
|
|
response = requests.post(base_url + "/documents", text)
|
|
final_url = "%s/%s" % (base_url, response.json()['key'])
|
|
|
|
except requests.exceptions.SSLError:
|
|
self.report({'ERROR'}, "Error with SSL authorization, requires a more recent Blender")
|
|
return None
|
|
|
|
except:
|
|
self.report({'ERROR'}, "Error in sending the text to the server.")
|
|
return None
|
|
|
|
else:
|
|
return final_url
|
|
|
|
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 register():
|
|
bpy.types.Scene.use_webbrowser = bpy.props.BoolProperty(
|
|
name='Launch Browser',
|
|
description='Opens the page with the submitted text',
|
|
default=True)
|
|
|
|
bpy.utils.register_class(TEXT_PT_hastebin)
|
|
bpy.utils.register_class(TEXT_OT_hastebin)
|
|
|
|
|
|
def unregister():
|
|
del bpy.types.Scene.use_webbrowser
|
|
bpy.utils.unregister_class(TEXT_PT_hastebin)
|
|
bpy.utils.unregister_class(TEXT_OT_hastebin)
|
|
|
|
if __name__ == "__main__":
|
|
register()
|