scoutdoc.main.converter.ScoutDocConverter.java Source code

Java tutorial

Introduction

Here is the source code for scoutdoc.main.converter.ScoutDocConverter.java

Source

/*******************************************************************************
 * Copyright (c) 2012 BSI Business Systems Integration AG.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     BSI Business Systems Integration AG - initial API and implementation
 ******************************************************************************/

package scoutdoc.main.converter;

import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineParser;
import org.eclipse.mylyn.wikitext.core.parser.util.MarkupToEclipseToc;

import scoutdoc.main.ProjectProperties;
import scoutdoc.main.mediawiki.ApiFileUtility;
import scoutdoc.main.structure.Page;
import scoutdoc.main.structure.PageUtility;
import scoutdoc.main.structure.Pages;
import scoutdoc.main.structure.Task;

import com.google.common.base.CharMatcher;
import com.google.common.base.Preconditions;
import com.google.common.io.Files;

public class ScoutDocConverter {
    private static final Charset CHARSET = Charset.forName("UTF-8");

    public void execute(Task t) throws IOException {
        Preconditions.checkArgument(t.getInputPages().size() > 0, "InputPages needs to contain at least one page");

        MediaWikiLanguageExt markupLanguage = new MediaWikiLanguageExt();

        markupLanguage.getTemplateProviders().add(new IgnoreTemplateProvider("ScoutPage")); //Could also use: markupLanguage.setTemplateExcludes("ScoutPage")
        markupLanguage.getTemplateProviders().add(new PagesTemplateProvider());
        markupLanguage.setInternalLinkPattern(ProjectProperties.getWikiServerInternalLinkPattern());

        MarkupParser markupParser = new MarkupParser();
        markupParser.setMarkupLanguage(markupLanguage);

        List<ConversionItem> items = new ArrayList<ConversionItem>();
        ConversionItem firstItem = new ConversionItem();
        firstItem.inputPage = Pages.normalize(t.getInputPages().get(0));
        firstItem.outputFileName = "index.html";
        firstItem.outputTitle = t.getOutputTitle();
        firstItem.includeToc = t.getInputPages().size() > 1;
        firstItem.firstLevel = true;
        items.add(firstItem);

        for (int i = 1; i < t.getInputPages().size(); i++) {
            Page p = Pages.normalize(t.getInputPages().get(i));
            ConversionItem item = new ConversionItem();
            item.inputPage = p;
            item.outputFileName = String.format("%02d", i) + "_" + PageUtility.toBasePageNamee(p).toLowerCase()
                    + ".html";
            item.outputTitle = PageUtility.toBasePageName(p);
            item.includeToc = true;
            item.firstLevel = false;
            items.add(item);
        }

        markupLanguage.setPageMapping(new PageMapper(items));

        OutlineParser outlineParser = new OutlineParser();
        outlineParser.setMarkupLanguage(markupLanguage);

        OutlineItem rootItem = outlineParser.createRootItem();
        OutlineItem firstLevel = rootItem;

        for (int j = 0; j < items.size(); j++) {
            ConversionItem item = items.get(j);

            System.out.println("============");
            System.out.println("Page: " + item.inputPage.getName());
            System.out.println("outputFileName: " + item.outputFileName);

            item.inputContent = Files.toString(new File(PageUtility.toFilePath(item.inputPage)), CHARSET);

            item.outputFile = new File(ProjectProperties.getFolderWikiDist() + ProjectProperties.getFileSeparator()
                    + t.getOutputFolder() + ProjectProperties.getFileSeparator() + item.outputFileName);
            Files.createParentDirs(item.outputFile);
            System.out.println("outputFile: " + item.outputFile);

            File apiFile = PageUtility.toApiFile(item.inputPage);
            Collection<Page> images = ApiFileUtility.parseImages(apiFile);

            StringWriter out = new StringWriter();
            HtmlDocumentBuilderExt htmlDocumentBuilder = new HtmlDocumentBuilderExt(out);
            htmlDocumentBuilder.setPrependImagePrefix(ProjectProperties.getRelPathNavImagesDist());
            htmlDocumentBuilder.setDefaultAbsoluteLinkTarget("doc_external");
            htmlDocumentBuilder.setItems(items);
            htmlDocumentBuilder.setCurrentItemIndex(j);

            markupParser.setBuilder(htmlDocumentBuilder);

            markupLanguage.setPageName(item.inputPage.getName());
            Set<String> imageNames = new HashSet<String>();
            for (Page image : images) {
                imageNames.add(PageUtility.toPageNamee(image));
            }
            markupLanguage.setImageNames(imageNames);

            markupParser.parse(item.inputContent);

            String htmlContent = out.toString();
            Files.write(htmlContent, item.outputFile, CHARSET);

            if (item.includeToc) {
                item.outlineItem = computeOutline(outlineParser, item);
                if (item.firstLevel) {
                    rootItem.getChildren().add(item.outlineItem);
                    firstLevel = item.outlineItem;
                } else {
                    firstLevel.getChildren().add(item.outlineItem);
                }
            } else {
                item.outlineItem = new OutlineItem(rootItem, 1, "id", 1, 1, item.outputTitle);
                item.outlineItem.setResourcePath(item.outputFile.getAbsolutePath());
                if (item.firstLevel) {
                    firstLevel = item.outlineItem;
                }
            }

            File toFolder = computeImagesFolder(t);
            for (Page image : images) {
                File imageFile = PageUtility.toImageFile(image);
                if (imageFile.exists()) {
                    Files.copy(imageFile, new File(toFolder, PageUtility.convertToInternalName(image.getName())));
                } else {
                    System.err.println("Requested imageFile does not exist. Page: " + image.toString());
                }

            }
        }

        MarkupToEclipseToc eclipseToc = new MarkupToEclipseToc() {
            @Override
            protected String computeFile(OutlineItem item) {
                if (item != null && item.getResourcePath() != null) {
                    return tail(item.getResourcePath(), ProjectProperties.getFileSeparator());
                }
                return super.computeFile(item);
            }
        };
        eclipseToc.setBookTitle(t.getOutputTitle());
        eclipseToc.setHelpPrefix(CharMatcher.anyOf(String.valueOf(ProjectProperties.getFileSeparator()))
                .replaceFrom(t.getOutputFolder(), "/"));
        eclipseToc.setHtmlFile("index.html");
        String tocContent = eclipseToc.createToc(rootItem);

        File tocOutputFile = new File(ProjectProperties.getFolderWikiDist() + ProjectProperties.getFileSeparator()
                + t.getOutputTocFile());
        Files.write(tocContent, tocOutputFile, CHARSET);

        //If more than one page, copy navigation images.
        if (t.getInputPages().size() > 1) {
            File fromFolder = new File(ProjectProperties.getFolderNavImagesSource());
            File toFolder = computeImagesFolder(t);
            Files.copy(new File(fromFolder, ProjectProperties.IMAGE_HOME),
                    new File(toFolder, ProjectProperties.IMAGE_HOME));
            Files.copy(new File(fromFolder, ProjectProperties.IMAGE_NEXT),
                    new File(toFolder, ProjectProperties.IMAGE_NEXT));
            Files.copy(new File(fromFolder, ProjectProperties.IMAGE_PREV),
                    new File(toFolder, ProjectProperties.IMAGE_PREV));
        }
    }

    private File computeImagesFolder(Task t) throws IOException {
        String filePath = ProjectProperties.getFolderWikiDist() + ProjectProperties.getFileSeparator()
                + t.getOutputFolder() + ProjectProperties.getFileSeparator()
                + ProjectProperties.getRelPathNavImagesDist();
        File file = new File(filePath);
        Files.createParentDirs(file);
        file.mkdir();
        return file;
    }

    private static OutlineItem computeOutline(OutlineParser outlineParser, ConversionItem conversionItem) {
        OutlineItem outlineItem = outlineParser.parse(conversionItem.inputContent);
        outlineItem.setLabel(conversionItem.outputTitle);
        outlineItem.setResourcePath(conversionItem.outputFile.getAbsolutePath());
        return outlineItem;
    }

    private static String tail(String input, String character) {
        Preconditions.checkArgument(character.length() == 1);
        char charAt = character.charAt(0);
        String output = input;
        int index = CharMatcher.is(charAt).lastIndexIn(input);
        if (index > 0) {
            output = input.substring(index + 1);
        }
        return output;
    }

    //  private static String head(String input, char c) {
    //    String output = input;
    //    int index = CharMatcher.is(c).indexIn(input);
    //    if (index > 0) {
    //      output = input.substring(0, index);
    //    }
    //    return output;
    //  }
}