a8d6d379b790d0e3d1900a7d3e8e7c8b239371d8
1 package be
.nikiroo
.fanfix
.output
;
4 import java
.io
.FileWriter
;
5 import java
.io
.IOException
;
7 import be
.nikiroo
.fanfix
.Instance
;
8 import be
.nikiroo
.fanfix
.bundles
.Config
;
9 import be
.nikiroo
.fanfix
.bundles
.StringId
;
10 import be
.nikiroo
.fanfix
.data
.Chapter
;
11 import be
.nikiroo
.fanfix
.data
.MetaData
;
12 import be
.nikiroo
.fanfix
.data
.Story
;
13 import be
.nikiroo
.fanfix
.data
.Paragraph
.ParagraphType
;
15 class LaTeX
extends BasicOutput
{
16 protected FileWriter writer
;
17 private boolean lastWasQuote
= false;
20 private char openQuote
= Instance
.getTrans().getChar(
21 StringId
.OPEN_SINGLE_QUOTE
);
22 private char closeQuote
= Instance
.getTrans().getChar(
23 StringId
.CLOSE_SINGLE_QUOTE
);
24 private char openDoubleQuote
= Instance
.getTrans().getChar(
25 StringId
.OPEN_DOUBLE_QUOTE
);
26 private char closeDoubleQuote
= Instance
.getTrans().getChar(
27 StringId
.CLOSE_DOUBLE_QUOTE
);
30 public File
process(Story story
, File targetDir
, String targetName
)
32 String targetNameOrig
= targetName
;
33 targetName
+= getDefaultExtension();
35 File target
= new File(targetDir
, targetName
);
37 writer
= new FileWriter(target
);
39 super.process(story
, targetDir
, targetNameOrig
);
49 protected String
getDefaultExtension() {
54 protected void writeStoryHeader(Story story
) throws IOException
{
57 String title
= "\\title{}";
59 if (story
.getMeta() != null) {
60 MetaData meta
= story
.getMeta();
61 title
= "\\title{" + latexEncode(meta
.getTitle()) + "}";
62 date
= "\\date{" + latexEncode(meta
.getDate()) + "}";
63 author
= "\\author{" + latexEncode(meta
.getAuthor()) + "}";
64 lang
= meta
.getLang().toLowerCase();
65 if (lang
!= null && !lang
.isEmpty()) {
66 lang
= Instance
.getConfig().getStringX(Config
.LATEX_LANG
, lang
);
68 System
.err
.println(Instance
.getTrans().getString(
69 StringId
.LATEX_LANG_UNKNOWN
, lang
));
75 writer
.append("% This LaTeX document was auto-generated by Fanfic Reader, created by Niki.\n");
76 writer
.append("%\n\n");
77 writer
.append("\\documentclass[a4paper]{book}\n");
78 if (lang
!= null && !lang
.isEmpty()) {
79 writer
.append("\\usepackage[" + lang
+ "]{babel}\n");
81 writer
.append("\\usepackage[utf8]{inputenc}\n");
82 writer
.append("\\usepackage[T1]{fontenc}\n");
83 writer
.append("\\usepackage{lmodern}\n");
84 writer
.append("\\newcommand{\\br}{\\vspace{10 mm}}\n");
85 writer
.append("\\newcommand{\\say}{--- \\noindent\\emph}\n");
86 writer
.append("\\hyphenpenalty=1000\n");
87 writer
.append("\\tolerance=5000\n");
88 writer
.append("\\begin{document}\n");
89 if (story
.getMeta() != null && story
.getMeta().getDate() != null)
90 writer
.append(date
+ "\n");
91 writer
.append(title
+ "\n");
92 writer
.append(author
+ "\n");
93 writer
.append("\\maketitle\n");
100 protected void writeStoryFooter(Story story
) throws IOException
{
101 writer
.append("\\end{document}\n");
105 protected void writeChapterHeader(Chapter chap
) throws IOException
{
106 writer
.append("\n\n\\chapter{" + latexEncode(chap
.getName()) + "}"
111 protected void writeChapterFooter(Chapter chap
) throws IOException
{
116 protected String
enbold(String word
) {
117 return "\\textsc{" + word
+ "}";
121 protected String
italize(String word
) {
122 return "\\emph{" + word
+ "}";
126 protected void writeTextLine(ParagraphType type
, String line
)
129 line
= decorateText(latexEncode(line
));
134 lastWasQuote
= false;
137 writer
.write("\n\\br");
139 lastWasQuote
= false;
144 lastWasQuote
= false;
147 writer
.write("\n\\say{" + line
+ "}\n");
149 writer
.write("\n\\noindent{}");
159 private String
latexEncode(String input
) {
160 StringBuilder builder
= new StringBuilder();
161 for (char car
: input
.toCharArray()) {
162 // TODO: check restricted chars?
163 if (car
== '^' || car
== '$' || car
== '\\' || car
== '#'
165 builder
.append('\\');
167 } else if (car
== openQuote
) {
169 } else if (car
== closeQuote
) {
170 builder
.append('\'');
171 } else if (car
== openDoubleQuote
) {
172 builder
.append("``");
173 } else if (car
== closeDoubleQuote
) {
174 builder
.append("''");
180 return builder
.toString();