...
 
Commits (20)
......@@ -9,7 +9,6 @@ const output = require('./output')
const { parse } = require('plume-book-parser')
const pullAll = require('lodash/pullAll')
const {
BookTranslation,
BookComponent,
......@@ -30,9 +29,6 @@ const EpubBackend = async (
style,
) => {
try {
const bookContent = await getBookContent(bookId)
const convertedBook = parse(bookContent, style)
// Apply CSS
// TODO: to be decided where the per applications themes should live
const stylesRoot = `${__dirname}/themes`
......@@ -54,6 +50,11 @@ const EpubBackend = async (
title: bookTranslation[0].title,
identifier: bookId,
}
let bookContent = await getBookContent(bookId)
bookContent = `<span class="booktitle">${book.title}</span>${bookContent}`
const convertedBook = parse(bookContent, style)
let outcome
switch (previewer) {
default: {
......@@ -171,7 +172,6 @@ const createHTMLDocument = async (
<meta charset="UTF-8"><link rel="stylesheet" href="${stylesRoot}"/>
</head>
<body class="hyphenate" lang="en-us">
<section class="titlepage"><header><h1 class="booktitle">${book.title}</h1></header></section>
</body>
</html>`,
)
......@@ -181,8 +181,7 @@ const createHTMLDocument = async (
const $img = output(img)
const tempUri = $img.attr('src')
$img.attr('src', `/uploads/${tempUri}`)
$img.attr('src', `/var/www/plume/${tempUri}`)
})
return output
}
......
......@@ -27,7 +27,7 @@
content: "Document provisoire et confidentiel en cours de contradiction";
color: red;
white-space: pre;
font-style: italic;
}
@bottom-left {
content: counter(page);
......@@ -51,6 +51,11 @@ section.titlepage {
/*Title Page Content*/
.titlepage .footer {
string-set: frontpageFooter content(text);
visibility: hidden;
}
@page titlepage {
margin: 10mm 10mm;
......@@ -62,9 +67,9 @@ section.titlepage {
content: none;
}
@bottom-center {
content: "13, rue Cambon \2022 75100 PARIS CEDEX 01 \2022 T +33 1 42 98 95 00 \2022 www.ccomptes.fr";
font-size: 12px;
@bottom-center{
content: string(frontpageFooter);
font-size: 10pt;
position: relative;
top: -25px;
}
......@@ -91,62 +96,50 @@ section.titlepage {
}
.titlepage header {
margin-top: 250px;
background-color: white;
border-width: 2px;
border-style: solid;
position: absolute;
top: 30%;
height: 50%;
height: 500px;
width: 100%;
color: black;
padding-right: 60px;
}
.titlepage header::after {
content: "Destiné à recevoir les remarques des personnes destinataires, le présent document est provisoire et confidentiel.";
position: relative;
top: 150px;
max-width: 400px;
font-weight: bold;
margin: auto;
display: block;
.titlepage .report_type {
font-size: 20pt;
font-family: Arial;
font-size: 13px;
}
.titlepage h1 {
text-align: right;
text-transform: uppercase;
margin: 20% 16mm 20%;
font-weight: 400;
}
.titlepage h1:before {
content: "RELEVÉ D’OBSERVATIONS PROVISOIRES";
font-size: 27px;
display: block;
position: relative;
top: -108px;
font-family: Arial;
font-weight: 600;
font-weight: bold;
}
.titlepage h1:after {
content: "(Article R. 143-7 du code des juridictions financières)";
font-size: 12px;
display: block;
.law_article {
font-size: 10pt;
text-align: right;
font-family: Arial;
position: relative;
top: -206px;
text-transform: initial;
}
.booktitle {
font-size: 45px;
font-size: 28pt;
color: black;
text-align: right;
text-transform: uppercase;
font-weight: normal;
margin-top: 120px;
}
.disclaimer {
margin-left: 18%;
max-width: 66%;
font-weight: bold;
text-align: center;
font-family: Arial;
font-size: 10pt;
margin-top:30px;
}
/*********************************************************************************************************************/
/* TABLE OF CONTENT
/*********************************************************************************************************************/
......@@ -166,6 +159,10 @@ section.titlepage {
content: none;
}
@bottom-center {
content: none
}
@bottom-left-corner {
content: none;
}
......
......@@ -82,13 +82,8 @@ class PagedStyler extends Component {
<Actions onClick={this.handlePrint}>Télécharger le PDF</Actions>
<Actions onClick={this.handleDownload}>Télécharger le fichier HTML</Actions>
</PreviewToolbar>
<iframe
frameBorder="0"
id="printBook"
key={this.state.random}
src={`/paged/previewer/index.html?url=/uploads/paged/${hashed}/index.html&stylesheet=/uploads/paged/${hashed}/default.css`}
title="PagedJS"
/>
<p>La prévisualiation est temporairement désactivée,</p>
<p>Vous pouvez télécharger le PDF généré en cliquant sur "Télécharger PDF"</p>
</PreviewArea>
</Wrapper>
)
......
......@@ -132,7 +132,6 @@ const Book = props => {
onArchiveBook,
} = props
const { authors, isPublished, archived } = book
console.log('book', book)
const { canRenameBooks, canDeleteBooks, canArchiveBooks } = bookRule
return (
......
......@@ -2,5 +2,6 @@
"HELLO": "hello {name}",
"BYE": "bye",
"TABLE_OF_CONTENT" : "table of content",
"RECOMMENDATIONS": "recommendations"
"RECOMMENDATIONS": "recommendations",
"FOREWORD": "foreword"
}
\ No newline at end of file
......@@ -2,5 +2,6 @@
"HELLO": "bonjour {name}",
"BYE": "au revoir",
"TABLE_OF_CONTENT": "table des matières",
"RECOMMENDATIONS": "recommandations"
"RECOMMENDATIONS": "recommandations",
"FOREWORD": "avant-propos"
}
\ No newline at end of file
const BasicParser = require('../basicParser')
const { format } = require('editoria-i18n')
class ForewordParser extends BasicParser {
static apply(xmlDocument) {
const sectionTitle = format('FOREWORD')
xmlDocument('body').prepend(
`<section id="forewordSection" class="dedicatedPage">` +
`<h1 class="unnumbered">${sectionTitle}</h1>` +
`<div>` +
`<p>En application des dispositions des articles L. 143-1 et L. 143-0-2 du code des juridictions financières, la Cour rend publiques ses observations et ses recommandations, au terme d’une procédure contradictoire qui permet aux représentants des organismes et des administrations contrôlées, aux autorités directement concernées, notamment si elles exercent une tutelle, ainsi qu’aux personnes éventuellement mises en cause de faire connaître leur analyse.</p>` +
`<p>La divulgation prématurée, par quelque personne que ce soit, des présentes observations provisoires, qui conservent un caractère confidentiel jusqu’à l’achèvement de la procédure contradictoire, porterait atteinte à la bonne information des citoyens par la Cour. Elle exposerait en outre à des suites judiciaires l’auteur de toute divulgation dont la teneur mettrait en cause des personnes morales ou physiques ou porterait atteinte à un secret protégé par la loi.</p>` +
`</div>` +
`</section>`,
)
return xmlDocument
}
}
module.exports = ForewordParser
const BasicParser = require('./basicParser')
const BasicParser = require('../basicParser')
const { format } = require('editoria-i18n')
class RecommendationParser extends BasicParser {
......
const BasicParser = require('../basicParser')
class RiopFrontPageDataParser extends BasicParser {
static apply(xmlDocument) {
const booktitle = this.getBookTitle(xmlDocument)
return this.addFrontPageSection(xmlDocument, booktitle)
}
static getBookTitle(xmlDocument) {
const bookTitle = xmlDocument('.booktitle').text()
xmlDocument('.booktitle').remove()
return bookTitle
}
static addFrontPageSection(xmlDocument, bookTitle) {
xmlDocument('body').prepend(
`<section class="titlepage">` +
`<header>` +
`<p class="report_type">relevé d'observation provisoires</p>` +
`<p class="law_article">(Article R. 143-7 du code des juridictions financières)</p>` +
`<h1 class="booktitle">${bookTitle}</h1>` +
`</header>` +
`<p class="disclaimer">Destiné à recevoir les remarques des personnes destinataires, le présent document est provisoire et confidentiel.</p>` +
`<p class="footer">` +
`<span class="adress">13, rue Cambon 75100 PARIS CEDEX 01</span>` +
`<span class="phone_number">+33 1 42 98 95 00</span>` +
`<span class="website_url">www.ccomptes.fr</span>` +
`</p>` +
`</section>`,
)
return xmlDocument
}
}
module.exports = RiopFrontPageDataParser
......@@ -27,6 +27,10 @@ class CleanUpTagParser extends BasicParser {
changedXmlDoc = CleanUpTagParser.replace(changedXmlDoc, 'epigraph-prose', 'blockquote', 'sep')
changedXmlDoc = CleanUpTagParser.replace(changedXmlDoc, 'comment', 'span', 'comment')
// remove unused block
changedXmlDoc = CleanUpTagParser.remove(changedXmlDoc, 'container[id*="caption-image"]')
return changedXmlDoc
}
......@@ -43,6 +47,11 @@ class CleanUpTagParser extends BasicParser {
})
return xmlDocument
}
static remove(xmlDocument, selector) {
xmlDocument(selector).remove()
return xmlDocument
}
}
module.exports = CleanUpTagParser
......@@ -2,7 +2,7 @@ const BasicParser = require('./basicParser')
const { format } = require('editoria-i18n')
class TableOfContentParser extends BasicParser {
static apply (xmlDocument) {
static apply(xmlDocument) {
xmlDocument = TableOfContentParser.addHeadingNumberingAndId(xmlDocument)
const extractedHeadings = TableOfContentParser.extractHeadings(xmlDocument)
return TableOfContentParser.addTableOfContent(extractedHeadings, xmlDocument)
......@@ -16,7 +16,10 @@ class TableOfContentParser extends BasicParser {
heading.attr('id', `heading-${i}`)
if (!heading.hasClass('unnumbered')) {
const headingLevel = `level-${heading.prop('tagName')}`
const numberingObj = TableOfContentParser.getHeadingNumber(counters, headingLevel)
const numberingObj = TableOfContentParser.getHeadingNumber(
counters,
headingLevel,
)
const titleNumbering = numberingObj.titleNumbering
counters = numberingObj.newCounters
heading.prepend(`<span class="headingNb">${titleNumbering}</span>`)
......@@ -35,14 +38,14 @@ class TableOfContentParser extends BasicParser {
return extractedData
}
static addTableOfContent (headings, xmlDocument) {
static addTableOfContent(headings, xmlDocument) {
const sectionId = 'tableOfContentSection'
const sectionTitle = format('TABLE_OF_CONTENT')
xmlDocument('body').prepend(
`<section id="${sectionId}" class="dedicatedPage">` +
`<h1 class="unnumbered">${sectionTitle}</h1>` +
`<ol></ol>` +
`</section>`
`</section>`,
)
for (let i = 0; i < headings.length; i++) {
const heading = xmlDocument(headings[i])
......
const RecommendationParser = require('../../elements/recommendationParser')
const RecommendationParser = require('../../elements/ccomptes/recommendationParser')
const ForewordParser = require('../../elements/ccomptes/forewordParser')
const RiopFrontPageDataParser = require('../../elements/ccomptes/riopFrontPageDataParser')
const CleanUpTagParser = require('../../elements/cleanUpTagParser')
const TableOfContentParser = require('../../elements/tableOfContentParser')
const FootNoteParser = require('../../elements/footnoteParser')
......@@ -8,6 +10,8 @@ function RIOPParser (xmlDocument) {
xmlDocument = CleanUpTagParser.apply(xmlDocument)
xmlDocument = RecommendationParser.apply(xmlDocument)
xmlDocument = TableOfContentParser.apply(xmlDocument)
xmlDocument = ForewordParser.apply(xmlDocument)
xmlDocument = RiopFrontPageDataParser.apply(xmlDocument)
xmlDocument = FootNoteParser.apply(xmlDocument)
return xmlDocument
}
......
const ForewordParser = require('../../../elements/ccomptes/forewordParser')
const { txtToXml, xmlToTxt } = require('../../../parser')
test('add forevord to book', () => {
const xmlDoc = txtToXml(
'<html><head></head><body></body></html>',
)
const expectedXML =
'<html>' +
'<head></head>' +
'<body>' +
'<section id="forewordSection" class="dedicatedPage">' +
'<h1 class="unnumbered">foreword</h1>' +
'<div>' +
'<p>En application des dispositions des articles L. 143-1 et L. 143-0-2 du code des juridictions financi&#xE8;res, la Cour rend publiques ses observations et ses recommandations, au terme d&#x2019;une proc&#xE9;dure contradictoire qui permet aux repr&#xE9;sentants des organismes et des administrations contr&#xF4;l&#xE9;es, aux autorit&#xE9;s directement concern&#xE9;es, notamment si elles exercent une tutelle, ainsi qu&#x2019;aux personnes &#xE9;ventuellement mises en cause de faire conna&#xEE;tre leur analyse.</p>' +
'<p>La divulgation pr&#xE9;matur&#xE9;e, par quelque personne que ce soit, des pr&#xE9;sentes observations provisoires, qui conservent un caract&#xE8;re confidentiel jusqu&#x2019;&#xE0; l&#x2019;ach&#xE8;vement de la proc&#xE9;dure contradictoire, porterait atteinte &#xE0; la bonne information des citoyens par la Cour. Elle exposerait en outre &#xE0; des suites judiciaires l&#x2019;auteur de toute divulgation dont la teneur mettrait en cause des personnes morales ou physiques ou porterait atteinte &#xE0; un secret prot&#xE9;g&#xE9; par la loi.</p>' +
'</div>' +
'</section>' +
'</body>' +
'</html>'
const changedXML = ForewordParser.apply(xmlDoc)
expect(xmlToTxt(changedXML)).toEqual(expectedXML)
})
const RecommendationParser = require('../../elements/recommendationParser')
const { txtToXml, xmlToTxt } = require('./../../parser')
const RecommendationParser = require('../../../elements/ccomptes/recommendationParser')
const { txtToXml, xmlToTxt } = require('../../../parser')
test('extract recommendation element from document', () => {
const xmlDoc = txtToXml(
......
const RiopFrontPageDataParser = require('../../../elements/ccomptes/riopFrontPageDataParser')
const { txtToXml, xmlToTxt } = require('../../../parser')
test('add forevord to book', () => {
const xmlDoc = txtToXml(
'<html><head></head><body><span class="booktitle">BookTitle</span></body></html>',
)
const expectedXML =
'<html>' +
'<head></head>' +
'<body>' +
'<section class="titlepage">' +
'<header>' +
'<p class="report_type">relev&#xE9; d&apos;observation provisoires</p>' +
'<p class="law_article">(Article R. 143-7 du code des juridictions financi&#xE8;res)</p>' +
'<h1 class="booktitle">BookTitle</h1>' +
'</header>' +
'<p class="disclaimer">Destin&#xE9; &#xE0; recevoir les remarques des personnes destinataires, le pr&#xE9;sent document est provisoire et confidentiel.</p>' +
'<p class="footer">' +
'<span class="adress">13, rue Cambon 75100 PARIS CEDEX 01</span>' +
'<span class="phone_number">+33 1 42 98 95 00</span>' +
'<span class="website_url">www.ccomptes.fr</span>' +
'</p>' +
'</section>' +
'</body>' +
'</html>'
const changedXML = RiopFrontPageDataParser.apply(xmlDoc)
expect(xmlToTxt(changedXML)).toEqual(expectedXML)
})
......@@ -6,6 +6,7 @@ test('convert to RIOP ', () => {
'<html>' +
'<head></head>' +
'<body>' +
'<span class="booktitle">BookTitle</span>' +
'<bookstore>' +
'<book>' +
'<h1>Everyday Italian</h1>' +
......@@ -36,6 +37,26 @@ test('convert to RIOP ', () => {
'<html>' +
'<head></head>' +
'<body>' +
'<section class="titlepage">' +
'<header>' +
'<p class="report_type">relev&#xE9; d&apos;observation provisoires</p>' +
'<p class="law_article">(Article R. 143-7 du code des juridictions financi&#xE8;res)</p>' +
'<h1 class="booktitle">BookTitle</h1>' +
'</header>' +
'<p class="disclaimer">Destin&#xE9; &#xE0; recevoir les remarques des personnes destinataires, le pr&#xE9;sent document est provisoire et confidentiel.</p>' +
'<p class="footer">' +
'<span class="adress">13, rue Cambon 75100 PARIS CEDEX 01</span>' +
'<span class="phone_number">+33 1 42 98 95 00</span>' +
'<span class="website_url">www.ccomptes.fr</span>' +
'</p>' +
'</section>' +
'<section id="forewordSection" class="dedicatedPage">' +
'<h1 class="unnumbered">foreword</h1>' +
'<div>' +
'<p>En application des dispositions des articles L. 143-1 et L. 143-0-2 du code des juridictions financi&#xE8;res, la Cour rend publiques ses observations et ses recommandations, au terme d&#x2019;une proc&#xE9;dure contradictoire qui permet aux repr&#xE9;sentants des organismes et des administrations contr&#xF4;l&#xE9;es, aux autorit&#xE9;s directement concern&#xE9;es, notamment si elles exercent une tutelle, ainsi qu&#x2019;aux personnes &#xE9;ventuellement mises en cause de faire conna&#xEE;tre leur analyse.</p>' +
'<p>La divulgation pr&#xE9;matur&#xE9;e, par quelque personne que ce soit, des pr&#xE9;sentes observations provisoires, qui conservent un caract&#xE8;re confidentiel jusqu&#x2019;&#xE0; l&#x2019;ach&#xE8;vement de la proc&#xE9;dure contradictoire, porterait atteinte &#xE0; la bonne information des citoyens par la Cour. Elle exposerait en outre &#xE0; des suites judiciaires l&#x2019;auteur de toute divulgation dont la teneur mettrait en cause des personnes morales ou physiques ou porterait atteinte &#xE0; un secret prot&#xE9;g&#xE9; par la loi.</p>' +
'</div>' +
'</section>' +
'<section id="tableOfContentSection" class="dedicatedPage">' +
'<h1 class="unnumbered">table of content</h1>' +
'<ol>' +
......@@ -78,4 +99,4 @@ test('convert to RIOP ', () => {
const changedXML = xmlToTxt(RIOPParser(xml))
expect(changedXML).toEqual(expectedXML)
})
})
\ No newline at end of file