Subversion Repositories mkgmap

Rev

Blame | Last modification | View Log | RSS feed

/*
 * Copyright (C) 2019.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3 or
 * version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 */

package buildoptions;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * Convert options.txt to format needed in help file options.
 * Saves some manual edits to keep both files in sync.
 * Used with ant gen-options-file  
 * @author Mike Baggaley
 *
 */

public class OptionsBuilder {

        public static void main(String[] args) {
                final int indentSize = 4;
                boolean hasNonAscii = false;
                int lineNumber = 0;
                File outputFile = new File(args[0]);
                System.setProperty("line.separator", "\n");
                try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                                BufferedWriter bw = new BufferedWriter(new FileWriter(outputFile))) {
                        String line;
                        String previousLine = "";
                        int indent = 0;
                        boolean preformatted = false;
                        while((line = br.readLine()) != null) {
                                ++lineNumber;
                                if (!line.matches("\\p{ASCII}*")) {
                                        System.err.println("Line " + lineNumber + " contains one or more non-ASCII characters.\r\n" + line);
                                        hasNonAscii = true;
                                }
                                if (preformatted) {
                                        if (line.trim().compareToIgnoreCase("</pre>") == 0)
                                                preformatted = false;
                                        else {
                                            bw.write(line);
                                            bw.newLine();
                                        }
                                } else {
                                        line = line.replaceAll("\\s+", " ");
                                        if (line.length() > 0) {
                                                if (line.startsWith(";")) {
                                                        line = line.substring(1);
                                                        indent = 0;
                                                        if (!previousLine.isEmpty()) {
                                                            bw.write(previousLine);
                                                            bw.newLine();
                                                            previousLine = "";
                                                        }
                                                }
                                                else if (line.charAt(0) == ':') {
                                                        if (!previousLine.isEmpty()) {
                                                            bw.write(previousLine);
                                                            bw.newLine();
                                                            previousLine = "";
                                                        }
                                                        indent = 1;
                                                        line = line.substring(1);
                                                        while (line.charAt(0) == ':') {
                                                                indent++;
                                                                line = line.substring(1);
                                                        }
                                                        if (line.charAt(0) == ';')
                                                                line = line.substring(1);
                                                }
                                                else if (line.trim().compareToIgnoreCase("<p>") == 0) {
                                                        if (!previousLine.isEmpty()) {
                                                            bw.write(previousLine);
                                                            bw.newLine();
                                                            previousLine = "";
                                                        }
                                                        line = "";
                                                    bw.newLine();
                                                }
                                                else if (line.trim().compareToIgnoreCase("<pre>") == 0) {
                                                        if (!previousLine.isEmpty()) {
                                                            bw.write(previousLine);
                                                            bw.newLine();
                                                            previousLine = "";
                                                        }
                                                        line = "";
                                                    preformatted = true;
                                                }
                                                line = line.trim();
                                                if (!previousLine.isEmpty()) {
                                                        if (!line.isEmpty()) {
                                                                previousLine += " " + line;
                                                        }
                                                } else {
                                                        previousLine = line;
                                                        for (int i = 0; i < indent; i++) {
                                                                for (int j = 0; j < indentSize; j++)
                                                                        previousLine = " " + previousLine;
                                                        }
                                                }
                                                while (previousLine.length() > 79) {
                                                        line = previousLine.substring(0, 80);
                                                        int lastSpaceIndex = line.lastIndexOf(' ');
                                                        int firstNonSpaceIndex = 0;
                                                        while (firstNonSpaceIndex < 79) {
                                                                if (line.charAt(firstNonSpaceIndex) != ' ')
                                                                        break;
                                                                firstNonSpaceIndex++;
                                                        }
                                                        if (lastSpaceIndex > firstNonSpaceIndex) {
                                                                line = line.substring(0, lastSpaceIndex);
                                                                previousLine = previousLine.substring(lastSpaceIndex + 1);
                                                                for (int i = 0; i < indent; i++) {
                                                                        for (int j = 0; j < indentSize; j++)
                                                                                previousLine = " " + previousLine;
                                                                }
                                                            bw.write(line);
                                                            bw.newLine();
                                                        }
                                                        else {
                                                            bw.write(previousLine);
                                                            bw.newLine();
                                                            previousLine = "";
                                                        }
                                                }
                                        }
                                        else {
                                                indent = 0;
                                                if (!previousLine.isEmpty()) {
                                                    bw.write(previousLine);
                                                    bw.newLine();
                                                    previousLine = "";
                                                }
                                                bw.newLine();
                                        }
                                }
                        }
                        if (!previousLine.isEmpty()) {
                            bw.write(previousLine);
                            bw.newLine();
                        }
                } catch (IOException e) {
                        e.printStackTrace();
                        System.exit(-1);
                }
                if (hasNonAscii) {
                        System.exit(-1);
                }
        }

}