pfa 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,238 @@
1
+ require_relative 'imagemagick_module'
2
+ require_relative 'pfa_element_module'
3
+
4
+ module PFA
5
+ class RelativePFA
6
+ class Node
7
+
8
+ include PFAElementModule
9
+ include MagickPFA
10
+
11
+ attr_reader :pfa, :key
12
+
13
+ attr_reader :description
14
+
15
+ def initialize(pfa, key, value = nil)
16
+ @pfa = pfa
17
+ @key = key
18
+ parse_raw_value(value)
19
+ end
20
+
21
+ def code_image_magick
22
+ pfa.img_builder.code_image_magick
23
+ end
24
+
25
+ # --- MÉTHODES TEMPORELLES ---
26
+
27
+ # -- Temps relatifs --
28
+
29
+ # [PFA::NTime] Temps (relatif) de début du nœud
30
+ # @note : défini à l'instantiation
31
+ def start_at
32
+ @start_at
33
+ end
34
+
35
+ # [PFA::NTime] Temps (relatif) de fin du noeud
36
+ def end_at
37
+ @end_at ||= start_at + duration # attention : 2 NTime
38
+ end
39
+
40
+ # \PFA::NTime Durée
41
+ # Soit elle a été explicitement définie en renseignant le noeud,
42
+ # soit on lui donne la valeur de la durée absolue.
43
+ # Sauf pour les actes, qui possèdent leur propre calcul, étant
44
+ # donné qu'ils dépendent d'autres éléments
45
+ def duration
46
+ @duration ||= begin
47
+ if type == :part
48
+ case key
49
+ when :exposition then @end_at = pfa.developpement_part1.start_at
50
+ when :developpement_part1 then @end_at = pfa.developpement_part2.start_at
51
+ when :developpement_part2 then @end_at = pfa.denouement.start_at
52
+ when :denouement then @end_at = PFA::NTime.new(pfa.duration.to_i)
53
+ end
54
+ end_at - start_at
55
+ else
56
+ abs_duration
57
+ end
58
+ end
59
+ end
60
+
61
+ # [String] Horloge du temps (relatif) de départ
62
+ def horloge
63
+ @horloge ||= start_at.to_horloge
64
+ end
65
+
66
+ # -- Temps Absolus --
67
+
68
+ # [PFA::NTime] Temps absolu (idéal) de départ
69
+ def abs_start
70
+ @abs_start ||= calc_with_fraction_of_duree(abs_data[:abs_start])
71
+ end
72
+
73
+ def abs_end
74
+ @abs_end ||= abs_start + abs_duration
75
+ end
76
+
77
+ def abs_duration
78
+ @abs_duration ||= calc_with_fraction_of_duree(abs_data[:abs_duration])
79
+ end
80
+
81
+ # --- MÉTHODES DE DIMENSIONNEMENT ---
82
+
83
+ # -- Dimensions Absolues --
84
+
85
+ def abs_left
86
+ @abs_left ||= abs_start.to_px(pfa)#.tap { |n| dbg "abs_left: #{n}".bleu}
87
+ end
88
+
89
+ def abs_width
90
+ @abs_width ||= abs_duration.to_px(pfa)
91
+ end
92
+
93
+ def abs_right
94
+ @abs_right ||= begin
95
+ if id == 'DE' # denouement
96
+ # Pour que le trait du dénouement soit dans l'image
97
+ abs_left + abs_width - 2
98
+ else
99
+ abs_left + abs_width
100
+ end
101
+ end
102
+ end
103
+
104
+ def abs_top
105
+ @abs_top ||= MagickPFA::ABS_TOPS[type]
106
+ end
107
+
108
+ def abs_bottom
109
+ @abs_bottom ||= MagickPFA::ABS_BOTTOMS[type]
110
+ end
111
+
112
+ def abs_height
113
+ @abs_height ||= MagickPFA::HEIGHTS[type]
114
+ end
115
+
116
+ def img_abs_surface
117
+ @img_abs_surface ||= "#{abs_width}x#{abs_height}"
118
+ end
119
+
120
+ # -- Dimensions Relatives --
121
+
122
+ def left
123
+ @left ||= start_at.to_px(pfa)
124
+ end
125
+
126
+ def width
127
+ @width ||= duration.to_px(pfa)
128
+ end
129
+
130
+ def right
131
+ @right ||= begin
132
+ if id == 'DE' # denouement
133
+ # Pour que le trait du dénouement soit dans l'image
134
+ left + width - 2
135
+ else
136
+ left + width
137
+ end
138
+ end
139
+ end
140
+
141
+ def top
142
+ @top ||= MagickPFA::TOPS[type]
143
+ end
144
+
145
+ def bottom
146
+ @bottom ||= MagickPFA::BOTTOMS[type]
147
+ end
148
+
149
+ # Hauteur de la boite pour écrire le texte
150
+ def height
151
+ @height ||= (MagickPFA::HEIGHTS[type]).to_i
152
+ end
153
+
154
+ def img_surface
155
+ @img_surface ||= "#{width}x#{height}"
156
+ end
157
+
158
+
159
+ # --- Predicate Methods ---
160
+
161
+ # @return [Bool] true si le nœud courant est après
162
+ # le nœud [RelativePFA::Node] +node+
163
+ #
164
+ def after?(node)
165
+ # dbg "node = #{node.inspect}".orange
166
+ return start_at > node.start_at
167
+ end
168
+
169
+
170
+ # --- Absolute Data ---
171
+
172
+ # \Hash Données absolues du nœud
173
+ def abs_data
174
+ @abs_data ||= AbsolutePFA.data[:nodes][key]
175
+ end
176
+
177
+ def mark
178
+ abs_data[:hname]
179
+ end
180
+
181
+ def type
182
+ abs_data[:type].to_sym
183
+ end
184
+
185
+ def id
186
+ abs_data[:id]
187
+ end
188
+
189
+ # --- Calculated Values (dimensions) ---
190
+
191
+
192
+
193
+ # -- Des valeurs qui peuvent servir… --
194
+ def demiheight ; @demiheight ||= height / 2 end
195
+ def demiwidth ; @demiwidth ||= width / 2 end
196
+ def abs_demiwidth ; @absdemiwidth ||= abs_width / 2 end
197
+ def hcenter ; @hcenter ||= left + demiwidth end
198
+ def abs_hcenter ; @abshcenter ||= abs_left + abs_demiwidth end
199
+ def vcenter ; @vcenter ||= top + demiheight end
200
+ # Le bas ultime du paradigme ?
201
+ def box_bottom ; @box_bottom ||= top + 13 * MagickPFA::LINE_HEIGHT end
202
+
203
+
204
+ private
205
+
206
+
207
+ # Méthode qui parse la valeur fournie à l'instantiation pour en
208
+ # tirer les valeurs (@start_at et @duration)
209
+ def parse_raw_value(value)
210
+ @raw_value = value
211
+ if value.is_a?(Hash)
212
+ @start_at = NTime.new(value[:t], pfa.zero.to_i)
213
+ @description = value[:d]
214
+ if value.key?(:duree) || value.key?(:duration)
215
+ # La durée est fournie en secondes, elle doit donc être
216
+ # ramenée à la valeur sur 120 minutes
217
+ @duration = NTime.new(value[:duree]||value[:duration], 0)
218
+ end
219
+ end
220
+ end
221
+
222
+ # @return [PFA::NTime] le temps représenté par une fraction dans
223
+ # les données absolues du Paradigme de Field Augmenté
224
+ #
225
+ # @param [String] fraction_str
226
+ # Cette fraction peut avoir les aspects suivants :
227
+ # 1/2
228
+ # 1/2 + 1/48
229
+ # 1/2 - 1/24
230
+ #
231
+ def calc_with_fraction_of_duree(fraction_str)
232
+ fraction = eval(fraction_str.to_s.gsub(/\//,'.0/')) # p.e. 1/24 => 1.0/24
233
+ return PFA::NTime.new(pfa.duration.to_i * fraction, 0)
234
+ end
235
+
236
+ end #/class Node
237
+ end #/class RelativePFA
238
+ end #/module PFA
@@ -0,0 +1,69 @@
1
+ module PFA
2
+
3
+ # Reçoit une valeur temporelle quelconque (mais valide) et retourne
4
+ # le temps \Time correspondant
5
+ #
6
+ # Les valeurs adminissibles sont \Time, \String (format horloge)
7
+ # ou \Integer (nombre de secondes)
8
+ #
9
+ def self.time_from(value)
10
+ case value
11
+ when Time then value
12
+ when String then PFA.h2t(value)
13
+ when Integer then Time.at(value)
14
+ else raise PFAFatalError.new(52, **{value:"#{value.inspect}::#{value.class}"})
15
+ end
16
+ end
17
+
18
+ # Reçoit une horloge au format \String et retourne un nombre
19
+ # de secondes correspondant.
20
+ #
21
+ # @param \String horloge L'horloge transmise, sous différents
22
+ # formats possible, comme 'H:M:S', 'H+M+S' ou 'H,M,S'
23
+ #
24
+ def self.h2s(horloge)
25
+ horloge.match?(REG_HORLOGE) || raise(PFAFatalError.new(52, **{value:"#{horloge.inspect}::#{horloge.class}"}))
26
+ s, m, h = horloge.split(/[+,:]/).reverse.collect {|n| n.to_i}
27
+ return (s||0) + (m||0) * 60 + (h||0) * 3600
28
+ end
29
+
30
+ # Reçoit une horloge et retourne le temps correspondant
31
+ def self.h2t(horloge)
32
+ Time.at(h2s(horloge))
33
+ end
34
+
35
+ # Reçoit un nombre de secondes \Integer et retourne une horloge
36
+ # au format 'H:MM:SS'
37
+ # Si +options[:as]+ = :duree, on renvoie une version durée,
38
+ # c'est-à-dire avec les heures, et les minutes sur deux chiffres
39
+ # seulement s'il y a des heures.
40
+ def self.s2h(secondes, **options)
41
+ secondes.is_a?(Integer) || raise(PFAFatalError.new(51), **{value: "#{secondes.inspect}::#{secondes.class}"})
42
+ h = secondes / 3600
43
+ r = secondes % 3600
44
+ m = r / 60
45
+ s = r % 60
46
+ if options[:as] == :duree
47
+ # -- Version durée --
48
+ # (on ne met les heures que si elles sont définies)
49
+ segs = []
50
+ segs << "#{h}" if h > 0
51
+ m = m.to_s.rjust(2,'0') if h > 0
52
+ segs << "#{m}"
53
+ segs << s.to_s.rjust(2,'0')
54
+ segs.join(':') # => "1:02:54" ou "2:45"
55
+ else
56
+ # -- Version horloge normale --
57
+ # (toujours avec les heures)
58
+ "#{h}:" + [m,s].collect{|n|n.to_s.rjust(2,'0')}.join(':')
59
+ end
60
+ end
61
+
62
+ # Reçoit un temps \Time et retourne une horloge 'H:MM:SS'
63
+ def self.t2h(time)
64
+ time.is_a?(Time) || raise(PFAFatalError.new(50, **{value: "#{time.inspect}::#{time.class}"}))
65
+ return s2h(time.to_i)
66
+ end
67
+
68
+ REG_HORLOGE = /^([0-9][+:,])?([0-9]{1,2}[+:,])?[0-9]{1,2}$/.freeze
69
+ end#/module PFA
@@ -0,0 +1,3 @@
1
+ module PFA
2
+ VERSION = "1.0.1"
3
+ end
data/lib/pfa.rb ADDED
@@ -0,0 +1,20 @@
1
+ def dbg(str)
2
+ STDOUT.write("\n#{str}\n")
3
+ end
4
+ require 'clir'
5
+ require 'yaml'
6
+ require 'singleton'
7
+ require "pfa/version"
8
+ require 'pfa/constants'
9
+ require 'pfa/errors_manager'
10
+ require 'pfa/temporal_methods'
11
+ require 'pfa/node_time'
12
+ require 'pfa/relative_pfa'
13
+ require 'pfa/absolute_pfa'
14
+ require 'pfa/relative_pfa_node'
15
+ require 'pfa/relative_pfa_datatime'
16
+ require 'pfa/img_builder'
17
+
18
+ module PFA
19
+
20
+ end
data/pfa.gemspec ADDED
@@ -0,0 +1,34 @@
1
+ require_relative 'lib/pfa/version'
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = "pfa"
5
+ s.version = PFA::VERSION
6
+ s.authors = ["PhilippePerret"]
7
+ s.email = ["philippe.perret@yahoo.fr"]
8
+
9
+ s.summary = %q{Gestion d'un Paradigme de Field Augmentée (Field Augmented Paradigm)}
10
+ s.description = %q{Gestion complète d'un PFA, pour le produire soit en HTML soit en PDF et calculer les différences entre PFA relatif et PFA absolu.}
11
+ s.homepage = "https://rubygems.org/gems/pfa"
12
+ s.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
13
+
14
+ s.metadata["allowed_push_host"] = "https://rubygems.org"
15
+
16
+ s.add_dependency 'yaml'
17
+ s.add_dependency 'clir'
18
+ s.add_dependency 'singleton'
19
+ s.add_development_dependency 'minitest'
20
+ s.add_development_dependency 'minitest-color'
21
+
22
+ s.metadata["homepage_uri"] = s.homepage
23
+ s.metadata["source_code_uri"] = "https://github.com/PhilippePerret/pfa"
24
+ s.metadata["changelog_uri"] = "https://github.com/PhilippePerret/pfa/CHANGELOG.md"
25
+
26
+ # Specify which files should be added to the gem when it is released.
27
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
28
+ s.files = Dir.chdir(File.expand_path('..', __FILE__)) do
29
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test)/}) }
30
+ end
31
+ s.bindir = "exe"
32
+ s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
33
+ s.require_paths = ["lib"]
34
+ end
data/pfa.jpg ADDED
Binary file
metadata ADDED
@@ -0,0 +1,147 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pfa
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - PhilippePerret
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2023-09-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: yaml
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: clir
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: singleton
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest-color
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Gestion complète d'un PFA, pour le produire soit en HTML soit en PDF
84
+ et calculer les différences entre PFA relatif et PFA absolu.
85
+ email:
86
+ - philippe.perret@yahoo.fr
87
+ executables: []
88
+ extensions: []
89
+ extra_rdoc_files: []
90
+ files:
91
+ - ".DS_Store"
92
+ - ".gitignore"
93
+ - ".travis.yml"
94
+ - CHANGELOG.md
95
+ - Gemfile
96
+ - Gemfile.lock
97
+ - README.md
98
+ - Rakefile
99
+ - bin/console
100
+ - bin/setup
101
+ - lib/assets/Manuel/ImageMagick.md
102
+ - lib/assets/Manuel/Manuel-developer.md
103
+ - lib/assets/fr/PFA_ABSOLUTE_DATA.yaml
104
+ - lib/assets/fr/errors.yaml
105
+ - lib/pfa.rb
106
+ - lib/pfa/absolute_pfa.rb
107
+ - lib/pfa/any_builder.rb
108
+ - lib/pfa/constants.rb
109
+ - lib/pfa/errors_manager.rb
110
+ - lib/pfa/imagemagick_module.rb
111
+ - lib/pfa/img_builder.rb
112
+ - lib/pfa/node_time.rb
113
+ - lib/pfa/pfa_element_module.rb
114
+ - lib/pfa/relative_pfa.rb
115
+ - lib/pfa/relative_pfa_datatime.rb
116
+ - lib/pfa/relative_pfa_node.rb
117
+ - lib/pfa/temporal_methods.rb
118
+ - lib/pfa/version.rb
119
+ - pfa.gemspec
120
+ - pfa.jpg
121
+ homepage: https://rubygems.org/gems/pfa
122
+ licenses: []
123
+ metadata:
124
+ allowed_push_host: https://rubygems.org
125
+ homepage_uri: https://rubygems.org/gems/pfa
126
+ source_code_uri: https://github.com/PhilippePerret/pfa
127
+ changelog_uri: https://github.com/PhilippePerret/pfa/CHANGELOG.md
128
+ post_install_message:
129
+ rdoc_options: []
130
+ require_paths:
131
+ - lib
132
+ required_ruby_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: 2.3.0
137
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ requirements: []
143
+ rubygems_version: 3.1.6
144
+ signing_key:
145
+ specification_version: 4
146
+ summary: Gestion d'un Paradigme de Field Augmentée (Field Augmented Paradigm)
147
+ test_files: []