123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484 |
- # THIS SOFTWARE IS A PART OF FASTLBRY PROJECT
- # THIS SPECIFIC FILE IS UNDER GNU GPLv3 or later
- import os
- import json
- from subprocess import *
- import urllib.request
- import urllib.parse
- from urllib import request, parse
- ################################################################################
- # 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.
- def lbrynet(method="", params={}):
- # First we will make an attempt to use the request module
- try:
- # To test the SDK subprocess thing I have this little switch
- # 1/0 # Division by zero will trigger and error in this 'try'
- # and will skip it, to test the other method.
-
- data = {"method":method,
- "params":params}
- # The port of the LBRY SDK could be different for each user
- # so here I'm trying to solve this issue
- sdk_url = "http://localhost:5279"
- try:
- settings = open(os.path.expanduser('~/.local/share/lbry/lbrynet/daemon_settings.yml'))
- for line in settings:
- if line.startswith("api:"):
- sdk_url = "http://"+line[5:]
- except:
- pass
-
- data = str(json.dumps(data))
- data = data.encode('utf-8')
- req = request.Request(sdk_url, data=data)
- resp = json.loads(request.urlopen(req).read())
- try:
- resp = resp["result"]
- except:
- pass
-
- return resp
-
- except Exception as e:
- print("Failed", e)
- return False
-
- def odysee_get(link):
-
- if link.startswith("lbry://"):
- with open("lbry.json") as json_file:
- lbry = json.load(json_file)
- newlink = link.replace("lbry://", "/lbry/").replace("#", ":")
- if newlink not in lbry["hosting"]:
- out = lbrynet("resolve",
- {"urls":[link]}
- )
- out = out[link]
- try:
- price = out["value"]["fee"]["amount"]
- except:
- price = 0
- if price != 0:
- return link
-
- dpath = lbrynet("get", {"uri":link, "save_file":True}).get("download_path")
-
-
- lbry["hosting"][newlink] = dpath
- if dpath:
- with open("lbry.json", 'w') as f:
- json.dump(lbry, f, indent=4)
- else:
- return link
-
-
- return newlink+"\n"
-
- return link
- def Open(md):
- # Spliting it for the read.
- 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
- # Mentions
- line2 = line
- line = ""
- for word in line2.split(" "):
- if word.startswith("@"):
- word = '['+word+'](/account/'+word.replace("@", "")+')'
- line = line + " " + word
- line = line[1:]
-
- 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 = ""
- print("#####", n)
- for l in md[n+1:]:
- if not l.startswith("```"):
- code = code + l + "\n"
-
- else:
- skip = n + code.count("\n") + 2
- break
- print("!!!!!!!!!", skip)
- 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
-
-
-
- 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 ![Tooltip](Image.png)
- # and even weirder you can put one into the other. Like
- # [![Tooltip](Image.png)](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]])
- if block[0] == "text":
- block[0] = "text_c"
- else:
- 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(filename, isfile=True):
-
- textReturn = ""
- if isfile:
- text = open(filename)
- text = text.read()
- else:
- text = filename
- md = Open(text)
- close_div = False
- for n, i in enumerate(md):
- close_not_here = False
-
- if i[-1].startswith(">") or i[-1].startswith(">") and not close_div:
- i[-1] = '<div class="quote">' + i[-1].replace(">", "").replace(">", "")
-
- close_div = True
- elif close_div:
- i[-1] = i[-1].replace(">", "").replace(">", "")
- try:
- NEXT = md[n+1]
- except:
- NEXT = ["text", ""]
- if NEXT[-1].startswith(">") or NEXT[-1].startswith(">"):
- close_not_here = True
- if close_div and "\n" in i[-1] and not close_not_here:
- i[-1] = i[-1]+"</div>"
- close_div = False
-
- if type(i[0]) == str and i[0].startswith("text") and not i[0] == "text_cm":
- tag = ""
- ctag = ""
- for f in ["i", "b", "c"]:
- if f in i[0]:
- f.replace("c", "code").replace("q", "blockquote")
- tag = "<"+f+">"
- ctag = "</"+f+">"
- if i[-1].startswith("lbry://"):
- tag = '<a href="https://odysee.com/'+i[-1].replace("lbry://", "")[:-1]+'">'
- ctag = "</a>"
- if i[-1].startswith("http"):
- tag = '<a href="'+i[-1][:-1]+'">'
- ctag = "</a>"
- textReturn = textReturn + tag + i[-1] + ctag
- elif i[0] == "text_cm":
- tag = "<code>"
- ctag = "</code>"
- textReturn = textReturn + tag + i[-1] + ctag
-
- elif type(i[0]) == int:
- textReturn = textReturn + '\n<br><br><a href="#'+search_convert(i[-1].replace("#", "").replace("\n", "")[1:])+'"><h'+str(i[0])+' id="'+search_convert(i[-1].replace("#", "").replace("\n", "")[1:])+'">' + i[-1].replace("#", "") +"</h"+str(i[0])+"></a><br><br>"
-
- elif i[0] == "image_link":
- textReturn = textReturn + '\n<center><a href="'+i[-1]+'">'+'<img src="'+i[1]+'">'+"</a></center>"
-
- elif i[0] == "image":
-
-
- if i[1] == "audio":
- i[-1] = odysee_get(i[-1])
- textReturn = textReturn + '\n<audio controls="controls" width="20%" src="'+i[-1][:-1]+'"></audio>'
- elif i[1] == "video":
- i[-1] = i[-1].replace("lbry://", "https://player.odycdn.com/speech/")
- textReturn = textReturn + """\n<div class="video_frame"><video width="100%" controls>
- <source src=\""""+i[-1][:-1]+"""\" type="video/mp4">
- </video>
- </div>"""
-
- else:
- i[-1] = i[-1].replace("lbry://", "https://spee.ch/")
- textReturn = textReturn + '\n<center><img src="'+i[-1]+'"></center>'
-
- elif i[0] == "link":
- textReturn = textReturn + '<a href="'+i[-1]+'">'+i[1]+"</a>"
-
-
- textReturn = textReturn.replace("\n", "\n<br>")
- textReturn = textReturn + "\n\n<!-- Raw Version of the markdown text\n\n"
- textReturn = textReturn + text.replace("-->", "( somebody was trying to pentest the site here with exiting the comment early. Good job )") + "\n\n"
- textReturn = textReturn + " -->\n\n"
-
-
- return textReturn
|