Zanurkuj w Pythonie/Skrypty i strumienie - wszystko razem: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 1:
{{Podświetl|py}}
== Wszystko razem==
Przemierzyliśmy kawał drogi. Zatrzymajmy się na chwilę i zobaczmy jak te wszystkie elementy do siebie pasują.
Zaczniemy od skryptu, który pobiera argumenty z linii poleceń używając modułu <tt>getopt</tt>.
def main(argv):
Linia 16 ⟶ 14:
...
Tworzymy nową instancję klasy <tt>KantGenerator</tt> i przekazujemy jej plik z gramatyką oraz źródło, które może być, ale nie musi, podane w linii poleceń.
k = KantGenerator(grammar, source)
Instancja klasy <tt>KantGenerator</tt> automatycznie wczytuje gramatykę, która jest plikiem XML. Wykorzystujemy naszą funkcję <tt>openAnything</tt> do otwarcia pliku (który może być ulokowany lokalnie lub na zdalnym serwerze), następnie używamy wbudowanego zestawu funkcji parsujących <tt>minidom</tt> do sparsowania XML-a do postaci drzewa obiektów Pythona.
def _load(self, source):
Linia 30 ⟶ 25:
sock.close()
Ach i po drodze wykorzystujemy naszą wiedzę o strukturze dokumentu XML do utworzenia małego bufora referencji, którymi są po prostu elementy dokumentu XML.
def loadGrammar(self, grammar):
Linia 37 ⟶ 31:
self.refs[ref.attributes["id"].value] = ref
Jeśli został podany jakiś materiał źródłowy w linii poleceń, używamy go. W przeciwnym razie na podstawie gramatyki wyszukujemy referencję na najwyższym poziomie (tą do której nie mają odnośników żadne inne elementy) i używamy jej jako punktu startowego.
def getDefaultSource(self):
Linia 48 ⟶ 41:
return '<xref id="%s"/>' % random.choice(standaloneXrefs)
Teraz przedzieramy się przez materiał źródłowy. Ten materiał to także XML i parsujemy go węzeł po węźle. Aby podzielić nieco kod i uczynić go łatwiejszym w utrzymaniu, używamy oddzielnych funkcji obsługi (handlers) dla każdego typu węzła.
def parse_Element(self, node):
Linia 55 ⟶ 47:
handlerMethod(node)
Przelatujemy przez gramatykę, parsując wszystkie elementy potomne każdego elementu <tt>p</tt>,
def do_p(self, node):
Linia 62 ⟶ 54:
for child in node.childNodes: self.parse(child)
zastępując elementy <tt>choice</tt> losowym elementem potomnym,
def do_choice(self, node):
self.parse(self.randomChildElement(node))
i zastępując elementy <tt>xref</tt> losowym elementem potomnym odpowiedniego elementu <tt>ref</tt>, który wcześniej został zachowany w buforze.
def do_xref(self, node):
Linia 73 ⟶ 65:
self.parse(self.randomChildElement(self.refs[id]))
W końcu parsujemy wszystko do zwykłego tekstu,
def parse_Text(self, node):
Linia 80 ⟶ 72:
self.pieces.append(text)
który wypisujemy.
def main(argv):
|