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   * XProc step for the symbols list
23   * 
24   * In a DTBook:
25   *  - symbols are replaced with their braille representation
26   *  - a symbols list is inserted
27   * 
28   * @author Paul Rambags
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              // convert the immutable XdmNode to a modifiable Document
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 }