diff --git a/ArticleImageDataHandler.inc.php b/ArticleImageDataHandler.inc.php index fb868fd83599c63692ba99cc7edda89683b8ed22..15c35854d9ffbd626033db42578b59f1c4ef2f0c 100644 --- a/ArticleImageDataHandler.inc.php +++ b/ArticleImageDataHandler.inc.php @@ -1,52 +1,29 @@ fs = ImageUtils::buildFileSystem($this); - } /** * Image from zip archive galley file * @param array $args - * @param APP\core\Request $request + * @param Request $request * @return mixed */ - public function zimage(array $args, APP\core\Request $request) + public function zimage(array $args, Request $request) { - - $galleyId = (int)$args[1]; + $galleyId = $args[1]; $imgName = $args[2]; - $galley = NULL; - foreach ($this->publication->getData('galleys') as $g) { - if($galleyId == $g->getId()){ - $galley = $g; - } - } - if($galley != NULL){ - $file = $galley->getFile(); - $filename = Services::get('file') - ->formatFilename($file->getData('path'), $file->getLocalizedData('path')); - $pathInfo = pathinfo($filename); - $imagePath = $pathInfo['dirname'] . DIRECTORY_SEPARATOR . $pathInfo['filename'] . DIRECTORY_SEPARATOR . $imgName; - ImageUtils::downloadImage($this->fs, $imagePath, $imgName); - } - return NULL; - + $galley = Services::get('galley')->get($galleyId); + $file = $galley->getFile(); + $filename = Services::get('file') + ->formatFilename($file->getData('path'), $file->getLocalizedData('path')); + $pathInfo = pathinfo($filename); + $imagePath = $pathInfo['dirname'] . DIRECTORY_SEPARATOR . $pathInfo['filename'] . DIRECTORY_SEPARATOR . $imgName; + return Services::get('file')->download($imagePath, $imgName); } diff --git a/BookImageDataHandler.inc.php b/BookImageDataHandler.inc.php index b1256aa4dc94807d0fcba38767553c32fee2b61f..a5b91c924d7c6aba25bf1e09ee8cef3530cb2e49 100644 --- a/BookImageDataHandler.inc.php +++ b/BookImageDataHandler.inc.php @@ -1,25 +1,47 @@ fs = ImageUtils::buildFileSystem($this); - } +// /** +// * @param array $args +// * @param Request $request +// * @return mixed +// */ +// public function image(array $args, Request $request) +// { +// $fileId = $args[1]; +// $submission = $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION); +// import('lib.pkp.classes.submission.SubmissionFile'); +// $dependentFilesIterator = Services::get('submissionFile')->getMany([ +// 'assocTypes' => [ASSOC_TYPE_SUBMISSION_FILE], +// 'submissionIds' => [$submission->getId()], +// 'fileStages' => [SUBMISSION_FILE_DEPENDENT], +// 'includeDependentFiles' => true, +// ]); +// +// $submissionFile = null; +// foreach ($dependentFilesIterator as $dependentFile) { +// if ($fileId == $dependentFile->getData('fileId')) { +// $submissionFile = $dependentFile; +// break; +// } +// } +// +// // Download file if exists +// if (!Services::get('file')->fs->has($submissionFile->getData('path'))) { +// $request->getDispatcher()->handle404(); +// } +// +// $filename = Services::get('file') +// ->formatFilename($submissionFile->getData('path'), $submissionFile->getLocalizedData('name')); +// +// return Services::get('file')->download($submissionFile->getData('path'), $filename); +// } /** * Image from zip archive submission file @@ -27,18 +49,16 @@ class BookImageDataHandler extends CatalogBookHandler * @param Request $request * @return mixed */ - public function zimage(array $args, APP\core\Request $request) + public function zimage(array $args, Request $request) { $pubId= $args[1]; $imgName = $args[2]; - $submission = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_SUBMISSION); + $submission = $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION); - - $pubFormatFiles = Repo::submissionFile() - ->getCollector() - ->filterBySubmissionIds([$submission->getId()]) - ->filterByAssoc(Application::ASSOC_TYPE_PUBLICATION_FORMAT) - ->getMany(); + $pubFormatFiles = Services::get('submissionFile')->getMany([ + 'submissionIds' => [$submission->getId()], + 'assocTypes' => [ASSOC_TYPE_PUBLICATION_FORMAT], + ]); $publicationFile = NULL; foreach ($pubFormatFiles as $file){ @@ -46,10 +66,13 @@ class BookImageDataHandler extends CatalogBookHandler $publicationFile = $file; } } - +// $filename = Services::get('file') +// ->formatFilename($publicationFile->getData('path'), $publicationFile->getLocalizedData('path')); +// var_dump($filename); $pathInfo = pathinfo($publicationFile->getData('path')); $imagePath = $pathInfo['dirname'] . DIRECTORY_SEPARATOR . $pathInfo['filename'] . DIRECTORY_SEPARATOR . $imgName; - ImageUtils::downloadImage($this->fs, $imagePath, $imgName); + return Services::get('file')->download($imagePath, $imgName); + } diff --git a/README-fr.md b/README-fr.md index 43318ab8ee5920fbd0508d6c4d85d94bb076e5ef..54d065adbd7b312505dc1306c9fe6096656daf0e 100644 --- a/README-fr.md +++ b/README-fr.md @@ -18,11 +18,13 @@ Plugin OJS/OMP de chargement de flux XML développé dans le cadre du projet [FN **Licence** : CeCILL-B (voir [licence](LICENCE)). -**Exemple** : https://puc-editorial.unicaen.fr/ojs-3.4/index.php/Caen/article/view/2/14 +**Exemple** : + +- OJS 3.3 : https://puc-editorial.unicaen.fr/ojs-3.3/index.php/Caen/article/view/21/50 +- OMP 3.3 : https://puc-editorial.unicaen.fr/omp-3.3/index.php/acp/catalog/view/9/26/158 -**Ce plugin est en cours de développement, son usage n'est pas destiné à être utilisé en production.** @@ -71,8 +73,8 @@ Deux transformations sont fournies dans le plugin : Plugin testé sur les versions suivantes : -- OJS 3.4 (3.4.0-4) -- OMP 3.4 (3.4.0-4) +- OJS 3.3 (3.3.0-16) +- OMP 3.3 (3.3.0-16)) @@ -81,6 +83,10 @@ Plugin testé sur les versions suivantes : - Template de page : `HTMLGalleyView.tpl` ([lien](https://git.unicaen.fr/fnso/fairest/xml2html-pkp-plugin/-/blob/master/templates/HTMLGalleyView.tpl?ref_type=heads)) - Javascript : `resources/javascript/xml_2html.js` ([lien](https://git.unicaen.fr/fnso/fairest/xml2html-pkp-plugin/-/blob/master/resources/javascript/xml_2_html.js?ref_type=heads)) - CSS : `resources/styles/xml_2html.css` ([lien](https://git.unicaen.fr/fnso/fairest/xml2html-pkp-plugin/-/blob/master/resources/styles/xml_2_html.css?ref_type=heads)) +- XSL : + - `xsl/tei/03-tei2html.xsl`, feuille de transformation XSL qui surcharge `xsl/tei/03-tei2html_core.xsl` + - ou via l'ajout d'une ou de plusieurs XSLTs `N-.xsl` (où *N* > 3 et ** est le nom de la feuille de transformation choisi par l'utilisateur) + diff --git a/README.md b/README.md index f9f6f255bf5521fe4684c4c419b1aea7e050b549..b965ec635cd9ff4af3c596ede04c59878e7dea68 100644 --- a/README.md +++ b/README.md @@ -22,9 +22,6 @@ Plugin OJS and OMP for XML loading and conversion to HTML, developed as part of -**This plugin is currently under development and is not intended for production use.** - - ## Installation @@ -70,8 +67,8 @@ Two conversions are embedded in the plugin: Plugin tested on : -- OJS 3.4 (3.4.0-4) -- OMP 3.4 (3.4.0-4) +- OJS 3.3 (3.3.0-21) +- OMP 3.3 (3.3.0-21) diff --git a/XML2HTMLPlugin.php b/XML2HTMLPlugin.php index 5478fec8837c33a78b82ca8ce18f0d1ca3be9ab7..7e649299a91a8c116be4291f0d09dc5bb5a06e0d 100644 --- a/XML2HTMLPlugin.php +++ b/XML2HTMLPlugin.php @@ -1,4 +1,5 @@ getRequest()->getContext(); + $landingEnabled = false; + if ($context) { + $landingEnabled = $this->getSetting($context->getId(), 'landingpage'); + } if ($success && $this->getEnabled()) { - HookRegistry::register('ArticleHandler::view::galley', array($this, 'articleHandler')); + HookRegistry::register('ArticleHandler::view::galley', [$this, 'articleHandler']); + + if ($landingEnabled) { + HookRegistry::register('ArticleHandler::view', [$this, 'landingPageHandler']); + } + //HookRegistry::register('ArticleHandler::download', array($this, 'articleDownloadCallback'), HOOK_SEQUENCE_LATE); - HookRegistry::register('LoadHandler', array($this, 'loadImageHandler')); - HookRegistry::register('CatalogBookHandler::view', array($this, 'catalogHandler')); + HookRegistry::register('LoadHandler', [$this, 'loadImageHandler']); + HookRegistry::register('CatalogBookHandler::view', [$this, 'catalogHandler']); } @@ -36,28 +46,96 @@ class XML2HTMLPlugin extends GenericPlugin */ public function articleHandler($hookName, $params): bool { - $galley =& $params[2]; - $submission = &$params[3]; - //handle only on zip galleys - supposed to be an xml archive (source + images) - $zipMode = $galley && $galley->getFileType() === 'application/zip'; - if ($zipMode) { - $this->archiveView($galley->getFile()->getData('path'), $submission->getId(), $galley->getId(), 'article'); + $galley = & $params[2]; + $submission = & $params[3]; + + if (!$galley || $galley->getFileType() !== 'application/zip') { + return false; + } + + $request = Application::get()->getRequest(); + $isAjax = (bool) $request->getUserVar('galley_ajax'); + + // Génère ou récupère le HTML transformé + $html = $this->archiveView( + $galley->getFile()->getData('path'), + $submission->getId(), + $galley->getId(), + 'article' + ); + + if ($isAjax) { + header('Content-Type: text/html; charset=utf-8'); + echo $html; return true; - } else return false; + } + + $templateMgr = TemplateManager::getManager($request); + $context = $request->getContext(); + + $dcMetas = XML2HTMLPlugin::transformMetas( + XML2HTMLPlugin::getHTMLPathFromZipPath($galley->getFile()->getData('path')), + $this->getSetting($context->getId(), 'format') ?: 'JATS' + ); + + $templateMgr->assign('assetsPath', $this->getPluginAssetsPath($request)); + $templateMgr->assign('dcMetas', $dcMetas); + $templateMgr->assign('text', $html); + $templateMgr->assign('metadataSource', $this->getSetting($context->getId(), 'metadataSource')); + $templateMgr->assign('cssLandingPageUrl', $this->getCssFileUrl($request, 'cssLandingPageFile')); + $templateMgr->assign('cssSideViewUrl', $this->getCssFileUrl($request, 'cssSideViewFile')); + + $templateMgr->display($this->getTemplateResource('HTMLGalleyView.tpl')); + + return true; + } + + + + public function landingPageHandler($hookName, $params): bool + { + $request = & $params[0]; + $submission = & $params[2]; + + try { + $galleys = $submission->getGalleys(); + + foreach ($galleys as $galley) { + if ($galley->getFileType() === 'application/zip') { + $file = $galley->getFile(); + if ($file) { + $this->landingPageView( + $file->getData('path'), + $submission->getId(), + $galley->getId(), + 'article' + ); + return true; + } + } + } + + return false; + + } catch (\Exception $e) { + error_log('XML2HTMLPlugin error: ' . $e->getMessage()); + return false; + } } public function catalogHandler($hookName, $params): bool { $submission = &$params[1]; - $galley =& $params[2]; - $submissionFile =& $params[3]; - $zipMode = $submissionFile->getData('mimetype') === "application/zip"; + $galley = & $params[2]; + $submissionFile = & $params[3]; + $zipMode = $submissionFile->getData('mimetype') === 'application/zip'; if ($zipMode) { $this->archiveView($submissionFile->getData('path'), $submission->getId(), $galley->getId(), 'catalog'); return true; - } else + } else { return false; + } } @@ -77,29 +155,80 @@ class XML2HTMLPlugin extends GenericPlugin 'format' ); - if ($format == NULL || $format == '') - $format = 'JATS';//default value is JATS + if ($format == null || $format == '') { + $format = 'JATS'; + }//default value is JATS + + $xmlFilePath = XML2HTMLPlugin::unzipXMLArchive($filePath); + $html = $this->resolveZipImagePaths( + XML2HTMLPlugin::transform($xmlFilePath, $format), + $submissionId, + $galleyId, + $xmlFilePath, + $this->getRequest(), + $op + ); + + //metas transfo + $dcMetas = XML2HTMLPlugin::transformMetas($xmlFilePath, $format); + + //store render result + $templateMgr = TemplateManager::getManager($this->getRequest()); + $templateMgr->assign('assetsPath', $this->getPluginAssetsPath($this->getRequest())); + $templateMgr->assign('dcMetas', $dcMetas); + $templateMgr->assign('text', $html); + $templateMgr->assign('cssLandingPageUrl', $this->getCssFileUrl($this->getRequest(), 'cssLandingPageFile')); + $templateMgr->assign('cssSideViewUrl', $this->getCssFileUrl($this->getRequest(), 'cssSideViewFile')); + $html = $templateMgr->display($this->getTemplateResource('HTMLGalleyView.tpl')); + file_put_contents($htmlFile, $html, LOCK_EX); + } + return $html; + + } + + private function landingPageView(string $filePath, int $submissionId, int $galleyId, string $op) + { + $htmlFile = XML2HTMLPlugin::getHTMLPathFromZipPath($filePath); + $html = file_get_contents($htmlFile); + + $context = Application::get() + ->getRequest() + ->getContext(); + + if (!$html) { + $format = $this->getSetting($context->getId(), 'format'); + + if ($format == null || $format == '') { + $format = 'JATS'; + }//default value is JATS $xmlFilePath = XML2HTMLPlugin::unzipXMLArchive($filePath); $html = $this->resolveZipImagePaths( XML2HTMLPlugin::transform($xmlFilePath, $format), $submissionId, $galleyId, - $xmlFilePath, $this->getRequest(), - $op); + $xmlFilePath, + $this->getRequest(), + $op + ); //store transfo result file_put_contents($htmlFile, $html, LOCK_EX); } + $templateMgr = TemplateManager::getManager($this->getRequest()); $templateMgr->assign('assetsPath', $this->getPluginAssetsPath($this->getRequest())); $templateMgr->assign('text', $html); - $templateMgr->display($this->getTemplateResource('HTMLGalleyView.tpl')); + $templateMgr->assign('metadataSource', $this->getSetting($context->getId(), 'metadataSource')); + $templateMgr->assign('cssLandingPageUrl', $this->getCssFileUrl($this->getRequest(), 'cssLandingPageFile')); + $templateMgr->assign('cssSideViewUrl', $this->getCssFileUrl($this->getRequest(), 'cssSideViewFile')); + $templateMgr->display($this->getTemplateResource('LandingPage.tpl')); + return false; } /** * get HTML file path from its zip one * exemple : a/b/c/1234.zip -> ojs/files/dir/a/b/c/1234/1234.html - * @param $zipPath + * * @return string */ private static function getHTMLPathFromZipPath($zipPath) @@ -137,26 +266,23 @@ class XML2HTMLPlugin extends GenericPlugin } /** - * @param $request - * @param $verb - * @return mixed */ public function getActions($request, $verb) { $router = $request->getRouter(); import('lib.pkp.classes.linkAction.request.AjaxModal'); return array_merge( - $this->getEnabled() ? array( + $this->getEnabled() ? [ new LinkAction( 'settings', new AjaxModal( - $router->url($request, null, null, 'manage', null, array('verb' => 'settings', 'plugin' => $this->getName(), 'category' => 'generic')), + $router->url($request, null, null, 'manage', null, ['verb' => 'settings', 'plugin' => $this->getName(), 'category' => 'generic']), $this->getDisplayName() ), __('manager.plugins.settings'), null ), - ) : array(), + ] : [], parent::getActions($request, $verb) ); } @@ -167,7 +293,8 @@ class XML2HTMLPlugin extends GenericPlugin * save the form when the user saves it. * * @param array $args - * @param Request $request + * @param PKPRequest $request + * * @return JSONMessage */ public function manage($args, $request) @@ -196,44 +323,112 @@ class XML2HTMLPlugin extends GenericPlugin } - function getPluginAssetsPath($request) + public function getPluginAssetsPath($request) { return $request->getBaseUrl() . '/' . $this->getPluginPath() . '/resources/'; } - static function transform( + /** + * Returns the public URL to an uploaded custom CSS file, or null if none is set. + * + * @param PKPRequest $request + * @param string $settingKey 'cssLandingPageFile' or 'cssSideViewFile' + */ + public function getCssFileUrl($request, string $settingKey): ?string + { + $context = $request->getContext(); + if (!$context) { + return null; + } + + $filename = $this->getSetting($context->getId(), $settingKey); + if (!$filename) { + return null; + } + + return $request->getBaseUrl() + . '/' . $this->getPluginPath() + . '/resources/custom/' . $filename; + } + + public static function transform( string $xmlFilePath, string $format - ) - { + ) { + + $xsltDir = dirname(__FILE__) + . DIRECTORY_SEPARATOR + . 'xsl' + . DIRECTORY_SEPARATOR + . strtolower($format) + . DIRECTORY_SEPARATOR; + + $result = null; + foreach (glob($xsltDir . '*.xsl') as $xsltPath) { + if (basename($xsltPath) == strtolower($format) . XML2HTMLPlugin::$META_XSL_SUFFIX) { + continue; + }//do not apply metas xsl + $xml = new DOMDocument(); + if ($result == null) { + // Load the XML source + $xml->load($xmlFilePath); + } else { + //Load previous xsl result + $xml->loadXML($result); + } + $xsl = new DOMDocument(); + $xsl->load($xsltPath, LIBXML_DTDATTR); - $xslFileName = strtolower($format) . '2html.xsl'; - ////// xslt transfo - $xsltPath = dirname(__FILE__) . DIRECTORY_SEPARATOR . $xslFileName; - // Load the XML source - $xml = new DOMDocument; - $xml->load($xmlFilePath); + // Configure the transformer + $proc = new XSLTProcessor(); + $proc->importStyleSheet($xsl); // attach the xsl rules - $xsl = new DOMDocument; - $xsl->load($xsltPath, LIBXML_DTDATTR); + //lang param + $locale = AppLocale::getLocale(); + $proc->setParameter('', 'lang', $locale); - // Configure the transformer - $proc = new XSLTProcessor; - $proc->importStyleSheet($xsl); // attach the xsl rules - $locale = Locale::getLocale(); - $proc->setParameter('', 'lang', $locale); - return $proc->transformToXML($xml); + try { + $result = $proc->transformToXML($xml); + } catch (Exception $e) { + $result = null; + var_dump($e); + } + + } + return $result; + + } + + public static function transformMetas( + string $xmlFilePath, + string $format + ) { + $xslt = dirname(__FILE__) + . DIRECTORY_SEPARATOR + . 'xsl' + . DIRECTORY_SEPARATOR + . strtolower($format) + . DIRECTORY_SEPARATOR + . strtolower($format) + . XML2HTMLPlugin::$META_XSL_SUFFIX; + $xml = new DOMDocument(); + $xml->load($xmlFilePath); + $xsl = new DOMDocument(); + $xsl->load($xslt, LIBXML_DTDATTR); + $proc = new XSLTProcessor(); + $proc->importStyleSheet($xsl); + return $proc->transformToXML($xml); } /** - * @param string $path - * @return string|void|null * @throws Exception + * + * @return string|void|null */ - static function unzipXMLArchive(string $path) + public static function unzipXMLArchive(string $path) { $fileManager = new FileManager(); $submissionFileExtension = $fileManager->parseFileExtension($path); @@ -241,7 +436,7 @@ class XML2HTMLPlugin extends GenericPlugin if ($submissionFileExtension == 'zip') { $fileMgr = new PrivateFileManager(); $filesDir = $fileMgr->getBasePath() . DIRECTORY_SEPARATOR; - $zip = new ZipArchive; + $zip = new ZipArchive(); $zipPath = $filesDir . $path; $zipPathParts = pathinfo($zipPath); if (file_exists($zipPathParts['dirname'] . DIRECTORY_SEPARATOR . $zipPathParts['filename'])) { @@ -251,7 +446,7 @@ class XML2HTMLPlugin extends GenericPlugin . DIRECTORY_SEPARATOR . $fileInfo['filename'] . '.xml'; } - if ($zip->open($zipPath) === TRUE) { + if ($zip->open($zipPath) === true) { $nbFiles = $zip->numFiles; if ($nbFiles > 0 && !str_ends_with($zip->getNameIndex(0), '/')) { $basePath = $zipPathParts['dirname'] . DIRECTORY_SEPARATOR . $zipPathParts['filename'] . '/'; @@ -269,10 +464,10 @@ class XML2HTMLPlugin extends GenericPlugin } } } else { - throw new \Exception("Bad zip Submission file."); + throw new \Exception('Bad zip Submission file.'); } } else { - return NULL; + return null; } } @@ -280,9 +475,10 @@ class XML2HTMLPlugin extends GenericPlugin /** * @param $hookName string * @param $args array + * * @brief Handle associated files of the full-text, only images are supported */ - function loadImageHandler($hookName, array $args) + public function loadImageHandler($hookName, array $args) { $page = $args[0]; $op = $args[1]; @@ -290,21 +486,21 @@ class XML2HTMLPlugin extends GenericPlugin if ($page == 'article' && (/*$op == 'image' || */ $op == 'zimage')) { define('HANDLER_CLASS', 'ArticleImageDataHandler'); import('plugins.generic.xml2html.ArticleImageDataHandler'); - } else if (($page == 'catalog') && (/*$op == 'image' || */ $op == 'zimage')) { + } elseif (($page == 'catalog') && (/*$op == 'image' || */ $op == 'zimage')) { define('HANDLER_CLASS', 'BookImageDataHandler'); import('plugins.generic.xml2html.BookImageDataHandler'); } } - static function resolveZipImagePaths( + public static function resolveZipImagePaths( string $htmlString, int $submissionId, int $galleyId, string $xmlFilePath, - APP\core\Request $request, - string $op = 'article') - { + PKPRequest $request, + string $op = 'article' + ) { $pathInfo = pathinfo($xmlFilePath); $extractedZipPath = $pathInfo['dirname']; $files = scandir($extractedZipPath); @@ -312,22 +508,24 @@ class XML2HTMLPlugin extends GenericPlugin foreach ($files as $file) { $info = pathinfo($file); - if ($info["extension"] == 'jpg' || $info["extension"] == 'png') { + if ($info['extension'] == 'jpg' || $info['extension'] == 'png') { $request = $request; $filePath = $request->url( - null, $op, + null, + $op, 'zimage', - array( + [ $submissionId, $galleyId, $file - ) + ] ); $pattern = preg_quote(rawurlencode($file)); $htmlString = preg_replace( '/([Ss][Rr][Cc]|[Hh][Rr][Ee][Ff]|[Dd][Aa][Tt][Aa])\s*=\s*"([^"]*' . $pattern . ')"/', '\1="' . $filePath . '"', - $htmlString); + $htmlString + ); } } @@ -335,4 +533,3 @@ class XML2HTMLPlugin extends GenericPlugin } } - diff --git a/XML2HTMLSettingsForm.inc.php b/XML2HTMLSettingsForm.inc.php index c0168afee7572cb32abe8b97b52dcd6d566acff5..d4709dff9ec2e5522f4ad021741e8e9483d312da 100644 --- a/XML2HTMLSettingsForm.inc.php +++ b/XML2HTMLSettingsForm.inc.php @@ -1,99 +1,92 @@ _contextId = $contextId;*/ + public function __construct(XML2HTMLPlugin $plugin) + { $this->plugin = $plugin; - parent::__construct($plugin->getTemplateResource('settingsForm.tpl')); $this->addCheck(new FormValidatorPost($this)); $this->addCheck(new FormValidatorCSRF($this)); } - - /** - * Load settings already saved in the database - * - * Settings are stored by context, so that each journal, press, - * or preprint server can have different settings. - */ public function initData() { - $context = Application::get() - ->getRequest() - ->getContext(); - - $this->setData( - 'format', - $this->plugin->getSetting( - $context->getId(), - 'format' - ) - ); + $context = Application::get()->getRequest()->getContext(); + $contextId = $context->getId(); + + $this->setData('format', $this->plugin->getSetting($contextId, 'format')); + $this->setData('metadataSource', $this->plugin->getSetting($contextId, 'metadataSource')); + $this->setData('landingpage', $this->plugin->getSetting($contextId, 'landingpage')); + $this->setData('cssLandingPageFile', $this->plugin->getSetting($contextId, 'cssLandingPageFile')); + $this->setData('cssSideViewFile', $this->plugin->getSetting($contextId, 'cssSideViewFile')); parent::initData(); } - - /** - * Load data that was submitted with the form - */ public function readInputData() { - $this->readUserVars(['format']); - + $this->readUserVars(['format','metadataSource', 'landingpage', 'deleteCssLandingPage', 'deleteCssSideView']); parent::readInputData(); } - - /** - * Fetch any additional data needed for your form. - * - * Data assigned to the form using $this->setData() during the - * initData() or readInputData() methods will be passed to the - * template. - * - * In the example below, the plugin name is passed to the - * template so that it can be used in the URL that the form is - * submitted to. - */ public function fetch($request, $template = null, $display = false) { $templateMgr = TemplateManager::getManager($request); $templateMgr->assign('pluginName', $this->plugin->getName()); + $context = Application::get()->getRequest()->getContext(); + $contextId = $context->getId(); + + $templateMgr->assign('landingpage', $this->plugin->getSetting($contextId, 'landingpage')); + + // URL CSS Landing Page + $landingFile = $this->plugin->getSetting($contextId, 'cssLandingPageFile'); + $templateMgr->assign( + 'cssLandingPageUrl', + $landingFile + ? $request->getBaseUrl() . '/' . $this->plugin->getPluginPath() . '/resources/custom/' . $landingFile + : null + ); + + // URL CSS Side View + $sideViewFile = $this->plugin->getSetting($contextId, 'cssSideViewFile'); + $templateMgr->assign( + 'cssSideViewUrl', + $sideViewFile + ? $request->getBaseUrl() . '/' . $this->plugin->getPluginPath() . '/resources/custom/' . $sideViewFile + : null + ); + return parent::fetch($request, $template, $display); } - /** - * Save the plugin settings and notify the user - * that the save was successful - */ public function execute(...$functionArgs) { - $context = Application::get() - ->getRequest() - ->getContext(); - - $this->plugin->updateSetting( - $context->getId(), - 'format', - $this->getData('format') - ); + $context = Application::get()->getRequest()->getContext(); + $contextId = $context->getId(); + + $this->plugin->updateSetting($contextId, 'format', $this->getData('format')); + $this->plugin->updateSetting($contextId, 'landingpage', $this->getData('landingpage')); + $this->plugin->updateSetting($contextId, 'metadataSource', $this->getData('metadataSource')); + + // --- CSS Landing Page --- + if ($this->getData('deleteCssLandingPage')) { + $this->_deleteCssFile($contextId, 'cssLandingPageFile'); + } + $this->_handleUpload($contextId, 'cssLandingPageFile', 'custom-landing-page.css'); + + // --- CSS Side View --- + if ($this->getData('deleteCssSideView')) { + $this->_deleteCssFile($contextId, 'cssSideViewFile'); + } + $this->_handleUpload($contextId, 'cssSideViewFile', 'custom-sideview.css'); $notificationMgr = new NotificationManager(); $notificationMgr->createTrivialNotification( @@ -104,4 +97,77 @@ class XML2HTMLSettingsForm extends Form { return parent::execute(); } + + /** + * Handles upload for a given file input and setting key. + * + * @param int $contextId Journal context ID + * @param string $settingKey Plugin setting key to store the filename + * @param string $destName Target filename on disk (e.g. 'custom-landing-page.css') + */ + private function _handleUpload(int $contextId, string $settingKey, string $destName): void + { + $inputName = $settingKey; // the matches the setting key + + if (!isset($_FILES[$inputName]) || $_FILES[$inputName]['error'] !== UPLOAD_ERR_OK) { + return; + } + + $tmpPath = $_FILES[$inputName]['tmp_name']; + $origName = $_FILES[$inputName]['name']; + + if (strtolower(pathinfo($origName, PATHINFO_EXTENSION)) !== 'css') { + return; + } + + $destDir = dirname(__FILE__) + . DIRECTORY_SEPARATOR . 'resources' + . DIRECTORY_SEPARATOR . 'custom'; + + if (!is_dir($destDir)) { + mkdir($destDir, 0755, true); + } + + // Remove old file before replacing + $this->_deleteCssFile($contextId, $settingKey); + + // Suffix the filename with the journal path (slug) + // e.g. "custom-landing-page.css" → "custom-landing-page-my_journal.css" + $context = Application::get()->getRequest()->getContext(); + $journalSlug = preg_replace('/[^a-z0-9_-]/i', '_', $context->getPath()); + $baseName = pathinfo($destName, PATHINFO_FILENAME); // "custom-landing-page" + $ext = pathinfo($destName, PATHINFO_EXTENSION); // "css" + $finalName = $baseName . '-' . $journalSlug . '.' . $ext; + + $destPath = $destDir . DIRECTORY_SEPARATOR . $finalName; + + if (move_uploaded_file($tmpPath, $destPath)) { + $this->plugin->updateSetting($contextId, $settingKey, $finalName, 'string'); + } + } + + /** + * Deletes the CSS file from disk and clears the setting. + * + * @param int $contextId Journal context ID + * @param string $settingKey Plugin setting key holding the filename + */ + private function _deleteCssFile(int $contextId, string $settingKey): void + { + $existing = $this->plugin->getSetting($contextId, $settingKey); + if (!$existing) { + return; + } + + $path = dirname(__FILE__) + . DIRECTORY_SEPARATOR . 'resources' + . DIRECTORY_SEPARATOR . 'custom' + . DIRECTORY_SEPARATOR . $existing; + + if (file_exists($path)) { + unlink($path); + } + + $this->plugin->updateSetting($contextId, $settingKey, null, 'string'); + } } diff --git a/index.php b/index.php index 6ae863f764369029ade5ca08e447ac1af6320048..1073b74b003ec10e78b57a181f5171cebfbc8afb 100644 --- a/index.php +++ b/index.php @@ -5,6 +5,6 @@ * Date: 04/10/22 * Time: 17:38 */ -require_once('ImageUtils.php'); + require_once('XML2HTMLPlugin.php'); return new XML2HTMLPlugin(); diff --git a/jats2html.xsl b/jats2html.xsl deleted file mode 100644 index 93bb1d47568e1e60476b00b4cad955ba881586ed..0000000000000000000000000000000000000000 --- a/jats2html.xsl +++ /dev/null @@ -1,459 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- FR | EN -
- - -
- - -
-
- - -
-
-
-

- -

- -
-
-
- -
- -
- - - -
- - - - -
-
- - -
-
- - - - -
- -
-
- -
    - - - - - -
- -
-
- - - - - - - - -
-
- - - - - - - - - - - - - -
  • - - - - -
  • -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - -
    -
    - - -
    - -
    -
    - - - - - -
  • - - - - - - -
      - - - - - -
    -
    -
    -
  • - -
    - - - -
    - - - - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - -
    -
    - - -
    - -
    - - - - - - - - - - - - - - - -
    -
    -
    -
    - - - -
    - -
    -
    - - -

    - -

    -
    - - -
    - -
    -
    - - -
    - - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    -
    - - - - - - - - - - - - -
    - - - -
    -
    - - - -
    -
    - - - - -
      - -
    -
    - - -
      - -
    -
    - - -
  • -
    - - - - - - - - - - - - -
    - -
    -
    - - - - - - - - -
    diff --git a/locale/en_US/locale.po b/locale/en_US/locale.po index 1b6a2aa7508777c526f1c7417e4600fbdf9d6b6a..13c583ea902f1823a340ba1dbf0c4e472f8b511c 100644 --- a/locale/en_US/locale.po +++ b/locale/en_US/locale.po @@ -13,3 +13,27 @@ msgstr "" msgid "plugins.generic.xml2html.format" msgstr "Format / XML Vocabulary" + +msgid "plugins.generic.xml2html.landingpage" +msgstr "Display HTML on landing page" + +msgid "plugins.generic.xml2html.cssLandingPage" +msgstr "Landing Page CSS" + +msgid "plugins.generic.xml2html.cssSideView" +msgstr "Side View CSS" + +msgid "plugins.generic.xml2html.customCss.current" +msgstr "Current file:" + +msgid "plugins.generic.xml2html.customCss.view" +msgstr "View" + +msgid "plugins.generic.xml2html.customCss.delete" +msgstr "Delete this file" + +msgid "plugins.generic.xml2html.settingsFor" +msgstr "Settings for" + +msgid "plugins.generic.xml2html.metadata" +msgstr "Metadata's source" \ No newline at end of file diff --git a/locale/fr_FR/locale.po b/locale/fr_FR/locale.po index 22e106b6587557fdefe212ad3c7eac881ef9d865..4efbfaeee00defb8593c463162e3ba8bc45a4551 100644 --- a/locale/fr_FR/locale.po +++ b/locale/fr_FR/locale.po @@ -13,3 +13,27 @@ msgstr "" msgid "plugins.generic.xml2html.format" msgstr "Format / Vocabulaire XML" + +msgid "plugins.generic.xml2html.landingpage" +msgstr "Affichage du texte sur la page d'accueil" + +msgid "plugins.generic.xml2html.cssLandingPage" +msgstr "CSS de la page d'accueil" + +msgid "plugins.generic.xml2html.cssSideView" +msgstr "CSS de la vue de lecture" + +msgid "plugins.generic.xml2html.customCss.current" +msgstr "Fichier actuel :" + +msgid "plugins.generic.xml2html.customCss.view" +msgstr "Voir" + +msgid "plugins.generic.xml2html.customCss.delete" +msgstr "Supprimer ce fichier" + +msgid "plugins.generic.xml2html.settingsFor" +msgstr "Paramétrage de la revue" + +msgid "plugins.generic.xml2html.metadata" +msgstr "Source des métadonnées" \ No newline at end of file diff --git a/resources/javascript/xml_2_html.js b/resources/javascript/xml_2_html.js index 8e8b4ec282ec094b00540fdb6fcb85da376d8143..15c05520ab0af032dccf152fb3bd2d2390ac608d 100644 --- a/resources/javascript/xml_2_html.js +++ b/resources/javascript/xml_2_html.js @@ -2,10 +2,227 @@ const dict = { fr : { 'toc' : 'Table des matières', 'refs': 'Références', + 'figures': 'Figures', + 'notes': 'Notes', + 'index': "Index", + 'pagination': 'Pagination : ', + 'date-received': 'Date de réception', + 'date-accepted': 'Date d’acceptation', + 'date-publication-electronic': "Date de publication numérique", + 'date-publication-print': "Date de publication papier", + 'date-publication-early': "Date de publication anticipée", + 'colon': ' : ', + 'abstract': 'Résumé', + 'abstractTrl': 'Résumé ', + 'keywords': 'Mots-clés', + 'keywordsTrl': 'Mots-clés ', + 'author': 'Auteur', + 'authors': 'Auteurs', + 'editor': 'Contributeur', + 'editors': 'Contributeurs', + 'editorial-manager':'Responsable d’édition', + 'editorial-managers':'Responsables d’édition', + 'title': 'Titre', + 'titleTrl': 'Titre ', + 'supertitle': 'Surtitre', + 'subtitle': 'Sous-titre', + 'short-title': 'Titre court', + 'subject': 'Sujet', + 'publisher': 'Éditeur', + 'funder': 'Financeur', + 'funders': 'Financeurs', + 'sponsor': 'Partenariat financier', + 'sponsors': 'Partenariats financiers', + 'chronology': '(chronologie)', + 'geography': '(géographie)', + 'subject-kwd': '(thèmes)', + 'work': '(œuvres citées)', + 'propernoun': '(noms propres)', + 'personcited': '(personnes citées)', + 'article-meta': 'Article', + 'issue-meta': 'Numéro', + 'journal-meta': 'Revue', + 'pagination': 'Pagination', + 'copyright': 'Droits', + 'license': 'Licence', + 'isbn-print': 'ISBN (imprimé)', + 'isbn-electronic': 'ISBN (numérique)', + 'isbn-pdf': 'ISBN (PDF)', + 'isbn-epub': 'ISBN (ePub)', + 'issn-print': 'ISSN (imprimé)', + 'issn-electronic': 'ISSN (numérique)', + 'DOI': 'DOI', + 'volume': 'Volume', + 'issue': 'Fascicule', + 'cite-issue': 'Citer ce numéro', + 'cite-article': 'Citer cet article', + 'long-desc' : 'Description longue', + 'ai-policy': 'Usage par les IA', + 'ai-policy-in': 'Autorisé', + 'ai-policy-out': 'Interdit', + 'pbd': ' (directeur de la publication)', + 'aut rcp': ' (auteur correspondant)', + 'edt': ' (éditeur scientifique)', + 'trl': ' (traducteur)', + 'pht': ' (photographe)', + 'ill': ' (illustrateur)', + 'drm': ' (dessinateur)', + 'fld': ' (directeur d’opération)', + 'ctb': ' (contributeur)', + 'ann': ' (annotateur)', + 'com': ' (compilateur)', + 'ctg': ' (cartographe)', + }, en: { 'toc' : 'Table of contents', 'refs': 'References', + 'figures': 'Figures', + 'notes': 'Notes', + 'index': "Index", + 'pagination': 'Pagination: ', + 'date-received': 'Reception date', + 'date-accepted': 'Acceptation date', + 'date-publication-electronic': "Electronic publication date", + 'date-publication-print': "Print publication date", + 'date-publication-early': "Early access date", + 'colon': ': ', + 'abstract': 'Abstract', + 'abstractTrl': 'Abstract ', + 'keywords': 'Keywords', + 'keywordsTrl': 'Keywords ', + 'author': 'Author', + 'authors': 'Authors', + 'editor': 'Contributor', + 'editors': 'Contributors', + 'editorial-manager':'Editorial manager', + 'editorial-managers':'Editorial managers', + 'title': 'Title', + 'titleTrl': 'Title ', + 'subtitle': 'Subtitle', + 'supertitle': 'Supertitle', + 'short-title': 'Short title', + 'subject': 'Subject', + 'publisher': 'Editor', + 'funder': 'Funder', + 'funders': 'Funders', + 'sponsor': 'Sponsor', + 'sponsors': 'Sponsors', + 'chronology': '(chronology)', + 'geography': '(geography)', + 'subject-kwd': '(subjects)', + 'work': '(works cited)', + 'propernoun': '(proper nouns)', + 'personcited': '(people cited)', + 'article-meta': 'Article', + 'issue-meta': 'Issue', + 'journal-meta': 'Journal', + 'pagination': 'Pagination', + 'copyright': 'Copyright', + 'license': 'License', + 'isbn-print': 'ISBN (print)', + 'isbn-electronic': 'ISBN (electronic)', + 'isbn-pdf': 'ISBN (PDF)', + 'isbn-epub': 'ISBN (ePub)', + 'issn-print': 'ISSN (print)', + 'issn-electronic': 'ISSN (electronic)', + 'DOI': 'DOI', + 'volume': 'Volume', + 'issue': 'Issue', + 'cite-issue': 'Cite this issue', + 'cite-article': 'Cite this article', + 'long-desc' : 'Long description', + 'ai-policy': 'AI Policy', + 'ai-policy-in': 'Use by AI permitted', + 'ai-policy-out': 'Use by AI prohibited', + 'pbd': ' (publishing director)', + 'aut rcp': ' (corresponding author)', + 'edt': ' (editor)', + 'trl': ' (translator)', + 'pht': ' (photographer)', + 'ill': ' (illustrator)', + 'drm': ' (draftsman)', + 'fld': ' (field director)', + 'ctb': ' (contributor)', + 'ann': ' (annotateur)', + 'com': ' (compiler)', + 'ctg': ' (cartographer)', + + }, + es: { + 'toc' : 'Índice', + 'refs': 'Referencias', + 'figures': 'Figuras', + 'notes': 'Notas', + 'index': "Índice", + 'pagination': 'Paginación: ', + 'date-received': 'Fecha de recepción', + 'date-accepted': 'Fecha de aceptación', + 'date-publication-electronic': "Fecha de publicacíon electrónica", + 'date-publication-print': "Fecha de publicacíon impresa", + 'date-publication-early': "Fecha de publicación anticipada", + 'colon': ': ', + 'abstract': 'Resumen', + 'abstractTrl': 'Resumen ', + 'keywords': 'Palabras clave', + 'keywordsTrl': 'Palabras clave ', + 'author': 'Autor', + 'authors': 'Autores', + 'editor': 'Colaborador', + 'editors': 'Colaboradores', + 'editorial-manager':'Responsable editorial', + 'editorial-managers':'Responsables editoriales', + 'title': 'Título', + 'titleTrl': 'Título ', + 'subtitle': 'Subtítulo', + 'supertitle': 'Sobretítulo', + 'short-title': 'Título abreviado', + 'subject': 'Tema', + 'publisher': 'Editor', + 'funder': 'Financiador', + 'funders': 'Financiadores', + 'sponsor': 'Financiación', + 'sponsors': 'Financiaciones', + 'chronology': '(cronología)', + 'geography': '(geografía)', + 'subject-kwd': '(temas)', + 'work': '(obras citadas)', + 'propernoun': '(nombres propios)', + 'personcited': '(personas citadas)', + 'article-meta': 'Artículo', + 'issue-meta': 'Número', + 'journal-meta': 'Revista', + 'pagination': 'Paginación', + 'copyright': 'Derechos', + 'license': 'Licencia', + 'isbn-print': 'ISBN (impreso)', + 'isbn-electronic': 'ISBN (electrónico)', + 'isbn-pdf': 'ISBN (PDF)', + 'isbn-epub': 'ISBN (ePub)', + 'issn-print': 'ISSN (impreso)', + 'issn-electronic': 'ISSN (electrónico)', + 'DOI': 'DOI', + 'volume': 'Volumen', + 'issue': 'Fascículo', + 'cite-issue': 'Citar este número', + 'cite-article': 'Citar este artículo', + 'long-desc' : 'Descripción larga', + 'ai-policy': 'Política de IA', + 'ai-policy-in': 'Uso autorizado por parte de la IA', + 'ai-policy-out': 'Uso prohibido por parte de la IA', + 'pbd': ' (director de publicación)', + 'aut rcp': ' (autor para la correspondencia)', + 'edt': ' (editor científico)', + 'trl': ' (traductor)', + 'pht': ' (fotógrafo)', + 'ill': ' (illustrador)', + 'drm': ' (dibujante)', + 'fld': ' (director de excavación)', + 'ctb': ' (contribuidor)', + 'ann': ' (autor de anotación)', + 'com': ' (compilador)', + 'ctg': ' (cartógrafo)', + } } @@ -32,12 +249,7 @@ window.addEventListener('DOMContentLoaded', (event) => { // Appel fonction pour tableaux déroulants initialiseTableaux(); - // index collapsible - initializeCollapsibleLists(); - - // open new windows - openFigureWindow(elementId); - + initCitationCopy(); //toc hightlighing on scroll document.querySelector('.left-contents').addEventListener("scroll", () => { let scrollTop = document.querySelector('.left-contents').scrollTop; @@ -74,6 +286,22 @@ function openTab(tabName) { document.getElementById('tabtn-' + tabName).classList.add('focus-tab'); } +function openMetaTab(tabName) { + let i; + let metaTabs = document.querySelectorAll(".meta-content-tab"); + for (i = 0; i < metaTabs.length; i++) { + metaTabs[i].style.display = "none"; + } + document.getElementById(tabName).style.display = "block"; + + //button focus + document.querySelectorAll(".meta-tab-btn").forEach((btn) => { + btn.classList.remove('focus-meta-tab'); + }); + document.getElementById('tabtn-' + tabName).classList.add('focus-meta-tab'); + +} + function darkMode(bool) { if (bool) { @@ -93,31 +321,35 @@ function darkMode(bool) { function bindFootnotesAndImages() { let figAppels = document.getElementsByClassName('fig-call'); let notesAppels = document.getElementsByClassName('xref-call'); - // fusionne les deux tableaux ('arrays') dans un 3e : - let tousLesAppels = [...figAppels, ...notesAppels]; + let bibAppels = document.getElementsByClassName('bib-ref-call'); // ← AJOUT + + let tousLesAppels = [...figAppels, ...notesAppels, ...bibAppels]; // ← AJOUT + + for (let i = 0; i < tousLesAppels.length; i++) { + let target = tousLesAppels[i].dataset.target; + // Retirer le # pour getElementById + let targetId = target ? target.replace('#', '') : null; + let focusTarget = targetId ? document.getElementById(targetId) : null; + if (!focusTarget) continue; - for (let i=0 ; i < tousLesAppels.length ; i++) { - let focusTarget = document.getElementById(tousLesAppels[i].dataset.target); tousLesAppels[i].addEventListener('click', () => { - if(tousLesAppels[i].classList.contains('fn-call')) { + if (tousLesAppels[i].classList.contains('fn-call')) { openTab('footnotes'); - } else if (tousLesAppels[i].classList.contains('fig-call')){ - let cible = tousLesAppels[i].getAttribute('data-target'); + } else if (tousLesAppels[i].classList.contains('fig-call')) { openTab('figures'); - scrollToElementById(cible); + scrollToElementById(targetId); + } else if (tousLesAppels[i].classList.contains('bib-ref-call')) { + openTab('refs'); // ← ouvre l'onglet références } else { openTab('refs'); } - document.getElementById(tousLesAppels[i].dataset.target).scrollIntoView({ - block: 'center', - behavior: "smooth" - }); - document.querySelectorAll('.footnote, .ref').forEach( + focusTarget.scrollIntoView({ block: 'center', behavior: 'smooth' }); + + document.querySelectorAll('.footnote, .ref, .bibl').forEach( (fn) => fn.classList.remove('focus') ); focusTarget.classList.add('focus'); - }); if(tousLesAppels[i].classList.contains('fn-call')) { @@ -153,54 +385,35 @@ function scrollToElementById(elementId) { let figTables; - function initialiseTableaux() { - - figTables = document.getElementsByClassName("fig-table"); - - for (let i = 0; i element - var indexLevel2Elements = parentLi.querySelectorAll('.index-level2'); // Get descendant elements with class .index-level2 - indexLevel2Elements.forEach(function (element) { - element.style.display = (element.style.display === 'none' || element.style.display === '') ? 'block' : 'none'; // Toggle display - }); - - // Toggle button text on the clicked toggle button - this.textContent = (indexLevel2Elements[0].style.display === 'none') ? '[+]' : '[-]'; // Use the first element's display property +function toggleIndexItem(li) { + const subLists = li.querySelectorAll(':scope > .index-level2'); + if (!subLists.length) return; + + const isCollapsed = li.classList.contains('collapsed'); + li.classList.toggle('collapsed', !isCollapsed); + li.classList.toggle('expanded', isCollapsed); + subLists.forEach(ul => { + ul.style.display = isCollapsed ? 'block' : 'none'; }); - }); + + // Empêcher la propagation si on clique sur un lien enfant + event.stopPropagation(); } @@ -233,22 +446,29 @@ function openFigureWindow(elementId) { color: #999; margin: 25px 0px; } - label {background-color: #454545;width:90%;} - span.expand {display:none;} - table, img { - max-width:90% - } - td,th { - border-bottom:1px solid #ccc; - font-size:1rem; - } - .fig-table label { + label { + width:90%; padding: 10px; margin: 0; cursor: pointer; } + span.expand {display:none;} + table, img { + max-width:90% + } + + table { + width: 100%; + border-collapse: collapse + } + + td,th { + font-size:1rem; + padding-left: 2px; + } + .credits { margin: 0 5 5 20px; font-size:smaller; @@ -288,38 +508,329 @@ function openFigureWindow(elementId) { // Drag div document.addEventListener('DOMContentLoaded', function() { const dragBar = document.getElementById('drag-bar'); - const leftPane = document.getElementById('left'); const rightPane = document.getElementById('right'); let isDragging = false; - let startX; - let initialWidthLeft; - let initialWidthRight; dragBar.addEventListener('mousedown', (e) => { isDragging = true; - startX = e.clientX; - initialWidthLeft = leftPane.offsetWidth; - initialWidthRight = rightPane.offsetWidth; - - document.addEventListener('mousemove', onMouseMove); - document.addEventListener('mouseup', onMouseUp); + e.preventDefault(); + document.body.style.cursor = 'col-resize'; + document.body.style.userSelect = 'none'; }); - function onMouseMove(e) { + document.addEventListener('mousemove', (e) => { if (!isDragging) return; - const newWidthLeft = initialWidthLeft + e.clientX - startX; - const newWidthRight = initialWidthRight - e.clientX + startX; + const container = document.querySelector('.article-and-metas'); + const containerRect = container.getBoundingClientRect(); + + // Calcul depuis le bord droit + const newWidth = containerRect.right - e.clientX; + + // Limites + const minWidth = 200; + const maxWidth = containerRect.width - 300; + + if (newWidth >= minWidth && newWidth <= maxWidth) { + rightPane.style.flex = `0 0 ${newWidth}px`; + } + }); - if (newWidthLeft > 100 && newWidthRight > 100) { - leftPane.style.width = `${newWidthLeft}px`; - rightPane.style.width = `${newWidthRight}px`; + document.addEventListener('mouseup', () => { + if (isDragging) { + isDragging = false; + document.body.style.cursor = ''; + document.body.style.userSelect = ''; } + }); +}); + +function deactivateAllFilters(exceptBtnId) { + const filters = [ + { btnId: 'btn-filter-figures', injectedId: null }, + { btnId: 'btn-filter-metadata', injectedId: 'injected-metadata' }, + { btnId: 'btn-filter-bibliometrics', injectedId: 'injected-bibliometrics' }, + ]; + + filters.forEach(({ btnId, injectedId }) => { + if (btnId === exceptBtnId) return; + const btn = document.getElementById(btnId); + if (btn) btn.classList.remove('active'); + if (injectedId) { + const injected = document.getElementById(injectedId); + if (injected) injected.remove(); } + }); - function onMouseUp() { - isDragging = false; - document.removeEventListener('mousemove', onMouseMove); - document.removeEventListener('mouseup', onMouseUp); + // Restaurer l'affichage de l'article (toujours, avant que la fonction + // appelante applique ses propres masquages) + document.querySelector('.article-wrap').querySelectorAll('*').forEach(el => { + el.style.removeProperty('display'); + }); +} + +// ------------------------------------------------------- +// Filtre Figures +// ------------------------------------------------------- +function toggleFiguresFilter() { + const articleWrap = document.querySelector('.article-wrap'); + const btn = document.getElementById('btn-filter-figures'); + + // Si déjà actif → simple désactivation + if (btn.classList.contains('active')) { + btn.classList.remove('active'); + articleWrap.querySelectorAll('*').forEach(el => el.style.removeProperty('display')); + return; + } + + // Désactiver les autres filtres puis activer celui-ci + deactivateAllFilters('btn-filter-figures'); + btn.classList.add('active'); + + articleWrap.querySelectorAll('p, table.linguistic, ul.index-unordered, h1, h2, h3').forEach(el => { + el.style.display = 'none'; + }); + articleWrap.querySelectorAll('section').forEach(el => { + el.style.display = 'block'; + }); + articleWrap.querySelectorAll('figure').forEach(el => { + el.style.display = 'block'; + let parent = el.parentElement; + while (parent && parent !== articleWrap) { + parent.style.display = 'block'; + parent = parent.parentElement; } -}); \ No newline at end of file + }); +} + +// ------------------------------------------------------- +// Filtre Métadonnées +// ------------------------------------------------------- +function toggleMetadataFilter() { + const articleWrap = document.querySelector('.article-wrap'); + const btn = document.getElementById('btn-filter-metadata'); + + // Si déjà actif → simple désactivation + if (btn.classList.contains('active')) { + btn.classList.remove('active'); + const injected = document.getElementById('injected-metadata'); + if (injected) injected.remove(); + articleWrap.querySelectorAll('*').forEach(el => el.style.removeProperty('display')); + return; + } + + // Désactiver les autres filtres puis activer celui-ci + deactivateAllFilters('btn-filter-metadata'); + btn.classList.add('active'); + + articleWrap.querySelectorAll('p, table.linguistic, ul.index-unordered, h1, h2, h3, figure, section').forEach(el => { + el.style.display = 'none'; + }); + + const metaContent = document.querySelector('#article-meta'); + if (metaContent && !document.getElementById('injected-metadata')) { + const metaClone = metaContent.cloneNode(true); + metaClone.id = 'injected-metadata'; + metaClone.style.cssText = 'display:block; padding: 1em; background: var(--bg, #fff);'; + articleWrap.appendChild(metaClone); + } else if (document.getElementById('injected-metadata')) { + document.getElementById('injected-metadata').style.display = 'block'; + } +} + +// ------------------------------------------------------- +// Filtre Bibliométrie +// ------------------------------------------------------- +async function toggleBibliometrics() { + const articleWrap = document.querySelector('.article-wrap'); + const btn = document.getElementById('btn-filter-bibliometrics'); + + // Si déjà actif → simple désactivation + if (btn.classList.contains('active')) { + btn.classList.remove('active'); + const injected = document.getElementById('injected-bibliometrics'); + if (injected) injected.remove(); + articleWrap.querySelectorAll('*').forEach(el => el.style.removeProperty('display')); + return; + } + + // Désactiver les autres filtres puis activer celui-ci + deactivateAllFilters('btn-filter-bibliometrics'); + btn.classList.add('active'); + + articleWrap.querySelectorAll('p, table.linguistic, ul.index-unordered, h1, h2, h3, figure, section').forEach(el => { + el.style.display = 'none'; + }); + + // Créer le bloc injecté (ou le ré-afficher si déjà créé) + let injected = document.getElementById('injected-bibliometrics'); + if (injected) { + injected.style.display = 'block'; + return; + } + + injected = document.createElement('div'); + injected.id = 'injected-bibliometrics'; + injected.style.cssText = 'display:block; padding: 1em;'; + injected.innerHTML = '

    Chargement…

    '; + articleWrap.appendChild(injected); + + const published = document.querySelector('.item.published .value')?.innerText.trim() ?? 'N/A'; + const section = document.querySelector('.item.issue .sub_item .value')?.innerText.trim() ?? 'N/A'; + const keywords = document.querySelector('.item.keywords .value')?.innerText.trim() ?? 'N/A'; + const galleys = [...document.querySelectorAll('.galleys_links a')].map(a => a.innerText.trim()).join(', ') || 'N/A'; + + const match = window.location.pathname.match(/article\/view\/(\d+)/); + const articleId = match ? match[1] : null; + + let statsHTML = '
  • Statistiques indisponibles.
  • '; + if (articleId) { + try { + const res = await fetch(`/index.php/mj/api/v1/stats/publications/${articleId}`); + const data = await res.json(); + statsHTML = ` +
  • Vues du résumé : ${data.abstractViews ?? 0}
  • +
  • Vues HTML : ${data.htmlViews ?? 0}
  • +
  • Vues PDF : ${data.pdfViews ?? 0}
  • +
  • Autres téléchargements : ${data.otherViews ?? 0}
  • +
  • Total galley : ${data.galleyViews ?? 0}
  • `; + } catch (e) {} + } + + injected.innerHTML = ` +

    Statistiques de consultation

    +
      ${statsHTML}
    +

    Informations de publication

    +
      +
    • Publié le : ${published}
    • +
    • Rubrique : ${section}
    • +
    • Mots-clés : ${keywords}
    • +
    • Formats disponibles : ${galleys}
    • +
    `; +} +function openGalleyIframe() { + // Récupère le lien galley présent dans la page + const galleyLink = document.querySelector('.galleys_links .obj_galley_link'); + if (!galleyLink) { + alert('Aucun lien galley trouvé dans la page.'); + return; + } + + const overlay = document.getElementById('galley-overlay'); + const iframe = document.getElementById('galley-iframe'); + const btn = document.getElementById('btn-galley'); + + iframe.src = galleyLink.href; + overlay.style.display = 'block'; + btn.classList.add('active'); + + // Fermer en cliquant sur le fond + overlay.addEventListener('click', function(e) { + if (e.target === overlay) closeGalleyIframe(); + }, { once: true }); +} + +function closeGalleyIframe() { + const overlay = document.getElementById('galley-overlay'); + const iframe = document.getElementById('galley-iframe'); + const btn = document.getElementById('btn-galley'); + + overlay.style.display = 'none'; + iframe.src = ''; // libère la ressource + btn.classList.remove('active'); +} + +document.querySelectorAll('.galleys_links li').forEach(li => { + if (li.textContent.trim() === 'HTML') { + li.style.display = 'none'; + } +}); + +function openModal(url) { + // Crée la modale si elle n'existe pas encore + if (!document.getElementById('iframeModal')) { + const modal = document.createElement('div'); + modal.id = 'iframeModal'; + modal.style.cssText = ` + position: fixed; top: 0; left: 0; + width: 100%; height: 100%; + background: rgba(0,0,0,0.7); + z-index: 9999; + display: flex; + justify-content: center; + align-items: center; + `; + modal.innerHTML = ` +
    + + +
    + `; + modal.addEventListener('click', function(e) { + if (e.target === this) closeModal(); + }); + document.body.appendChild(modal); + } + + document.getElementById('modalIframe').src = url; + document.getElementById('iframeModal').style.display = 'flex'; +} + +function closeModal() { + const modal = document.getElementById('iframeModal'); + if (modal) { + modal.style.display = 'none'; + document.getElementById('modalIframe').src = ''; + } +} + +function initCitationCopy() { + const els = document.querySelectorAll('.data-citation'); + console.log('[citationCopy] éléments trouvés :', els.length); + + els.forEach(function(el) { + el.addEventListener('click', function() { + const text = el.innerText.trim(); + console.log('[citationCopy] clic, texte :', text); + + function showFeedback() { + const original = el.innerText; + el.classList.add('copied'); + el.setAttribute('data-original', original); + el.innerText = '✓ Copié dans le presse-papier'; + setTimeout(function() { + el.innerText = el.getAttribute('data-original'); + el.classList.remove('copied'); + }, 2000); + } + + function fallbackCopy() { + const ta = document.createElement('textarea'); + ta.value = text; + ta.style.cssText = 'position:fixed;top:50%;left:50%;width:1px;height:1px;opacity:0;'; + document.body.appendChild(ta); + ta.focus(); + ta.select(); + try { + const ok = document.execCommand('copy'); + console.log('[citationCopy] execCommand résultat :', ok); + if (ok) showFeedback(); + } catch(e) { + console.error('[citationCopy] execCommand erreur :', e); + } + document.body.removeChild(ta); + } + + if (navigator.clipboard && window.isSecureContext) { + navigator.clipboard.writeText(text) + .then(showFeedback) + .catch(function(e) { + console.warn('[citationCopy] clipboard API échouée, fallback :', e); + fallbackCopy(); + }); + } else { + fallbackCopy(); + } + }); + }); +} \ No newline at end of file diff --git a/resources/styles/landingpage.css b/resources/styles/landingpage.css new file mode 100644 index 0000000000000000000000000000000000000000..87b5892609ed14f44e50e4ccb18a10395302b7b8 --- /dev/null +++ b/resources/styles/landingpage.css @@ -0,0 +1,1927 @@ +:root { + + --primary-color: #1a5490; + --primary-hover: #2f6fb3; + --accent-color: #0ea5e9; + --text-primary: #1e293b; + --text-secondary: #64748b; + --text-muted: #94a3b8; + + + --dark-bg-primary: #0f172a; + --dark-bg-secondary: #1e293b; + --dark-text-primary: #e2e8f0; + --dark-text-secondary: #cbd5e1; + --dark-border: #334155; + + + --dark-theme-bg: #22272e; + --dark-theme-txt: #adbac7; + --grey-color: #777; + --lighter-txt-light-theme: #545454; + --darker-txt-dark-theme: #97A4B0; + --third-color : #0a84ff; + --right-width: 35%; + --btn-tabs-height: 40px; + + + --max-content-width: 1250px; + --sidebar-width: 480px; + --nav-height: 64px; + --spacing-xs: 0.3rem; + --spacing-sm: 0.8rem; + --spacing-md: 1.2rem; + --spacing-lg: 2rem; + --spacing-xl: 3rem; + + + --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, + "Helvetica Neue", Arial, sans-serif; + --font-serif: "Georgia", "Times New Roman", Times, serif; + --font-mono: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, + monospace; + + + --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1); + --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1); + + + --transition-fast: 150ms ease; + --transition-base: 250ms ease; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html { + font-size: 16px; + scroll-behavior: smooth; +} + +body { + font-family: var(--font-serif); + color: var(--text-primary); + background-color: #ffffff; + line-height: 1.75; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +body.dark { + background-color: var(--dark-bg-primary); + color: var(--dark-text-primary); +} + +.cmp_breadcrumbs { + position: sticky; + top: 0; + left: 0; + right: 0; + height: var(--nav-height); + background-color: rgba(255, 255, 255, 0.95); + border-bottom: 1px solid #e2e8f0; + box-shadow: var(--shadow-sm); + z-index: 100; + display: flex; + align-items: center; + padding: 0 var(--spacing-md); + backdrop-filter: blur(8px); +} + +body.dark nav { + background-color: rgba(15, 23, 42, 0.95); + border-bottom-color: var(--dark-border); +} + +nav li { + display: inline-block; + padding: var(--spacing-xs) var(--spacing-sm); + font-family: var(--font-sans); + font-size: 0.9rem; + font-weight: 500; +} + +#mode-color-btns { + position: fixed; + top: 10px; + right: var(--spacing-sm); + z-index: 110; +} + +#sun, +#moon { + cursor: pointer; + width: 25px; + height: 25px; + border: none; + background-color: transparent; + border-radius: 8px; + transition: background-color var(--transition-fast); + display: flex; + align-items: center; + justify-content: center; +} + +#sun:hover, +#moon:hover { + background-color: rgba(0, 0, 0, 0.05); +} + +body.dark #sun:hover, +body.dark #moon:hover { + background-color: rgba(255, 255, 255, 0.1); +} + +.wrap { + padding-top: 42px; + min-height: 100vh; +} + +.LangMode { + +} + +.LangMode > a[role="button"] { + cursor: pointer; +} + +section.back { + display: none; +} + +.obj_article_details, +.landingPage{ + + margin: 0; + padding: 0; + box-sizing: border-box; + max-width: var(--max-content-width); + margin: 0 auto; +} + +.article-and-metas { + position: relative; + display: flex; + width: 100%; + align-items: flex-start; +} + +.left-contents { + flex: 1 1 auto; + display: flex; + justify-content: center; + min-width: 100px; + overflow-x: hidden; +} + +.article-wrap { + max-width: var(--max-content-width); + margin: 0 auto; +} + +.right-contents { + flex: 0 0 auto; + width: var(--sidebar-width); + max-width: 100%; + background-color: #fafaf9; + border-left: 1px solid #e7e5e4; + font-family: var(--font-sans); + box-sizing: border-box; + position: sticky; + top: 0; + height: 95vh; + overflow-y: auto; + overflow-x: hidden; + scrollbar-width: thin; + word-wrap: break-word; + overflow-wrap: break-word; + position: sticky; + top: 64; +} + +.article-wrap h1, +.title-sub{ + display: none; +} + +.right-contents * { + word-wrap: break-word; + box-sizing: border-box; +} + +.right-contents .front, +.right-contents .content-tab, +.right-contents .meta-content-tab { + width: 100%; + box-sizing: border-box; +} + +body.dark .right-contents { + background-color: var(--dark-bg-secondary); + border-left-color: var(--dark-border); +} + +.left-contents h1:not(div.boxed-text *) { + font-family: var(--font-serif); + font-size: 2.5rem; + font-weight: 700; + line-height: 1.2; + margin-bottom: var(--spacing-lg); + color: var(--text-primary); + letter-spacing: -0.02em; + padding-top: 25px; + padding-bottom: var(--spacing-lg); +} + +body.dark .left-contents h1:not(div.boxed-text *) { + color: var(--dark-text-primary); +} + +.article-wrap ul, .article-wrap ol { + margin-left: var(--spacing-lg); + margin-top: var(--spacing-md); + margin-bottom: var(--spacing-md); + line-height: 1.8; +} + +.article-wrap li { + margin-bottom: var(--spacing-xs); + padding-left: var(--spacing-xs); +} + +section.body, section.front { + padding-right: 15px; +} + +section.body { + padding-right: 50px; + line-height: normal; +} + +section.front ol, section.front ol { + padding-left: 25px; +} + +.front > .button-tabs { + position: sticky; + top: 0; + display: flex; + background-color: #fafaf9; + border-bottom: 1px solid #e7e5e4; + z-index: 10; + height: var(--btn-tabs-height); + margin-right: -15px; + width: calc(100% + 15px); + overflow-x: auto; + overflow-y: hidden; +} + +.dark .button-tabs { + background-color: var(--dark-bg-secondary); + border-bottom-color: var(--dark-border); +} + +.tab-btn { + flex: 1 0 auto; + padding: var(--spacing-sm); + font-family: var(--font-sans); + font-size: 0.875rem; + font-weight: 600; + background-color: transparent; + border: none; + border-right: 1px solid #e7e5e4; + color: var(--text-secondary); + cursor: pointer; + transition: all var(--transition-fast); + height: var(--btn-tabs-height); + min-width: fit-content; +} + +.tab-btn[data-key="toc"] { + flex: 1; + white-space: nowrap; +} + +body.dark .tab-btn { + color: var(--dark-text-secondary); + border-right-color: var(--dark-border); +} + +.tab-btn:hover { + background-color: rgba(0, 0, 0, 0.03); + color: var(--text-primary); +} + +body.dark .tab-btn:hover { + background-color: rgba(255, 255, 255, 0.05); + color: var(--dark-text-primary); +} + +.focus-meta-tab { + background-color: var(--primary-color); + color: white; +} + +.focus-meta-tab:hover { + background-color: var(--primary-hover); + color: white; +} + +.focus-tab { + background-color: var(--primary-color); + color: white; +} + +.focus-tab:hover { + background-color: var(--primary-hover); + color: white; +} + +.content-tab { + padding: var(--spacing-md); + font-size: 0.9375rem; +} + +.content-tab .button-tabs.meta-tabs { + margin-top: calc(var(--spacing-md) * -1); + margin-right: calc((var(--spacing-md) + 15px) * -1); + margin-left: calc(var(--spacing-md) * -1); + margin-bottom: var(--spacing-lg); + display: flex; + +} + +.content-tab .bibliography { + border: none; +} + +section.body p:not(div.boxed-text *, .caption, .credits, .stage, details *, .front-matter *) { + font-size: 1.0625rem; + line-height: 1.7; + margin-top: var(--spacing-md); + color: var(--text-primary); + text-align: justify; + hyphens: auto; + word-wrap: break-word; +} + +body.dark section.body p:not(div.boxed-text *, .caption, .credits, details *) { + color: var(--dark-text-primary); +} + +.title-sup, +.z39-98 { + display: inline-block; + margin-top: 10px; + font-size: 1.2rem; + background-color: var(--dark-theme-txt); + padding-right: 2rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + font-weight: 450; +} + +.title-sub { + font-family: var(--font-serif); + font-size: 1.875rem; + font-weight: 700; + margin-top: 10px; + margin-bottom: 10px; + color: var(--text-primary); + letter-spacing: -0.01em; +} + +section.body h2:not(div.boxed-text *) { + font-family: var(--font-serif); + font-size: 1.875rem; + font-weight: 700; + margin-top: var(--spacing-xl); + margin-bottom: var(--spacing-md); + color: var(--text-primary); + line-height: 1.3; + letter-spacing: -0.01em; +} + +section.body h3:not(div.boxed-text *) { + font-family: var(--font-serif); + font-size: 1.5rem; + font-weight: 600; + margin-top: var(--spacing-lg); + margin-bottom: var(--spacing-sm); + color: var(--text-primary); + line-height: 1.4; +} + +section.body h4:not(div.boxed-text *) { + font-family: var(--font-sans); + font-size: 1.25rem; + font-weight: 600; + margin-top: var(--spacing-md); + margin-bottom: var(--spacing-sm); + color: var(--text-secondary); +} + +section.body h5 { + font-family: var(--font-sans); + font-size: 1.125rem; + font-weight: 600; + margin-top: var(--spacing-md); + margin-bottom: var(--spacing-xs); + color: var(--text-secondary); +} + +section.body h6 { + font-family: var(--font-sans); + font-size: 1.125rem; + font-weight: 600; + margin-top: var(--spacing-md); + margin-bottom: var(--spacing-xs); + color: var(--text-secondary); +} + +section.body p.firstPara:not(div.boxed-text *, details *) { + margin-top: var(--spacing-xl); +} + +figure { + margin: var(--spacing-xl) 0; + padding: var(--spacing-md); + background-color: #f8fafc; + border-radius: 12px; + border: 1px solid #e2e8f0; + display: flex; + flex-direction: column; + min-height: 70px; +} + +body.dark figure { + background-color: var(--dark-bg-secondary); + border-color: var(--dark-border); +} + +figure.fig-formula { + color: inherit; + background: transparent; + margin: 0px 0px; + min-height: 50px; + padding-top: 5px; + padding-bottom: 5px; + border: none; +} + +.img { + height: 1.3em; + width: auto; + vertical-align: bottom; +} + +figure img { + width: 100%; + height: auto; + border-radius: 8px; + box-shadow: var(--shadow-md); + padding-bottom: 0px; + margin-bottom: 7px; +} + +figure .fig-call-window img, +figure .table-call-window img { + border-radius: 0px; + box-shadow: none; +} + +body.dark .caption { + color: var(--dark-text-secondary); +} + +.fig-call-window, +.fig-call-window a, +.fig-call-window a:visited, +.table-call-window, +.table-call-window a, +.table-call-window a:visited { + text-decoration: none; + align-self: flex-end; + margin-top: -13px; + margin-right: -6px; + margin-bottom: -15px; +} + +.bibl-cr + .bibl-cr { + margin-top: 15px; +} + +.bibl-cr { + margin-top: 25px; +} + +section.review { + position: relative; + padding-top: 50px; +} + +section.review:not(:first-child)::before { + content: ""; + position: absolute; + left: 0; + width: 100%; + height: 1px; + background-color: #454545; + top: 40px; +} + +div[id='figures'] figure { + border-top: none; + background-color: inherit; + border: none; + margin-top: -15px; + margin-bottom: var(--spacing-md); + padding-bottom: var(--spacing-md); + padding-right: var(--spacing-md); + padding-left: var(--spacing-md); + padding-top: var(--spacing-xl); +} + +div[id='figures'] figure + figure { + border-top: 4px solid #e2e8f0; + border-radius: 0px; + margin-top: var(--spacing-md); + margin-bottom: var(--spacing-md); + padding-bottom: var(--spacing-md); + padding-right: var(--spacing-md); + padding-left: var(--spacing-md); + padding-top: var(--spacing-xl); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + min-height: 70px; +} + +img { + width: 100%; + padding-bottom: 5px; +} + +.speaker { + font-weight: bold; +} + +.stage { + font-style: italic; + color: var(--lighter-txt-light-theme); + font-size: 1.0625rem; + line-height: 1.7; + margin-top: var(--spacing-md); + text-align: justify; + hyphens: auto; + word-wrap: break-word; +} + +.dark .stage { + font-style: italic; + color: var(--darker-txt-dark-theme); +} + +table caption { + font-style: italic; + margin-bottom: var(--spacing-sm); + color: var(--text-secondary); + font-size: 1.2rem; +} + +table { + width: 100%; + border-collapse: collapse; + display: table; + text-indent: initial; + line-height: normal; + font-weight: normal; + font-size: medium; + font-style: normal; + color: -internal-quirk-inherit; + text-align: start; + border-spacing: 2px; + white-space: normal; + font-variant: normal; + margin: 0 0; + margin-bottom: 7px; + font-family: var(--font-sans); + font-size: 0.9375rem; + background-color: white; +} + +table.linguistic { + display: table; + margin-top: 1em; + margin-bottom: 1em; +} + +table.lg { + display: table; + width: 100%; + margin-top: 1em; + margin-bottom: 1em; + border: none; +} + +td[class='num'] { + width: 40px; + border: none; + padding-left: none; +} + +td[class='l'] { + border: none; + padding-left: none; +} + +th, +td { + padding: var(--spacing-sm); + text-align: left; + border-bottom: 1px solid #e2e8f0; + font-size: 0.9rem; + padding-left: 2px; +} + +body.dark th, +body.dark td { + border-bottom-color: var(--dark-border); +} + +th { + font-weight: 600; + background-color: #f8fafc; + color: var(--text-primary); +} + +body.dark th { + background-color: var(--dark-bg-secondary); + color: var(--dark-text-primary); +} + +blockquote table.lg td, +blockquote table.lg th { + font-size: 1.1rem; + padding-left: 2px; +} + +table.lg td { + line-height: 120%; + font-size: 150%; +} + +.fig-table label, +.fig-ill label { + padding: 10px; + cursor: pointer; + margin-bottom: 5px; + line-height: 1.5; +} + +.expand { + color: var(--third-color); + text-decoration: none; + margin-right: 0.5em; + cursor: pointer; +} + +span[class='expand empty'] { + color: var(--third-color); + text-decoration: none; + margin-right: 0.5em; + cursor: pointer; +} + +figure .credits, +figure .caption { + margin-top: 8px; + margin-right: 5px; + margin-bottom: 5px; + margin-left: 8px; + align-self: flex-start; + line-height: 1.5; + color: var(--text-primary); + text-align: justify; + hyphens: auto; + word-wrap: break-word; +} + +label { + margin-bottom: 15px; +} + +.caption-right-panel, +.credits-right-panel { + text-align: left; + align-self: flex-start; + line-height: 1.4; + margin-top: 10px; + font-size: 0.85rem; +} + +.label-right-panel { + text-align: left; + align-self: flex-start; + line-height: 1.4; + font-weight: bold; + font-size: 0.85rem; +} + +.img-righ-panel { + margin-bottom: 5px; + margin-top: 5px; +} + +section.body { + counter-reset: section; +} + +section.body h2:not(div.boxed-text *) { + counter-reset: subsection; +} +section.body h3:not(div.boxed-text *) { + counter-reset: subsubsection; +} +section.body h4:not(div.boxed-text *) { + counter-reset: subsubsubsection; +} + +details.floating-note { + width: 100%; + margin-left: 9px; + margin-top: 12px; +} + +details.floating-note .body { + font-size: smaller; + line-height: 1.4em; +} + +details.floating-note .body ul, details.floating-note .body ol { + margin-left: var(--spacing-sm); + margin-top: var(--spacing-sm); + margin-bottom: var(--spacing-sm); + line-height: 1.4em; +} + +details.floating-note p.firstPara { + margin-top: 20px; +} +details.floating-note p { + margin-top: 6px; +} + +summary::marker { + color: var(--third-color); + content: "⇱  "; + font-size: 105%; +} + +.floating-note[open] summary::marker { + content: "⇲  "; +} + +summary span.idno { + color: var(--third-color); + font-family: var(--font-sans); + font-size: 95%; +} + +.appendix, .right-panel-appendix { + position: relative; +} + +section.appendix { + margin-top: 100px; +} + +section.body section.appendix > h1 { + margin-bottom: var(--spacing-xl); +} + +section.appendix::before { + content: ""; + position: absolute; + left: 0; + width: 100%; + height: 1px; + background-color: #454545; + top: -10px; +} + +.right-panel-appendix::before { + content: ""; + position: absolute; + left: 0; + width: 100%; + height: 1px; + background-color: #454545; + top: -2px; +} + +.auteur-annexe { + font-size: 85%; +} + +section.body frontinclusion h2.sous-titre-annexe { + margin-top: -10px; + font-size: 1.5rem; + line-height: 100%; + font-weight: normal; +} + +bodyInclusion p.firstPara:not(div.boxed-text *) { + margin-top: 50px; +} + +.right-contents #refs ul { + list-style: none; +} + +.right-contents #refs li { + margin-left: 1.5em; + margin-bottom: var(--spacing-md); + font-size: 0.9375rem; + line-height: 1.6; +} + +.right-contents #refs h3 { + font-size: 1.125rem; + font-weight: 600; + margin-top: var(--spacing-lg); + margin-bottom: var(--spacing-sm); + color: var(--text-primary); + padding-top: 10px; +} + +body.dark .right-contents #refs h3 { + color: var(--dark-text-primary); +} + +.right-contents #refs h4 { + margin-bottom: 10px; +} + +.review_bibliography p.bibl { + margin-left: 1.5em; + text-indent: -1.5em; + font-size: 90%; +} + +section.review p.bibl-cr { + margin-bottom: 50px; + margin-left: 30px; +} + +#toc { + font-size: 0.9375rem; +} + +#toc a { + color: var(--text-secondary); + text-decoration: none; + display: block; + padding: var(--spacing-xs) var(--spacing-sm); + border-radius: 6px; + transition: all var(--transition-fast); +} + +#toc a:hover { + color: var(--primary-color); + background-color: rgba(26, 84, 144, 0.08); +} + +body.dark #toc a { + color: var(--dark-text-secondary); +} + +body.dark #toc a:hover { + color: var(--accent-color); + background-color: rgba(14, 165, 233, 0.1); +} + +#toc a.active { + color: var(--primary-color); + background-color: rgba(26, 84, 144, 0.12); + font-weight: 600; + padding-left: 5px; + padding-right: 5px; +} + +body.dark #toc a.active { + color: var(--accent-color); + background-color: rgba(14, 165, 233, 0.15); +} + +#toc ol { + list-style-type: none; +} + +#toc .section2 { + margin-left: 1rem; +} + +#toc .section3 { + margin-left: 2rem; +} + +#toc .section4 { + margin-left: 3rem; +} + +#toc .section5 { + margin-left: 4rem; +} + +.toc-floatingText { + background-color: #ddd; +} + +.author-aut, +.authority_affiliation, +.authority_mail { + text-align: right; +} + +span[class*="fn-call"], sup { + font-size: 0.75em; + vertical-align: super; + line-height: 0; + font-weight: 600; +} + +sub { + font-size: .60em; +} + +span[class*="fn-call"] { + color: var(--primary-color); + cursor: pointer; + transition: color var(--transition-fast); +} + +span[class*="fn-call"]:hover { + color: var(--primary-hover); +} + +body.dark span[class*="fn-call"] { + color: var(--accent-color); +} + +span.bibr-call { + color: var(--primary-color); + cursor: pointer; + text-decoration: none; + border-bottom: 1px dotted var(--primary-color); + transition: all var(--transition-fast); +} + +span.bibr-call:hover { + color: var(--primary-hover); + border-bottom-color: var(--primary-hover); +} + +body.dark span.bibr-call { + color: var(--accent-color); + border-bottom-color: var(--accent-color); +} + +div[id^="footnotes"] ul, +div[id^="footnotes"] ul { + list-style-type: none; +} + +div[id^="footnotes"] li { + padding-left: var(--spacing-md); + padding-right: var(--spacing-md); + padding-top: var(--spacing-sm); + padding-bottom: var(--spacing-sm); + background-color: #fafaf9; + border-left: 3px solid transparent; + border-radius: 8px; + transition: all var(--transition-base); + box-sizing: border-box; +} + +body.dark div[id^="footnotes"] li { + background-color: var(--dark-bg-secondary); +} + +div[id^="footnotes"] li.focus, #refs .ref.focus, #refs li.bibl.focus { + border-left-color: var(--primary-color); + background-color: rgba(26, 84, 144, 0.05); + border-left-color: var(--primary-color); +} + +body.dark div[id^="footnotes"] li.focus { + border-left-color: var(--accent-color); + background-color: rgba(14, 165, 233, 0.08); +} + +div[id^="footnotes"] li .label { + color: var(--primary-color); + font-weight: 600; + cursor: pointer; + font-family: var(--font-sans); + display: inline-block; + margin-right: 10px; +} + +body.dark div[id^="footnotes"] .label { + color: var(--accent-color); +} + +div[id^="footnotes"] li .label:hover { + color: var(--grey-color); +} + +div[id^="footnotes"] li .label:before { + content: '['; +} + +div[id^="footnotes"] li .label:after { + content: '] '; +} + +.mixed-citation { + margin-top: 10px; + margin-bottom: 10px; + padding: 10px; + border-bottom: 1px solid #888; +} + +.dark div[id^="footnotes"] li, .dark .mixed-citation { + border-bottom: 1px solid var(--dark-theme-txt); +} + +#index .index-level1 { + list-style-type: none; + margin-top: 3%; + font-weight: bold; +} + +#index .index-level2 { + list-style-type: none; + margin-top: 1%; + margin-left: 5%; + font-weight: normal; +} + +#index .index-level3 { + list-style-type: none; + margin-top: 1%; + margin-left: 5%; + font-weight: normal; +} + +.index-anchor { + color: var(--third-color); + font-size: 75%; +} + +.index-link:first-of-type { + margin-left: 12px; +} + +.index-level2 { + display: none; +} + +.toggle-button { + cursor: pointer; + color: var(--third-color); +} + +.expanded .toggle-button::after { + content: "[-]"; +} + +.collapsed .toggle-button::after { + content: "[+]"; +} + +body.dark .journal-meta { + background-color: var(--dark-bg-secondary); +} + +.meta-field { + margin-bottom: var(--spacing-md); + font-family: var(--font-sans); +} + +.meta-field > div:first-child { + color: var(--grey-color); + margin-top: 10px; +} + +.meta-field:before { + display: block; + font-size: 0.75rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--text-muted); + margin-bottom: var(--spacing-xs); +} + +body.dark .meta-field:before { + color: var(--dark-text-secondary); +} + +.abstract { + margin-top: 6px; +} + +.correction { + border: 1px solid black; + margin-top: 6px; + padding: 3px; +} + +.ack { + font-style: italic; +} + +.front-matter, .epigraph { + margin-bottom: 20px; + font-size: 95%; +} + +.front-matter:last-of-type { + margin-bottom: 50px; +} + +.kwd { + display: inline-block; + margin-right: 5px; +} + +.kwd:after { + margin-left: 5px; + content: "·"; +} + +.kwd:last-child::after { + content: none; +} + +.underline { + text-decoration: underline; +} + +div.boxed-text { + border: 2px solid var(--primary-color); + border-radius: 12px; + padding: var(--spacing-lg); + margin: var(--spacing-xl) 0; + background-color: rgba(26, 84, 144, 0.03); +} + +body.dark div.boxed-text { + border-color: var(--accent-color); + background-color: rgba(14, 165, 233, 0.05); +} + +div.boxed-text h1 { + font-size: 2.3rem; + margin-bottom: 10px; + line-height: normal; + padding-top: 25px; +} + +div.boxed-text h2, frontinclusionencadre .titlePage .title-main { + font-size: 1.8rem; + margin-bottom: 20px; + line-height: normal; + padding-top: 25px; +} + +frontinclusionencadre .titlePage .title-main { + font-weight: bold; +} + +div.boxed-text h3 { + font-size: 1.6rem; + margin-bottom: 20px; + line-height: normal; + padding-top: 25px; +} + +div.boxed-text p { + font-size: 1.2rem; + margin-top: 10px; + line-height: 150%; + word-wrap: break-word; +} + +div.boxed-text * { + font-size: 1.2rem; +} + +div.item.galleys { + font-size: 0.75rem; +} +div.item.galleys h2 { + display: none; +} +div.item.galleys ul { + list-style-type: none; +} + +disp-quote { + display: block; + text-align: right; +} + +blockquote { + margin: var(--spacing-lg) 0; + padding-left: var(--spacing-lg); + border-left: 4px solid var(--primary-color); + font-style: italic; + font-size: 1.0625rem; + color: var(--text-secondary); +} + +body.dark blockquote { + border-left-color: var(--accent-color); + color: var(--dark-text-secondary); +} + +.epigraph blockquote { + font-size: 100%; +} + +blockquote + blockquote { + margin-top: 1.7em; +} + +.quotation2 { + border-left: 2px solid var(--grey-color); + padding-left: 5%; + margin-left: -5%; +} + +.lb::after { + content: "\a"; + white-space: pre; +} + +ul, ol { + margin-top: 1ex; + margin-bottom: 1.5ex; + line-height: 130%; +} + +iframe { + border: solid 0.5pt; +} + +#map { + height: 400px; +} + +#drag-bar { + flex: 0 0 3px; + cursor: col-resize; + background-color: #e2e8f0; + position: relative; + z-index: 1000; + transition: background-color var(--transition-fast); +} + +#drag-bar:hover, +#drag-bar:active { + background-color: var(--primary-color); +} + +body.dark #drag-bar { + background-color: var(--dark-border); +} + +body.dark #drag-bar:hover { + background-color: var(--accent-color); +} + +.article-wrap section section p.signature, .article-wrap section section p.author-section-body { + text-align: right; +} + +a { + color: var(--primary-color); + text-decoration: none; + transition: color var(--transition-fast); +} + +a:hover { + color: var(--primary-hover); +} + +body.dark a { + color: var(--accent-color); +} + +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: transparent; +} + +::-webkit-scrollbar-thumb { + background: #cbd5e1; + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: #94a3b8; +} + +body.dark ::-webkit-scrollbar-thumb { + background: var(--dark-border); +} + +body.dark ::-webkit-scrollbar-thumb:hover { + background: #475569; +} + +#mirador-container { + width: 100%; + height: calc(100vh - 80px); + position: relative; + min-height: 500px; +} + +#mirador.content-tab { + padding: 0; + height: calc(100vh - 50px); + overflow: hidden; + display: flex; + flex-direction: column; +} + +body.dark #mirador-container { + background-color: var(--dark-theme-bg); +} + +#mirador-container > div { + width: 100% !important; + height: 100% !important; +} + +@media (max-width: 1200px) { + .right-contents { + width: 320px; + } + + .left-contents { + max-width: calc(100% - 320px); + } +} + +@media (max-width: 768px) { + :root { + --nav-height: 56px; + } + + .article-and-metas { + flex-direction: column; + display: flex; + width: 100%; + overflow: hidden; + } + + .left-contents, + .right-contents { + width: 100%; + max-width: 100%; + position: relative; + } + + .right-contents { + border-left: none; + border-top: 1px solid #e2e8f0; + height: auto; + } + + body.dark .right-contents { + border-top-color: var(--dark-border); + } +} + +div.idno { + margin-left: 7px; + border-left: 1px solid var(--text-secondary); + padding-left: 5px; + margin-top: 2px; + margin-bottom: 2px; +} + +.obj_article_details .cmp_notification { + font-family: var(--font-sans); + font-size: 0.825rem; + padding: 8px 16px; + margin-bottom: var(--spacing-lg); + background: #fff8e1; + border: 1px solid #ffe082; + border-radius: 3px; + color: #4e342e; + display: none; + align-items: center; + gap: 12px; +} + +.obj_article_details .cmp_notification a { + font-weight: 600; + color: inherit; + text-decoration: underline; +} + +.obj_article_details h1.page_title { + font-family: var(--font-serif); + font-size: 1.75rem; + font-weight: 700; + line-height: 1.25; + letter-spacing: -0.015em; + color: var(--text-primary); + margin: 0 0 var(--spacing-lg); + padding: var(--spacing-lg) 0 var(--spacing-md); + border-bottom: 1px solid #e2e8f0; +} + +body.dark .obj_article_details h1.page_title { + color: var(--dark-text-primary); + border-bottom-color: var(--dark-border); +} + +.obj_article_details .row { + display: flex; + gap: var(--spacing-xl); + align-items: flex-start; + padding-bottom: var(--spacing-xl); +} + +.obj_article_details .main_entry { + flex: 1 1 0; + min-width: 0; + display: flex; + flex-direction: column; + gap: var(--spacing-lg); + padding-right: var(--spacing-lg); +} + +.obj_article_details .entry_details { + flex: 0 0 180px; + display: flex; + flex-direction: column; + gap: var(--spacing-md); + border-left: 1px solid #e2e8f0; + padding-left: var(--spacing-lg); +} + +body.dark .obj_article_details .entry_details { + border-left-color: var(--dark-border); +} + +.obj_article_details .item > h2.label, +.obj_article_details .sub_item > h2.label { + font-family: var(--font-sans); + font-size: 0.7rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--text-muted); + margin-bottom: 4px; + margin-top: 0; + padding: 0; + border: none; + background: none; +} + +.obj_article_details h2.pkp_screen_reader { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + white-space: nowrap; + border: 0; +} + +.obj_article_details .item.authors ul.authors { + list-style: none; + padding: 0; + margin: 0; + flex-wrap: wrap; + gap: 4px 16px; +} + +.obj_article_details .item.authors ul.authors li { + font-family: var(--font-sans); + font-size: 0.9375rem; + font-weight: 600; + color: var(--text-primary); + margin: 0; + padding: 1em; +} + +body.dark .obj_article_details .item.authors ul.authors li { + color: var(--dark-text-primary); +} + +.obj_article_details .item.abstract p { + font-family: var(--font-serif); + font-size: 0.9375rem; + line-height: 1.7; + color: var(--text-secondary); + text-align: justify; + hyphens: auto; + margin: 0; +} + +body.dark .obj_article_details .item.abstract p { + color: var(--dark-text-secondary); +} + +.obj_article_details .item.galleys ul.galleys_links { + list-style: none; + padding: 0; + margin: 0; + display: flex; + flex-direction: column; + gap: 6px; +} + +.obj_article_details .item.galleys a.obj_galley_link { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 5px; + width: 100%; + font-family: var(--font-sans); + font-size: 0.75rem; + font-weight: 600; + letter-spacing: 0.05em; + text-transform: uppercase; + padding: 5px 12px; + border: 1.5px solid var(--primary-color); + border-radius: 2px; + color: var(--primary-color); + text-decoration: none; + transition: background var(--transition-fast), color var(--transition-fast); + background: transparent; +} + +.obj_article_details .item.galleys a.obj_galley_link:hover { + background: var(--primary-color); + color: #fff; +} + +body.dark .obj_article_details .item.galleys a.obj_galley_link { + border-color: var(--accent-color); + color: var(--accent-color); +} + +body.dark .obj_article_details .item.galleys a.obj_galley_link:hover { + background: var(--accent-color); + color: #fff; +} + +.obj_article_details .item.issue .value { + font-family: var(--font-sans); + font-size: 0.875rem; + color: var(--text-secondary); +} + +body.dark .obj_article_details .item.issue .value { + color: var(--dark-text-secondary); +} + +.obj_article_details{ + border-bottom: 2px solid #718EAC; +} + +@media (max-width: 768px) { + .obj_article_details .row { + flex-direction: column; + gap: var(--spacing-lg); + } + + .obj_article_details .main_entry { + padding-right: 0; + } + + .obj_article_details .entry_details { + flex: none; + border-left: none; + border-top: 1px solid #e2e8f0; + padding-left: 0; + padding-top: var(--spacing-md); + } + + body.dark .obj_article_details .entry_details { + border-top-color: var(--dark-border); + } +} + +.pkp_structure_footer_wrapper{ +border-top: 2px solid#718EAC; +margin-top: 2em; +} + +.filter-bar{ + display: none; +} + +.LangMode{ + display: none; +} + +.affiliation{ + display: block; +} + +.pkp_structure_head{ +font-family: "Merriweather Sans","Helvetica Neue",Helvetica,Arial,sans-serif; + background-color: white; + padding: 8px 0 0; + border-bottom: 2px solid #718EAC; + font-size: 1rem; + line-height: 1.5; + height: var(--nav-height); + align-items: center; + padding: 0 var(--spacing-md); +} + +.pkp_site_name{ + padding: 0.8rem; +} + +.pkp_brand_footer{ + max-width: 10%; + padding: 20px; + align-content: center; + display: flex; + margin: auto; +} + +.linked_data { + display: flex; + flex-direction: column; + gap: 3px; + padding: var(--spacing-md); + background-color: #fafaf9; + border: 1px solid #e7e5e4; + border-left: 3px solid var(--primary-color); + border-radius: 6px; + margin-bottom: var(--spacing-md); + box-sizing: border-box; + transition: box-shadow var(--transition-base), border-color var(--transition-base); + font-family: var(--font-sans); +} + +.linked_data:hover { + box-shadow: var(--shadow-md); + border-left-color: var(--accent-color); +} + +body.dark .linked_data { + background-color: var(--dark-bg-secondary); + border-color: var(--dark-border); + border-left-color: var(--accent-color); +} + +.linked_data .data-title { + font-size: 0.9rem; + font-weight: 700; + color: var(--text-primary); + margin: 0 0 2px; + line-height: 1.3; +} + +body.dark .linked_data .data-title { + color: var(--dark-text-primary); +} + +.linked_data .data-author { + font-size: 0.78rem; + color: var(--text-secondary); + margin: 0; + line-height: 1.5; +} + +.linked_data .data-author + .data-author { + margin-top: 0; +} + +.linked_data .data-author::before { + content: ""; + display: inline-block; + width: 0.4em; + height: 0.4em; + background-color: var(--accent-color); + border-radius: 50%; + margin-right: 5px; + vertical-align: middle; + opacity: 0.7; +} + +.linked_data .data-date { + font-size: 0.75rem; + font-weight: 600; + color: var(--text-muted); + text-align: right; + margin: 0; + white-space: nowrap; + align-self: start; +} + +body.dark .linked_data .data-date { + color: var(--dark-text-secondary); +} + +.linked_data .data-desc { + font-size: 0.8rem; + color: var(--text-secondary); + line-height: 1.55; + margin: 4px 0 0; + padding-top: var(--spacing-xs); + border-top: 1px solid #e7e5e4; +} + +body.dark .linked_data .data-desc { + color: var(--dark-text-secondary); + border-top-color: var(--dark-border); +} + +.linked_data .data-citation { + font-size: 0.75rem; + font-style: italic; + color: var(--text-muted); + margin: 2px 0 0; + line-height: 1.5; + padding: var(--spacing-xs) var(--spacing-sm); + background: rgba(26, 84, 144, 0.05); + border-radius: 3px; +} + +body.dark .linked_data .data-citation { + color: var(--dark-text-secondary); + background: rgba(14, 165, 233, 0.08); +} + +.linked_data .data-license, +.linked_data .data-link { + display: inline; +} + +.linked_data .data-license + .data-link, +.linked_data .data-link { + +} + +.linked_data .data-license { + order: 5; + font-size: 0.7rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.06em; + color: #fff; + background-color: var(--primary-color); + padding: 2px 7px; + border-radius: 3px; + margin: 0; + align-self: center; + justify-self: start; + line-height: 1.6; +} + +body.dark .linked_data .data-license { + background-color: var(--accent-color); +} + +.linked_data .data-link { + font-size: 0.75rem; + margin: 0; + text-align: right; + align-self: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.linked_data .data-link a { + color: var(--primary-color); + text-decoration: none; + font-weight: 500; + transition: color var(--transition-fast); +} + +.linked_data .data-link a:hover { + color: var(--accent-color); + text-decoration: underline; +} + +body.dark .linked_data .data-link a { + color: var(--accent-color); +} + +@media (max-width: 768px) { + .linked_data .data-date, + .linked_data .data-link { + text-align: left; + } +} + +.linked_data .data-citation { + cursor: pointer; + user-select: none; + position: relative; + transition: background var(--transition-fast), color var(--transition-fast); +} + +.linked_data .data-citation:hover { + background: rgba(26, 84, 144, 0.12); + color: var(--primary-color); +} + +body.dark .linked_data .data-citation:hover { + background: rgba(14, 165, 233, 0.15); + color: var(--accent-color); +} + +.linked_data .data-citation::after { + font-style: normal; + font-size: 0.7em; + opacity: 0.45; + transition: opacity var(--transition-fast); +} + +.linked_data .data-citation:hover::after { + opacity: 1; +} + +.linked_data .data-citation.copied { + background: rgba(16, 185, 129, 0.12); + color: #059669; + font-style: normal; +} + +.linked_data .data-citation.copied::after { + content: " ✓"; + opacity: 1; +} + +.expan button{ + background: none; + background-color: rgba(0, 0, 0, 0); + border: none; + cursor: pointer; + font-size: inherit; + order: 5; + font-size: 0.7rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.06em; + color: #fff; + background-color: var(--primary-color); + padding: 2px 7px; + border-radius: 3px; + margin: 0; + margin-top: 0px; + margin-bottom: 0px; + align-self: center; + justify-self: start; + line-height: 1.6; + display: flex; + margin: auto; + margin-bottom: 1em; + margin-top: 1em; +} + +#refs li.bibl { + padding: var(--spacing-sm) var(--spacing-md); + border-left: 3px solid transparent; + border-right: 5px solid transparent; + border-radius: 8px; + transition: all var(--transition-base); + box-sizing: border-box; +} + +body.dark #refs li.bibl { + background-color: var(--dark-bg-secondary); +} + +body.dark #refs li.bibl.focus { + border-left-color: var(--accent-color); + background-color: rgba(224, 123, 57, 0.08); +} \ No newline at end of file diff --git a/resources/styles/xml_2_html.css b/resources/styles/xml_2_html.css index a3788aa9da05299c427bc8648e8eb623ca4a949f..332394071c12ca014d7fd62cbdc4d42273f4dea7 100644 --- a/resources/styles/xml_2_html.css +++ b/resources/styles/xml_2_html.css @@ -1,289 +1,481 @@ :root { + --primary-color: #1a5490; + --primary-hover: #2f6fb3; + --accent-color: #0ea5e9; + --text-primary: #1e293b; + --text-secondary: #64748b; + --text-muted: #94a3b8; + + --dark-bg-primary: #0f172a; + --dark-bg-secondary: #1e293b; + --dark-text-primary: #e2e8f0; + --dark-text-secondary: #cbd5e1; + --dark-border: #334155; + --dark-theme-bg: #22272e; --dark-theme-txt: #adbac7; --grey-color: #777; - /*--nav-height: 4em;*/ + --lighter-txt-light-theme: #545454; + --darker-txt-dark-theme: #97A4B0; --third-color : #0a84ff; --right-width: 35%; --btn-tabs-height: 40px; -} + --max-content-width: 850px; + --sidebar-width: 480px; + --nav-height: 64px; + --spacing-xs: 0.3rem; + --spacing-sm: 0.8rem; + --spacing-md: 1.2rem; + --spacing-lg: 2rem; + --spacing-xl: 3rem; -/** temp addons (if jatsParser enabled)*/ -/*.jatsParser__meta, #jatsParserFullText > h2, #jatsParserFullText > p, .usernav,.journal_branding, .jatsParser__cover-wrapper,*/ -/*nav li.dropdown, button.navbar-toggler {*/ -/* display: none;*/ -/*}*/ -/***************************************/ + --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, + "Helvetica Neue", Arial, sans-serif; + --font-serif: "Georgia", "Times New Roman", Times, serif; + --font-mono: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, + monospace; -/* hides pkp ojs stuff */ -/*#navigationUserWrapper, section.item, .cmp_skip_to_content, .pkp_navigation_primary_row, .pkp_site_name_wrapper,*/ -/*.entry_details, .pkp_brand_footer{*/ -/* display:none;*/ -/*}*/ + --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1); + --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1); + --transition-fast: 150ms ease; + --transition-base: 250ms ease; +} -*{ - /*border-width: 0;*/ +* { margin: 0; padding: 0; + box-sizing: border-box; +} + +html { + font-size: 16px; + scroll-behavior: smooth; } -/*.pkp_structure_main::before, .pkp_structure_main::after{*/ -/* background: none;*/ -/*}*/ +body { + font-family: var(--font-serif); + color: var(--text-primary); + background-color: #ffffff; + line-height: 1.75; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} -/*.pkp_structure_content, .pkp_structure_main, .obj_article_details .main_entry{*/ -/* margin: 0;*/ -/* padding: 0;*/ -/* width: auto;*/ -/*}*/ +body.dark { + background-color: var(--dark-bg-primary); + color: var(--dark-text-primary); +} -/*********/ nav { - /*height: var(--nav-height);*/ position: fixed; - width: 100%; - border-bottom : 1px solid black; - background-color: white; - box-sizing: border-box; + top: 0; + left: 0; + right: 0; + height: var(--nav-height); + background-color: rgba(255, 255, 255, 0.95); + border-bottom: 1px solid #e2e8f0; + box-shadow: var(--shadow-sm); + z-index: 100; + display: flex; + align-items: center; + padding: 0 var(--spacing-md); + backdrop-filter: blur(8px); } -body.dark nav{ - border-color : var(--dark-theme-txt); - background-color: var(--dark-theme-bg); +body.dark nav { + background-color: rgba(15, 23, 42, 0.95); + border-bottom-color: var(--dark-border); } - nav li { display: inline-block; - padding:5px; + padding: var(--spacing-xs) var(--spacing-sm); + font-family: var(--font-sans); + font-size: 0.9rem; + font-weight: 500; } -#mode-color-btns{ +#mode-color-btns { position: fixed; - top:5px; - right: 5px; - z-index:10; + top: 10px; + right: var(--spacing-sm); + z-index: 110; } -#sun, #moon{ + +#sun, +#moon { cursor: pointer; - width: 24px; - height: 24px; + width: 25px; + height: 25px; border: none; background-color: transparent; + border-radius: 8px; + transition: background-color var(--transition-fast); + display: flex; + align-items: center; + justify-content: center; } +#sun:hover, +#moon:hover { + background-color: rgba(0, 0, 0, 0.05); +} -body.dark{ - background-color: var(--dark-theme-bg); - color: var(--dark-theme-txt); +body.dark #sun:hover, +body.dark #moon:hover { + background-color: rgba(255, 255, 255, 0.1); } .wrap { - /*padding-top: calc(var(--nav-height));*/ - font-family: "Noto Sans",-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif; - /*border-top: 1px solid black;*/ + padding-top: 42px; + min-height: 100vh; + border-bottom: solid 3px rgb(226,232,240); +} + +.LangMode { + position: fixed; } -section.back{ +.LangMode > a[role="button"] { + cursor: pointer; +} + +section.back { display: none; } -.article-and-metas{ +.article-and-metas { + position: relative; display: flex; - max-width: 100vw; + width: 100%; + height: calc(100vh - var(--nav-height)); + overflow: hidden; } .left-contents { - width: 65%; + flex: 1 1 auto; + display: flex; + justify-content: center; + min-width: 100px; + padding: var(--spacing-xl) var(--spacing-lg); + scrollbar-color: var(--text-muted) var(--text-muted); overflow-y: auto; - max-height: 100vh;/*calc(100vh - var(--nav-height));*/ - scrollbar-color: var(--third-color) var(--third-color); - /*margin-top: var(--nav-height);*/ + overflow-x: hidden; + height: 100%; } -.article-wrap{ - max-width: 820px; - margin-left: auto; - margin-right: auto; +.article-wrap { + max-width: var(--max-content-width); + margin: 0 auto; } .right-contents { - width: var(--right-width); - position: fixed; - right:0px; - top: 0;/*calc(var(--nav-height));*/ - overflow-y: auto; + flex: 0 0 auto; + width: var(--sidebar-width); + max-width: 100%; + background-color: #fafaf9; + border-left: 1px solid #e7e5e4; + font-family: var(--font-sans); + box-sizing: border-box; + height: 100%; + overflow-y: auto; + overflow-x: hidden; scrollbar-width: thin; - height: 100vh;/*calc(100vh - var(--nav-height));*/ - border-left: 1px solid black; + word-wrap: break-word; + overflow-wrap: break-word; } -.left-contents h1 { - font-size: 3.2rem; - margin-bottom: 20px; - line-height: normal; - padding-top: 25px;/*calc(var(--nav-height));*/ +.right-contents * { + word-wrap: break-word; + box-sizing: border-box; } +.right-contents .front, +.right-contents .content-tab, +.right-contents .meta-content-tab { + width: 100%; + box-sizing: border-box; +} + +body.dark .right-contents { + background-color: var(--dark-bg-secondary); + border-left-color: var(--dark-border); +} + +.left-contents h1:not(div.boxed-text *) { + font-family: var(--font-serif); + font-size: 2.5rem; + font-weight: 700; + line-height: 1.2; + margin-bottom: var(--spacing-lg); + color: var(--text-primary); + letter-spacing: -0.02em; + padding-top: 25px; + padding-bottom: var(--spacing-lg); +} + +body.dark .left-contents h1:not(div.boxed-text *) { + color: var(--dark-text-primary); +} + +.article-wrap ul, .article-wrap ol { + margin-left: var(--spacing-lg); + margin-top: var(--spacing-md); + margin-bottom: var(--spacing-md); + line-height: 1.8; +} -.article-wrap ul, .article-wrap ol{ - margin-left: 40px; +.article-wrap li { + margin-bottom: var(--spacing-xs); + padding-left: var(--spacing-xs); } -/*.left-contents section.body, .left-contents h1{*/ - /*width: 65%;*/ -/*}*/ + section.body, section.front { - padding-right: 15px ; + padding-right: 15px; } section.body { - font-size: 150%; - padding-right:50px ; - line-height: normal ; + padding-right: 50px; + line-height: normal; } - section.front ol, section.front ol { - padding-left: 25px ; + padding-left: 25px; } - -.button-tabs{ - border-bottom : 1px solid black; - position: fixed; - width: var(--right-width); +.front > .button-tabs { + position: sticky; + top: 0; + display: flex; + background-color: #fafaf9; + border-bottom: 1px solid #e7e5e4; + z-index: 10; height: var(--btn-tabs-height); - z-index: 1; - background-color: white; + margin-right: -15px; + width: calc(100% + 15px); + overflow-x: auto; + overflow-y: hidden; } .dark .button-tabs { - border-bottom: 1px solid var(--dark-theme-txt); - background-color: var(--dark-theme-bg); + background-color: var(--dark-bg-secondary); + border-bottom-color: var(--dark-border); } -.tab-btn{ - background-color: white; - padding: 10px ; - font-size: 1rem; - cursor: pointer; +.tab-btn { + flex: 1 0 auto; + padding: var(--spacing-sm); + font-family: var(--font-sans); + font-size: 0.875rem; + font-weight: 600; + background-color: transparent; border: none; - font-weight: bold; + border-right: 1px solid #e7e5e4; + color: var(--text-secondary); + cursor: pointer; + transition: all var(--transition-fast); height: var(--btn-tabs-height); - border-right:1px solid black; + min-width: fit-content; } -.dark .tab-btn { - border-right:1px solid var(--dark-theme-txt); + +.tab-btn[data-key="toc"] { + flex: 1; + white-space: nowrap; } -.content-tab{ - padding: calc(var(--btn-tabs-height) + 10px) 20px; +body.dark .tab-btn { + color: var(--dark-text-secondary); + border-right-color: var(--dark-border); } -.content-tab .bibliography { - border:none; +.tab-btn:hover { + background-color: rgba(0, 0, 0, 0.03); + color: var(--text-primary); +} + +body.dark .tab-btn:hover { + background-color: rgba(255, 255, 255, 0.05); + color: var(--dark-text-primary); } -.focus-tab{ - background-color: black; +.focus-meta-tab { + background-color: var(--primary-color); color: white; } +.focus-meta-tab:hover { + background-color: var(--primary-hover); + color: white; +} -.dark .tab-btn{ - background-color: var(--dark-theme-bg); - color: #adbac7; +.focus-tab { + background-color: var(--primary-color); + color: white; } -.dark .focus-tab{ - color: var(--dark-theme-bg); - background-color: var(--dark-theme-txt); +.focus-tab:hover { + background-color: var(--primary-hover); + color: white; } -.dark .right-contents { - border-color: var(--dark-theme-txt); +.content-tab { + padding: var(--spacing-md); + font-size: 0.9375rem; } +.content-tab .button-tabs.meta-tabs { + margin-top: calc(var(--spacing-md) * -1); + margin-right: calc((var(--spacing-md) + 15px) * -1); + margin-left: calc(var(--spacing-md) * -1); + margin-bottom: var(--spacing-lg); + display: flex; -/***** section/h *******/ -section.body p { - margin-top:10px ; - line-height: 150% ; - word-wrap: break-word } -section.body p:first-child { - margin-top:50px; +.content-tab .bibliography { + border: none; } -.title-trl { - margin-top: 20px; - margin-bottom: 15px; - font-size: 3rem; - font-style:italic; +section.body p:not(div.boxed-text *, .caption, .credits, .stage, details *, .front-matter *) { + font-size: 1.0625rem; + line-height: 1.7; + margin-top: var(--spacing-md); + color: var(--text-primary); + text-align: justify; + hyphens: auto; + word-wrap: break-word; +} + +body.dark section.body p:not(div.boxed-text *, .caption, .credits, details *) { + color: var(--dark-text-primary); +} + +.title-sup, +.z39-98 { + display: inline-block; + margin-top: 10px; + font-size: 1.2rem; + background-color: var(--dark-theme-txt); + padding-right: 2rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + font-weight: 450; } .title-sub { - font-size: 2.4rem; - margin-top: 25px ; + font-family: var(--font-serif); + font-size: 1.875rem; + font-weight: 700; + margin-top: 10px; + margin-bottom: 10px; + color: var(--text-primary); + letter-spacing: -0.01em; } -section.body h2 { - margin-top: 30px ; - margin-bottom: 15px ; - font-size: 3rem; - /*line-height: 200%;*/ +section.body h2:not(div.boxed-text *) { + font-family: var(--font-serif); + font-size: 1.875rem; + font-weight: 700; + margin-top: var(--spacing-xl); + margin-bottom: var(--spacing-md); + color: var(--text-primary); + line-height: 1.3; + letter-spacing: -0.01em; } -section.body h3 { - margin-top: 25px ; - margin-bottom: 10px ; - font-size: 2.5rem; - /*line-height: 100%;*/ +section.body h3:not(div.boxed-text *) { + font-family: var(--font-serif); + font-size: 1.5rem; + font-weight: 600; + margin-top: var(--spacing-lg); + margin-bottom: var(--spacing-sm); + color: var(--text-primary); + line-height: 1.4; } -section.body h4 { - margin-top: 15px ; - margin-bottom: 5px ; - font-size: 2rem; - /*line-height: 15%;*/ +section.body h4:not(div.boxed-text *) { + font-family: var(--font-sans); + font-size: 1.25rem; + font-weight: 600; + margin-top: var(--spacing-md); + margin-bottom: var(--spacing-sm); + color: var(--text-secondary); } section.body h5 { - margin-top: 15px ; - margin-bottom: 5px ; - font-size: 1.6rem; - /*line-height: 15%;*/ + font-family: var(--font-sans); + font-size: 1.125rem; + font-weight: 600; + margin-top: var(--spacing-md); + margin-bottom: var(--spacing-xs); + color: var(--text-secondary); } section.body h6 { - margin-top: 15px ; - margin-bottom: 5px ; - font-size: 1.4rem; - /*line-height: 15%;*/ + font-family: var(--font-sans); + font-size: 1.125rem; + font-weight: 600; + margin-top: var(--spacing-md); + margin-bottom: var(--spacing-xs); + color: var(--text-secondary); +} + +section.body p.firstPara:not(div.boxed-text *, details *) { + margin-top: var(--spacing-xl); } -/***** figure *******/ figure { - width: 100%; - min-height: 100px; - display:flex; + margin: var(--spacing-xl) 0; + padding: var(--spacing-md); + background-color: #f8fafc; + border-radius: 12px; + border: 1px solid #e2e8f0; + display: flex; flex-direction: column; - align-items: center; - justify-content: center; - color: #999; - margin: 25px 0px; - background-color: #454545; + min-height: 70px; } -img { +body.dark figure { + background-color: var(--dark-bg-secondary); + border-color: var(--dark-border); +} + +figure.fig-formula { + color: inherit; + background: transparent; + margin: 0px 0px; + min-height: 50px; + padding-top: 5px; + padding-bottom: 5px; + border: none; +} + +.img { + height: 1.3em; + width: auto; + vertical-align: bottom; +} + +figure img { width: 100%; + height: auto; + border-radius: 8px; + box-shadow: var(--shadow-md); + padding-bottom: 0px; + margin-bottom: 7px; } -.caption { - padding: 8px; +figure .fig-call-window img, +figure .table-call-window img { + border-radius: 0px; + box-shadow: none; +} + +body.dark .caption { + color: var(--dark-text-secondary); } .fig-call-window, @@ -292,160 +484,420 @@ img { .table-call-window, .table-call-window a, .table-call-window a:visited { - color:var(--third-color); text-decoration: none; + align-self: flex-end; + margin-top: -13px; + margin-right: -6px; + margin-bottom: -15px; +} + +.bibl-cr + .bibl-cr { + margin-top: 15px; +} + +.bibl-cr { + margin-top: 25px; } -.table-call-window { +section.review { position: relative; - top: -10px; - left: 355px; - margin-top: -26px; + padding-top: 50px; +} + +section.review:not(:first-child)::before { + content: ""; + position: absolute; + left: 0; + width: 100%; + height: 1px; + background-color: #454545; + top: 40px; } -/* right pane */ div[id='figures'] figure { - border-bottom:1px solid var(--grey-color); - padding-bottom: 30px; + border-top: none; background-color: inherit; + border: none; + margin-top: -15px; + margin-bottom: var(--spacing-md); + padding-bottom: var(--spacing-md); + padding-right: var(--spacing-md); + padding-left: var(--spacing-md); + padding-top: var(--spacing-xl); +} + +div[id='figures'] figure + figure { + border-top: 4px solid #e2e8f0; + border-radius: 0px; + margin-top: var(--spacing-md); + margin-bottom: var(--spacing-md); + padding-bottom: var(--spacing-md); + padding-right: var(--spacing-md); + padding-left: var(--spacing-md); + padding-top: var(--spacing-xl); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + min-height: 70px; +} + +img { + width: 100%; + padding-bottom: 5px; +} + +.speaker { + font-weight: bold; } -/****** formula ******/ -.fig-formula { - background-color:white; - color: black; +.stage { + font-style: italic; + color: var(--lighter-txt-light-theme); + font-size: 1.0625rem; + line-height: 1.7; + margin-top: var(--spacing-md); + text-align: justify; + hyphens: auto; + word-wrap: break-word; } -figure[class='fig-formula inline'] { - display:inline; +.dark .stage { + font-style: italic; + color: var(--darker-txt-dark-theme); } -/****** table ******/ table caption { - font-size: 1.2rem; font-style: italic; + margin-bottom: var(--spacing-sm); + color: var(--text-secondary); + font-size: 1.2rem; } table { - display: none; width: 100%; + border-collapse: collapse; + display: table; + text-indent: initial; + line-height: normal; + font-weight: normal; + font-size: medium; + font-style: normal; + color: -internal-quirk-inherit; + text-align: start; + border-spacing: 2px; + white-space: normal; + font-variant: normal; + margin: 0 0; + margin-bottom: 7px; + font-family: var(--font-sans); + font-size: 0.9375rem; + background-color: white; +} + +table.linguistic { + display: table; + margin-top: 1em; + margin-bottom: 1em; } -table[class='linguistic'] { +table.lg { display: table; width: 100%; - margin-top:1em; + margin-top: 1em; margin-bottom: 1em; + border: none; } -td,th { - border-bottom:1px solid #ccc; - font-size:1.1rem; +td[class='num'] { + width: 40px; + border: none; + padding-left: none; } -.fig-table label { +td[class='l'] { + border: none; + padding-left: none; +} + +th, +td { + padding: var(--spacing-sm); + text-align: left; + border-bottom: 1px solid #e2e8f0; + font-size: 0.9rem; + padding-left: 2px; +} + +body.dark th, +body.dark td { + border-bottom-color: var(--dark-border); +} + +th { + font-weight: 600; + background-color: #f8fafc; + color: var(--text-primary); +} + +body.dark th { + background-color: var(--dark-bg-secondary); + color: var(--dark-text-primary); +} + +blockquote table.lg td, +blockquote table.lg th { + font-size: 1.1rem; + padding-left: 2px; +} + +table.lg td { + line-height: 120%; + font-size: 150%; +} + +.fig-table label, +.fig-ill label { padding: 10px; - margin: 0; cursor: pointer; - padding-left: 1em; - max-width: 80%; + margin-bottom: 5px; + line-height: 1.5; } .expand { color: var(--third-color); text-decoration: none; - position: relative; - right: 45%; - top: 37px; - margin-top: -27px; + margin-right: 0.5em; + cursor: pointer; } span[class='expand empty'] { color: var(--third-color); text-decoration: none; - position: relative; - right: 45%; - top: 20px; - margin-top: -27px; + margin-right: 0.5em; + cursor: pointer; } -.credits { - margin: 0 5 5 20px; - font-size:smaller; +figure .credits, +figure .caption { + margin-top: 8px; + margin-right: 5px; + margin-bottom: 5px; + margin-left: 8px; align-self: flex-start; + line-height: 1.5; + color: var(--text-primary); + text-align: justify; + hyphens: auto; + word-wrap: break-word; +} + +label { + margin-bottom: 15px; +} + +.caption-right-panel, +.credits-right-panel { + text-align: left; + align-self: flex-start; + line-height: 1.4; + margin-top: 10px; + font-size: 0.85rem; +} + +.label-right-panel { + text-align: left; + align-self: flex-start; + line-height: 1.4; + font-weight: bold; + font-size: 0.85rem; +} + +.img-righ-panel { + margin-bottom: 5px; + margin-top: 5px; } -/*counters*/ section.body { counter-reset: section; } -section.body h2:not(div.boxed-text *){ +section.body h2:not(div.boxed-text *) { counter-reset: subsection; } -section.body h3:not(div.boxed-text *){ +section.body h3:not(div.boxed-text *) { counter-reset: subsubsection; } -section.body h4:not(div.boxed-text *){ +section.body h4:not(div.boxed-text *) { counter-reset: subsubsubsection; } +details.floating-note { + width: 100%; + margin-left: 9px; + margin-top: 12px; +} -/* biblio end */ -.bibliography { - margin-top:4ex; - border-top:1px solid #efefef; +details.floating-note .body { + font-size: smaller; + line-height: 1.4em; } -section.bibliography h2 { - font-size: 2rem; +details.floating-note .body ul, details.floating-note .body ol { + margin-left: var(--spacing-sm); + margin-top: var(--spacing-sm); + margin-bottom: var(--spacing-sm); + line-height: 1.4em; } -section.bibliography h3 { - font-size: 1.8rem; +details.floating-note p.firstPara { + margin-top: 20px; +} +details.floating-note p { + margin-top: 6px; } -section.bibliography ul { - list-style-type: none; - margin-left: 0; +summary::marker { + color: var(--third-color); + content: "⇱  "; + font-size: 105%; +} + +.floating-note[open] summary::marker { + content: "⇲  "; +} + +summary span.idno { + color: var(--third-color); + font-family: var(--font-sans); + font-size: 95%; +} + +.appendix, .right-panel-appendix { + position: relative; +} + +section.appendix { + margin-top: 100px; +} + +section.body section.appendix > h1 { + margin-bottom: var(--spacing-xl); +} + +section.appendix::before { + content: ""; + position: absolute; + left: 0; + width: 100%; + height: 1px; + background-color: #454545; + top: -10px; +} + +.right-panel-appendix::before { + content: ""; + position: absolute; + left: 0; + width: 100%; + height: 1px; + background-color: #454545; + top: -2px; +} + +.auteur-annexe { + font-size: 85%; +} + +section.body frontinclusion h2.sous-titre-annexe { + margin-top: -10px; + font-size: 1.5rem; + line-height: 100%; + font-weight: normal; +} + +bodyInclusion p.firstPara:not(div.boxed-text *) { + margin-top: 50px; +} + +.right-contents #refs ul { + list-style: none; +} + +.right-contents #refs li { + margin-left: 1.5em; + text-indent: -1.5em; + margin-bottom: var(--spacing-md); + font-size: 0.9375rem; + line-height: 1.6; +} + +.right-contents #refs h3 { + font-size: 1.125rem; + font-weight: 600; + margin-top: var(--spacing-lg); + margin-bottom: var(--spacing-sm); + color: var(--text-primary); + padding-top: 10px; } -section.bibliography li.bibl { - font-size:1.3rem; +body.dark .right-contents #refs h3 { + color: var(--dark-text-primary); +} + +.right-contents #refs h4 { + margin-bottom: 10px; } +.review_bibliography p.bibl { + margin-left: 1.5em; + text-indent: -1.5em; + font-size: 90%; +} -/***** TOC *******/ +section.review p.bibl-cr { + margin-bottom: 50px; + margin-left: 30px; +} -#toc li { - margin-top:5px; +#toc { + font-size: 0.9375rem; } + #toc a { - color: black; + color: var(--text-secondary); text-decoration: none; - /* padding-left: 5px; - padding-right: 5px;*/ - /*display: inline-block;*/ + display: block; + padding: var(--spacing-xs) var(--spacing-sm); + border-radius: 6px; + transition: all var(--transition-fast); } -#toc a:hover{ - color: var(--grey-color); +#toc a:hover { + color: var(--primary-color); + background-color: rgba(26, 84, 144, 0.08); +} + +body.dark #toc a { + color: var(--dark-text-secondary); } -.dark #toc a { - color: var(--dark-theme-txt); +body.dark #toc a:hover { + color: var(--accent-color); + background-color: rgba(14, 165, 233, 0.1); } #toc a.active { - color: white; - background-color: black; + color: var(--primary-color); + background-color: rgba(26, 84, 144, 0.12); + font-weight: 600; padding-left: 5px; padding-right: 5px; } -.dark #toc a.active { - color: var(--dark-theme-bg); - background-color: var(--dark-theme-txt); +body.dark #toc a.active { + color: var(--accent-color); + background-color: rgba(14, 165, 233, 0.15); } #toc ol { @@ -453,63 +905,120 @@ section.bibliography li.bibl { } #toc .section2 { - margin-left:5%; + margin-left: 1rem; } #toc .section3 { - margin-left:10%; + margin-left: 2rem; } #toc .section4 { - margin-left:15%; + margin-left: 3rem; } #toc .section5 { - margin-left:20%; + margin-left: 4rem; } -/***** INLINE ELEMENTS******/ +.toc-floatingText { + background-color: #ddd; +} -span[class*="fn-call"], sup{ /** must not affect line height **/ - font-size: .60em; - vertical-align: 0.65em; +.author-aut, +.authority_affiliation, +.authority_mail { + text-align: right; +} + +span[class*="fn-call"], sup { + font-size: 0.75em; + vertical-align: super; line-height: 0; + font-weight: 600; +} + +sub { + font-size: .60em; } span[class*="fn-call"] { - /*font-variant-position: super;*/ - color: var(--third-color); + color: var(--primary-color); cursor: pointer; + transition: color var(--transition-fast); } -span.bibr-call{ - text-decoration: underline; +span[class*="fn-call"]:hover { + color: var(--primary-hover); +} + +body.dark span[class*="fn-call"] { + color: var(--accent-color); +} + +span.bibr-call { + color: var(--primary-color); cursor: pointer; + text-decoration: none; + border-bottom: 1px dotted var(--primary-color); + transition: all var(--transition-fast); +} + +span.bibr-call:hover { + color: var(--primary-hover); + border-bottom-color: var(--primary-hover); +} + +body.dark span.bibr-call { + color: var(--accent-color); + border-bottom-color: var(--accent-color); } -/***** FOOTNOTES ******/ div[id^="footnotes"] ul, div[id^="footnotes"] ul { list-style-type: none; } -div[id^="footnotes"] li{ +div[id^="footnotes"] li { + padding-left: var(--spacing-md); + padding-right: var(--spacing-md); + padding-top: var(--spacing-sm); + padding-bottom: var(--spacing-sm); + background-color: #fafaf9; + border-left: 3px solid transparent; + border-radius: 8px; + transition: all var(--transition-base); box-sizing: border-box; - padding: 20px 10px 20px 10px; - border-bottom: 1px solid #888; } -div[id^="footnotes"] li.focus, #refs .ref.focus{ +body.dark div[id^="footnotes"] li { + background-color: var(--dark-bg-secondary); +} + +div[id^="footnotes"] li.focus, #refs .ref.focus { + border-left-color: var(--primary-color); + background-color: rgba(26, 84, 144, 0.05); border-right: 5px solid var(--third-color); } +body.dark div[id^="footnotes"] li.focus { + border-left-color: var(--accent-color); + background-color: rgba(14, 165, 233, 0.08); +} + div[id^="footnotes"] li .label { - display: inline-block; - margin-right:10px; + color: var(--primary-color); + font-weight: 600; cursor: pointer; + font-family: var(--font-sans); + display: inline-block; + margin-right: 10px; +} + +body.dark div[id^="footnotes"] .label { + color: var(--accent-color); } -div[id^="footnotes"] li .label:hover{ +div[id^="footnotes"] li .label:hover { color: var(--grey-color); } @@ -518,17 +1027,7 @@ div[id^="footnotes"] li .label:before { } div[id^="footnotes"] li .label:after { - content: ']'; -} - -/* -#footnotes .label { - color:var(--third-color); -} -*/ - -div[id^="footnotes"] .label { - color:var(--third-color); + content: '] '; } .mixed-citation { @@ -542,7 +1041,6 @@ div[id^="footnotes"] .label { border-bottom: 1px solid var(--dark-theme-txt); } -/*********** INDEX **********/ #index .index-level1 { list-style-type: none; margin-top: 3%; @@ -564,7 +1062,7 @@ div[id^="footnotes"] .label { } .index-anchor { - color:var(--third-color); + color: var(--third-color); font-size: 75%; } @@ -572,99 +1070,153 @@ div[id^="footnotes"] .label { margin-left: 12px; } -/* collapse via toggle-button */ .index-level2 { - display: none; + display: none; } .toggle-button { - cursor: pointer; - color:var(--third-color); + cursor: pointer; + color: var(--third-color); } .expanded .toggle-button::after { - content: "[-]"; + content: "[-]"; } .collapsed .toggle-button::after { - content: "[+]"; + content: "[+]"; } -/******************************************/ -.journal-meta { - padding: 10px; +body.dark .journal-meta { + background-color: var(--dark-bg-secondary); } -.meta-field:before { - display: block; +.meta-field { + margin-bottom: var(--spacing-md); + font-family: var(--font-sans); +} + +.meta-field > div:first-child { color: var(--grey-color); margin-top: 10px; } -.subject:before{ - content : "Sujet"; -} -.article-title:before { - content : "Titre"; -} -.subtitle:before { - content : "Sous-titre"; +.meta-field:before { + display: block; + font-size: 0.75rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--text-muted); + margin-bottom: var(--spacing-xs); } -.trans-title:before{ - content : "Titre traduit"; +body.dark .meta-field:before { + color: var(--dark-text-secondary); +} +.abstract { + margin-top: 6px; } -.contrib-group:before{ - content : "Contributeurs"; +.correction { + border: 1px solid black; + margin-top: 6px; + padding: 3px; } -.abstract:before{ - content : "Résumé"; +.ack { + font-style: italic; } -.trans-abstract:before{ - content : "Résumé traduit"; +.front-matter, .epigraph { + margin-top: 20px; + margin-bottom: 20px; + font-size: 95%; +} +.front-matter:first-of-type { + margin-top: 50px; } -.kwd-group:before{ - content: "Mots-clés"; + +.front-matter:last-of-type { + margin-bottom: 50px; } .kwd { - display:inline-block; - margin-right:5px; - + display: inline-block; + margin-right: 5px; } -.kwd:after{ - margin-left:5px; +.kwd:after { + margin-left: 5px; content: "·"; } +.kwd:last-child::after { + content: none; +} + .underline { text-decoration: underline; } -.bio { - margin-bottom:2ex; +div.boxed-text { + border: 2px solid var(--primary-color); + border-radius: 12px; + padding: var(--spacing-lg); + margin: var(--spacing-xl) 0; + background-color: rgba(26, 84, 144, 0.03); +} + +body.dark div.boxed-text { + border-color: var(--accent-color); + background-color: rgba(14, 165, 233, 0.05); +} + +div.boxed-text h1 { + font-size: 2.3rem; + margin-bottom: 10px; + line-height: normal; + padding-top: 25px; +} + +div.boxed-text h2, frontinclusionencadre .titlePage .title-main { + font-size: 1.8rem; + margin-bottom: 20px; + line-height: normal; + padding-top: 25px; +} + +frontinclusionencadre .titlePage .title-main { + font-weight: bold; +} + +div.boxed-text h3 { + font-size: 1.6rem; + margin-bottom: 20px; + line-height: normal; + padding-top: 25px; } -/********* BOXED TEXT **********/ -div.boxed-text{ - border: 1px solid var(--grey-color); - padding: 15px; +div.boxed-text p { + font-size: 1.2rem; + margin-top: 10px; + line-height: 150%; + word-wrap: break-word; +} + +div.boxed-text * { + font-size: 1.2rem; } -/** galleys DL links**/ div.item.galleys { position: fixed; - top:20px; + top: 20px; right: 75px; display: flex; justify-content: right; - font-size:0.75rem; + font-size: 0.75rem; } div.item.galleys h2 { display: none; @@ -673,41 +1225,196 @@ div.item.galleys ul { list-style-type: none; } -/*********** QUOTE *******************/ -disp-quote { +disp-quote { display: block; - text-align:right; + text-align: right; } blockquote { - background-color:aliceblue; + margin: var(--spacing-lg) 0; + padding-left: var(--spacing-lg); + border-left: 4px solid var(--primary-color); + font-style: italic; + font-size: 1.0625rem; + color: var(--text-secondary); +} + +body.dark blockquote { + border-left-color: var(--accent-color); + color: var(--dark-text-secondary); +} + +.epigraph blockquote { + font-size: 100%; +} + +blockquote + blockquote { + margin-top: 1.7em; +} + +.quotation2 { + border-left: 2px solid var(--grey-color); padding-left: 5%; + margin-left: -5%; +} + +.lb::after { + content: "\a"; + white-space: pre; } -/*************** DRAG-BAR ***************************/ ul, ol { - margin-top:2ex; - margin-bottom:2ex; - line-height: 150% ; + margin-top: 1ex; + margin-bottom: 1.5ex; + line-height: 130%; } iframe { border: solid 0.5pt; } -#map { height: 400px; } +#map { + height: 400px; +} #drag-bar { - width: 1px; + flex: 0 0 3px; cursor: col-resize; - background-color: black; - display: block; + background-color: #e2e8f0; + position: relative; z-index: 1000; + transition: background-color var(--transition-fast); } -#drag-bar:hover { - width: 5px; - cursor: col-resize; - background-color: #ddd; - z-index: 1000; +#drag-bar:hover, +#drag-bar:active { + background-color: var(--primary-color); +} + +body.dark #drag-bar { + background-color: var(--dark-border); +} + +body.dark #drag-bar:hover { + background-color: var(--accent-color); +} + +.article-wrap section section p.signature, .article-wrap section section p.author-section-body { + text-align: right; +} + +a { + color: var(--primary-color); + text-decoration: none; + transition: color var(--transition-fast); +} + +a:hover { + color: var(--primary-hover); +} + +body.dark a { + color: var(--accent-color); +} + +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: transparent; +} + +::-webkit-scrollbar-thumb { + background: #cbd5e1; + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: #94a3b8; +} + +body.dark ::-webkit-scrollbar-thumb { + background: var(--dark-border); +} + +body.dark ::-webkit-scrollbar-thumb:hover { + background: #475569; +} + +#mirador-container { + width: 100%; + height: calc(100vh - 80px); + position: relative; + min-height: 500px; +} + +#mirador.content-tab { + padding: 0; + height: calc(100vh - 50px); + overflow: hidden; + display: flex; + flex-direction: column; +} + +body.dark #mirador-container { + background-color: var(--dark-theme-bg); +} + +#mirador-container > div { + width: 100% !important; + height: 100% !important; +} + +@media (max-width: 1200px) { + .right-contents { + width: 320px; + } + + .left-contents { + max-width: calc(100% - 320px); + } +} + +@media (max-width: 768px) { + :root { + --nav-height: 56px; + } + + .article-and-metas { + flex-direction: column; + display: flex; + width: 100%; + overflow: hidden; + } + + .left-contents, + .right-contents { + width: 100%; + max-width: 100%; + position: relative; + } + + .right-contents { + border-left: none; + border-top: 1px solid #e2e8f0; + height: auto; + } + + body.dark .right-contents { + border-top-color: var(--dark-border); + } +} + +div.idno { + margin-left: 7px; + border-left: 1px solid var(--text-secondary); + padding-left: 5px; + margin-top: 2px; + margin-bottom: 2px; +} + +.filter-bar { + display: none; } \ No newline at end of file diff --git a/tei2html.xsl b/tei2html.xsl deleted file mode 100644 index a3d5dd300681d34ac1a5d524d864997151b20e77..0000000000000000000000000000000000000000 --- a/tei2html.xsl +++ /dev/null @@ -1,795 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - FR | EN -
    - - -
    - - -
    -
    - - -
    -
    -
    -

    - -

    - -

    - -

    -
    - -
    -
    -
    - -
    -
    - - - -
    - - - - - -
    -
    - - - - - - -
    - -
    - - - - - - - - - - - - - - - - -
    - -
    -
    - -
      - - - - - -
    - -
    -
    - - - - - - - - - - - - -
    -
    - - - - - - - - - - - - -
  • - - - - - -
  • -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - index-anchor - anchor - - - # - - - - - - - - - - - - - - - -
    - - - - -
    -
    - - -
    -
      - -
    -
    -
    - - -
  • - -
  • -
    - - - - - -
  • - - - - section2 - - - - - - - - - - - - -
      - - - - - -
    -
    -
    -
  • - -
    - - - - - - - -
    - - - - - - -
    - -
    -
    -
    -
    - - - - - - -
    - - - Pagination : - - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  [+] - - - - -
    - - - - -
    -
    - - -
    - -
    - - - - - - - - - - - - - - - -
    -
    -
    -
    - - - -
    - - - - - - - - - - - - - - - - -
    -
    - - -

    - -

    -
    - -
    - - -
    - - - fig-table - fig-formula - fig-ill - - - -
    -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    -
    - - - - - - - ol - ul - - - - - - - - index- - - - - - - - list-style-type: "– "; - - - - - - - - - - - -
  • - -
  • -
    - - - -
    -
    - - -

    -
    - - - - - - - - - - - - - - -
    - - -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    diff --git a/templates/HTMLGalleyView.tpl b/templates/HTMLGalleyView.tpl index e15eea80695c2c374a79ce9e45fb048251a9e0f1..9ac86becfd7b43a41ab36f2e783a596fe28977d5 100644 --- a/templates/HTMLGalleyView.tpl +++ b/templates/HTMLGalleyView.tpl @@ -1,4 +1,3 @@ - @@ -8,14 +7,22 @@ {$currentContext->getLocalizedName()} - + {if $cssSideViewUrl} + + {else} + + {/if} + + + + {$dcMetas} -
    + diff --git a/templates/LandingPage.tpl b/templates/LandingPage.tpl new file mode 100644 index 0000000000000000000000000000000000000000..4e1b2dd39f28bb7c7aae030d54a0a9de9740bc6b --- /dev/null +++ b/templates/LandingPage.tpl @@ -0,0 +1,95 @@ +{** +* templates/frontend/pages/article.tpl +* +* Copyright (c) 2014-2021 Simon Fraser University +* Copyright (c) 2003-2021 John Willinsky +* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING. +* +* @brief Display the page to view an article with all of it's details. +* +* @uses $article Submission This article +* @uses $publication Publication The publication being displayed +* @uses $firstPublication Publication The first published version of this article +* @uses $currentPublication Publication The most recently published version of this article +* @uses $issue Issue The issue this article is assigned to +* @uses $section Section The journal section this article is assigned to +* @uses $journal Journal The journal currently being viewed. +* @uses $primaryGalleys array List of article galleys that are not supplementary or dependent +* @uses $supplementaryGalleys array List of article galleys that are supplementary +* +* @hook Templates::Article::Footer::PageFooter [] +*} + +{include file="frontend/components/header.tpl" pageTitleTranslated=$article->getCurrentPublication()->getLocalizedFullTitle(null, 'html')|strip_unsafe_html} + + + +
    + {if $metadataSource == 'pkp'} + {include file="frontend/objects/article_details.tpl"} + {/if} + + + + + + + + {if $cssLandingPageUrl} + + {else} + + {/if} + + {call_hook name="Templates::Article::Footer::PageFooter"} + +
    + + + + {include file="frontend/components/footer.tpl"} \ No newline at end of file diff --git a/templates/settingsForm.tpl b/templates/settingsForm.tpl index 7770e53ecb758ac54b14d31fd703cc1ba8f7a2d7..540839ea2fb969c1bdbaec0cae223bc275a08a79 100644 --- a/templates/settingsForm.tpl +++ b/templates/settingsForm.tpl @@ -1,24 +1,87 @@ - -
    +
    +

    {translate key="plugins.generic.xml2html.settingsFor"} {$currentContext->getLocalizedName()}

    {csrf} + {fbvFormSection label="plugins.generic.xml2html.format"} - + + {/fbvFormSection} + + {fbvFormSection} + + {/fbvFormSection} + + {fbvFormSection label="plugins.generic.xml2html.cssLandingPage"} + + {if $cssLandingPageUrl} +

    + {translate key="plugins.generic.xml2html.customCss.current"} + {translate key="plugins.generic.xml2html.customCss.view"} | + + {translate key="plugins.generic.xml2html.customCss.delete"} + + +

    + {/if} + {/fbvFormSection} + + {fbvFormSection label="plugins.generic.xml2html.cssSideView"} + + {if $cssSideViewUrl} +

    + {translate key="plugins.generic.xml2html.customCss.current"} + {translate key="plugins.generic.xml2html.customCss.view"} | + + {translate key="plugins.generic.xml2html.customCss.delete"} + + +

    + {/if} {/fbvFormSection} + + {fbvFormSection label="plugins.generic.xml2html.metadata"} + + {/fbvFormSection} + {fbvFormButtons submitText="common.save"} +
    diff --git a/version.xml b/version.xml index ea4785d8fb1a890e9612b6716ca81010a3f02612..4f85c3478315ce19b2c6df6cde46d7350efd42fe 100644 --- a/version.xml +++ b/version.xml @@ -3,8 +3,8 @@ xml2html plugins.generic - 0.1.0.0 - 2022-10-04 + 1.0.0.0 + 2026-07-11 1 XML2HTMLPlugin diff --git a/xsl/jats/jats-metas2html.xsl b/xsl/jats/jats-metas2html.xsl new file mode 100644 index 0000000000000000000000000000000000000000..dfe933ea85a1ae9af0a39e6fee158e3716038514 --- /dev/null +++ b/xsl/jats/jats-metas2html.xsl @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/xsl/jats/jats2html.xsl b/xsl/jats/jats2html.xsl new file mode 100644 index 0000000000000000000000000000000000000000..f95547055f7a218e50495da8e78cab5c4efb1563 --- /dev/null +++ b/xsl/jats/jats2html.xsl @@ -0,0 +1,1851 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + FR | EN | ES +
    + + +
    + + +
    +
    + + +
    + + +
    + +
    +
    + +

    + +

    +
    +
    +

    + +

    +

    + +

    + +
    +
    +
    + +
    + +
    + + +
    + + + +
    +
    + + + +
    + +
    +
    +
    + + +
    +
    + + + + + + + + + + + + + +
    + +
    +
    +
      + + + +
    1. + + + + + + + + . + + + +
    2. +
      +
      + + + + + + + +
      +
    + +
    +
    + + + + + + + + + + + +
    +
    + + + +
    +

    +
    +
    + + +
    + +

    + +

    +
    +
    +
    + + + + +
    +
    +

    + +

    + +
    +
    +
    + +
    +
    +

    + +

    + +
    +
    +
    +
    +
    + + + + + + + + xref-call fn-call + + + + + + + + + + + + + + +
  • + + footnote + + + + + + + + + +
  • +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    +
    + + +
    + +
    +
    + + + + + +
  • + + + + + + + + + + + + + + + + +
      + + + + + + + + + + +
    +
    +
  • + +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + +
    +
    + +
    +
    +
    +
    + + + +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    + + + + + + + + + + // + + + // + + + +
    + +
    +
    +
    + + +
    + +
    +
    +
    + + + + +
    + +
    + + + + + + + + + + + + + + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
    +
    +
    + + + + + + + + + + + + + + No + + + + + + + + + + No + + + + + + + + +
    +
    + + + + + + + + +
    +
    +
    + + + + + + + +
    + + + + + + + + + + + + + +
    +
    + +
    +
    +
    + + + + + + +
    +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    +
    + +
    +
    + + + + + +
    + + +
    +
    + +
    +
    +
    + +
    +
    + + + +
    + + +
    +
    + +
    +
    +
    + +
    +
    + + + +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    + + +
    + + + author meta-field + contributor meta-field + editorial-manager meta-field + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + + + +
    +

    + +

    + +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + +

    + +

    +
    + + + () + + +
    +
    + + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +
    +
    + + +
    + +
    +
    + + +
    + + + + +
    +
    + + + + + + + + +
    + + + + + + + +
    +
    + + +
    + + + + + + + + + ouvrir + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + +

    +
    + + +

    + +

    +
    + + +

    + +

    +
    + + +

    + +

    +
    + + +
    + + + +
    + +
    + +
    +
    + + +
    + + + + + + + + + + + + + + + + +
    +

    + + + + +

    +
    + + +

    + + + + +

    +
    + +

    + + + + +

    +
    +
    +
    + + + + +

    + +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + + + + + + + + + + + + + +
    + + + + + + ouvrir + + + + + + + + + + +
    + +

    + +
    +
    + + + + + + + + + +
      + + +
    +
    + + +
      + +
    +
    + + +
  • +
    + + + + + + + + + + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + +

    +
    + +

    + +

    +
    +
    +
    + + + +

    + +

    +
    + + +

    + +

    +
    + + + + +
    + +
    +
    + + + + + + + + +

    + +

    +
    + + + + + + + + + + +

    + +

    +
    + + + + + + + + + + +

    + + firstPara + + +

    +
    + + + + +

    + + + + + + + + + +
    +
    +
    +
    +
    +

    +
    + + + + + + + + + +

    + +

    +
    +
    +
    + + + + + +
    +
    + + + + + + +
    +
    +
    + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + + + + + + +

    + +

    +
    + +
    +
      +

      + +

      +
    +
    +
    +
    +
    + + +

    + +

    +
    + + +

    + +

    +
    + + + + + + + + + + + +
    + +
    +
    + + + + + + + + + +

    + +

    +
    + + + + + + + + + + + + +
    +
    +
    +
    + + + + + + + +
    diff --git a/xsl/tei/01-tei2tei.xsl b/xsl/tei/01-tei2tei.xsl new file mode 100644 index 0000000000000000000000000000000000000000..3d5d9c4e5d60ca7472be0ad52535ffd54e5bcb6c --- /dev/null +++ b/xsl/tei/01-tei2tei.xsl @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + +
    + Index + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + + + + + + +
    + Index + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + + + + + + +
    \ No newline at end of file diff --git a/xsl/tei/02-tei2tei.xsl b/xsl/tei/02-tei2tei.xsl new file mode 100644 index 0000000000000000000000000000000000000000..eef0e4df25d6ed2bf1ff1ba9935027069f05a3bb --- /dev/null +++ b/xsl/tei/02-tei2tei.xsl @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Index + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + , + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + , + + + + + + + + + +
    \ No newline at end of file diff --git a/xsl/tei/03-tei2html.xsl b/xsl/tei/03-tei2html.xsl new file mode 100644 index 0000000000000000000000000000000000000000..f99cbab39a3034e7f09a5994da92ce5c218fa603 --- /dev/null +++ b/xsl/tei/03-tei2html.xsl @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/xsl/tei/03-tei2html_core.xsl b/xsl/tei/03-tei2html_core.xsl new file mode 100644 index 0000000000000000000000000000000000000000..be47aac536b5edef92600f7fb55bb342944738ba --- /dev/null +++ b/xsl/tei/03-tei2html_core.xsl @@ -0,0 +1,2444 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + FR + | + EN + | + ES +
    + + +
    +
    + +
    +
    + + +
    +

    + +

    + +

    + +

    +
    + + + + + + +
    +
    + +
    + +
    +
    + + + + + + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    + +
    +
    +
    + +

    + +

    +
    + +

    + +

    +
    +

    + +

    + +

    + +

    +
    + +
    +
    +
    + +
    +
    + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + + + rtl + + +
      + + + + +
    1. + + + + + + + + . + + + +
    2. +
      +
      + + + + + + + +
      +
    + +
    +
    + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + +
    + + + + + + + + + +
    + +
    + + + + + + + + + + + + +
    + +
    +
    + + +
    + +
    +
    + + + +

    + +

    +
    + + +
    + + + + + + + + + encadre + + annexe + table + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + + xref-call fn-call + + + + + + + + + + + + + +
  • + + footnote + + + + + + + + + + + + + + + +
  • +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + index-anchor + anchor + + + # + + + + + + + + + + + + + + + + + + + + +
    +
      + + + + +
    +
    +
    +
    +
    + + + + + +

    + +

    +
    + +

    + +

    +
    + + + + + + +

    + +

    +
    + +
  • + + + + +
  • +
    + +

    + +

    +
    +
    +
    + + + + + +
  • + + + + toc-floatingText + + + + + + + + + + + + + + + + + + +
      + + + + + +
    +
    +
    +
  • + +
    + + + + + + + + + +
    + + + +
    +
    + +
    +
    +
    + + + +
    +
    + + +
    + + + +
    +
    + +
    +
    +
    + + + +
    +
    + + +
    + + + +
    +
    + +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    + + + + + + +
    + + + author meta-field + + + contrib meta-field + + + funder meta-field + + + + + + + + + + + +
    + +
    +
    + + + + +
    +

    + +

    + +
    + + + +
    +
    +
    +
    + + + + + + + + + +
    + +
    +
    +
    +
    + + +

    + + + + + + + + +

    +
    + + + + + + + +
    +

    + +

    + +
    + +
    +
    +
    +
    + + + + + + +

    + +

    +
    + + + + + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +
    +
    + + + + + + + + + + + + + +
    + + + date-received meta-field + + + date-accepted meta-field + + +
    + +
    + +
    +
    + + + +
    +
    + + + + + + + + + + + +
    + +
    +
    +
    + + + + + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    + + + + + +
    +
    +
    + + + + + + + + + + +
    +
    + + CC-BY-4.0 + CC-BY-SA-4.0 + CC-BY-NC-4.0 + CC-BY-ND-4.0 + CC-BY-NC-ND-4.0 + CC-BY-NC-SA-4.0 + OpenEdition Books License + +
    +
    + + + + + + + + + + + + + + + + + + + + + + aiPolicy:default-opt-in + + + + aiPolicy:default-opt-out + + + + + + + + + + + + + + + aiPolicy:default-opt-out + + + + + + + + + + + + + + + + + true + + true + false + + + + +
    +
    + + + + + + + + +
    +
    +
    + + +
    + + + issue-id meta-field + article-id meta-field + + +
    + + + + +
    +
    + + +
    + + () +
    +
    + + +
    +
    + +
    +
    + + + +
    +
    + +
    +
    +
    + + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + + +
    + + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    + +
    +
    +
    + + + +
    +
    + +
    +
    + + + +
    +
    + + +
    +
    +
    + + +
    + + +
    +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  [+] + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    +
    + + +

    + + + + + + + +

    +
    + + +

    + + + + + + + + firstPara + + +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + +
    +

    + + + + +

    +
    + + +

    + + + + +

    +
    + +

    + + + + +

    +
    +
    +
    + +
    + + main- + + + -ann + + + + + fig-table + fig-formula + fig-ill + + + + + + + + fig-call-window + table-call-window + + + + + openFigureWindow(' + main- + + ') + + ouvrir + + + + + + + + + + + + + + + + + +
    + +
    +
    + +
    + +
    +
    +
    +
    +
    +
    + + +
    + + + + +
    + +
    +
    +
    +
    + + +
    + + + + +
    + +
    +
    +
    +
    + + + + + + +

    + +

    +
    + + + + + + + + + + + + + + + + + + + + + {following-sibling::tei:figDesc} + + + + + {following-sibling::tei:figDesc} + + + + + {following-sibling::tei:figDesc} + + + +

    + +

    +
    + + + + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + boxed-text + + + + +
    +
    + + + + + + ol + ul + + + + + + + + index- + + + + + + + + list-style-type: "– "; + + + + + + + + + + + +
  • + + + + +
  • +
    + + + + + +
    + +
    +
    + + + + + +
    + + +

    + + + + + + + + + + + +

    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    + + + + +

    + + + + + + + + + + +
    +
    + + + + +
    +
    + +
    +
    +

    +
    + + + + + + + + + + + + + + +

    + +

    +
    + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    +
    Français
    +
    Latin
    +
    + + + + + + + +
    + +
    + +
    + +
    + +
    + +
    +
    + +
    +
    + + + + + + + + + + + +
    +
    + + + + + + + + + +
    \ No newline at end of file diff --git a/xsl/tei/tei-metas2html.xsl b/xsl/tei/tei-metas2html.xsl new file mode 100644 index 0000000000000000000000000000000000000000..9cf110b5b3c638e2d6fd5232160c7bff1efcd794 --- /dev/null +++ b/xsl/tei/tei-metas2html.xsl @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + +