/* * Copyright 2008 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.common.css; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import java.util.List; import java.util.Map; import java.util.Set; /** * Provides inputs and options to Closure Stylesheets. * To construct an instance, use a {@link JobDescriptionBuilder}. * * <p>Instances of this class are immutable. * */ public class JobDescription { public final List<SourceCode> inputs; public final String copyrightNotice; public final OutputFormat outputFormat; public final InputOrientation inputOrientation; public final OutputOrientation outputOrientation; public final OptimizeStrategy optimize; public final List<String> trueConditionNames; public final boolean useInternalBidiFlipper; public final boolean swapLtrRtlInUrl; public final boolean swapLeftRightInUrl; public final boolean simplifyCss; public final boolean eliminateDeadStyles; public final boolean allowDefPropagation; public final boolean allowUnrecognizedFunctions; public final Set<String> allowedNonStandardFunctions; public final boolean allowUnrecognizedProperties; public final Set<String> allowedUnrecognizedProperties; public final boolean allowUndefinedConstants; public final boolean allowMozDocument; public final Vendor vendor; public final boolean allowKeyframes; public final boolean allowWebkitKeyframes; public final boolean processDependencies; public final ImmutableSet<String> allowedAtRules; public final String cssRenamingPrefix; public final List<String> excludedClassesFromRenaming; public final GssFunctionMapProvider gssFunctionMapProvider; public final SubstitutionMapProvider cssSubstitutionMapProvider; public final OutputRenamingMapFormat outputRenamingMapFormat; public final boolean preserveComments; public final boolean suppressDependencyCheck; public final Map<String, Integer> compileConstants; public final boolean createSourceMap; public final SourceMapDetailLevel sourceMapLevel; public final boolean preserveImportantComments; static final String CONDITION_FOR_LTR = "GSS_LTR"; static final String CONDITION_FOR_RTL = "GSS_RTL"; /** * The output format. */ public enum OutputFormat { /** Pretty-prints the initial parse tree built from the input. */ DEBUG, /** Prints a compact representation of the compiled CSS. */ COMPRESSED, /** Pretty-prints the compiled CSS. */ PRETTY_PRINTED, } /** * The input orientation. */ public enum InputOrientation { LTR, RTL } /** * The output orientation. */ public enum OutputOrientation { LTR, RTL, NOCHANGE } /** * The optimization strategy. */ public enum OptimizeStrategy { NONE, SAFE, MAXIMUM } /** * The source map generation levels. */ public enum SourceMapDetailLevel { ALL, DEFAULT } JobDescription(List<SourceCode> inputs, String copyrightNotice, OutputFormat outputFormat, InputOrientation inputOrientation, OutputOrientation outputOrientation, OptimizeStrategy optimize, List<String> trueConditionNames, boolean useInternalBidiFlipper, boolean swapLtrRtlInUrl, boolean swapLeftRightInUrl, boolean simplifyCss, boolean eliminateDeadStyles, boolean allowDefPropagation, boolean allowUnrecognizedFunctions, Set<String> allowedNonStandardFunctions, boolean allowUnrecognizedProperties, Set<String> allowedUnrecognizedProperties, boolean allowUndefinedConstants, boolean allowMozDocument, Vendor vendor, boolean allowKeyframes, boolean allowWebkitKeyframes, boolean processDependencies, Set<String> allowedAtRules, String cssRenamingPrefix, List<String> excludedClassesFromRenaming, GssFunctionMapProvider gssFunctionMapProvider, SubstitutionMapProvider cssSubstitutionMapProvider, OutputRenamingMapFormat outputRenamingMapFormat, boolean preserveComments, boolean suppressDependencyCheck, Map<String, Integer> compileConstants, boolean createSourceMap, SourceMapDetailLevel sourceMapLevel, boolean preserveImportantComments) { this.allowUndefinedConstants = allowUndefinedConstants; Preconditions.checkArgument(!inputs.contains(null)); Preconditions.checkNotNull(outputFormat); Preconditions.checkNotNull(inputOrientation); Preconditions.checkNotNull(outputOrientation); Preconditions.checkNotNull(optimize); Preconditions.checkNotNull(trueConditionNames); Preconditions.checkNotNull(allowedAtRules); Preconditions.checkNotNull(excludedClassesFromRenaming); Preconditions.checkNotNull(compileConstants); this.inputs = ImmutableList.copyOf(inputs); this.copyrightNotice = copyrightNotice; this.outputFormat = outputFormat; this.inputOrientation = inputOrientation; this.outputOrientation = outputOrientation; this.optimize = optimize; this.trueConditionNames = ImmutableList.copyOf(trueConditionNames); this.useInternalBidiFlipper = useInternalBidiFlipper; this.swapLtrRtlInUrl = swapLtrRtlInUrl; this.swapLeftRightInUrl = swapLeftRightInUrl; this.simplifyCss = simplifyCss; this.eliminateDeadStyles = eliminateDeadStyles; this.allowDefPropagation = allowDefPropagation; this.allowUnrecognizedFunctions = allowUnrecognizedFunctions; this.allowedNonStandardFunctions = ImmutableSet.copyOf( allowedNonStandardFunctions); this.allowUnrecognizedProperties = allowUnrecognizedProperties; this.allowedUnrecognizedProperties = ImmutableSet.copyOf( allowedUnrecognizedProperties); this.allowMozDocument = allowMozDocument; this.vendor = vendor; this.allowKeyframes = allowKeyframes; this.allowWebkitKeyframes = allowWebkitKeyframes; this.processDependencies = processDependencies; this.allowedAtRules = ImmutableSet.copyOf(allowedAtRules); this.cssRenamingPrefix = cssRenamingPrefix; this.excludedClassesFromRenaming = ImmutableList.copyOf(excludedClassesFromRenaming); this.gssFunctionMapProvider = gssFunctionMapProvider; this.cssSubstitutionMapProvider = cssSubstitutionMapProvider; this.outputRenamingMapFormat = outputRenamingMapFormat; this.preserveComments = preserveComments; this.suppressDependencyCheck = suppressDependencyCheck; this.compileConstants = ImmutableMap.copyOf(compileConstants); this.createSourceMap = createSourceMap; this.sourceMapLevel = sourceMapLevel; this.preserveImportantComments = preserveImportantComments; } /** * @return the total length of all the inputs' contents */ public int getAllInputsLength() { int totalLength = 0; for (SourceCode input : inputs) { totalLength += input.getFileContentsLength(); } return totalLength; } /** * Whether an input orientation is the same as an output orientation, meaning * that no flipping is required. */ static boolean orientationsAreTheSame(InputOrientation inputOrientation, OutputOrientation outputOrientation) { return inputOrientation.toString().equals(outputOrientation.toString()); } /** * Whether the job requires that the output orientation be different * from the input orientation. */ public boolean needsBiDiFlipping() { return !(outputOrientation == OutputOrientation.NOCHANGE || JobDescription.orientationsAreTheSame( inputOrientation, outputOrientation)); } /** * Returns a new {@code JobDescriptionBuilder} based on this job. */ public JobDescriptionBuilder toBuilder() { return new JobDescriptionBuilder().copyFrom(this); } }