Benutzer:Prog/ C++-Programmierung/ Gesamtes Buch

Da mich der PDF-Export des C++-Buches nicht zufriedenstellt, entwickle ich eine Software welche die Umwandlung auf Basis der HTML-Parser-Ausgabe vollzieht. Der Hintergedanke dabei ist, das Änderungen und Erweiterungen an der MediaWiki-Software nur geringfügigen Einfluss auf den Umwandlungsprozess nehmen können. Da viele der HTML-Vorlagen für die Gestaltung einer PDF-Version ungeeignet sind, habe ich eine MediaWiki-Erweiterung geschrieben, welche es erlaubt, beliebige Vorlagen auf einzelnen Seiten gegen andere Vorlagen auszutauschen. Das ausgegebene XHTML dient als Eingabe für das eigentliche Übersetzungstool. Die Ausgabe muss zwingend XHTML konform sein, da mein Tool einen einfachen XML-Parser zum interpretieren der Datei verwendet.

Die Software werde ich vollständig im Quelltext hier veröffentlichen, sobald sie nach meiner Meinung hinreichen ausgereift ist. Sie ist in C++ geschrieben und benutzt einige Boost-Bibliotheken. Auch die allgemeine Arbeitsweise der Umwandlung wird hier beschrieben werden.

Folgende Vorbereitungsschritte müssen vor Nutzung des Tools ausgeführt werden:

  • Installation eines HTTP-Servers mit PHP5 Unterstützung (z.B. Apache2) und eines (MediaWikikompatiblen) SQL-Servers (z.B. PostgreSQL, MySQL)
  • Installation einer aktuellen MediaWiki-Version
  • In der LocalSettings.php (MediaWiki-Konfigurationsdatei) folgende Werte setzen:
    • $wgMaxArticleSize = 65536;
    • $wgExpensiveParserFunctionLimit = 500;
  • Installation der folgenden Erweiterung
    • In "MediaWikiRoot/extensions/" Verzeichnis "TemplateReplace" anlegen
    • Datei "MediaWikiRoot/extensions/TemplateReplace/TemplateReplace.php" erzeugen
<?php
# Copyright (C) 2010 Prog (Benjamin Buch) <benni.buch@googlemail.com>
# http://www.mediawiki.org/
# 
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or 
# (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# http://www.gnu.org/copyleft/gpl.html

/**
 * Extension to define a set of templates there should be replaced by others.
 *
 * @author Prog (Benjamin Buch) <benni.buch at googlemail.com>
 * @addtogroup Extensions
 */

if( !defined( 'MEDIAWIKI' ) ) {
	die();
}

$wgHooks['ParserFirstCallInit'][] = 'setupTemplateReplace';
$wgHooks['BeforeParserFetchTemplateAndtitle'][] = 'doTemplateReplace';

$wgExtensionCredits['parserhook'][] = array(
	'name' => 'TemplateReplace',
	'author' => 'Prog (Benjamin Buch)',
	'url' => 'http://localhost/borpex/index.php/Extension:TemplateReplace',
	'description' => 'Allows definition of a set of templates there should be replaced by others',
	'descriptionmsg' => 'templatereplace-desc',
);

$dir = dirname(__FILE__) . '/';
$wgExtensionMessagesFiles['TemplateReplace'] = $dir . 'TemplateReplace.i18n.php';

$wgTemplateReplaceList = array();

function setupTemplateReplace( &$parser ) {
	$parser->setHook( 'replace', 'makeTemplateReplaceList' );
	return true;
}

function makeTemplateReplaceList( $input, $args, $parser, $frame ) {
	global $wgTemplateReplaceList;
	preg_match_all("/\{([^}]+)\}[ \\t\\n]*=>[ \\t\\n]*\{([^}]*)\}/", $input, $result);
	for($i = 0; $i < count($result[0]); ++$i){
		$wgTemplateReplaceList[$result[1][$i]] = $result[2][$i];
	}
	$parser->setHook( 'math', 'specialMathEnvironment' );
	return '';
}

function specialMathEnvironment( $input, $args, $parser, $frame ) {
	return '<div class="math">'.trim($input).'</div>';
}

function doTemplateReplace( $parser, $title, $skip, $id ) {
	global $wgTemplateReplaceList;
	if(array_key_exists($title->mPrefixedText, $wgTemplateReplaceList)){
		$title = Title::newFromText($wgTemplateReplaceList[$title->mPrefixedText]);
	}
	return true;
}
  • Datei "MediaWikiRoot/extensions/TemplateReplace/TemplateReplace.i18n.php" erzeugen
<?php

/* Internationalisation file for Charinsert extension
*/

$messages = array();

$messages['en'] = array(
	'templatereplace-desc' => 'Allows definition of a set of templates there should be replaced by others.',
);

/** German (Deutsch)
 * @author Prog (Benjamin Buch)
 */
$messages['de'] = array(
	'templatereplace-desc' => 'Erlaubt die Definition einer Liste von Seiteneinbindungen die durch andere ersetzt werden sollen.',
);
  • Exportieren des C++-Buches aus Wikibooks:
  • Import des C++-Buches im localen Wiki:
    • Melden Sie sich als Admin an
    • Gehen Sie auf die Seite "Spezial:Importieren" und laden Sie die XML-Datei hoch (kann lange dauern, mehrere Minuten)
      • Eventuell müssen Sie den PHP-Parameter max_execution_time in der php.ini ändern (Voreinstellung 30 Sekunden), damit der Webserver das Script nicht abschießt, weil es zu lange läuft, sollte es länger als 5 minuten brauchen, müssen wahrscheinlich auch die Timeout-Einstellungen des Webservers selbst hochgesetzt werden (bei Apache2 und IIS ist die Voreinstellung 300 Sekunden, wie die Parameter jeweils heißen weiß ich nicht)
      • Alternativ können Sie das Buch auch in mehreren Stücken hochladen
    • Manuelles Hochladen der Grafiken, unter den gleichen Namen wie bei Wikibooks (hab bisher noch keine bessere Möglichkeit gefunden...)
  • Erstellen der folgenden Seiten im lokalen Wiki:
  • C++-Programmierung/ Vorlage:Code/Simpel
<div class="{{#if:{{{valid|}}}|validcode|{{#if:{{{error|}}}|errorcode|code}}}}">{{#if: {{{kopf|}}} | <div class="head">
{{{kopf}}}
</div>}}<div class="cpp">{{#tag:nowiki|{{{code}}}}}</div>{{#if: {{{output|}}} | <div class="output">{{#tag:nowiki|{{{output}}}}}</div>}}{{#if: {{{fuss|}}} | <div class="foot">
{{{fuss}}}
</div>}}</div>
  • C++-Programmierung/ Vorlage:Syntax/Simpel
<div class="syntax">{{#tag:nowiki|{{{code}}}}}</div>
  • C++-Programmierung/ Vorlage:Hinweis/Simpel
<div class="advice">
{{{1}}}
</div>
  • C++-Programmierung/ Vorlage:Tipp/Simpel
<div class="hint">
{{{1}}}
</div>
  • C++-Programmierung/ Vorlage:Später im Buch/Simpel
<div class="later">
{{{1}}}
</div>
  • C++-Programmierung/ Vorlage:Nicht näher beschrieben/Simpel
<div class="notspecified">
{{{1}}}
</div>
  • C++-Programmierung/ Vorlage:Anderes Buch/Simpel
<div class="recommendation">
{{{1}}}
</div>
  • C++-Programmierung/ Vorlage:Kapitelanhang/Simpel
{{#if: {{{Zusammenfassung|}}}{{{Fragen|}}}{{{Aufgaben|}}}|<div class="addendum">{{#if: {{{Zusammenfassung|}}}|<div class="briefing">
{{{Zusammenfassung}}}
</div>}}{{#if: {{{Fragen|}}}|<div class="questions">
{{{Fragen}}}
</div>}}{{#if: {{{Aufgaben|}}}|<div class="exercises">
{{{Aufgaben}}}
</div>}}</div>}}
  • C++-Programmierung/ Vorlage:Frage/Simpel
<div class="questioncontainer"><div class="questionnumber">
{{{Nummer}}}
</div><div class="question">
{{{Frage}}}
</div><div class="answer">
{{{Antwort}}}
</div></div>
  • C++-Programmierung/ Vorlage:Aufgabe/Simpel
<div class="exercisecontainer"><div class="exercisenumber">
{{{Nummer}}}
</div><div class="exercise">
{{{Aufgabe}}}
</div><div class="primesolution">
{{{Lösung}}}
</div></div>
  • Vorlage:Cpp/Simpel
<span class="cpp">{{#tag:nowiki|{{{1}}}}}</span>
  • Vorlage:Null
<noinclude>Erfüllt den Zweck von /dev/null</noinclude>
  • Erstellen der eigentlichen Ausgabeseite (beliebiger Name) mit dem Inhalt:
<replace>
{C++-Programmierung/ Vorlage:Code} => {C++-Programmierung/ Vorlage:Code/Simpel}
{C++-Programmierung/ Vorlage:Syntax} => {C++-Programmierung/ Vorlage:Syntax/Simpel}
{C++-Programmierung/ Vorlage:Hinweis} => {C++-Programmierung/ Vorlage:Hinweis/Simpel}
{C++-Programmierung/ Vorlage:Tipp} => {C++-Programmierung/ Vorlage:Tipp/Simpel}
{C++-Programmierung/ Vorlage:Später im Buch} => {C++-Programmierung/ Vorlage:Später im Buch/Simpel}
{C++-Programmierung/ Vorlage:Nicht näher beschrieben} => {C++-Programmierung/ Vorlage:Nicht näher beschrieben/Simpel}
{C++-Programmierung/ Vorlage:Anderes Buch} => {C++-Programmierung/ Vorlage:Anderes Buch/Simpel}
{C++-Programmierung/ Vorlage:Kapitelanhang} => {C++-Programmierung/ Vorlage:Kapitelanhang/Simpel}
{C++-Programmierung/ Vorlage:Frage} => {C++-Programmierung/ Vorlage:Frage/Simpel}
{C++-Programmierung/ Vorlage:Aufgabe} => {C++-Programmierung/ Vorlage:Aufgabe/Simpel}
{C++-Programmierung/ Vorlage:Gesamter Abschnitt} => {C++-Programmierung/ Vorlage:Gesamter Abschnitt/Simpel}
{C++-Programmierung/ Vorlage:Kapitel noch nicht vorhanden} => {Vorlage:Null}
{C++-Programmierung/ Vorlage:Zusammenfassung noch nicht vorhanden} => {Vorlage:Null}
{Vorlage:Cpp} => {Vorlage:Cpp/Simpel}
</replace> __NOTOC__
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Abschnitte|1}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|1}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|1}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Abschnitte|2}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|2}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|2}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Abschnitte|3}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|3}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|3}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Abschnitte|4}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|4}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|4}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Abschnitte|5}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|5}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|5}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Abschnitte|6}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|6}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|6}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Abschnitte|7}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|7}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|7}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Abschnitte|8}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|8}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|8}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Abschnitte|9}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|9}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|9}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Abschnitte|10}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|10}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|10}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Abschnitte|11}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|11}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|11}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Abschnitte|12}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|12}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|12}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Abschnitte|13}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|13}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|13}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Abschnitte|14}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|14}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|14}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Abschnitte|15}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|15}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|15}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Abschnitte|16}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|16}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|16}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Abschnitte|17}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|17}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|17}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Abschnitte|18}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|18}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|18}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Abschnitte|19}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|19}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|19}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Abschnitte|20}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|20}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Abschnitte|20}}}}
}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}

{{ #if: {{:C++-Programmierung/ Vorlage:Alle Anhänge|1}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Anhänge|1}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Anhänge|1}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Anhänge|2}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Anhänge|2}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Anhänge|2}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Anhänge|3}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Anhänge|3}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Anhänge|3}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Anhänge|4}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Anhänge|4}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Anhänge|4}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Anhänge|5}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Anhänge|5}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Anhänge|5}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Anhänge|6}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Anhänge|6}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Anhänge|6}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Anhänge|7}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Anhänge|7}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Anhänge|7}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Anhänge|8}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Anhänge|8}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Anhänge|8}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Anhänge|9}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Anhänge|9}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Anhänge|9}}}}
{{ #if: {{:C++-Programmierung/ Vorlage:Alle Anhänge|10}} |
{{ #ifexist: C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Anhänge|10}} |
{{:C++-Programmierung/ Vorlage:Gesamter Abschnitt|C++-Programmierung/ {{:C++-Programmierung/ Vorlage:Alle Anhänge|10}}}}
}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}

Für die weitere Verarbeitung muss erst mein Tool fertiggestellt werden, wer Lust und Spaß am basteln hat, kann ja schon mal versuchen, die bisherigen Schritte nachzuvollziehen. ;) Viel Spaß --Prog 17:36, 3. Dez. 2010 (CET)

Die Überarbeitung der oben veröffentlichten MediaWiki-Erweiterung kann gerne direkt auf dieser Seite vorgenommen werden, insbesondere was Formulierungs-, Grammatik- und Rechtschreibfehler angeht. --Prog 17:36, 3. Dez. 2010 (CET)