psd 3.1.2 → 3.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e01eed6ed75e5db88c644ea838ff2f29d89c9df2
4
- data.tar.gz: ca303780610167552c62d169a886595d71b55a6d
3
+ metadata.gz: f50b617c54533215a7298c60bd67cf41a822b9b4
4
+ data.tar.gz: 5e460352673f2a562d1539ef354297a776431beb
5
5
  SHA512:
6
- metadata.gz: f69ddfe1cf1ce6f9600151080928539f5529ae94fdbf0cb94c32bc7e4f0b6e2eef8058dc7af1cc9094202181bce10265a67c6fb850f182772aacbc48ca5ff3b5
7
- data.tar.gz: cf3f1ae5c8a4c25eeaadc90e93f0d36b479d024fe7da33909a25f2b2b8d00c1ceb1d2d2fe058af67f106781400d29a7e35bdd7da57c7f6fdb4d50a2e35f4eb68
6
+ metadata.gz: 48fb4c174e1faace5c98f63f5a5ed584a4a459c553d7c284efa1e15b22bfdbc5e28bfd93dac16d4e9a1f7c47dba1dc3f40e05d9c514e1045ccd90590d38f39d3
7
+ data.tar.gz: 79ebfea952eb57031c6cc0d57e803728c20cb107597a2df578261dcf677708d5a998701039ef9a4032aad374a556ce33a2dc816dbf64ab17c9ec5756cfa96f70
data/README.md CHANGED
@@ -19,9 +19,8 @@ A general purpose Photoshop file parser written in Ruby. It allows you to work w
19
19
 
20
20
  PSD.rb is tested against:
21
21
 
22
- * MRI 1.9.3 & 2.0.0
22
+ * MRI 1.9.3, 2.0.0, 2.1.0
23
23
  * JRuby (1.9.3 mode)
24
- * Rubinius (1.9.3 mode)
25
24
 
26
25
  If you use MRI Ruby and are interested in significantly speeding up PSD.rb with native code, check out [psd_native](https://github.com/layervault/psd_native).
27
26
 
@@ -76,15 +75,23 @@ end
76
75
 
77
76
  ### Traversing the Document
78
77
 
79
- To access the document as a tree structure, use `psd.tree` to get the root node. From there, you can traverse the tree using any of these methods:
78
+ To access the document as a tree structure, use `psd.tree` to get the root node. From there, work with the tree using any of these methods:
80
79
 
81
80
  * `root`: get the root node from anywhere in the tree
81
+ * `root?`: is this the root node?
82
82
  * `children`: get all immediate children of the node
83
+ * `has_children?`: does this node have any children?
84
+ * `childless?`: opposite of `has_children?`
83
85
  * `ancestors`: get all ancestors in the path of this node (excluding the root)
84
86
  * `siblings`: get all sibling tree nodes including the current one (e.g. all layers in a folder)
87
+ * `next_sibling`: gets the sibling immediately following the current node
88
+ * `prev_sibling`: gets the sibling immediately before the current node
89
+ * `has_siblings?`: does this node have any siblings?
90
+ * `only_child?`: opposite of `has_siblings?`
85
91
  * `descendants`: get all descendant nodes not including the current one
86
92
  * `subtree`: same as descendants but starts with the current node
87
- * `depth`: calculate the depth of the current node
93
+ * `depth`: calculate the depth of the current node (root node is 0)
94
+ * `path`: gets the path to the current node
88
95
 
89
96
  For any of the traversal methods, you can also retrieve folder or layer nodes only by appending `_layers` or `_groups` to the method. For example:
90
97
 
@@ -96,6 +103,7 @@ If you know the path to a group or layer within the tree, you can search by that
96
103
 
97
104
  ``` ruby
98
105
  psd.tree.children_at_path("Version A/Matte")
106
+ psd.tree.children_at_path(["Version A", "Matte"])
99
107
  ```
100
108
 
101
109
  ### Layer Comps
@@ -111,7 +119,7 @@ tree = psd.tree.filter_by_comp('Version A')
111
119
  puts tree.children.map(&:name)
112
120
  ```
113
121
 
114
- This returns a new node tree and does not alter the original so you won't lose any data.
122
+ This returns a new node tree and does not alter the original.
115
123
 
116
124
  ### Accessing Layer Data
117
125
 
@@ -197,6 +205,20 @@ png = psd.image.to_png # reference to PNG data
197
205
  psd.image.save_as_png 'path/to/output.png' # writes PNG to disk
198
206
  ```
199
207
 
208
+ This uses the full rasterized preview provided by Photoshop. It does not use the built-in rendering engine (described below). If the file was not saved with Compatibility Mode enabled, this will return an empty image.
209
+
210
+ ### Preview Building
211
+
212
+ You can build previews of any subset or version of the PSD document using the built-in renderer. This is useful for generating previews of layer comps or exporting individual layer groups as images.
213
+
214
+ ``` ruby
215
+ # Save a layer comp
216
+ psd.tree.filter_by_comp("Version A").save_as_png('./Version A.png')
217
+
218
+ # Generate PNG of individual layer group
219
+ psd.tree.children_at_path("Group 1").first.to_png
220
+ ```
221
+
200
222
  ### Debugging
201
223
 
202
224
  If you run into any problems parsing a PSD, you can enable debug logging via the `PSD_DEBUG` environment variable. For example:
@@ -205,31 +227,17 @@ If you run into any problems parsing a PSD, you can enable debug logging via the
205
227
  PSD_DEBUG=true bundle exec examples/parse.rb
206
228
  ```
207
229
 
208
- You can also give a path to a file instead. If you need to enable debugging programatically:
230
+ If you need to enable debugging programatically:
209
231
 
210
232
  ``` ruby
211
233
  PSD.debug = true
212
234
  ```
213
235
 
214
- ### Preview Building
215
-
216
- **This is currently an experimental feature. It works "well enough" but is not perfect yet.**
217
-
218
- You can build previews of any subset or version of the PSD document. This is useful for generating previews of layer comps or exporting individual layer groups as images.
219
-
220
- ``` ruby
221
- # Save a layer comp
222
- psd.tree.filter_by_comp("Version A").save_as_png('./Version A.png')
223
-
224
- # Generate PNG of individual layer group
225
- psd.tree.children_at_path("Group 1").first.to_png
226
- ```
227
-
228
236
  ## To-do
229
237
 
230
238
  There are a few features that are currently missing from PSD.rb.
231
239
 
232
240
  * More image modes + depths for image exporting
233
- * A few layer info blocks
234
241
  * Support for rendering all layer styles
242
+ * Support for layer comp adjusted layer styles
235
243
  * Render engine fixes for groups with lowered opacity
data/lib/psd.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'psd/enginedata'
2
2
  require 'chunky_png'
3
+ require 'xmp'
3
4
  # require "cairo"
4
5
 
5
6
  require 'active_support/core_ext/module/delegation'
data/lib/psd/file.rb CHANGED
@@ -82,7 +82,10 @@ class PSD
82
82
  # Reads a unicode string, which is double the length of a normal string and encoded as UTF-16.
83
83
  def read_unicode_string(length=nil)
84
84
  length ||= read_int if length.nil?
85
- !length.nil? && length > 0 ? read(length * 2).encode('UTF-8', 'UTF-16BE').delete("\000") : ''
85
+ return '' if length.nil? || length <= 0
86
+ read(length * 2)
87
+ .encode('UTF-8', 'UTF-16BE', universal_newline: true)
88
+ .delete("\000")
86
89
  end
87
90
 
88
91
  # Reads a boolean value.
data/lib/psd/image.rb CHANGED
@@ -120,4 +120,4 @@ class PSD
120
120
  @pixel_data[i]
121
121
  end
122
122
  end
123
- end
123
+ end
@@ -18,9 +18,6 @@ class PSD
18
18
  descriptor_version = @file.read_int
19
19
 
20
20
  @data[:text] = Descriptor.new(@file).parse
21
- @data[:text]['EngineData']
22
- .encode!('UTF-8', 'MacRoman', invalid: :replace, undef: :replace)
23
- .delete!("\000")
24
21
 
25
22
  @data[:engine_data] = nil
26
23
  begin
@@ -44,12 +41,7 @@ class PSD
44
41
  # Extracts the text within the text area. In the event that psd-enginedata fails
45
42
  # for some reason, we attempt to extract the text using some rough regex.
46
43
  def text_value
47
- if engine_data.nil?
48
- # Something went wrong, lets hack our way through.
49
- /\/Text \(˛ˇ(.*)\)$/.match(@data[:text]['EngineData'])[1].gsub /\r/, "\n"
50
- else
51
- engine_data.EngineDict.Editor.Text
52
- end
44
+ @data[:text]['Txt ']
53
45
  end
54
46
  alias :to_s :text_value
55
47
 
@@ -12,8 +12,7 @@ class PSD
12
12
 
13
13
  @layers = []
14
14
  @merged_alpha = false
15
- @global_mask = nil
16
- @extras = []
15
+ @global_mask = nil
17
16
  end
18
17
 
19
18
  # Allows us to skip this section because it starts with the length of the section
@@ -0,0 +1,46 @@
1
+ require 'psd/resources/base'
2
+
3
+ class PSD
4
+ class Resource
5
+ module Section
6
+ class XMPMetadata < Base
7
+ resource_id 1060
8
+ name :xmp_metadata
9
+
10
+ attr_reader :xml, :data
11
+ alias_method :to_hash, :data
12
+
13
+ def parse
14
+ @xml = @file.read(@resource.size)
15
+ @data = {}
16
+
17
+ @xmp = XMP.new(xml)
18
+ @xmp.namespaces.each do |a|
19
+ parse_tree(a.to_sym)
20
+ end
21
+ rescue Java::OrgW3cDom::DOMException
22
+ PSD.logger.error "Unable to parse XMP Metadata"
23
+ ensure
24
+ @resource.data = self
25
+ end
26
+
27
+ private
28
+
29
+ def parse_tree(attr_name)
30
+ @data[attr_name] = {}
31
+ @xmp.send(attr_name).attributes.each do |a|
32
+ begin
33
+ @data[attr_name][a.to_sym] = @xmp.send(attr_name).send(a)[0]
34
+ rescue
35
+ @data[attr_name][a.to_sym] = parse_text_node(@xmp.send(attr_name), "//#{attr_name}:#{a}")
36
+ end
37
+ end
38
+ end
39
+
40
+ def parse_text_node(node, path)
41
+ node.send(:xml).xpath(path).first.text
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
data/lib/psd/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class PSD
2
- VERSION = "3.1.2"
2
+ VERSION = "3.1.3"
3
3
  end
data/psd.gemspec CHANGED
@@ -19,9 +19,10 @@ Gem::Specification.new do |gem|
19
19
  gem.require_paths = ["lib"]
20
20
 
21
21
  gem.add_dependency 'rake'
22
- gem.add_dependency 'psd-enginedata', '~> 1.0'
22
+ gem.add_dependency 'psd-enginedata', '~> 1'
23
23
  gem.add_dependency 'chunky_png'
24
24
  gem.add_dependency 'activesupport', '~> 3.2.7'
25
+ gem.add_dependency 'xmp'
25
26
 
26
27
  gem.test_files = Dir.glob("spec/**/*")
27
28
  gem.add_development_dependency 'rspec'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: psd
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.2
4
+ version: 3.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan LeFevre
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-04-10 00:00:00.000000000 Z
12
+ date: 2014-04-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -31,14 +31,14 @@ dependencies:
31
31
  requirements:
32
32
  - - ~>
33
33
  - !ruby/object:Gem::Version
34
- version: '1.0'
34
+ version: '1'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - ~>
40
40
  - !ruby/object:Gem::Version
41
- version: '1.0'
41
+ version: '1'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: chunky_png
44
44
  requirement: !ruby/object:Gem::Requirement
@@ -67,6 +67,20 @@ dependencies:
67
67
  - - ~>
68
68
  - !ruby/object:Gem::Version
69
69
  version: 3.2.7
70
+ - !ruby/object:Gem::Dependency
71
+ name: xmp
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - '>='
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
70
84
  - !ruby/object:Gem::Dependency
71
85
  name: rspec
72
86
  requirement: !ruby/object:Gem::Requirement
@@ -140,7 +154,6 @@ files:
140
154
  - LICENSE.txt
141
155
  - README.md
142
156
  - Rakefile
143
- - circle.yml
144
157
  - lib/psd.rb
145
158
  - lib/psd/blend_mode.rb
146
159
  - lib/psd/channel_image.rb
@@ -223,6 +236,7 @@ files:
223
236
  - lib/psd/resources/guides.rb
224
237
  - lib/psd/resources/layer_comps.rb
225
238
  - lib/psd/resources/slices.rb
239
+ - lib/psd/resources/xmp_metadata.rb
226
240
  - lib/psd/util.rb
227
241
  - lib/psd/version.rb
228
242
  - psd.gemspec
data/circle.yml DELETED
@@ -1,6 +0,0 @@
1
- machine:
2
- ruby:
3
- version: 2.0.0-p195
4
- test:
5
- override:
6
- - rspec