Diskussion:Wiki2scorm - entwicklung - Archiv

Aus Philo Wiki
Wechseln zu:Navigation, Suche

lizenz

meiner meinung nach wäre die GPL die richtige! eventuell auch die LGPL.

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)

als Alternative zu Wiki-Syntax & Co:

(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)

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