Jump To …
README lib / psd / blend_mode.coffee lib / psd / channel_image.coffee lib / psd / color.coffee lib / psd / descriptor.coffee lib / psd / file.coffee lib / psd / header.coffee lib / psd / image.coffee lib / psd / image_export.coffee lib / psd / image_exports / png.coffee lib / psd / image_format.coffee lib / psd / image_formats / layer_raw.coffee lib / psd / image_formats / layer_rle.coffee lib / psd / image_formats / raw.coffee lib / psd / image_formats / rle.coffee lib / psd / image_mode.coffee lib / psd / image_modes / cmyk.coffee lib / psd / image_modes / greyscale.coffee lib / psd / image_modes / rgb.coffee lib / psd / init.coffee lib / psd / layer / blend_modes.coffee lib / psd / layer / blending_ranges.coffee lib / psd / layer / channel_image.coffee lib / psd / layer / helpers.coffee lib / psd / layer / info.coffee lib / psd / layer / mask.coffee lib / psd / layer / name.coffee lib / psd / layer / position_channels.coffee lib / psd / layer.coffee lib / psd / layer_info / blend_clipping_elements.coffee lib / psd / layer_info / blend_interior_elements.coffee lib / psd / layer_info / fill_opacity.coffee lib / psd / layer_info / gradient_fill.coffee lib / psd / layer_info / layer_id.coffee lib / psd / layer_info / layer_name_source.coffee lib / psd / layer_info / legacy_typetool.coffee lib / psd / layer_info / locked.coffee lib / psd / layer_info / metadata.coffee lib / psd / layer_info / nested_section_divider.coffee lib / psd / layer_info / object_effects.coffee lib / psd / layer_info / section_divider.coffee lib / psd / layer_info / solid_color.coffee lib / psd / layer_info / typetool.coffee lib / psd / layer_info / unicode_name.coffee lib / psd / layer_info / vector_mask.coffee lib / psd / layer_info / vector_origination.coffee lib / psd / layer_info / vector_stroke.coffee lib / psd / layer_info / vector_stroke_content.coffee lib / psd / layer_info.coffee lib / psd / layer_mask.coffee lib / psd / lazy_execute.coffee lib / psd / mask.coffee lib / psd / node.coffee lib / psd / nodes / ancestry.coffee lib / psd / nodes / build_preview.coffee lib / psd / nodes / group.coffee lib / psd / nodes / layer.coffee lib / psd / nodes / root.coffee lib / psd / nodes / search.coffee lib / psd / path_record.coffee lib / psd / resource.coffee lib / psd / resource_section.coffee lib / psd / resources / layer_comps.coffee lib / psd / resources.coffee lib / psd / util.coffee lib / psd.coffee shims / init.coffee shims / png.coffee

# typetool.coffee

lib/psd/layer_info/

¶

    _ = require 'lodash'
    parseEngineData = require 'parse-engine-data'
    LayerInfo = require '../layer_info.coffee'
    Descriptor = require '../descriptor.coffee'

    module.exports = class TextElements extends LayerInfo
      @shouldParse: (key) -> key is 'TySh'

      TRANSFORM_VALUE = ['xx', 'xy', 'yx', 'yy', 'tx', 'ty']
      COORDS_VALUE = ['left', 'top', 'right', 'bottom']

      constructor: (layer, length) ->
        super(layer, length)

        @version = null
        @transform = {}
        @textVersion = null
        @descriptorVersion = null
        @textData = null
        @engineData = null
        @textValue = null
        @warpVersion = null
        @descriptorVersion = null
        @warpData = null
        @coords = {}

      parse: ->
        @version = @file.readShort()

        @parseTransformInfo()

        @textVersion = @file.readShort()
        @descriptorVersion = @file.readInt()

        @textData = new Descriptor(@file).parse()
        @textValue = @textData['Txt ']
        @engineData = parseEngineData(@textData.EngineData)

        @warpVersion = @file.readShort()

        @descriptorVersion = @file.readInt()

        @warpData = new Descriptor(@file).parse()

        for name, index in COORDS_VALUE
          @coords[name] = @file.readInt()

      parseTransformInfo: ->
        for name, index in TRANSFORM_VALUE
          @transform[name] = @file.readDouble()

      fonts: ->
        return [] unless @engineData?
        @engineData.ResourceDict.FontSet.map (f) -> f.Name

      sizes: ->
        return [] if not @engineData? and not @styles().FontSize?
        @styles().FontSize

      alignment: ->
        return [] unless @engineData?
        alignments = ['left', 'right', 'center', 'justify']
        @engineData.EngineDict.ParagraphRun.RunArray.map (s) ->
          alignments[Math.min(parseInt(s.ParagraphSheet.Properties.Justification, 10), 3)]

¶

Return all colors used for text in this layer. The colors are returned in RGBA format as an array of arrays.

      colors: ->

¶

If the color is opaque black, this field is sometimes omitted.

        return [[0, 0, 0, 255]] if not @engineData? or not @styles().FillColor?

        @styles().FillColor.map (s) ->
          values = s.Values.map (v) -> Math.round(v * 255)
          values.push values.shift() # Change ARGB -> RGBA for consistency
          values

      styles: ->
        return {} unless @engineData?
        return @_styles if @_styles?

        data = @engineData.EngineDict.StyleRun.RunArray.map (r) ->
          r.StyleSheet.StyleSheetData

        @_styles = _.reduce(data, (m, o) ->
          for own k, v of o
            m[k] or= []
            m[k].push v
          m
        , {})

¶

Creates the CSS string and returns it. Each property is newline separated and not all properties may be present depending on the document.

Colors are returned in rgba() format and fonts may include some internal Photoshop fonts.

      toCSS: ->
        definition =
          'font-family': @fonts().join(', ')
          'font-size': "#{@sizes()[0]}pt"
          'color': "rgba(#{@colors()[0].join(', ')})"
          'text-align': @alignment()[0]

        css = []
        for k, v of definition
          continue unless v?
          css.push "#{k}: #{v};"

        css.join("\n")

      export: ->
        value: @textValue
        font:
          name: @fonts()[0]
          sizes: @sizes()
          colors: @colors()
          alignment: @alignment()
        left: @coords.left
        top: @coords.top
        right: @coords.right
        bottom: @coords.bottom
        transform: @transform

generated Tue May 12 2015 10:08:57 GMT-0400 (EDT)