mirror of
https://github.com/f-droid/fdroidserver.git
synced 2025-09-15 23:42:37 +03:00
Merge branch 'master' of git://gitorious.org/f-droid/fdroidserver
This commit is contained in:
commit
7af5e7d347
5 changed files with 205 additions and 18 deletions
|
@ -583,8 +583,22 @@ A brief summary of what the application is.
|
||||||
|
|
||||||
@cindex Description
|
@cindex Description
|
||||||
|
|
||||||
A full description of the application. This can span multiple lines, and is
|
A full description of the application. This can span multiple lines (which
|
||||||
terminated by a line containing a single '.'.
|
should be kept to a maximum of 80 characters), and is terminated by a line
|
||||||
|
containing a single '.'.
|
||||||
|
|
||||||
|
Basic MediaWiki-style formatting can be used. Leaving a blank line starts a
|
||||||
|
new paragraph. Surrounding text with @code{''} make it italic, and with
|
||||||
|
@code{'''} makes it bold.
|
||||||
|
|
||||||
|
You can link to another app in the repo by using @code{[[app.id]]}. The link
|
||||||
|
will be made appropriately whether in the Android client, the web repo
|
||||||
|
browser or the wiki. The link text will be the apps name.
|
||||||
|
|
||||||
|
Links to web addresses can be done using @code{[http://example.com Text]}.
|
||||||
|
|
||||||
|
Bulletted lists are done by simply starting each item with a @code{*} on
|
||||||
|
a new line, and numbered lists are the same but using @code{#}.
|
||||||
|
|
||||||
@node Repo Type
|
@node Repo Type
|
||||||
@section Repo Type
|
@section Repo Type
|
||||||
|
|
|
@ -21,6 +21,7 @@ import shutil
|
||||||
import subprocess
|
import subprocess
|
||||||
import time
|
import time
|
||||||
import operator
|
import operator
|
||||||
|
import cgi
|
||||||
|
|
||||||
def getvcs(vcstype, remote, local, sdk_path):
|
def getvcs(vcstype, remote, local, sdk_path):
|
||||||
if vcstype == 'git':
|
if vcstype == 'git':
|
||||||
|
@ -612,19 +613,177 @@ def read_metadata(verbose=False):
|
||||||
apps.append(parse_metadata(metafile, verbose=verbose))
|
apps.append(parse_metadata(metafile, verbose=verbose))
|
||||||
return apps
|
return apps
|
||||||
|
|
||||||
|
# Formatter for descriptions. Create an instance, and call parseline() with
|
||||||
|
# each line of the description source from the metadata. At the end, call
|
||||||
|
# end() and then text_plain, text_wiki and text_html will contain the result.
|
||||||
|
class DescriptionFormatter:
|
||||||
|
stNONE = 0
|
||||||
|
stPARA = 1
|
||||||
|
stUL = 2
|
||||||
|
stOL = 3
|
||||||
|
bold = False
|
||||||
|
ital = False
|
||||||
|
state = stNONE
|
||||||
|
text_plain = ''
|
||||||
|
text_wiki = ''
|
||||||
|
text_html = ''
|
||||||
|
linkResolver = None
|
||||||
|
def __init__(self, linkres):
|
||||||
|
self.linkResolver = linkres
|
||||||
|
def endcur(self, notstates=None):
|
||||||
|
if notstates and self.state in notstates:
|
||||||
|
return
|
||||||
|
if self.state == self.stPARA:
|
||||||
|
self.endpara()
|
||||||
|
elif self.state == self.stUL:
|
||||||
|
self.endul()
|
||||||
|
elif self.state == self.stOL:
|
||||||
|
self.endol()
|
||||||
|
def endpara(self):
|
||||||
|
self.text_plain += '\n'
|
||||||
|
self.text_html += '</p>'
|
||||||
|
self.state = self.stNONE
|
||||||
|
def endul(self):
|
||||||
|
self.text_html += '</ul>'
|
||||||
|
self.state = self.stNONE
|
||||||
|
def endol(self):
|
||||||
|
self.text_html += '</ol>'
|
||||||
|
self.state = self.stNONE
|
||||||
|
|
||||||
|
def formatted(self, txt, html):
|
||||||
|
formatted = ''
|
||||||
|
if html:
|
||||||
|
txt = cgi.escape(txt)
|
||||||
|
while True:
|
||||||
|
index = txt.find("''")
|
||||||
|
if index == -1:
|
||||||
|
return formatted + txt
|
||||||
|
formatted += txt[:index]
|
||||||
|
txt = txt[index:]
|
||||||
|
if txt.startswith("'''"):
|
||||||
|
if html:
|
||||||
|
if self.bold:
|
||||||
|
formatted += '</b>'
|
||||||
|
else:
|
||||||
|
formatted += '<b>'
|
||||||
|
self.bold = not self.bold
|
||||||
|
txt = txt[3:]
|
||||||
|
else:
|
||||||
|
if html:
|
||||||
|
if self.ital:
|
||||||
|
formatted += '</i>'
|
||||||
|
else:
|
||||||
|
formatted += '<i>'
|
||||||
|
self.ital = not self.ital
|
||||||
|
txt = txt[2:]
|
||||||
|
|
||||||
|
|
||||||
|
def linkify(self, txt):
|
||||||
|
linkified_plain = ''
|
||||||
|
linkified_html = ''
|
||||||
|
while True:
|
||||||
|
index = txt.find("[")
|
||||||
|
if index == -1:
|
||||||
|
return (linkified_plain + self.formatted(txt, False), linkified_html + self.formatted(txt, True))
|
||||||
|
linkified_plain += self.formatted(txt[:index], False)
|
||||||
|
linkified_html += self.formatted(txt[:index], True)
|
||||||
|
txt = txt[index:]
|
||||||
|
if txt.startswith("[["):
|
||||||
|
index = txt.find("]]")
|
||||||
|
if index == -1:
|
||||||
|
raise MetaDataException("Unterminated ]]")
|
||||||
|
url = txt[2:index]
|
||||||
|
if self.linkResolver:
|
||||||
|
url, urltext = self.linkResolver(url)
|
||||||
|
else:
|
||||||
|
urltext = url
|
||||||
|
linkified_html += '<a href="' + url + '">' + cgi.escape(urltext) + '</a>'
|
||||||
|
linkified_plain += urltext
|
||||||
|
txt = txt[index+2:]
|
||||||
|
else:
|
||||||
|
index = txt.find("]")
|
||||||
|
if index == -1:
|
||||||
|
raise MetaDataException("Unterminated ]")
|
||||||
|
url = txt[2:index]
|
||||||
|
index2 = url.find(' ')
|
||||||
|
if index2 == -1:
|
||||||
|
urltxt = url
|
||||||
|
else:
|
||||||
|
urltxt = url[index2 + 1:]
|
||||||
|
url = url[:index]
|
||||||
|
linkified_html += '<a href="' + url + '">' + cgi.escape(urltxt) + '</a>'
|
||||||
|
linkified_plain += urltxt
|
||||||
|
if urltxt != url:
|
||||||
|
linkified_plain += ' (' + url + ')'
|
||||||
|
txt = txt[index+1:]
|
||||||
|
|
||||||
|
def addtext(self, txt):
|
||||||
|
p, h = self.linkify(txt)
|
||||||
|
self.text_plain += p
|
||||||
|
self.text_html += h
|
||||||
|
|
||||||
|
def parseline(self, line):
|
||||||
|
self.text_wiki += line + '\n'
|
||||||
|
if len(line) == 0:
|
||||||
|
self.endcur()
|
||||||
|
elif line.startswith('*'):
|
||||||
|
self.endcur([self.stUL])
|
||||||
|
if self.state != self.stUL:
|
||||||
|
self.text_html += '<ul>'
|
||||||
|
self.state = self.stUL
|
||||||
|
self.text_html += '<li>'
|
||||||
|
self.text_plain += '*'
|
||||||
|
self.addtext(line[1:])
|
||||||
|
self.text_html += '</li>'
|
||||||
|
elif line.startswith('#'):
|
||||||
|
self.endcur([self.stOL])
|
||||||
|
if self.state != self.stOL:
|
||||||
|
self.text_html += '<ol>'
|
||||||
|
self.state = self.stOL
|
||||||
|
self.text_html += '<li>'
|
||||||
|
self.text_plain += '*' #TODO: lazy - put the numbers in!
|
||||||
|
self.addtext(line[1:])
|
||||||
|
self.text_html += '</li>'
|
||||||
|
else:
|
||||||
|
self.endcur([self.stPARA])
|
||||||
|
if self.state == self.stNONE:
|
||||||
|
self.text_html += '<p>'
|
||||||
|
self.state = self.stPARA
|
||||||
|
elif self.state == self.stPARA:
|
||||||
|
self.text_html += ' '
|
||||||
|
self.text_plain += ' '
|
||||||
|
self.addtext(line)
|
||||||
|
|
||||||
|
def end(self):
|
||||||
|
self.endcur()
|
||||||
|
|
||||||
# Parse multiple lines of description as written in a metadata file, returning
|
# Parse multiple lines of description as written in a metadata file, returning
|
||||||
# a single string.
|
# a single string in plain text format.
|
||||||
def parse_description(lines):
|
def description_plain(lines, linkres):
|
||||||
text = ''
|
ps = DescriptionFormatter(linkres)
|
||||||
for line in lines:
|
for line in lines:
|
||||||
if len(line) == 0:
|
ps.parseline(line)
|
||||||
text += '\n\n'
|
ps.end()
|
||||||
else:
|
return ps.text_plain
|
||||||
if not text.endswith('\n') and len(text) > 0:
|
|
||||||
text += ' '
|
# Parse multiple lines of description as written in a metadata file, returning
|
||||||
text += line
|
# a single string in wiki format.
|
||||||
return text
|
def description_wiki(lines):
|
||||||
|
ps = DescriptionFormatter(None)
|
||||||
|
for line in lines:
|
||||||
|
ps.parseline(line)
|
||||||
|
ps.end()
|
||||||
|
return ps.text_wiki
|
||||||
|
|
||||||
|
# Parse multiple lines of description as written in a metadata file, returning
|
||||||
|
# a single string in HTML format.
|
||||||
|
def description_html(lines,linkres):
|
||||||
|
ps = DescriptionFormatter(linkres)
|
||||||
|
for line in lines:
|
||||||
|
ps.parseline(line)
|
||||||
|
ps.end()
|
||||||
|
return ps.text_html
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Extract some information from the AndroidManifest.xml at the given path.
|
# Extract some information from the AndroidManifest.xml at the given path.
|
||||||
|
|
|
@ -126,6 +126,9 @@ def main():
|
||||||
if url.startswith('https://github.com'):
|
if url.startswith('https://github.com'):
|
||||||
if url.endswith('/'):
|
if url.endswith('/'):
|
||||||
url = url[:-1]
|
url = url[:-1]
|
||||||
|
if url.endswith('.git'):
|
||||||
|
print "A github URL should point to the project, not the git repo"
|
||||||
|
sys.exit(1)
|
||||||
projecttype = 'github'
|
projecttype = 'github'
|
||||||
repo = url + '.git'
|
repo = url + '.git'
|
||||||
repotype = 'git'
|
repotype = 'git'
|
||||||
|
|
|
@ -30,7 +30,7 @@ from xml.dom.minidom import Document
|
||||||
from optparse import OptionParser
|
from optparse import OptionParser
|
||||||
import time
|
import time
|
||||||
import common
|
import common
|
||||||
|
from common import MetaDataException
|
||||||
|
|
||||||
# Update the wiki. 'apps' is a list of all applications and everything we know
|
# Update the wiki. 'apps' is a list of all applications and everything we know
|
||||||
# about them, and 'apks' likewise. Set 'verbose' to True for verbose output.
|
# about them, and 'apks' likewise. Set 'verbose' to True for verbose output.
|
||||||
|
@ -66,7 +66,7 @@ def update_wiki(apps, apks, verbose=False):
|
||||||
wikidata += " - [http://f-droid.org/repository/browse/?fdid=" + app['id'] + " view in repository]\n\n"
|
wikidata += " - [http://f-droid.org/repository/browse/?fdid=" + app['id'] + " view in repository]\n\n"
|
||||||
|
|
||||||
wikidata += "=Description=\n"
|
wikidata += "=Description=\n"
|
||||||
wikidata += common.parse_description(app['Description']) + "\n"
|
wikidata += common.description_wiki(app['Description']) + "\n"
|
||||||
|
|
||||||
# Get a list of all packages for this application...
|
# Get a list of all packages for this application...
|
||||||
apklist = []
|
apklist = []
|
||||||
|
@ -438,6 +438,10 @@ def main():
|
||||||
el = doc.createElement(name)
|
el = doc.createElement(name)
|
||||||
el.appendChild(doc.createTextNode(value))
|
el.appendChild(doc.createTextNode(value))
|
||||||
parent.appendChild(el)
|
parent.appendChild(el)
|
||||||
|
def addElementCDATA(name, value, doc, parent):
|
||||||
|
el = doc.createElement(name)
|
||||||
|
el.appendChild(doc.createCDATASection(value))
|
||||||
|
parent.appendChild(el)
|
||||||
|
|
||||||
root = doc.createElement("fdroid")
|
root = doc.createElement("fdroid")
|
||||||
doc.appendChild(root)
|
doc.appendChild(root)
|
||||||
|
@ -510,8 +514,15 @@ def main():
|
||||||
addElement('name', app['Name'], doc, apel)
|
addElement('name', app['Name'], doc, apel)
|
||||||
addElement('summary', app['Summary'], doc, apel)
|
addElement('summary', app['Summary'], doc, apel)
|
||||||
addElement('icon', app['icon'], doc, apel)
|
addElement('icon', app['icon'], doc, apel)
|
||||||
|
def linkres(link):
|
||||||
|
for app in apps:
|
||||||
|
if app['id'] == link:
|
||||||
|
return ("fdroid.app:" + link, app['Name'])
|
||||||
|
raise MetaDataException("Cannot resolve app id " + link)
|
||||||
addElement('description',
|
addElement('description',
|
||||||
common.parse_description(app['Description']), doc, apel)
|
common.description_plain(app['Description'], linkres), doc, apel)
|
||||||
|
addElement('desc',
|
||||||
|
common.description_html(app['Description'], linkres), doc, apel)
|
||||||
addElement('license', app['License'], doc, apel)
|
addElement('license', app['License'], doc, apel)
|
||||||
if 'Category' in app:
|
if 'Category' in app:
|
||||||
# We put the first (primary) category in LAST, which will have
|
# We put the first (primary) category in LAST, which will have
|
||||||
|
|
|
@ -164,7 +164,7 @@ class FDroid
|
||||||
case "summary":
|
case "summary":
|
||||||
$summary=$el;
|
$summary=$el;
|
||||||
break;
|
break;
|
||||||
case "description":
|
case "desc":
|
||||||
$desc=$el;
|
$desc=$el;
|
||||||
break;
|
break;
|
||||||
case "license":
|
case "license":
|
||||||
|
@ -246,7 +246,7 @@ class FDroid
|
||||||
$out.="<br>".$summary."</p>";
|
$out.="<br>".$summary."</p>";
|
||||||
$out.="</div>";
|
$out.="</div>";
|
||||||
|
|
||||||
$out.="<p>".$desc."</p>";
|
$out.=str_replace('href="fdroid.app:', 'href="/repository/browse/?fdid=', $desc);
|
||||||
|
|
||||||
if(isset($antifeatures)) {
|
if(isset($antifeatures)) {
|
||||||
$antifeaturesArray = explode(',',$antifeatures);
|
$antifeaturesArray = explode(',',$antifeatures);
|
||||||
|
@ -640,7 +640,7 @@ class FDroid
|
||||||
case "summary":
|
case "summary":
|
||||||
$appinfo['summary']=$el;
|
$appinfo['summary']=$el;
|
||||||
break;
|
break;
|
||||||
case "description":
|
case "desc":
|
||||||
$appinfo['description']=$el;
|
$appinfo['description']=$el;
|
||||||
break;
|
break;
|
||||||
case "license":
|
case "license":
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue