/* * RmdFormatOptionsHelper.java * * Copyright (C) 2009-14 by RStudio, Inc. * * Unless you have received this program directly from RStudio pursuant * to the terms of a commercial license agreement with RStudio, then * this program is licensed to you under the terms of version 3 of the * GNU Affero General Public License. This program is distributed WITHOUT * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT, * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details. * */ package org.rstudio.studio.client.rmarkdown.ui; import java.util.List; import org.rstudio.core.client.files.FileSystemItem; import org.rstudio.studio.client.common.FilePathUtils; import org.rstudio.studio.client.rmarkdown.model.RmdFrontMatterOutputOptions; import org.rstudio.studio.client.rmarkdown.model.RmdTemplateFormatOption; import com.google.gwt.core.client.JavaScriptObject; public class RmdFormatOptionsHelper { public final static JavaScriptObject optionsListToJson( List<RmdFormatOption> options, FileSystemItem document, RmdFrontMatterOutputOptions optionList) { if (optionList == null) optionList = RmdFrontMatterOutputOptions.create(); for (RmdFormatOption option: options) { if (option.valueIsDefault()) { optionList.removeOption(option.getOption().getName()); } else { String type = option.getOption().getType(); if (option.getValue() == null) { // all nulls are written identically addOption(optionList, option.getOption(), null); } else if (type.equals(RmdTemplateFormatOption.TYPE_BOOLEAN)) { addOption(optionList, option.getOption(), Boolean.parseBoolean(option.getValue())); } else if (type.equals(RmdTemplateFormatOption.TYPE_FLOAT)) { addOption(optionList, option.getOption(), Float.parseFloat(option.getValue())); } else if (type.equals(RmdTemplateFormatOption.TYPE_INTEGER)) { addOption(optionList, option.getOption(), Integer.parseInt(option.getValue())); } else if (type.equals(RmdTemplateFormatOption.TYPE_CHOICE) || type.equals(RmdTemplateFormatOption.TYPE_STRING)) { addOption(optionList, option.getOption(), option.getValue()); } else if (type.equals(RmdTemplateFormatOption.TYPE_FILE)) { // For file options, compute the path relative to the document // if we're starting with an absolute path if (document != null && option.getValue() != null && FilePathUtils.pathIsAbsolute(option.getValue())) { FileSystemItem selFile = FileSystemItem.createFile(option.getValue()); // this will be null if no relative path can be found; if // this is the case, we'll use the absolute path as-is String relativePath = selFile.getPathRelativeTo(document.getParentPath()); addOption(optionList, option.getOption(), relativePath == null ? option.getValue() : relativePath); } else { addOption(optionList, option.getOption(), option.getValue()); } } } } return optionList; } // We need one of these per type since JSNI doesn't unbox templated types // for us private final native static void addOption (JavaScriptObject optionList, RmdTemplateFormatOption option, boolean value) /*-{ optionList[option.option_name] = value; }-*/; private final native static void addOption (JavaScriptObject optionList, RmdTemplateFormatOption option, String value) /*-{ optionList[option.option_name] = value; }-*/; private final native static void addOption (JavaScriptObject optionList, RmdTemplateFormatOption option, float value) /*-{ optionList[option.option_name] = value; }-*/; private final native static void addOption (JavaScriptObject optionList, RmdTemplateFormatOption option, int value) /*-{ optionList[option.option_name] = value; }-*/; }