diff --git a/README.md b/README.md
index 788aae1..0575a3f 100644
--- a/README.md
+++ b/README.md
@@ -1,11 +1,11 @@
# Extension YesWiki publication
-> Extension [YesWiki] qui génère des publications au format PDF à partir d'une sélection de [fiches Bazar][Bazar] et/ou de [pages de contenu][yeswiki-page].
+> Une extension [YesWiki] pour créer des documents imprimables (format PDF) à partir d'une sélection de [fiches Bazar][Bazar] et/ou de [pages de contenu][yeswiki-page].
La mise en page est effectuée par [Paged.js](https://www.pagedjs.org/)
([documentation](https://www.pagedjs.org/documentation/)), et la capture PDF par un [navigateur dit "headless"][headless-browser] (par défaut [chromium](#pré-requis)).
-Les publications générées sont de type [ebook](#pour-générer-des-ebooks-téléchargeables) ou [newsletter](#pour-générer-des-newsletters).
+Les publications générées sont de type [livres/livrets](#pour-générer-des-livrets-téléchargeables), [fanzines](#pour-générer-des-livrets-téléchargeables) ou [newsletter](#pour-générer-des-newsletters).
@@ -33,12 +33,23 @@ Les publications générées sont de type [ebook](#pour-générer-des-ebooks-té
Une page "publication", avec actions de téléchargement et prévisualisation (auteur·ices et admin) |
Bouton d'export à ajouter (action {{bazar2publication}} ) |
+
+
+
+ |
+
+ |
+
+
+ Exemple de pliage de fanzine |
+ |
+
## Pré-requis technique
Avoir installé [Chromium](https://www.chromium.org/Home) **sur
-le serveur** et connaitre le chemin d'accès vers l'exécutable.
+le serveur**. Éventuellement, connaître le chemin d'accès vers l'exécutable s'il est différent de `/usr/bin/chromium`.
Pour installer Chrome sous Ubuntu/Debian :
@@ -59,11 +70,11 @@ L'action `{{publicationgenerator}}` prend en charge les étapes 1, 2 et 3.
Le handler `/pdf` prend en charge l'étape 4.
-### Pour générer des ebooks téléchargeables
+### Pour générer des livrets téléchargeables
Utiliser l'action `{{publicationgenerator}}`. Aucun paramètre n'est obligatoire.
-Chaque ebook généré sera enregistré sous la forme d'une page sur le wiki. Le nom de cette page sera constitué de la valeur du paramètre `pagenameprefix` suivie du titre de l'ebook.
+Chaque publication est générée sous forme d'une page wiki. Le nom de cette page sera constitué de la valeur du paramètre `pagenameprefix` suivie du titre de l'ebook (par défaut `Ebook`).
On pourra utilement consulter la section [Action `{{publicationgenerator}}`](#action-publicationgenerator) ci-après.
@@ -89,6 +100,18 @@ Chaque newsletter générée sera enregistrée sous la forme d'une fiche bazar d
On pourra utilement consulter la section [Action `{{publicationgenerator}}`](#action-publicationgenerator) ci-après.
+### Surcharger les styles d'impression par défaut
+
+Des styles d'impression par défaut sont ajoutés pour vous donner le moins de travail possible lors de la création d'une publication.
+Il y a plusieurs mécanismes pour **personnaliser vos styles d'impression** en créant des feuilles de styles (fichiers `.css`) :
+
+| Répertoire | Noms possibles | À quoi ça s'applique ?
+| --- | --- | ---
+| `custom/tools/publication/*.css` | Peu importe | Toute publication, peu importe le thème
+| `custom/tools/publication/print-layouts/*.css` | `fanzine.css`, `book.css` | Seulement les fanzines, ou les livres/livrets, peu importe le thème
+| `themes/NOM_DU_THEME/tools/publication/*.css` | Peu importe | Toute publication, pour un thème donné
+| `themes/NOM_DU_THEME/tools/publication/print-layouts/*.css` | `fanzine.css`, `book.css` | Seulement les fanzines, ou les livres/livrets, pour un thème donné
+
## Actions YesWiki
L'extension publication ajoute deux actions à votre wiki.
diff --git a/actions/publicationgenerator.php b/actions/publicationgenerator.php
index 1c8c953..f55680b 100644
--- a/actions/publicationgenerator.php
+++ b/actions/publicationgenerator.php
@@ -13,24 +13,24 @@
*/
use YesWiki\Bazar\Service\EntryManager;
+use YesWiki\Publication\Service\Publication;
if (!defined("WIKINI_VERSION")) {
die("accès direct interdit");
}
$entryManager = $this->services->get(EntryManager::class);
+$publicationService = $this->services->get(Publication::class);
include_once 'tools/tags/libs/tags.functions.php';
-$this->addCssFile('tools/publication/presentation/styles/publication.css');
-
// Format of the output. Either you want to generate an ebook or a newsletter
// Default value is ebook
$name = _t('PUBLICATION_EBOOK');
$outputFormat = $this->getParameter('outputformat', 'Ebook');
$messages = [];
-if ($outputFormat === 'newsletter') {
+if (strcasecmp($outputFormat, 'newsletter') === 0) {
$formId = $this->getParameter('formid'); // Bazar form used to store the newsletter
if (empty($formId)) {
exit(_t('PUBLICATION_MISSING_NEWSLETTER_FORM'));
@@ -65,18 +65,15 @@
// include default pages in page listing ?
$addInstalledPages = $this->getParameter('addinstalledpage');
-// default publication cover
-$default = [];
-$default['coverimage'] = $this->getParameter('coverimage');
-
-// default publication title
-$default['title'] = $this->getParameter('title');
-
-// default publication description
-$default['desc'] = $this->getParameter('desc');
-
-// default publication author
-$default['author'] = $this->getParameter('author');
+// defaults from the action
+$defaults = [
+ "publication-cover-image" => $this->getParameter('coverimage'),
+ "publication" => [
+ "title" => $this->getParameter('title'),
+ "description" => $this->getParameter('desc'),
+ "authors" => $this->getParameter('author') ?: $this->getParameter('authors'),
+ ]
+];
// default added pages that can be used to separate content
$chapterCoverPages = $this->getParameter('chapterpages');
@@ -92,9 +89,6 @@
$chapterCoverPages = $a;
}
-// app display template
-$template = $this->getParameter('template', 'exportpages_table');
-
// titles for groups
$titles = $this->getParameter('titles');
if (!empty($titles)) {
@@ -206,16 +200,22 @@
// Handling of data submitted by the form
// Page creation
-if (isset($_POST["page"])) {
- do { // use of a do-while loop in order to allow for breaks (in case of errors)
+
+if (isset($_POST) && count($_POST)) {
+ do { // use of a do-while loop in order to allow for breaks (in case of errors)
if (!isset($_POST['antispam']) || $_POST['antispam'] != 1) {
// There may be a spamming problem
- $output = '' . _t('PUBLICATION_SPAM_RISK') . '
' . "\n";
+ array_push($messages, array('danger', _t('PUBLICATION_SPAM_RISK')));
+ break; // Stops the current do-while loop
+ }
+ if (!isset($_POST["page"]) || count($_POST["page"]) === 0) {
+ // There is no page selected
+ array_push($messages, array('danger', _t('PUBLICATION_NO_PAGE_FOUND')));
break; // Stops the current do-while loop
}
- if (!isset($_POST["publication-title"]) || $_POST["publication-title"] == '') {
+ if (!isset($_POST["publication"]["title"]) || trim($_POST["publication"]["title"]) === '') {
// There is no publication-title
- $output = '' . _t('PUBLICATION_NO_TITLE_FOUND') . '
' . "\n";
+ array_push($messages, array('danger', _t('PUBLICATION_NO_TITLE_FOUND')));
break; // Stops the current do-while loop
}
@@ -231,7 +231,7 @@
if (isset($ebookPageName) && !empty($ebookPageName)) {
$pageName = $ebookPageName;
} else {
- $pageName = generatePageName($ebookPageNamePrefix . ' ' . $_POST["publication-title"]);
+ $pageName = generatePageName($ebookPageNamePrefix . ' ' . $_POST["publication"]["title"]);
}
@@ -248,10 +248,8 @@
// $page can be 'SomeTag' or 'SomeTag?parameter=value'
// the query string is used to parametrize book creation
else {
- list($page, $qs) = explode('?', $page);
- parse_str($qs, $qs);
-
- $output .= '{{include page="' . $page . '" class="'. trim(implode(' ', [$qs['type'], $qs['class']])) .'"}}' . "\n";
+ $includeCode = $publicationService->getIncludeActionFromPageTag($page);
+ $output .= $includeCode;
}
}
@@ -267,11 +265,11 @@
$output = $this->Format('""' . _t('PUBLICATION_EBOOK_PAGE_CREATION_FAILED') . '.""' . "\n" . '{{button class="btn-primary" link="' . $this->GetPageTag() . '" text="' . _t('PUBLICATION_GOTO_EBOOK_CREATION_PAGE') . ' ' . $this->GetPageTag() . '"}}""
""' . "\n");
}
} while (false); // end of ebook specific loop
- } elseif (strcasecmp($outputFormat, 'newsletter') == 0) { // We want to produce a newsletter
+ } elseif (strcasecmp($outputFormat, 'newsletter') === 0) { // We want to produce a newsletter
$fiche['id_typeannonce'] = $formId;
- $fiche['bf_titre'] = $_POST["publication-title"];
- $fiche['bf_description'] = $_POST["publication-description"];
- $fiche['bf_author'] = $_POST["publication-author"];
+ $fiche['bf_titre'] = implode(' ', [$outputFormat, $_POST["publication"]["title"]]);
+ $fiche['bf_description'] = $_POST["publication"]["description"];
+ $fiche['bf_author'] = $_POST["publication"]["authors"];
$fiche['bf_content'] = '';
// Generate the content of the page body
@@ -285,77 +283,76 @@
// we assume it is a page tag otherwise
// maybe we should also explicitly check it is a valid page tag instead?
else {
- $fiche['bf_content'] .= $this->Format('{{include page="' . $page . '" class=""}}' . "\n");
+ $includeCode = $publicationService->getIncludeActionFromPageTag($page);
+ $fiche['bf_content'] .= $this->Format($includeCode);
}
}
- $acceptedTags = '