fix #4319 et correction (à améliorer) des problèmes liés aux \n présents dans le fichier source

This commit is contained in:
NicolasLACROIX 2019-10-26 15:01:43 +02:00
parent c37adc36b4
commit 74b204aa33
3 changed files with 294 additions and 201 deletions

View File

@ -14,10 +14,49 @@ import org.apache.pdfbox.pdmodel.font.PDType1Font;
import config.Config; import config.Config;
import config.Question; import config.Question;
// infor concernant strok, fill, ... : https://stackoverflow.com/a/27959484 // infos concernant strok, fill, ... : https://stackoverflow.com/a/27959484
// TODO: voir ouverture puis fermeture de stream dans chaque méthode
// ou ouverture de stream à l'instanciation puis fermeture dans save
public class SubjectGenerator { public class SubjectGenerator {
private Config config;
private PDDocument pdDocument;
public SubjectGenerator(Config c, PDDocument doc) {
this.config = c;
this.pdDocument = doc;
}
public SubjectGenerator(Config c, int nbPages, PDRectangle format) {
this.config = c;
this.pdDocument = new PDDocument();
for (int i = 0; i < nbPages; i++) {
this.pdDocument.addPage(new PDPage(format));
}
}
public SubjectGenerator() {
this(null, null);
}
public Config getConfig() {
return this.config;
}
public void setConfig(Config config) {
this.config = config;
}
public PDDocument getPdDocument() {
return this.pdDocument;
}
public void setPdDocument(PDDocument pdDocument) {
this.pdDocument = pdDocument;
}
private static void drawDotedLine(PDPageContentStream contentStream, int xi, int yi, int xf, int yf) private static void drawDotedLine(PDPageContentStream contentStream, int xi, int yi, int xf, int yf)
throws IOException { throws IOException {
contentStream.moveTo(xi, yi); contentStream.moveTo(xi, yi);
@ -40,13 +79,13 @@ public class SubjectGenerator {
contentStream.fill(); contentStream.fill();
} }
public static PDDocument generateFooter(PDDocument pdDocument) { public void generateFooter() {
int nbTotal = pdDocument.getNumberOfPages(); int nbTotal = this.pdDocument.getNumberOfPages();
int count = 1; int count = 1;
try { try {
for (PDPage page : pdDocument.getPages()) { for (PDPage page : this.pdDocument.getPages()) {
PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, page, PDPageContentStream pdPageContentStream = new PDPageContentStream(this.pdDocument, page,
PDPageContentStream.AppendMode.APPEND, true); PDPageContentStream.AppendMode.APPEND, true);
PDFont font = PDType1Font.TIMES_ROMAN; PDFont font = PDType1Font.TIMES_ROMAN;
int width = (int) page.getMediaBox().getWidth(); int width = (int) page.getMediaBox().getWidth();
@ -65,14 +104,14 @@ public class SubjectGenerator {
} catch (IOException ioe) { } catch (IOException ioe) {
ioe.printStackTrace(); ioe.printStackTrace();
} }
return pdDocument;
} }
public static PDDocument generateMarks(PDDocument pdDocument) { public void generateMarks() {
for (PDPage page : pdDocument.getPages()) { // TODO: divide generateMarks to avoid header's generation for all pages
// the header part should be added to generateHeader
for (PDPage page : this.pdDocument.getPages()) {
try { try {
PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, page, PDPageContentStream pdPageContentStream = new PDPageContentStream(this.pdDocument, page,
PDPageContentStream.AppendMode.APPEND, true); PDPageContentStream.AppendMode.APPEND, true);
PDFont font = PDType1Font.TIMES_ROMAN; PDFont font = PDType1Font.TIMES_ROMAN;
@ -174,19 +213,16 @@ public class SubjectGenerator {
ioe.printStackTrace(); ioe.printStackTrace();
} }
} }
return pdDocument;
} }
/* /*
* public static PDDocument generateIDPageArea(PDDocument pdDocument) { * public static PDDocument generateIDPageArea(PDDocument pdDocument) { }
*
* }
*/ */
public static PDDocument generateNameArea(PDDocument pdDocument) { public void generateNameArea() {
try { try {
PDPage page = pdDocument.getPage(0); PDPage page = this.pdDocument.getPage(0);
PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, page, PDPageContentStream pdPageContentStream = new PDPageContentStream(this.pdDocument, page,
PDPageContentStream.AppendMode.APPEND, true); PDPageContentStream.AppendMode.APPEND, true);
PDFont font = PDType1Font.TIMES_ROMAN; PDFont font = PDType1Font.TIMES_ROMAN;
@ -224,13 +260,12 @@ public class SubjectGenerator {
} catch (IOException ioe) { } catch (IOException ioe) {
ioe.printStackTrace(); ioe.printStackTrace();
} }
return pdDocument;
} }
public static PDDocument generateNumEtudAreaBis(PDDocument pdDocument) { public void generateNumEtudAreaBis() {
try { try {
PDPage page = pdDocument.getPage(0); PDPage page = this.pdDocument.getPage(0);
PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, page, PDPageContentStream pdPageContentStream = new PDPageContentStream(this.pdDocument, page,
PDPageContentStream.AppendMode.APPEND, true); PDPageContentStream.AppendMode.APPEND, true);
PDFont font = PDType1Font.TIMES_ROMAN; PDFont font = PDType1Font.TIMES_ROMAN;
@ -268,13 +303,12 @@ public class SubjectGenerator {
} catch (IOException ioe) { } catch (IOException ioe) {
ioe.printStackTrace(); ioe.printStackTrace();
} }
return pdDocument;
} }
public static PDDocument generateNumEtudArea(PDDocument pdDocument) { public void generateNumEtudArea() {
try { try {
PDPage page = pdDocument.getPage(0); PDPage page = this.pdDocument.getPage(0);
PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, page, PDPageContentStream pdPageContentStream = new PDPageContentStream(this.pdDocument, page,
PDPageContentStream.AppendMode.APPEND, true); PDPageContentStream.AppendMode.APPEND, true);
PDFont font = PDType1Font.TIMES_ROMAN; PDFont font = PDType1Font.TIMES_ROMAN;
@ -307,36 +341,38 @@ public class SubjectGenerator {
} catch (IOException ioe) { } catch (IOException ioe) {
ioe.printStackTrace(); ioe.printStackTrace();
} }
return pdDocument;
} }
public void generateHeader(PDDocument pdDocument) { public void generateHeader() {
try { try {
PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, pdDocument.getPage(0)); PDPageContentStream pdPageContentStream = new PDPageContentStream(this.pdDocument,
this.pdDocument.getPage(0));
PDFont font = PDType1Font.HELVETICA_BOLD; PDFont font = PDType1Font.HELVETICA_BOLD;
} catch (IOException ioe) { } catch (IOException ioe) {
ioe.printStackTrace(); ioe.printStackTrace();
} }
} }
public static PDDocument generateBody(PDDocument pdDocument) { public void generateBody() {
try { try {
PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, pdDocument.getPage(0), PDPageContentStream pdPageContentStream = new PDPageContentStream(this.pdDocument,
PDPageContentStream.AppendMode.APPEND, true); this.pdDocument.getPage(0), PDPageContentStream.AppendMode.APPEND, true);
PDFont font = PDType1Font.HELVETICA_BOLD; PDFont font = PDType1Font.HELVETICA_BOLD;
// Boucle sur les questions // Boucle sur les questions
int qIndex = 1; int qIndex = 1;
int heightOffset = 265; int heightOffset = 265;
int pageIndex = 0; int pageIndex = 0;
for (Question q : Config.getQuestions()) { System.out.println(this.config.getQuestions());
int height = (int) pdDocument.getPage(0).getMediaBox().getHeight(); for (Question q : this.config.getQuestions()) {
PDPage page = pdDocument.getPage(pageIndex); q.setTitre(q.getTitre().replace("\n", "")); // /\ TODO: must be done in Config /\
SubjectGenerator.generateQ(q, qIndex, pdDocument, page, 25, heightOffset); int height = (int) this.pdDocument.getPage(0).getMediaBox().getHeight();
PDPage page = this.pdDocument.getPage(pageIndex);
this.generateQ(q, qIndex, this.pdDocument, page, 25, heightOffset);
qIndex++; qIndex++;
heightOffset += 100; heightOffset += 100;
if (heightOffset > height - 10) { if (heightOffset > (height - 10)) {
heightOffset = 265; heightOffset = 265;
pageIndex++; pageIndex++;
} }
@ -348,19 +384,17 @@ public class SubjectGenerator {
catch (IOException ioe) { catch (IOException ioe) {
ioe.printStackTrace(); ioe.printStackTrace();
} }
return pdDocument;
} }
public static void generateQ(Question q, int qIndex, PDDocument pdDocument, PDPage curPage, int widthOffset, int heightOffset) { public void generateQ(Question q, int qIndex, PDDocument pdDocument, PDPage curPage, int widthOffset,
int heightOffset) {
try { try {
// Il faut rendre plus générale la génération des Q (en fonction du nombre de réponses, recycler le heightOffset) // Il faut rendre plus générale la génération des Q (en fonction du nombre de
// réponses, recycler le heightOffset)
int width = (int) pdDocument.getPage(0).getMediaBox().getWidth(); int width = (int) pdDocument.getPage(0).getMediaBox().getWidth();
int height = (int) pdDocument.getPage(0).getMediaBox().getHeight(); int height = (int) pdDocument.getPage(0).getMediaBox().getHeight();
PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, curPage, PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, curPage,
PDPageContentStream.AppendMode.APPEND, true); PDPageContentStream.AppendMode.APPEND, true);
PDFont font = PDType1Font.TIMES_ROMAN; PDFont font = PDType1Font.TIMES_ROMAN;
@ -368,12 +402,12 @@ public class SubjectGenerator {
pdPageContentStream.setFont(font, fontSize); pdPageContentStream.setFont(font, fontSize);
float titleLength = (font.getStringWidth(q.getTitre()) / 1000) * fontSize; float titleLength = (font.getStringWidth(q.getTitre()) / 1000) * fontSize;
System.out.println(qIndex + ". " + q.getTitre() + " - Width: " + titleLength + "/" + width + " - " + height + " - NbRep: " + q.getReponses().size() + "\n"); System.out.println(qIndex + ". " + q.getTitre() + " - Width: " + titleLength + "/" + width + " - " + height
+ " - NbRep: " + q.getReponses().size() + "\n");
// Titre // Titre
// Si titre plus long que largeur page -> mise sur plusieurs lignes // Si titre plus long que largeur page -> mise sur plusieurs lignes
if (titleLength > width - 20) { if (titleLength > (width - 20)) {
pdPageContentStream.beginText(); pdPageContentStream.beginText();
pdPageContentStream.newLineAtOffset(widthOffset, height - heightOffset); pdPageContentStream.newLineAtOffset(widthOffset, height - heightOffset);
pdPageContentStream.showText("Q." + qIndex + " -"); pdPageContentStream.showText("Q." + qIndex + " -");
@ -394,14 +428,10 @@ public class SubjectGenerator {
pdPageContentStream.endText(); pdPageContentStream.endText();
} }
// Reponses (QCM) // Reponses (QCM)
/// Rectangle /// Rectangle
//pdPageContentStream.addRect(widthOffset + 20, height - heightOffset - 15, 100, 100); // pdPageContentStream.addRect(widthOffset + 20, height - heightOffset - 15,
// 100, 100);
/// Texte /// Texte
for (int i = 0; i < q.getReponses().size(); i++) { for (int i = 0; i < q.getReponses().size(); i++) {
@ -414,26 +444,24 @@ public class SubjectGenerator {
pdPageContentStream.close(); pdPageContentStream.close();
/* /*
pdPageContentStream.beginText(); * pdPageContentStream.beginText(); pdPageContentStream.newLineAtOffset(80 + (22
pdPageContentStream.newLineAtOffset(80 + (22 * i) + 12, height - 105); * * i) + 12, height - 105); pdPageContentStream.showText(String.valueOf(i));
pdPageContentStream.showText(String.valueOf(i)); * pdPageContentStream.endText(); // draw second range of rectangles
pdPageContentStream.endText(); * pdPageContentStream.addRect(80 + (22 * i), height - 124, 11, 11); // write
// draw second range of rectangles * second range of numbers pdPageContentStream.beginText();
pdPageContentStream.addRect(80 + (22 * i), height - 124, 11, 11); * pdPageContentStream.newLineAtOffset(80 + (22 * i) + 12, height - 122);
// write second range of numbers * pdPageContentStream.showText(String.valueOf(i));
pdPageContentStream.beginText(); * pdPageContentStream.endText();
pdPageContentStream.newLineAtOffset(80 + (22 * i) + 12, height - 122); */
pdPageContentStream.showText(String.valueOf(i));
pdPageContentStream.endText();*/
} catch (IOException ioe) { } catch (IOException ioe) {
ioe.printStackTrace(); ioe.printStackTrace();
} }
} }
public static ArrayList<String> setTextOnMultLines (String text, int widthOffset, PDDocument pdDocument, PDFont font, int fontSize){ public static ArrayList<String> setTextOnMultLines(String text, int widthOffset, PDDocument pdDocument, PDFont font,
int fontSize) {
// TODO: voir si l'on laisse en static ou non
int width = (int) pdDocument.getPage(0).getMediaBox().getWidth(); int width = (int) pdDocument.getPage(0).getMediaBox().getWidth();
float subStrLength = 0; float subStrLength = 0;
@ -442,18 +470,21 @@ public class SubjectGenerator {
int lastSpace = -2; int lastSpace = -2;
int spaceIndex = 0; int spaceIndex = 0;
while (text.length() > 0) { while (text.length() > 0) {
//System.out.println("1. Si: " + spaceIndex + " - Ls: " + lastSpace + " TxtL: " + text.length()); // System.out.println("1. Si: " + spaceIndex + " - Ls: " + lastSpace + " TxtL: "
// + text.length());
spaceIndex = text.indexOf(' ', lastSpace + 2); spaceIndex = text.indexOf(' ', lastSpace + 2);
//System.out.println("2. Si: " + spaceIndex + " - Ls: " + lastSpace + " : " + text + "\n"); // System.out.println("2. Si: " + spaceIndex + " - Ls: " + lastSpace + " : " +
// text + "\n");
String subStr = ""; String subStr = "";
//System.out.println("1. SubL: " + subStrLength + " - W: " + (width - widthOffset)); // System.out.println("1. SubL: " + subStrLength + " - W: " + (width -
// widthOffset));
if (spaceIndex == -1) { if (spaceIndex == -1) {
lines.add(text); lines.add(text);
text = ""; text = "";
} } else {
else
subStr = text.substring(0, spaceIndex); subStr = text.substring(0, spaceIndex);
}
try { try {
subStrLength = (font.getStringWidth(subStr) / 1000) * fontSize; subStrLength = (font.getStringWidth(subStr) / 1000) * fontSize;
@ -461,13 +492,16 @@ public class SubjectGenerator {
System.err.print(ioe.getMessage()); System.err.print(ioe.getMessage());
} }
//System.out.println("2. SubL: " + subStrLength + " - W: " + (width - widthOffset)); // System.out.println("2. SubL: " + subStrLength + " - W: " + (width -
// widthOffset));
if (subStrLength > width - widthOffset - widthMargin) { if (subStrLength > (width - widthOffset - widthMargin)) {
if (lastSpace > 0) if (lastSpace > 0) {
lastSpace = spaceIndex; lastSpace = spaceIndex;
}
//System.out.println("[IF] SubL: " + subStrLength + " - W: " + (width - widthOffset)); // System.out.println("[IF] SubL: " + subStrLength + " - W: " + (width -
// widthOffset));
subStr = text.substring(0, lastSpace); subStr = text.substring(0, lastSpace);
lines.add(subStr); lines.add(subStr);
text = text.substring(lastSpace).trim(); text = text.substring(lastSpace).trim();
@ -485,37 +519,47 @@ public class SubjectGenerator {
return lines; return lines;
} }
public void save(String dest) {
try {
this.pdDocument.save(dest);
this.pdDocument.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
public static void main(String args[]) throws IOException { public static void main(String args[]) throws IOException {
// Create a Document object. // config initialization
PDDocument pdDocument = new PDDocument(); // Config c = new Config("E:\\sourceB.txt"); // SourceB ne contient aucun '\n'
// Create a Page object Config c = new Config("E:\\source.txt");
PDPage pdPage1 = new PDPage(PDRectangle.A4);
// System.out.println("Height : " + pdPage1.getMediaBox().getHeight());
// System.out.println("Width : " + pdPage1.getMediaBox().getWidth());
PDPage pdPage2 = new PDPage(PDRectangle.A4);
PDPage pdPage3 = new PDPage(PDRectangle.A4);
PDPage pdPage4 = new PDPage(PDRectangle.A4);
PDPage pdPage5 = new PDPage(PDRectangle.A4);
// Add the page to the document and save the document to a desired file.
pdDocument.addPage(pdPage1);
pdDocument.addPage(pdPage2);
pdDocument.addPage(pdPage3);
pdDocument.addPage(pdPage4);
pdDocument.addPage(pdPage5);
Config c = new Config("E:\\sourceB.txt"); // SourceB ne contient auucn '\n'
c.readConfig(); c.readConfig();
// Create a Document object.
/**
* PDDocument pdDocument = new PDDocument(); // Create a Page object PDPage
* pdPage1 = new PDPage(PDRectangle.A4); // System.out.println("Height : " +
* pdPage1.getMediaBox().getHeight()); // System.out.println("Width : " +
* pdPage1.getMediaBox().getWidth()); PDPage pdPage2 = new
* PDPage(PDRectangle.A4); PDPage pdPage3 = new PDPage(PDRectangle.A4); PDPage
* pdPage4 = new PDPage(PDRectangle.A4); PDPage pdPage5 = new
* PDPage(PDRectangle.A4);
*
* // Add the page to the document pdDocument.addPage(pdPage1);
* pdDocument.addPage(pdPage2); pdDocument.addPage(pdPage3);
* pdDocument.addPage(pdPage4); pdDocument.addPage(pdPage5);
*/
pdDocument = SubjectGenerator.generateMarks(pdDocument); // instanciate a new SubjectGenerator
pdDocument = SubjectGenerator.generateNumEtudAreaBis(pdDocument); // TODO: change PDRectangle.A4 to the format specified in the config
pdDocument = SubjectGenerator.generateNameArea(pdDocument); SubjectGenerator subjectGenerator = new SubjectGenerator(c, 5, PDRectangle.A4);
pdDocument = SubjectGenerator.generateFooter(pdDocument);
pdDocument = SubjectGenerator.generateBody(pdDocument); subjectGenerator.generateMarks();
subjectGenerator.generateNumEtudAreaBis();
subjectGenerator.generateNameArea();
subjectGenerator.generateFooter();
subjectGenerator.generateBody();
subjectGenerator.save("E:\\testPDFMarks.pdf");
// pdDocument.save("C:\\Users\\Nico\\Desktop\\testPDFMarks.pdf");
pdDocument.save("E:\\testPDFMarks.pdf");
pdDocument.close();
System.out.println("PDF saved to the location !!!"); System.out.println("PDF saved to the location !!!");
} }
} }

View File

@ -1,9 +1,12 @@
package config; package config;
import java.io.*; import java.io.File;
import java.util.*; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
public class Config { public class Config {
private HashMap<String, String> param = new HashMap<String, String>(); // Hashmap des parametres de config, Key = private HashMap<String, String> param = new HashMap<String, String>(); // Hashmap des parametres de config, Key =
// nom paramn, // nom paramn,
private ArrayList<Question> questions = new ArrayList<Question>(); private ArrayList<Question> questions = new ArrayList<Question>();
@ -12,7 +15,7 @@ public class Config {
// Getters et setters // Getters et setters
public HashMap<String, String> getParam() { public HashMap<String, String> getParam() {
return param; return this.param;
} }
public void setParam(HashMap<String, String> param) { public void setParam(HashMap<String, String> param) {
@ -20,7 +23,7 @@ public class Config {
} }
public ArrayList<Question> getQuestions() { public ArrayList<Question> getQuestions() {
return questions; return this.questions;
} }
public void setQuestions(ArrayList<Question> questions) { public void setQuestions(ArrayList<Question> questions) {
@ -36,34 +39,54 @@ public class Config {
} }
} }
public static String clearString(String string) {
// Sources :
// https://howtodoinjava.com/regex/java-clean-ascii-text-non-printable-chars/
// https://stackoverflow.com/a/52559280
// https://docs.oracle.com/javase/10/docs/api/java/lang/String.html#trim()
// https://stackoverflow.com/a/33724262
// strips off all non-ASCII characters
string = string.replace("\n", "");
string = string.replaceAll("[^\\x00-\\xFF]", " ");
// erases all the ASCII control characters
string = string.replaceAll("[\\p{Cntrl}&&[^\r\n\t]]", "");
// removes non-printable characters from Unicode
string = string.replaceAll("\\p{C}", "");
return string.trim(); // trim() : eliminates leading and trailing spaces
}
public Config(String s) { public Config(String s) {
// Constructeur, prend en parametre le chemin vers le fichier source // Constructeur, prend en parametre le chemin vers le fichier source
source = s; this.source = s;
// Initialisation des parametres avec les valeurs par défaut. // Initialisation des parametres avec les valeurs par défaut.
// Les élements avec des placeholders en valeur sont des élements qui ne servent // Les élements avec des placeholders en valeur sont des élements qui ne servent
// pas pour le moment // pas pour le moment
param.put("PaperSize", "A4"); // A3 A4 A5 letter this.param.put("PaperSize", "A4"); // A3 A4 A5 letter
param.put("Title", "Placeholder"); // titre de l exam this.param.put("Title", "Placeholder"); // titre de l exam
param.put("Presentation", "Placeholder"); // texte de consignes this.param.put("Presentation", "Placeholder"); // texte de consignes
param.put("DocumentModel", "PlaceHolder"); // nom du fichier du modéle this.param.put("DocumentModel", "PlaceHolder"); // nom du fichier du modéle
param.put("ShuffleQuestions", "1"); // 1 = qt mélangées, 0 = non mél this.param.put("ShuffleQuestions", "1"); // 1 = qt mélangées, 0 = non mél
param.put("ShuffleAnswers", "1"); // 1= proposition rép mélangées, 0= non this.param.put("ShuffleAnswers", "1"); // 1= proposition rép mélangées, 0= non
param.put("Code", "8"); // code étudiant = 8 chiffres (entre 1 et 16) this.param.put("Code", "8"); // code étudiant = 8 chiffres (entre 1 et 16)
param.put("MarkFormat", "20"); // expl "20" pour des notes entre 0 et 20 notées é 0.25 points this.param.put("MarkFormat", "20"); // expl "20" pour des notes entre 0 et 20 notées é 0.25 points
param.put("NameField", "Nom et Prénom"); // remplace le texte this.param.put("NameField", "Nom et Prénom"); // remplace le texte
param.put("StudentField", this.param.put("StudentField",
"Veuillez coder votre numéro\r\n d'étudiant ci-contre et écrire votre nom \r\n dans la case ci-dessous"); "Veuillez coder votre numéro\r\n d'étudiant ci-contre et écrire votre nom \r\n dans la case ci-dessous");
// sert à remplacer le petit texte qui demande de coder son numéro déétudiant et // sert à remplacer le petit texte qui demande de coder son numéro déétudiant et
// inscrire son nom // inscrire son nom
param.put("MarkField", "Veuillez coder le numéro de l'étudiant"); this.param.put("MarkField", "Veuillez coder le numéro de l'étudiant");
param.put("SeparateAnswerSheet", "1"); // si 1 = feuille de réponse séparée. this.param.put("SeparateAnswerSheet", "1"); // si 1 = feuille de réponse séparée.
param.put("AnswerSheetTitle", "Title"); // titre é inscrire en tete de la feuille de rép this.param.put("AnswerSheetTitle", "Title"); // titre é inscrire en tete de la feuille de rép
param.put("AnswerSheetPresentation", "Presentation"); // Donne le texte de présentation de la feuille de réponse this.param.put("AnswerSheetPresentation", "Presentation"); // Donne le texte de présentation de la feuille de
param.put("SingleSided", "Placeholder");// si valeur = 1, aucune page blanche entre feuille de sujet et de
// réponse // réponse
param.put("DefaultScoringS", "Placeholder");// Donne le baréme par défaut pour les questions simples this.param.put("SingleSided", "Placeholder");// si valeur = 1, aucune page blanche entre feuille de sujet et de
param.put("DefaultScoringM", "Placeholder");// Donne le baréme par défaut pour les questions é choix multiple // réponse
param.put("QuestionBlocks", "Placeholder");// prend 0 pour valeur pour permettre é la boite d'une question boite this.param.put("DefaultScoringS", "Placeholder");// Donne le baréme par défaut pour les questions simples
this.param.put("DefaultScoringM", "Placeholder");// Donne le baréme par défaut pour les questions é choix
// multiple
this.param.put("QuestionBlocks", "Placeholder");// prend 0 pour valeur pour permettre é la boite d'une question
// boite
// d'etre coupé sur plusieurs pages, prend 1 sinon // d'etre coupé sur plusieurs pages, prend 1 sinon
} }
@ -76,15 +99,16 @@ public class Config {
// questions. // questions.
// Gestion de questions mais actuellement inutile pour le programme // Gestion de questions mais actuellement inutile pour le programme
try { try {
Scanner scan = new Scanner(new File(source), "UTF-8"); Scanner scan = new Scanner(new File(this.source), "UTF-8");
String ligne; String ligne;
Question q; Question q;
ligne = scan.nextLine(); ligne = scan.nextLine();
// ligne pour gerer le code FEFF en UTF-8 BOM qui peut apparaitre si le fichier // ligne pour gerer le code FEFF en UTF-8 BOM qui peut apparaitre si le fichier
// txt est edité avec windows notepad // txt est edité avec windows notepad
// ce caractere apparait uniquement en debut de fichier // ce caractere apparait uniquement en debut de fichier
if (ligne.startsWith("\uFEFF")) if (ligne.startsWith("\uFEFF")) {
ligne = ligne.substring(1); ligne = ligne.substring(1);
}
while (scan.hasNext() || !ligne.isEmpty() || ligne.equals(System.lineSeparator())) { while (scan.hasNext() || !ligne.isEmpty() || ligne.equals(System.lineSeparator())) {
if (!ligne.equals("")) { if (!ligne.equals("")) {
if (!(ligne.substring(0, 1).equals("#"))) // si ligne commence par un # c'est un commentaire, donc if (!(ligne.substring(0, 1).equals("#"))) // si ligne commence par un # c'est un commentaire, donc
@ -93,26 +117,27 @@ public class Config {
{ {
if (ligne.substring(0, 1).equals("*")) // si ligne commence par une *, c'est une question if (ligne.substring(0, 1).equals("*")) // si ligne commence par une *, c'est une question
{ {
q = makeQuestion(ligne); q = this.makeQuestion(Config.clearString(ligne));
ligne = scan.nextLine(); // on scan la prochaine ligne ligne = scan.nextLine();
while (!ligne.equals("")) // tant que la ligne n'est pas vide, on lit la suite qui est while (!ligne.equals("")) // tant que la ligne n'est pas vide, on lit la suite qui est
// supposé // supposée
// etre les reponses // etre les reponses
{ {
q.addReponse(ligne); q.addReponse(Config.clearString(ligne));
ligne = scan.nextLine(); ligne = scan.nextLine();
} }
questions.add(q); this.questions.add(q);
} else // si c'est pas une *, alors c'est un parametre (on ignore les lignes vides) } else // si c'est pas une *, alors c'est un parametre (on ignore les lignes vides)
{ {
lireParam(ligne); this.lireParam(ligne);
} }
} }
} }
ligne = scan.nextLine(); ligne = scan.nextLine();
while (ligne.equals("")) // on saute les lignes vides avant de recommencer la boucle while while (ligne.equals("")) {
ligne = scan.nextLine(); ligne = scan.nextLine();
} }
}
scan.close(); scan.close();
} catch (Exception e) { } catch (Exception e) {
} }
@ -158,54 +183,55 @@ public class Config {
if (n != -1) // si -1 alors il n'y a pas de : et donc ce n'est pas un paramètre if (n != -1) // si -1 alors il n'y a pas de : et donc ce n'est pas un paramètre
{ {
String spl[] = { s.substring(0, n), s.substring(n + 1, s.length()) }; String spl[] = { s.substring(0, n), s.substring(n + 1, s.length()) };
while (spl[1].substring(0, 1).equals(" ")) while (spl[1].substring(0, 1).equals(" ")) {
spl[1] = spl[1].substring(1, spl[1].length()); spl[1] = spl[1].substring(1, spl[1].length());
}
spl[0] = spl[0].toUpperCase().trim(); // pour eviter la casse, on met tout en upper case spl[0] = spl[0].toUpperCase().trim(); // pour eviter la casse, on met tout en upper case
switch (spl[0]) // chaque case correspond é un parametre, pour le moment on ignore tout switch (spl[0]) // chaque case correspond é un parametre, pour le moment on ignore tout
// parametre qui n'est pas utile au programme. // parametre qui n'est pas utile au programme.
{ {
case "PAPERSIZE": case "PAPERSIZE":
setPaperSize(spl[1]); this.setPaperSize(spl[1]);
break; break;
case "CODE": case "CODE":
setCode(spl[1]); this.setCode(spl[1]);
break; break;
case "MARKFORMAT": case "MARKFORMAT":
setMarkFormat(spl[1]); this.setMarkFormat(spl[1]);
break; break;
case "NAMEFIELD": case "NAMEFIELD":
setNameField(spl[1]); this.setNameField(spl[1]);
break; break;
case "STUDENTIDFIELD": case "STUDENTIDFIELD":
setStudentIdField(spl[1]); this.setStudentIdField(spl[1]);
break; break;
case "MARKFIELD": case "MARKFIELD":
setMarkField(spl[1]); this.setMarkField(spl[1]);
break; break;
case "SEPARATEANSWERSHEET": case "SEPARATEANSWERSHEET":
setSeparateAnswerSheet(spl[1]); this.setSeparateAnswerSheet(spl[1]);
break; break;
case "ANSWERSHEETTITLE": case "ANSWERSHEETTITLE":
setAnswerSheetTitle(spl[1]); this.setAnswerSheetTitle(spl[1]);
break; break;
case "ANSWERSHEETPRESENTATION": case "ANSWERSHEETPRESENTATION":
setAnswerSheetPresentation(spl[1]); this.setAnswerSheetPresentation(spl[1]);
break; break;
default: // parametre mal tapé ou non utile (pour le moment) au programme, on l'ignore default: // parametre mal tapé ou non utile (pour le moment) au programme, on l'ignore
@ -223,16 +249,16 @@ public class Config {
s = s.toUpperCase(); s = s.toUpperCase();
s = s.trim(); s = s.trim();
if (s.equals("A3") || s.equals("A4") || s.equals("A5") || s.equals("LETTER")) { if (s.equals("A3") || s.equals("A4") || s.equals("A5") || s.equals("LETTER")) {
param.replace("PaperSize", s); this.param.replace("PaperSize", s);
} }
} }
public void setCode(String s) { public void setCode(String s) {
s = s.trim(); s = s.trim();
if (isParsable(s)) { if (this.isParsable(s)) {
int n = Integer.parseInt(s); int n = Integer.parseInt(s);
if (n >= 1 && n <= 16) { if ((n >= 1) && (n <= 16)) {
param.replace("Code", s); this.param.replace("Code", s);
} }
} }
} }
@ -240,47 +266,47 @@ public class Config {
public void setMarkFormat(String s) { public void setMarkFormat(String s) {
s = s.trim(); s = s.trim();
if (s.equals("20/4") || s.equals("100")) { if (s.equals("20/4") || s.equals("100")) {
param.replace("MarkFormat", s); this.param.replace("MarkFormat", s);
} }
} }
public void setNameField(String s) { public void setNameField(String s) {
if (!s.equals("")) { if (!s.equals("")) {
param.replace("NameField", s); this.param.replace("NameField", s);
} }
} }
public void setStudentIdField(String s) { public void setStudentIdField(String s) {
if (!s.equals("")) { if (!s.equals("")) {
param.replace("StudentIdField", s); this.param.replace("StudentIdField", s);
} }
} }
public void setMarkField(String s) { public void setMarkField(String s) {
if (!s.equals("")) { if (!s.equals("")) {
param.replace("MarkField", s); this.param.replace("MarkField", s);
} }
} }
public void setSeparateAnswerSheet(String s) { public void setSeparateAnswerSheet(String s) {
s = s.trim(); s = s.trim();
int n = Integer.parseInt(s); int n = Integer.parseInt(s);
if (n == 0 || n == 1) { if ((n == 0) || (n == 1)) {
param.replace("SeparateAnswerSheet", s); this.param.replace("SeparateAnswerSheet", s);
} }
} }
public void setAnswerSheetTitle(String s) { public void setAnswerSheetTitle(String s) {
if (!s.equals("")) { if (!s.equals("")) {
param.replace("AnswerSheetTitle", s); this.param.replace("AnswerSheetTitle", s);
} }
} }
public void setAnswerSheetPresentation(String s) { public void setAnswerSheetPresentation(String s) {
if (!s.equals("")) { if (!s.equals("")) {
param.replace("AnswerSheetPresentation", s); this.param.replace("AnswerSheetPresentation", s);
} }
} }
} }

View File

@ -10,16 +10,39 @@ public class TestConfig {
void testMakeQuestion() { void testMakeQuestion() {
Config c = new Config("test"); Config c = new Config("test");
Question q = new Question("Je suis le titre", false); Question q = new Question("Je suis le titre", false);
q=c.makeQuestion("* Dans M.A.S.K. qui sont les pilotes ou copilote de Rhino (un camion tracteur Kenworth w900)?"); q = c.makeQuestion(
assertEquals("Dans M.A.S.K. qui sont les pilotes ou copilote de Rhino (un camion tracteur Kenworth w900)?",q.getTitre()); "* Dans M.A.S.K. qui sont les pilotes ou copilote de Rhino (un camion tracteur Kenworth w900)?");
assertEquals("Dans M.A.S.K. qui sont les pilotes ou copilote de Rhino (un camion tracteur Kenworth w900)?",
q.getTitre());
Question q2=new Question("Selon la serie diffusée en 1991 sur TF1, où le petit Nicolas doit il travailler et s'appliquer ?",false); Question q2 = new Question(
q2=c.makeQuestion("** Dans M.A.S.K. qui sont les pilotes ou copilote de Rhino (un camion tracteur Kenworth w900)?"); "Selon la serie diffusée en 1991 sur TF1, où le petit Nicolas doit il travailler et s'appliquer ?",
assertEquals("Dans M.A.S.K. qui sont les pilotes ou copilote de Rhino (un camion tracteur Kenworth w900)?",q2.getTitre()); false);
q2 = c.makeQuestion(
"** Dans M.A.S.K. qui sont les pilotes ou copilote de Rhino (un camion tracteur Kenworth w900)?");
assertEquals("Dans M.A.S.K. qui sont les pilotes ou copilote de Rhino (un camion tracteur Kenworth w900)?",
q2.getTitre());
Question q3 = new Question("Quelles sont les bonnes réponses", false); Question q3 = new Question("Quelles sont les bonnes réponses", false);
q3=c.makeQuestion("*<lines=1> Cette jeune fille vient d'emménager à Sunnydale avec sa mère et rencontre son nouvel observateur. Quel est le nom de ce dernier ?"); q3 = c.makeQuestion(
assertEquals("Cette jeune fille vient d'emménager à Sunnydale avec sa mère et rencontre son nouvel observateur. Quel est le nom de ce dernier ?",q3.getTitre()); "*<lines=1> Cette jeune fille vient d'emménager à Sunnydale avec sa mère et rencontre son nouvel observateur. Quel est le nom de ce dernier ?");
assertEquals(
"Cette jeune fille vient d'emménager à Sunnydale avec sa mère et rencontre son nouvel observateur. Quel est le nom de ce dernier ?",
q3.getTitre());
} }
@Test
void testClearString() {
String string = " \ntest \r testù ";
assertEquals("test testù", Config.clearString(string));
// TODO: improve tests with a string containing
// all non desired characters
/**
* String string2 = "\n\r\\u000A\\uFFFF"; assertEquals("",
* Config.clearString(string2));
* assertTrue(Config.clearString(string2).isEmpty());
*/
}
} }