All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.squarespace.less.model.Unit Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (c) 2014 SQUARESPACE, 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.squarespace.less.model;

import java.util.HashMap;
import java.util.Map;


/**
 * Represents the unit in a {@link Dimension}.
 */
public enum Unit {

  PERCENTAGE ("%", "percentage"),

  // ABSOLUTE LENGTHS

  // centimeters
  CM ("cm", "centimeters"),
  // millimeters
  MM ("mm", "millimeters"),
  // inches (1in == 2.54cm)
  IN ("in", "inches"),
  // pixels (1px == 1/96in)
  PX ("px", "pixels"),
  // points (1pt == 1/72in)
  PT ("pt", "points"),
  // picas  (1pc == 12pt)
  PC ("pc", "picas"),

  // FONT-RELATIVE LENGTHS

  // width of the '0' (ZERO U+0030) glyph in the element's font
  CH ("ch", "advance measure of '0' glyph"),
  // font size of element
  EM ("em", "element font size"),
  // x-height of the element's font
  EX ("ex", "x-height of element's font"),
  // font size of the root element
  REM ("rem", "font size of root element"),

  // VIEWPORT-RELATIVE LENGTHS

  // 1% of viewport's height
  VH ("vh", "viewport's height"),
  // 1% of viewport's width
  VW ("vw", "viewport's width"),
  // 1% of viewport's smaller dimension
  VMIN ("vmin", "viewport's smaller dimension"),
  // 1% of viewport's larger dimension
  VMAX ("vmax", "viewport's larger dimension"),
  // [bug / typo in less 1.3.3 'vm']
  VM ("vm", ""),

  // GRID

  FR ("fr", "fractions"),

  // TIME

  // seconds
  S ("s", "seconds"),
  // milliseconds
  MS ("ms", "milliseconds"),

  // RESOLUTIONS

  // dots per inch
  DPI ("dpi", "dots per inch"),
  // dots per centimeter
  DPCM ("dpcm", "dots per centimeter"),
  // dots per 'px' unit (1dppx == 96dpi)
  DPPX ("dppx", "dots per 'px' unit"),

  // FREQUENCIES

  // Hertz
  HZ ("hz", "hertz"),
  // KiloHertz (1khz == 1000hz)
  KHZ ("khz", "kilohertz"),

  // ANGLES

  // Degrees
  DEG ("deg", "degrees"),
  // Gradians
  GRAD ("grad", "gradians"),
  // Radians
  RAD ("rad", "radians"),
  // Turns
  TURN ("turn", "turns");

  /**
   * Regular expression to match a unit identifier.
   *
   * NOTE: Keep this sorted roughly by most-frequently-used first
   * NOTE: 'vm' is not a real unit, but is added here since less.js references it
   */
  public static final String REGEX =
      "px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn|fr|dpi|dpcm|dppx|rem|vw|vh|vmin|vmax|ch|hz|khz|vm";

  /**
   * Mapping from a unit's representation to its value.
   */
  private static final Map UNIT_MAP = new HashMap<>();

  // Build up the mapping from a unit's representation to its enumerated value.
  static {
    Unit[] values = Unit.values();
    for (int i = 0; i < values.length; i++) {
      Unit unit = values[i];
      UNIT_MAP.put(unit.repr(), unit);
    }
  }

  /**
   * Representation of the unit, e.g. "px".
   */
  private final String repr;

  /**
   * Human-readable representation for the unit, e.g. "pixels".
   */
  private final String humanRepr;

  /**
   * Construct a unit with the given representations.
   */
  Unit(String repr, String humanRepr) {
    this.repr = repr;
    this.humanRepr = humanRepr;
  }

  /**
   * Return the shorthand representation.
   */
  public String repr() {
    return repr;
  }

  /**
   * Return the human-readable representation.
   */
  public String humanRepr() {
    return humanRepr;
  }

  /**
   * Get the unit for a given raw string.
   */
  public static Unit get(String raw) {
    return UNIT_MAP.get(raw.toLowerCase());
  }

  /**
   * TODO: Format a double to a unit-specific level of precision.
   */
  public String format(double val) {
    // XXX: precision
    return "";
  }

  @Override
  public String toString() {
    return repr.toUpperCase() + (humanRepr.isEmpty() ? "" : " (" + humanRepr + ")");
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy