Diskussion:Wiki2scorm - entwicklung - Archiv
Inhaltsverzeichnis
lizenz
meiner meinung nach wäre die GPL die richtige! eventuell auch die LGPL.
- übersetzung: http://www.gnu.de/gpl-ger.html
- orginal: http://www.gnu.org/copyleft/gpl.html
- allgemeine info: http://www.gnu.org oder http://de.wikipedia.org/wiki/General_Public_License (daniel, 11.05.05)
benutzerinterface
yaml versus formular
ich tendiere zu einer wiki-like syntax. mir persönlich ist sogar yaml zu umfangreich. eine impementierung ist meiner meinung nach unnötig, wenn wir nur einen festen satz an metadaten haben, die fixe positionen im xml aufweisen. (daniel, 11.05.05)
WYSIWYG (What you see is what you get)
(anmerkung ml: ein wysiwig editor kann eine alternative zu wikiml sein, aber nicht zu yaml. bei yaml und co geht es nicht um sichtbare formatierungen sondern um (auch) maschinenlesbare (meta)daten. was wäre die wysiwyg variante von yaml ? was genau sollte man beim editieren sehen so wie man es bekommt ? allerdings liesse sich mit analoger javascript programmierung eine unterstützung für's yaml editieren denken. zb zum anzeigen von möglichen werten. ich denke yaml liesse sich durchaus auch in einem editor einsetzen in dem sichtbare formatierungen wysiwig mässig gehandhabt werden. genaugenommen ist auch wysiwyg und wikiml nicht unbedingt ein widerspruch: ein wysiwyg editor könnte statt html code wikiml code erzeugen.)
- Wenn, angenommen, ein WYSIWIG Editor hergenommen wird, sehe ich denn Vorteil von yaml nicht mehr, dann können wir eh gleich wieder direkt XML hernehmen. Wieso erst von Editor -> yaml -> XML? Wenn schon von Editor, dann Editor -> yaml. --mape 22:52, 18. Mai 2005 (CEST)
- widgEditor: HTML-Editor mittels Style-Sheets und Javascript
- WYSIWYG comes to Safari 1.3 (funktioniert ab Mac OS X 10.3.9)
metadaten
ablauf des programms
programmteile
mein vorschlag:
- parser: liest daten aus dem wiki und schreibt sie in ein oder zwei directory (url + xml-daten).
- url-loader: liest die url aus dem directory und lädt die dateien. danach schreibt er sie in ein temporäres verzeichnis.
- xml-writer: ertsellt die datei "imsmanifest.xml" im temporären verzeichnis.
- zip-writer: zippt das temporäre verzeichnis.
- proof: prüft das zip-file und gibt eine erfolgs- oder fehlermeldung zurück. (daniel, 11.05.05)
schnittstellen
schnittstellen, grobe skizze, vorschlag (ml. 20.5.2005)
class MakePackage:
(nicht eingerückt wegen wiki markup)
PackageInfo = { # dictionary with user supplied package info's. these are also the valid yaml metadata entrys. the info's in dictionary and yaml are not hierachically structured (like the xml manifest).
'identifier': "", # manifest: manifest and organization identifier
'title': "", # manifest: organization and item title
'index': "", # start/index content item, in manifest: item and resource
'content': [] # list of url's for archive content
}
ErrorLog = ""
ResultDirectory = ""
TempDirectory = ""
XmlTemplateDirectory = ""
.# member functions: (define in other modules and assign here)
CreatePackageFromYaml = ....
lib-user interface:
def CreatePackageFromYaml( self, strYamlPackageInfo):
parameter strYamlPackageInfo: string with user info in (maybe simplified) yaml syntax. for valid entrys see self.PackageInfo dictionary. example:
identifier:id123 title:Big Typescript index:www.xxx.at/wiki/index.html content: -www.xxx.at/wiki/index.html -www.xxx.at/wiki/page1.html -www.xxx.at/wiki/page2.html -www.xxx.at/wiki/page3.html
return value: string with path and filename of created package (zip-archive)
creates the package using the metainfo and index- and resourcelist-info from strYamlPackageInfo and the xml templates in self.XmlTemplateDirectory. the resulting package (zip-archive) contains the xml manifest metainfo (xml-files) and the content (html-files) in a subdirectory 'res'
internal interface:
def ParseYaml( self, strYamlPackageInfo):
parse strYamlPackageInfo parameter string contaning package info in yaml syntax and assign to matching self.PackageInfo entrys. report nonmatching entrys to self.ErrorLog.
(step 1: import to temporary dictionary:
variant 1: use pyyaml parser
variant 2: simple serial unstructured parsing. (skip leading whitespace, characters until ':' are the dictionary key, rest to end of line the dictionary value, if lines begin (after removed whitespace) with '-' add rest to end of line as list item to value of last key)
step 2: iterate over temporary dictionary, if key and type match self.PackageInfo entry then assign value, else add error text to self.ErrorLog.)
def CreateXml( self):
read xml files from self.XmlTemplateDirectory, insert values from self.PackageInfo into xml tags, write xml files to self.TempDirectory. copy xml schemas (.xsd) from self.XmlTemplateDirectory (or another) to self.TempDirectory.
def DownloadContent( self):
download all url's in the content list in the self.PackageInfo dictionary to a subdirctory 'res' of self.TempDirectory. (replace special characters to create a valid file name from the name-part of the url)
remove the web-path and replace special characters for all occurances of the self.PackageInfo['content'] url's (complete and without host part (or without self.UrlBase)) in the downloaded html-files. (either provisionally general or only in hrefs). (example: www.xxx.at/wiki/page1.html -> page1.html and /wiki/page1.html -> page1.html)
def CreateArchive( self):
create zip-archive in the self.ResultDirectory from the content of self.TempDirectory
anmerkungen
der klassennname könnte auch ContentPackage, der user interface funktion name MakeFromYaml sein.
ParseYaml variant 1: use pyyaml parser hätte den vorteil das, sollte für eine erweiterung (ev zb mehrere lernobjekte in einem package) mehr strukturierte information notwendig sein, das dann auch geht.
für den download part könnte auch wget verwendet werden. das hätte namens- und href konvertierungen gleich dabei und würde für die zukunft einiges an erweiterungsmöglichkeiten bieten (wildcards, verwenden von wiki suchergebnissen)
externe programme können aus python folgendermassen aufgerufen werden (in der simpelsten variante):
import subprocess subprocess.call(["/div/test2", "param1=123", "param2=abc"])
der wget aufruf könnte so aussehen:
wget --html-extension --directory-prefix=/tempdir/res --no-directories --convert-links --append-output=log.txt --page-requisites resource-1 ... resource-n
(mit folgendem aufruf kann man übrigens eine offlineversion des wikis erzeugen: wget --html-extension --directory-prefix=c:\div\mediawiki --convert-links --append-output=log.txt --page-requisites --recursive --level=1 http://timaios.philo.at/wiki/index.php/Spezial:Allpages )
sonstiges
alternativvorschlag für ParseYaml()
# parse_yaml.py def ParseYaml( self, strYamlPackageInfo): "Function to parse a String in Yaml" n, d = ParseYaml.__name__, ParseYaml.__doc__ try: import re, string currListKey = None for l in string.split(strYamlPackageInfo, '\n'): # key : value k = re.search('\A\s*(\w+)\s*:\s*(.*)\Z', l) if k != None: key = k.group(1) if self.PackageInfo.has_key(key): if type(self.PackageInfo[key]) is list: currListKey = key if k.group(2) != '': self.ErrorLog += 'ParseYaml: value ignored, should be a list: ' + l + '\n' else: self.PackageInfo[key] = k.group(2) currListKey = None else: self.ErrorLog += 'ParseYaml: invalid entry: ' + l + '\n' continue # - listitem k = re.search('\A\s*-\s*(.*)\Z', l) if k != None: if currListKey != None: self.PackageInfo[currListKey].append(k.group(1)) else: self.ErrorLog += 'ParseYaml: listitem without previous valid listentry: ' + l + '\n' continue # whitespace k = re.search('\A\s*\Z', l) if k != None: continue self.ErrorLog += 'ParseYaml: line not handled: ' + l + '\n' except ImportError, (strerror): self.ErrorLog += '%s: %s\n ImportError: %s\n' % (n, d, strerror) except IOError, (errno, strerror): self.ErrorLog += '%s: %s\n IOError: [Errno %s] %s\n' % (n, d, errno, strerror) #eof