Coverage Report - org.webslinger.ext.convertors.WikiVelocityHelper
 
Classes in this File Line Coverage Branch Coverage Complexity
WikiVelocityHelper
56%
44/79
69%
11/16
2
 
 1  
 package org.webslinger.ext.convertors;
 2  
 
 3  
 import java.io.IOException;
 4  
 import java.io.StringWriter;
 5  
 import java.util.Iterator;
 6  
 import java.util.Map;
 7  
 import java.util.regex.Pattern;
 8  
 
 9  
 public class WikiVelocityHelper {
 10  1
     private static final Pattern PATTERN = Pattern.compile("(\n|\")");
 11  
     private final StringWriter writer;
 12  
     private boolean hadEnd;
 13  
 
 14  3
     public WikiVelocityHelper(StringWriter writer) {
 15  3
         this.writer = writer;
 16  3
     }
 17  
 
 18  
     protected void writeArg(Object value) {
 19  53
         if (value == null) return;
 20  44
         if (value instanceof Number) {
 21  20
             writer.write(value.toString());
 22  24
         } else if (value instanceof Map) {
 23  0
             writer.write('{');
 24  0
             Iterator it = ((Map) value).entrySet().iterator();
 25  0
             while (it.hasNext()) {
 26  0
                 Map.Entry entry = (Map.Entry) it.next();
 27  0
                 writeArg(entry.getKey());
 28  0
                 writer.write(": ");
 29  0
                 writeArg(entry.getValue());
 30  0
                 if (it.hasNext()) writer.write(", ");
 31  0
             }
 32  0
             writer.write('}');
 33  0
         } else {
 34  24
             writer.write('"');
 35  24
             String s = value instanceof String ? (String) value : value.toString();
 36  24
             writer.write(PATTERN.matcher(s).replaceAll("\\\\$1"));
 37  24
             writer.write('"');
 38  
         }
 39  44
     }
 40  
 
 41  
     protected void checkEnd(boolean escape) {
 42  130
         if (hadEnd) {
 43  32
             writer.write(escape ? "#{end}" : "#end");
 44  32
             hadEnd = false;
 45  
         }
 46  130
     }
 47  
 
 48  
     protected void callDirective(String name, Object[] args) {
 49  52
         checkEnd(false);
 50  52
         writer.write('#');
 51  52
         writer.write(name);
 52  52
         writer.write('(');
 53  105
         for (int i = 1; i < args.length; i += 2) {
 54  53
             if (i != 1) writer.write(' ');
 55  53
             writeArg(args[i]);
 56  
         }
 57  52
         writer.write(")");
 58  52
     }
 59  
 
 60  
     public void acceptMacro(String name, Object[] args) {
 61  13
         callDirective(name, args);
 62  13
     }
 63  
 
 64  
     public void endMacro(String name, Object[] args) {
 65  39
         if (hadEnd) {
 66  7
             writer.write("#end");
 67  
         } else {
 68  32
             hadEnd = true;
 69  
         }
 70  39
     }
 71  
 
 72  
     public void startMacro(String name, Object[] args) {
 73  39
         callDirective(name, args);
 74  39
     }
 75  
 
 76  
     public void acceptNewline(int count) {
 77  27
         checkEnd(count == 0);
 78  55
         for (int i = 0; i < count; i++) {
 79  28
             writer.write('\n');
 80  
         }
 81  27
     }
 82  
 
 83  
     public void acceptText(String text) {
 84  39
         checkEnd(true);
 85  39
         writer.write(text);
 86  39
     }
 87  
 
 88  
     public void acceptXml(String name, Map attributes) {
 89  0
         startXml(name, attributes);
 90  0
     }
 91  
 
 92  
     public void startXml(String name, Map attributes) {
 93  0
         checkEnd(false);
 94  0
         writer.write('#');
 95  0
         writer.write(name);
 96  0
         writer.write('(');
 97  0
         writer.write('{');
 98  0
         Iterator it = attributes.entrySet().iterator();
 99  0
         while (it.hasNext()) {
 100  0
             Map.Entry entry = (Map.Entry) it.next();
 101  0
             writeArg(entry.getKey());
 102  0
             writer.write(": ");
 103  0
             writeArg(entry.getValue());
 104  0
             if (it.hasNext()) writer.write(", ");
 105  0
         }
 106  0
         writer.write('}');
 107  0
         writer.write(')');
 108  0
     }
 109  
 
 110  
     public void endXml(String name, Map attributes) {
 111  0
         if (hadEnd) {
 112  0
             writer.write("#end");
 113  
         } else {
 114  0
             hadEnd = true;
 115  
         }
 116  0
     }
 117  
 
 118  
     public void blockNewline() {
 119  12
         checkEnd(false);
 120  12
         writer.write('\n');
 121  12
     }
 122  
 
 123  
     public void close() throws IOException {
 124  0
         checkEnd(false);
 125  0
     }
 126  
 }