/* * Copyright 2015 * * Licensed under the Eclipse Public License version 1.0, available at * http://opensource.org/licenses/eclipse-1.0.txt */ package de.lynorics.eclipse.jangaroo.ui.asdoc; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Parser to create an {@link Asdoc} from an input. * * @author Lynorics */ public class AsdocParser { /** * Parser to create an {@link Asdoc} from a string input. */ public Asdoc parse(String lines) { if (lines == null) { return null; } return parse(Arrays.asList(lines.split("\n"))); } /** * Parser to create an {@link Asdoc} from a string array input. */ public Asdoc parse(List<String> input) { if (input == null || input.size() == 0) { return null; } Asdoc asdoc = new Asdoc(); asdoc.setOriginal(join(input, "\n")); List<String> lines = trimLines(input); lines = parseParameters(asdoc, lines); lines = parseTags(asdoc, lines); asdoc.setText(join(lines, " ").trim()); return asdoc; } private String join(List<String> lines, String separator) { StringBuilder out = new StringBuilder(); for (Object o : lines) { out.append(o.toString()); if (o != lines.get(lines.size()-1)) { out.append(separator); } } return out.toString(); } private List<String> trimLines(List<String> input) { List<String> result = new ArrayList<String>(); Boolean linefeed = null; boolean tagFound = false; for (String zeile : input) { zeile = zeile.trim(); if (zeile.endsWith("*/")) { zeile = zeile.substring(0, zeile.length()-2); } if (zeile.startsWith("/**")) { zeile = zeile.substring(3); } else if (zeile.startsWith("*")) { zeile = zeile.substring(1); } zeile = zeile.trim(); if (zeile.startsWith("@")) { tagFound = true; } else if (tagFound && "".equals(zeile)) { continue; } else if (!tagFound && "".equals(zeile)) { if (linefeed == null) { linefeed = Boolean.TRUE; zeile = "<paragraph>"; } else { linefeed = Boolean.FALSE; } } else { linefeed = null; } if ("".equals(zeile)) { continue; } result.add(zeile); } while (result.size() > 0 && result.get(0).equals("<paragraph>")) { result.remove(0); } while (result.size() > 0 && result.get(result.size() -1).equals("<paragraph>")) { result.remove(result.size() - 1); } return result; } private List<String> parseParameters(Asdoc asdoc, List<String> lines) { List<String> result = new ArrayList<String>(); Parameter parameter = null; for (String zeile : lines) { if (zeile.startsWith("@param ")) { parameter = new Parameter(); String[] split = zeile.substring(7).split(" ",2); parameter.setName(split[0]); if (split.length > 1) { parameter.setText(split[1]); } asdoc.getParameters().add(parameter); } else if (parameter != null) { if (!"".equals(zeile) && !zeile.startsWith("@")) { parameter.setText(parameter.getText()+" "+zeile); } else { result.add(zeile); } } else { result.add(zeile); } } return result; } private List<String> parseTags(Asdoc asdoc, List<String> lines) { List<String> result = new ArrayList<String>(); Tag tag = null; for (String zeile : lines) { if (zeile.startsWith("@")) { tag = new Tag(); String[] split = zeile.substring(1).split(" ",2); tag.setName(split[0]); if (split.length > 1) { tag.setText(split[1]); } asdoc.getTags().add(tag); } else if (tag != null) { if (!"".equals(zeile) && !zeile.startsWith("@")) { tag.setText(tag.getText()+" "+zeile); } } else { result.add(zeile); } } return result; } }