Merge branch 'master' of git://gitorious.org/f-droid/fdroidserver

This commit is contained in:
David Black 2012-09-18 11:08:36 +01:00
commit 7af5e7d347
5 changed files with 205 additions and 18 deletions

View file

@ -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

View file

@ -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.

View file

@ -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'

View file

@ -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

View file

@ -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":