pfa 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []