Add files from 6a34355fda commit of FastLBRY-GTK notabug.org repo by jyamihud without the flbry/lbrynet binary
747 lines
42 KiB
Python
747 lines
42 KiB
Python
#####################################################################
|
|
# #
|
|
# THIS IS A SOURCE CODE FILE FROM A PROGRAM TO INTERACT WITH THE #
|
|
# LBRY PROTOCOL ( lbry.com ). IT WILL USE THE LBRY SDK ( lbrynet ) #
|
|
# FROM THEIR REPOSITORY ( https://github.com/lbryio/lbry-sdk ) #
|
|
# WHICH I GONNA PRESENT TO YOU AS A BINARY. SINCE I DID NOT DEVELOP #
|
|
# IT AND I'M LAZY TO INTEGRATE IN A MORE SMART WAY. THE SOURCE CODE #
|
|
# OF THE SDK IS AVAILABLE IN THE REPOSITORY MENTIONED ABOVE. #
|
|
# #
|
|
# ALL THE CODE IN THIS REPOSITORY INCLUDING THIS FILE IS #
|
|
# (C) J.Y.Amihud and Other Contributors 2021. EXCEPT THE LBRY SDK. #
|
|
# YOU CAN USE THIS FILE AND ANY OTHER FILE IN THIS REPOSITORY UNDER #
|
|
# THE TERMS OF GNU GENERAL PUBLIC LICENSE VERSION 3 OR ANY LATER #
|
|
# VERSION. TO FIND THE FULL TEXT OF THE LICENSE GO TO THE GNU.ORG #
|
|
# WEBSITE AT ( https://www.gnu.org/licenses/gpl-3.0.html ). #
|
|
# #
|
|
# THE LBRY SDK IS UNFORTUNATELY UNDER THE MIT LICENSE. IF YOU ARE #
|
|
# NOT INTENDING TO USE MY CODE AND JUST THE SDK. YOU CAN FIND IT ON #
|
|
# THEIR OFFICIAL REPOSITORY ABOVE. THEIR LICENSE CHOICE DOES NOT #
|
|
# SPREAD ONTO THIS PROJECT. DON'T GET A FALSE ASSUMPTION THAT SINCE #
|
|
# THEY USE A PUSH-OVER LICENSE, I GONNA DO THE SAME. I'M NOT. #
|
|
# #
|
|
# THE LICENSE CHOSEN FOR THIS PROJECT WILL PROTECT THE 4 ESSENTIAL #
|
|
# FREEDOMS OF THE USER FURTHER, BY NOT ALLOWING ANY WHO TO CHANGE #
|
|
# THE LICENSE AT WILL. SO NO PROPRIETARY SOFTWARE DEVELOPER COULD #
|
|
# TAKE THIS CODE AND MAKE THEIR USER-SUBJUGATING SOFTWARE FROM IT. #
|
|
# #
|
|
#####################################################################
|
|
|
|
import os
|
|
from subprocess import *
|
|
from gi.repository import Gtk
|
|
from gi.repository import Gdk
|
|
from gi.repository import Pango
|
|
|
|
|
|
from flbry import ui
|
|
from flbry import parse
|
|
from flbry import fetch
|
|
|
|
################################################################################
|
|
|
|
# Markdown. Or .md file format is an easy way to give your simple text documents
|
|
# a bit of flare. Stuff like links, images and quotes are supported. Also bold
|
|
# an italic characters.
|
|
|
|
EMOJIS ={ # SIZE | LINK
|
|
":alien:" :"",
|
|
":angry_1:" :"",
|
|
":angry_2:" :"",
|
|
":angry_3:" :"",
|
|
":angry_4:" :"",
|
|
":blind:" :"",
|
|
":block:" :"",
|
|
":bomb:" :"",
|
|
":brain_chip:":"",
|
|
":confirm:":"",
|
|
":confused_1:":"",
|
|
":confused_2:":"",
|
|
":cooking_something_nice:":"",
|
|
":cry_1:":"",
|
|
":cry_2:":"",
|
|
":cry_3:":"",
|
|
":cry_4:":"",
|
|
":cry_5:":"",
|
|
":donut:":"",
|
|
":eggplant_with_condom:":"",
|
|
":eggplant:":"",
|
|
":fire_up:":"",
|
|
":flat_earth:":"",
|
|
":flying_saucer:":"",
|
|
":heart_chopper:":"",
|
|
":hyper_troll:":"",
|
|
":ice_cream:":"",
|
|
":idk:":"",
|
|
":illuminati_1:":"",
|
|
":illuminati_2:":"",
|
|
":kiss_1:":"",
|
|
":kiss_2:":"",
|
|
":laser_gun:":"",
|
|
":laughing_1:":"",
|
|
":laughing_2:":"",
|
|
":lollipop:":"",
|
|
":love_1:":"",
|
|
":love_2:":"",
|
|
":monster:":"",
|
|
":mushroom:":"",
|
|
":nail_it:":"",
|
|
":no:":"",
|
|
":ouch:":"",
|
|
":peace:":"",
|
|
":pizza:":"",
|
|
":rabbit_hole:":"",
|
|
":rainbow_puke_1:":"",
|
|
":rainbow_puke_2:":"",
|
|
":rock:":"",
|
|
":sad:":"",
|
|
":salty:":"",
|
|
":scary:":"",
|
|
":sleep:":"",
|
|
":slime_down:":"",
|
|
":smelly_socks:":"",
|
|
":smile_1:":"",
|
|
":smile_2:":"",
|
|
":space_chad:":"",
|
|
":space_doge:":"",
|
|
":space_green_wojak:":"",
|
|
":space_julian:":"",
|
|
":space_red_wojak:":"",
|
|
":space_resitas:":"",
|
|
":space_tom:":"",
|
|
":spock:":"",
|
|
":star:":"",
|
|
":sunny_day:":"",
|
|
":surprised:":"",
|
|
":sweet:":"",
|
|
":thinking_1:":"",
|
|
":thinking_2:":"",
|
|
":thumb_down:":"",
|
|
":thumb_up_1:":"",
|
|
":thumb_up_2:":"",
|
|
":tinfoil_hat:":"",
|
|
":troll_king:":"",
|
|
":ufo:":"",
|
|
":waiting:":"",
|
|
":what:":"",
|
|
":woodoo_doll:":""
|
|
}
|
|
|
|
STICKERS = {
|
|
|
|
# TOTALLY GRATIS
|
|
|
|
"<stkr>:CAT:<stkr>":"",
|
|
"<stkr>:FAIL:<stkr>":"",
|
|
"<stkr>:HYPE:<stkr>":"",
|
|
"<stkr>:PANTS_1:<stkr>":"",
|
|
"<stkr>:FIRE:<stkr>":"",
|
|
"<stkr>:SLIME:<stkr>":"",
|
|
"<stkr>:PISS:<stkr>":"",
|
|
"<stkr>:BULL_RIDE:<stkr>":"",
|
|
"<stkr>:ELIMINATED:<stkr>":"",
|
|
"<stkr>:EGG_CARTON:<stkr>":"",
|
|
"<stkr>:BAN:<stkr>":"",
|
|
"<stkr>:MONEY_PRINTER:<stkr>":"",
|
|
"<stkr>:MOUNT_RUSHMORE:<stkr>":"",
|
|
"<stkr>:EGIRL:<stkr>":"",
|
|
"<stkr>:KANYE_WEST:<stkr>":"",
|
|
"<stkr>:TAYLOR_SWIFT:<stkr>":"",
|
|
"<stkr>:DONALD_TRUMP:<stkr>":"",
|
|
"<stkr>:BILL_CLINTON:<stkr>":"",
|
|
"<stkr>:EPSTEIN_ISLAND:<stkr>":"",
|
|
"<stkr>:KURT_COBAIN:<stkr>":"",
|
|
"<stkr>:BILL_COSBY:<stkr>":"",
|
|
"<stkr>:CHE_GUEVARA:<stkr>":"",
|
|
"<stkr>:CHRIS_CHAN:<stkr>":"",
|
|
"<stkr>:PREGNANT_MAN_BLONDE:<stkr>":"",
|
|
"<stkr>:PREGNANT_WOMAN_BROWN_HAIR:<stkr>":"",
|
|
"<stkr>:ROCKET_SPACEMAN:<stkr>":"",
|
|
"<stkr>:SALTY:<stkr>":"",
|
|
"<stkr>:SICK_FLAME:<stkr>":"",
|
|
"<stkr>:SICK_SKULL:<stkr>":"",
|
|
"<stkr>:SPHAGETTI_BATH:<stkr>":"",
|
|
"<stkr>:THUG_LIFE:<stkr>":"",
|
|
"<stkr>:TRAP:<stkr>":"",
|
|
"<stkr>:TRASH:<stkr>":"",
|
|
"<stkr>:WHUUT:<stkr>":"",
|
|
|
|
# TECHNICALLY PAID ( FROM ODYSEE )
|
|
|
|
"<stkr>:TIP_HAND_FLIP:<stkr>":"",
|
|
"<stkr>:TIP_HAND_FLIP_COIN:<stkr>":"",
|
|
"<stkr>:TIP_HAND_FILP_LBC:<stkr>":"",
|
|
"<stkr>:COMET_TIP:<stkr>":"",
|
|
"<stkr>:SILVER_ODYSEE_COIN:<stkr>":"",
|
|
"<stkr>:LBC_COMET_TIP:<stkr>":"",
|
|
"<stkr>:SMALL_TIP:<stkr>":"",
|
|
"<stkr>:SMALL_LBC_TIP:<stkr>":"",
|
|
"<stkr>:BITE_TIP:<stkr>":"",
|
|
"<stkr>:BITE_TIP_CLOSEUP:<stkr>":"",
|
|
"<stkr>:BITE_LBC_CLOSEUP:<stkr>":"",
|
|
"<stkr>:MEDIUM_TIP:<stkr>":"",
|
|
"<stkr>:MEDIUM_LBC_TIP:<stkr>":"",
|
|
"<stkr>:LARGE_TIP:<stkr>":"",
|
|
"<stkr>:LARGE_LBC_TIP:<stkr>":"",
|
|
"<stkr>:BIG_TIP:<stkr>":"",
|
|
"<stkr>:BIG_LBC_TIP:<stkr>":"",
|
|
"<stkr>:FORTUNE_CHEST:<stkr>":"",
|
|
"<stkr>:FORTUNE_CHEST_LBC:<stkr>":"",
|
|
|
|
}
|
|
|
|
def Open(md):
|
|
|
|
|
|
# Spliting it for the read.
|
|
|
|
# EMOJIES CAN BE MORE THEN ONE IN THE TEXT
|
|
for emoji in EMOJIS:
|
|
md = md.replace(emoji, EMOJIS[emoji])
|
|
|
|
# STICKERS ONLY ONE PER TEXT ( To make publishing from FastLBRY be compatible with
|
|
# ODYSEE.COM )
|
|
|
|
for sticker in STICKERS:
|
|
if md == sticker:
|
|
md = STICKERS[sticker]
|
|
break
|
|
|
|
md = "\n\n"+md
|
|
md = md.split("\n")
|
|
|
|
# First thing is I was to read the headings and convert it into a tree.
|
|
|
|
|
|
tree = []
|
|
indent = 1
|
|
c = []
|
|
|
|
skip = 0
|
|
|
|
for n,line in enumerate(md):
|
|
|
|
if skip > n:
|
|
continue
|
|
|
|
ty = "text"
|
|
te = line
|
|
|
|
# Here I want to simply get a type of each line. Later we going to parse
|
|
# the links and other things. But first. Let's parse stuff based on
|
|
# lines.
|
|
|
|
if line.startswith("```"):
|
|
|
|
# THREE ``` aka code block
|
|
|
|
# This tag will block any other tags
|
|
# untill it's untagged
|
|
|
|
code = ""
|
|
for l in md[n+1:]:
|
|
if not l.startswith("```"):
|
|
code = code + l + "\n"
|
|
|
|
else:
|
|
skip = n + code.count("\n") + 2
|
|
break
|
|
|
|
tree.append(["text_cm", code+"\n"])
|
|
te = ""
|
|
|
|
elif line.startswith("#"):
|
|
# The titles of the chapter. The Headers are usually written similar
|
|
# to how here in python you write comments. It's a # , space, and the
|
|
# text.
|
|
|
|
# The amount of hashes. ## or ### gives different sized text. Officialy
|
|
# it should support up to 6 hashes. ######. But why not make it more
|
|
# just in case.
|
|
|
|
ty = line.count("#") # This might give bugs
|
|
|
|
elif line.startswith(">"):
|
|
|
|
# The > sign in the Markdown language is used for quatations.
|
|
|
|
ty = "text_q"
|
|
te = te[1:]
|
|
|
|
tree.append([ty, te+"\n"])
|
|
|
|
# Now the stage 0 is over and we parsed the basic things. Now is the hard
|
|
# part to parse out all the images and stuff inside them. It's going to be
|
|
# done per part. And we are going to use the same technique I used for the
|
|
# conversion of the legacy projects. See : studio/story.py ( in VCStudio )
|
|
|
|
# We are going to itterate over each letter. And decide what to do by that
|
|
|
|
newtree = []
|
|
|
|
for block in tree:
|
|
|
|
if block[0] == "text_cm":
|
|
newtree.append(block)
|
|
continue
|
|
|
|
part = ""
|
|
skip = 0
|
|
|
|
for n, l in enumerate(block[-1]):
|
|
|
|
if skip > n:
|
|
continue
|
|
|
|
part = part + l
|
|
|
|
# Here we are going to do something if a give condition is met.
|
|
# Usually I gonna do something if [part] ends with a given markdown
|
|
# thing. I don't have a manual of markdown on me. So please make it
|
|
# more supported. I guess. I might forget things I rarely use.
|
|
|
|
# Links are made with [stuff you click on](https://example.com)
|
|
# but similar to it. Images are done 
|
|
# and even weirder you can put one into the other. Like
|
|
# [](https://example.com)
|
|
# Which going to give you a clickable image.
|
|
|
|
# For this version what we are going to do is next.
|
|
# If we got [![ then it's a clickable image
|
|
# If we got ![ then it's just image
|
|
# and if we got [ then it's a link.
|
|
|
|
if part.endswith("[!["):
|
|
|
|
# IMAGE LINK
|
|
newtree.append([block[0], part[:-3]])
|
|
|
|
tooltip = ""
|
|
imageurl = ""
|
|
url = ""
|
|
t = False
|
|
iu = False
|
|
skip = n
|
|
for le in block[-1][n:]: # For letters in the rest of text
|
|
|
|
skip = skip + 1
|
|
|
|
if le == "]":
|
|
t = True
|
|
elif le == ")" and t and not iu:
|
|
iu = True
|
|
elif le == ")" and t and iu:
|
|
break
|
|
elif not t:
|
|
tooltip = tooltip +le
|
|
elif t and not iu:
|
|
imageurl = imageurl + le
|
|
else:
|
|
url = url+le
|
|
|
|
tooltip = tooltip[tooltip.find("[")+1:]
|
|
imageurl = imageurl[imageurl.find("(")+1:]
|
|
url = url[url.find("(")+1:]
|
|
|
|
apnd = ["image_link", imageurl, url]
|
|
|
|
newtree.append(apnd)
|
|
|
|
part = ""
|
|
|
|
|
|
elif part.endswith("!["):
|
|
|
|
# IMAGE
|
|
|
|
newtree.append([block[0], part[:-2]])
|
|
|
|
tooltip = ""
|
|
url = ""
|
|
t = False
|
|
skip = n
|
|
for le in block[-1][n:]: # For letters in the rest of text
|
|
|
|
skip = skip + 1
|
|
|
|
if le == "]":
|
|
t = True
|
|
elif le == ")" and t:
|
|
break
|
|
elif not t:
|
|
tooltip = tooltip +le
|
|
else:
|
|
url = url+le
|
|
|
|
tooltip = tooltip[tooltip.find("[")+1:]
|
|
url = url[url.find("(")+1:]
|
|
|
|
apnd = ["image", tooltip, url]
|
|
newtree.append(apnd)
|
|
|
|
part = ""
|
|
|
|
|
|
elif part.endswith("[") and not block[-1][n:].startswith('[!['):
|
|
|
|
# LINK
|
|
newtree.append([block[0], part[:-1]])
|
|
|
|
|
|
tooltip = ""
|
|
url = ""
|
|
t = False
|
|
skip = n
|
|
for le in block[-1][n:]: # For letters in the rest of text
|
|
|
|
skip = skip + 1
|
|
|
|
if le == "]":
|
|
t = True
|
|
elif le == ")" and t:
|
|
break
|
|
elif not t:
|
|
tooltip = tooltip +le
|
|
else:
|
|
url = url+le
|
|
|
|
tooltip = tooltip[tooltip.find("[")+1:]
|
|
url = url[url.find("(")+1:]
|
|
|
|
apnd = ["link", tooltip, url]
|
|
newtree.append(apnd)
|
|
|
|
part = ""
|
|
|
|
|
|
|
|
# Now I want to deal with `, *, ** and ***. If you want to help me you
|
|
# can implement other types. Such as _, __, ___ and so on. Markdown is
|
|
# a very rich language. I'm going to use the cut down version I see other
|
|
# people use.
|
|
|
|
# BTW this is the time. Feb 28. When I switched from Gedit to GNU Emacs.
|
|
# Interesting feeling using this programm. I kind a love it even tho
|
|
# so many stuff in not intuitive. Like saving is not Ctrl - S but
|
|
# Ctrl - X -> Ctrl - S.
|
|
|
|
# Things like Alt-; to comment multiple lines at ones is HUGE. Also it
|
|
# was built by programmers for programmers. So it's a very good tool.
|
|
|
|
elif part.endswith("**") and not block[-1][n+2:].startswith('*'):
|
|
|
|
# DOUBLE **
|
|
|
|
newtree.append([block[0], part[:-2]])
|
|
|
|
if block[0] == "text":
|
|
block[0] = "text_b"
|
|
else:
|
|
block[0] = "text"
|
|
|
|
part = ""
|
|
|
|
elif part.endswith("*") and not block[-1][n+1:].startswith('*'):
|
|
|
|
# SINGLE *
|
|
|
|
newtree.append([block[0], part[:-1]])
|
|
|
|
if block[0] == "text":
|
|
block[0] = "text_i"
|
|
else:
|
|
block[0] = "text"
|
|
|
|
part = ""
|
|
|
|
|
|
elif part.endswith("`"):
|
|
|
|
# SINGLE `
|
|
|
|
newtree.append([block[0], part[:-1]])
|
|
|
|
tmpart = block[-1][n+1:]
|
|
tmpart = tmpart[:tmpart.find("`")]
|
|
|
|
newtree.append(["text_c", tmpart])
|
|
|
|
skip = n+len(tmpart)+2
|
|
|
|
block[0] = "text"
|
|
|
|
part = ""
|
|
|
|
newtree.append([block[0], part])
|
|
|
|
|
|
#newtree.append(["text", "\n"*20+" [END OF DOCUMENT] "])
|
|
tree = newtree
|
|
|
|
return(tree)
|
|
|
|
def search_convert(s):
|
|
|
|
# This function convers a chapter name into a link
|
|
# such links are use in notabug.org to link to chapters
|
|
# for example example.com/file.md#chapter-name
|
|
# With this url it will load the example.com/file.md and
|
|
# then skip to the "Chapter Name" chapter.
|
|
|
|
# This function transforms "Chapter Name" into "chapter-name"
|
|
|
|
l = " ./\|[]{}()?!@#$%^&*`~:;'\"=,<>"
|
|
s = s.lower().replace(" ","-")
|
|
r = ""
|
|
for i in s:
|
|
if i not in l:
|
|
r = r + i
|
|
return r
|
|
|
|
def convert(win, text_view, imwidth=800):
|
|
|
|
text_buffer = text_view.get_buffer()
|
|
st = text_buffer.get_start_iter()
|
|
en = text_buffer.get_end_iter()
|
|
text = text_buffer.get_text(st, en, True)
|
|
text_buffer.set_text("")
|
|
|
|
try:
|
|
text_buffer.create_tag("text", justification=Gtk.Justification.FILL, left_margin=64, right_margin=64)
|
|
text_buffer.create_tag("text_c", background="#eeeeee", foreground="#000000", font="Monospace", left_margin=64, right_margin=64, justification=Gtk.Justification.LEFT)
|
|
text_buffer.create_tag("text_b", font="Bold", justification=Gtk.Justification.FILL, left_margin=64, right_margin=64)
|
|
text_buffer.create_tag("text_i", font="Italic", justification=Gtk.Justification.FILL, left_margin=64, right_margin=64)
|
|
text_buffer.create_tag("text_q", justification=Gtk.Justification.FILL, left_margin=200, right_margin=200)
|
|
text_buffer.create_tag("header", size_points=30, justification=Gtk.Justification.CENTER, left_margin=64, right_margin=64)
|
|
except:
|
|
pass
|
|
text_view.set_justification(Gtk.Justification.CENTER)
|
|
|
|
md = Open(text)
|
|
markup = ""
|
|
|
|
for i in md:
|
|
|
|
en = text_buffer.get_end_iter()
|
|
|
|
|
|
|
|
if type(i[0]) == str and i[0].startswith("text") and not i[0] == "text_cm":
|
|
|
|
if i[-1].startswith("___") or i[-1].startswith("---"):
|
|
|
|
# Inspired by ( and partially copied from ) LBRY-GTK by MorsMortium
|
|
|
|
text_buffer.insert(en, "\n---")
|
|
|
|
anchor = Gtk.TextChildAnchor()
|
|
text_buffer.insert_child_anchor(en, anchor)
|
|
|
|
def Expand(Widget, Discard):
|
|
Width = text_view.get_allocated_width()
|
|
Widget.set_size_request(Width, -1)
|
|
|
|
|
|
B = Gtk.Box()
|
|
Separator = Gtk.HSeparator()
|
|
B.pack_start(Separator, 1,1,1)
|
|
B.connect("draw", Expand)
|
|
|
|
text_view.add_child_at_anchor(B , anchor)
|
|
|
|
text_buffer.insert(en, "\n\n")
|
|
continue
|
|
|
|
elif (i[-1].startswith("lbry://") or i[-1].startswith("https://") or i[-1].startswith("http://")) and "youtu" not in i[-1] and i[0] != "text_c":
|
|
|
|
# I will try to resolve it as a publication
|
|
|
|
def try_resolve(url):
|
|
out = fetch.lbrynet("resolve", {"urls":parse.bar(url)})
|
|
|
|
try:
|
|
out = out[parse.bar(url)]
|
|
is_channel = "value_type" in out and out["value_type"] == "channel"
|
|
|
|
return ["lbry", url, out]
|
|
|
|
except:
|
|
return ["text", url, out]
|
|
|
|
def render_resolved(data):
|
|
|
|
t, url, out = data
|
|
|
|
if t == "text":
|
|
return Gtk.Label(url)
|
|
elif t == "lbry":
|
|
try:
|
|
return ui.search_item(win, out, True)
|
|
except:
|
|
return Gtk.Label(url)
|
|
|
|
|
|
|
|
|
|
w = ui.load(win, try_resolve, render_resolved, i[-1])
|
|
anchor = Gtk.TextChildAnchor()
|
|
text_buffer.insert_child_anchor(en, anchor)
|
|
text_view.add_child_at_anchor(w , anchor)
|
|
|
|
continue
|
|
|
|
|
|
try:
|
|
text_buffer.insert_with_tags_by_name(en, i[-1], i[0])
|
|
except:
|
|
text_buffer.insert(en, i[-1])
|
|
|
|
elif i[0] == "text_cm":
|
|
codeview = Gtk.TextView()
|
|
#codeview.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0.2,0.2,0.2, 1))
|
|
#codeview.override_color(Gtk.StateType.NORMAL, Gdk.RGBA(0.9,0.9,0.9, 1))
|
|
codeview.override_font(Pango.FontDescription("Monospace"))
|
|
codescrl = Gtk.ScrolledWindow()
|
|
codeframe = Gtk.Frame()
|
|
codeframe.add(codescrl)
|
|
codescrl.set_size_request(imwidth, min(i[-1].count("\n")*20, 500 ))
|
|
codeview.set_editable(True)
|
|
codescrl.add(codeview)
|
|
codebuffer = codeview.get_buffer()
|
|
codebuffer.set_text(i[-1])
|
|
anchor = Gtk.TextChildAnchor()
|
|
text_buffer.insert_child_anchor(en, anchor)
|
|
text_view.add_child_at_anchor(codeframe , anchor)
|
|
|
|
elif type(i[0]) == int:
|
|
text_buffer.insert_with_tags_by_name(en, i[-1].replace("#", ""), "header")
|
|
|
|
elif i[0] == "image_link":
|
|
image = ui.load(win, ui.net_image_calculation, ui.net_image_render, i[1], imwidth, imwidth, "", True)
|
|
|
|
|
|
def link_launch(w, link):
|
|
os.system("xdg-open "+link)
|
|
def link_resolve(w, link):
|
|
win.url.set_text(link)
|
|
win.url.activate()
|
|
|
|
optionsthing = Gtk.Popover()
|
|
optbox = Gtk.VBox()
|
|
optionsthing.add(optbox)
|
|
optbox.pack_start(Gtk.Label("Link"), False, False, 5)
|
|
opt_link = Gtk.Entry()
|
|
opt_link.set_editable(False)
|
|
opt_link.set_text(i[-1])
|
|
optbox.pack_start(opt_link, False, False, False)
|
|
opt_launch = Gtk.Button("Launch")
|
|
optbox.pack_start(opt_launch, False, False, False)
|
|
opt_resolve = Gtk.Button("Resolve")
|
|
optbox.pack_start(opt_resolve, False, False, False)
|
|
opt_launch.connect("clicked", link_launch, i[-1])
|
|
opt_resolve.connect("clicked", link_resolve, i[-1])
|
|
|
|
|
|
optbox.pack_start(Gtk.HSeparator(), False, False, 5)
|
|
optbox.pack_start(Gtk.Label("Image"), False, False, 5)
|
|
opt_link = Gtk.Entry()
|
|
opt_link.set_editable(False)
|
|
opt_link.set_text(i[1])
|
|
optbox.pack_start(opt_link, False, False, False)
|
|
opt2_open = Gtk.Button("Open")
|
|
optbox.pack_start(opt2_open, False, False, False)
|
|
opt2_launch = Gtk.Button("Launch")
|
|
optbox.pack_start(opt2_launch, False, False, False)
|
|
opt2_resolve = Gtk.Button("Resolve")
|
|
optbox.pack_start(opt2_resolve, False, False, False)
|
|
opt2_open.connect("clicked", link_launch, ui.image_save_name(i[1]))
|
|
opt2_launch.connect("clicked", link_launch, i[1])
|
|
opt2_resolve.connect("clicked", link_resolve, i[1])
|
|
|
|
|
|
optbox.show_all()
|
|
|
|
|
|
link = Gtk.MenuButton(popover=optionsthing)
|
|
link.add(image)
|
|
anchor = Gtk.TextChildAnchor()
|
|
text_buffer.insert_child_anchor(en, anchor)
|
|
text_view.add_child_at_anchor(link, anchor)
|
|
|
|
|
|
elif i[0] == "image":
|
|
|
|
try:
|
|
loadw = int(i[1])
|
|
except:
|
|
loadw = imwidth
|
|
|
|
|
|
image = ui.load(win, ui.net_image_calculation, ui.net_image_render, i[-1], loadw, loadw, "", True)
|
|
|
|
def link_launch(w, link):
|
|
os.system("xdg-open "+link)
|
|
def link_resolve(w, link):
|
|
win.url.set_text(link)
|
|
win.url.activate()
|
|
|
|
optionsthing = Gtk.Popover()
|
|
optbox = Gtk.VBox()
|
|
optionsthing.add(optbox)
|
|
opt_link = Gtk.Entry()
|
|
opt_link.set_editable(False)
|
|
opt_link.set_text(i[-1])
|
|
optbox.pack_start(opt_link, False, False, False)
|
|
opt_open = Gtk.Button("Open")
|
|
optbox.pack_start(opt_open, False, False, False)
|
|
opt_launch = Gtk.Button("Launch")
|
|
optbox.pack_start(opt_launch, False, False, False)
|
|
opt_resolve = Gtk.Button("Resolve")
|
|
optbox.pack_start(opt_resolve, False, False, False)
|
|
opt_open.connect("clicked", link_launch, ui.image_save_name(i[-1]))
|
|
opt_launch.connect("clicked", link_launch, i[-1])
|
|
opt_resolve.connect("clicked", link_resolve, i[-1])
|
|
optbox.show_all()
|
|
|
|
link = Gtk.MenuButton(popover=optionsthing)
|
|
link.set_relief(Gtk.ReliefStyle.NONE)
|
|
link.add(image)
|
|
anchor = Gtk.TextChildAnchor()
|
|
text_buffer.insert_child_anchor(en, anchor)
|
|
text_view.add_child_at_anchor(link, anchor)
|
|
|
|
elif i[0] == "link":
|
|
|
|
# link = Gtk.LinkButton.new_with_label(
|
|
# uri=i[-1],
|
|
# label=i[1])
|
|
def link_launch(w, link):
|
|
os.system("xdg-open "+link)
|
|
def link_resolve(w, link):
|
|
win.url.set_text(link)
|
|
win.url.activate()
|
|
|
|
optionsthing = Gtk.Popover()
|
|
optbox = Gtk.VBox()
|
|
optionsthing.add(optbox)
|
|
opt_link = Gtk.Entry()
|
|
opt_link.set_editable(False)
|
|
opt_link.set_text(i[-1])
|
|
optbox.pack_start(opt_link, False, False, False)
|
|
opt_launch = Gtk.Button("Launch")
|
|
optbox.pack_start(opt_launch, False, False, False)
|
|
opt_resolve = Gtk.Button("Resolve")
|
|
optbox.pack_start(opt_resolve, False, False, False)
|
|
opt_launch.connect("clicked", link_launch, i[-1])
|
|
opt_resolve.connect("clicked", link_resolve, i[-1])
|
|
optbox.show_all()
|
|
|
|
link = Gtk.MenuButton(label=i[1], popover=optionsthing)
|
|
|
|
link.set_tooltip_text(i[-1])
|
|
anchor = Gtk.TextChildAnchor()
|
|
text_buffer.insert_child_anchor(en, anchor)
|
|
|
|
text_view.add_child_at_anchor(link, anchor)
|
|
|
|
|