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 = '