1 package nl.dedicon.pipeline.braille.calabash.impl;
2
3 import com.xmlcalabash.core.XProcException;
4 import com.xmlcalabash.core.XProcRuntime;
5 import com.xmlcalabash.core.XProcStep;
6 import com.xmlcalabash.io.ReadablePipe;
7 import com.xmlcalabash.io.WritablePipe;
8 import com.xmlcalabash.library.DefaultStep;
9 import com.xmlcalabash.runtime.XAtomicStep;
10 import net.sf.saxon.s9api.QName;
11 import net.sf.saxon.s9api.SaxonApiException;
12 import net.sf.saxon.s9api.XdmNode;
13 import nl.dedicon.pipeline.braille.step.SymbolsReplacer;
14 import nl.dedicon.pipeline.braille.step.Utils;
15 import org.daisy.common.xproc.calabash.XProcStepProvider;
16 import org.osgi.service.component.annotations.Component;
17 import org.slf4j.Logger;
18 import org.slf4j.LoggerFactory;
19 import org.w3c.dom.Document;
20
21
22
23
24
25
26
27
28
29
30 public class SymbolsListStep extends DefaultStep {
31
32 private static final Logger logger = LoggerFactory.getLogger(SymbolsListStep.class);
33
34 private static final QName _symbols_code = new QName("symbols-code");
35 private static final QName _symbols_list_header = new QName("symbols-list-header");
36
37 private ReadablePipe source = null;
38 private WritablePipe result = null;
39
40 private SymbolsListStep(XProcRuntime runtime, XAtomicStep step) {
41 super(runtime, step);
42 }
43
44 @Override
45 public void setInput(String port, ReadablePipe pipe) {
46 source = pipe;
47 }
48
49 @Override
50 public void setOutput(String port, WritablePipe pipe) {
51 result = pipe;
52 }
53
54 @Override
55 public void reset() {
56 source.resetReader();
57 result.resetWriter();
58 }
59
60 @Override
61 public void run() throws SaxonApiException {
62 super.run();
63
64 try {
65
66 XdmNode book = source.read();
67
68 String symbolsCode = getOption(_symbols_code, "");
69 String header = getOption(_symbols_list_header, "");
70
71 XdmNode symbolsCodeNode = runtime.parse(symbolsCode, runtime.getStaticBaseURI().toASCIIString());
72 SymbolsReplacer symbolsReplacer = new SymbolsReplacer(symbolsCodeNode);
73
74
75 Document document = Utils.convertToDocument(book);
76
77 symbolsReplacer.replaceSymbols(document);
78 symbolsReplacer.insertSymbolsList(document, header);
79
80 XdmNode newBook = Utils.convertToXdmNode(document, runtime.getProcessor().newDocumentBuilder(), true);
81
82 result.write(newBook);
83
84 } catch (Exception e) {
85
86 logger.error("dedicon:symbols-list failed", e);
87 throw new XProcException(step.getNode(), e);
88
89 }
90 }
91
92 @Component(
93 name = "dedicon:symbols-list",
94 service = {XProcStepProvider.class},
95 property = {"type:String={http://www.dedicon.nl}symbols-list"}
96 )
97 public static class Provider implements XProcStepProvider {
98
99 @Override
100 public XProcStep newStep(XProcRuntime runtime, XAtomicStep step) {
101 return new SymbolsListStep(runtime, step);
102 }
103 }
104 }