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.
- checksums.yaml +7 -0
- data/.DS_Store +0 -0
- data/.gitignore +8 -0
- data/.travis.yml +6 -0
- data/CHANGELOG.md +9 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +46 -0
- data/README.md +156 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/assets/Manuel/ImageMagick.md +155 -0
- data/lib/assets/Manuel/Manuel-developer.md +50 -0
- data/lib/assets/fr/PFA_ABSOLUTE_DATA.yaml +212 -0
- data/lib/assets/fr/errors.yaml +107 -0
- data/lib/pfa/absolute_pfa.rb +25 -0
- data/lib/pfa/any_builder.rb +28 -0
- data/lib/pfa/constants.rb +24 -0
- data/lib/pfa/errors_manager.rb +14 -0
- data/lib/pfa/imagemagick_module.rb +551 -0
- data/lib/pfa/img_builder.rb +198 -0
- data/lib/pfa/node_time.rb +188 -0
- data/lib/pfa/pfa_element_module.rb +30 -0
- data/lib/pfa/relative_pfa.rb +191 -0
- data/lib/pfa/relative_pfa_datatime.rb +27 -0
- data/lib/pfa/relative_pfa_node.rb +238 -0
- data/lib/pfa/temporal_methods.rb +69 -0
- data/lib/pfa/version.rb +3 -0
- data/lib/pfa.rb +20 -0
- data/pfa.gemspec +34 -0
- data/pfa.jpg +0 -0
- metadata +147 -0
@@ -0,0 +1,212 @@
|
|
1
|
+
---
|
2
|
+
# Données absolues du PFA (FPA Absolute Data)
|
3
|
+
|
4
|
+
times:
|
5
|
+
zero:
|
6
|
+
description: Temps zéro pris en référence pour rectifier toutes les valeurs.
|
7
|
+
type: time
|
8
|
+
printed: false
|
9
|
+
required: true
|
10
|
+
|
11
|
+
end_time:
|
12
|
+
description: Temps de fin du film (en général au début du générique de fin)
|
13
|
+
type: time
|
14
|
+
printed: false
|
15
|
+
required: true
|
16
|
+
|
17
|
+
# Exemple des temps pour un film de 120 minutes
|
18
|
+
# 1/4 = 30 minutes
|
19
|
+
# 1/24 = 5 minutes
|
20
|
+
nodes:
|
21
|
+
# --- EXPOSITION ---
|
22
|
+
exposition:
|
23
|
+
printed: true
|
24
|
+
required: true
|
25
|
+
id: 'EX'
|
26
|
+
hname: 'EXPOSITION'
|
27
|
+
type: part
|
28
|
+
abs_start: 0
|
29
|
+
abs_duration: 1/4 # p.e. 30 minutes
|
30
|
+
items: ['prelude', 'incident_perturbateur', 'incident_declencheur', 'zone_de_refus', 'pivot1']
|
31
|
+
preambule:
|
32
|
+
printed: true
|
33
|
+
drawn: false # pas sur le PFA
|
34
|
+
required: false
|
35
|
+
type: sequence
|
36
|
+
id: "PR"
|
37
|
+
hname: "Préambule"
|
38
|
+
description: "Introduction du film, souvent la présentation du personnage et de son contexte de vie."
|
39
|
+
abs_start: 0
|
40
|
+
abs_duration: 1/24 # p.e. 5 mn => fin à 5 mn
|
41
|
+
incident_perturbateur:
|
42
|
+
printed: true
|
43
|
+
drawn: true # sur le PFA
|
44
|
+
required: false
|
45
|
+
type: noeud
|
46
|
+
id: "IP"
|
47
|
+
hname: "Incident perturbateur"
|
48
|
+
abs_start: 1/24 # p.e. 5 mn
|
49
|
+
abs_duration: 1/24 # p.e. 5 mn => fin à 10 mn
|
50
|
+
incident_declencheur:
|
51
|
+
printed: true
|
52
|
+
drawn: true # sur le PFA
|
53
|
+
required: true
|
54
|
+
type: noeud
|
55
|
+
id: "ID"
|
56
|
+
hname: "Incident déclencheur"
|
57
|
+
description: "Moment qui déclenche l'histoire, qui permet de définir l'objectif ou la QDF (Question Dramatique Fondamentale)."
|
58
|
+
abs_start: 2/24 # p.e. 10 mn
|
59
|
+
abs_duration: 1/24 # p.e. 5 mn => fin à 15 mn
|
60
|
+
zone_de_refus:
|
61
|
+
printed: true
|
62
|
+
drawn: false # pas sur le PFA
|
63
|
+
required: false
|
64
|
+
type: sequence
|
65
|
+
id: "ZR"
|
66
|
+
hname: "Zone de refus"
|
67
|
+
description: "Moment de l'histoire où le personnage refuse son objectif (directement ou indirectement, consciemment ou inconsciemment)."
|
68
|
+
abs_start: 3/24 # p.e. 15 mn
|
69
|
+
abs_duration: 2/24 # p.e. 10 mn => fin à 25 mn
|
70
|
+
pivot1:
|
71
|
+
printed: true
|
72
|
+
drawn: true # sur le PFA
|
73
|
+
required: true
|
74
|
+
type: noeud
|
75
|
+
id: "P1"
|
76
|
+
hname: "Premier pivot"
|
77
|
+
abs_start: 1/4 - 1/24 # p.e. 30 mn - 5 mn = 25 mn
|
78
|
+
abs_duration: 1/24 # p.e. 5 mn => fin à 30 mn
|
79
|
+
description: "Moment de l'histoire où le personnage accepte son objectif, ce qui fait basculer le récit dans le développement."
|
80
|
+
|
81
|
+
# --- DÉVELOPPEMENT PARTIE 1 ---
|
82
|
+
developpement_part1:
|
83
|
+
printed: true
|
84
|
+
drawn: true # sur le PFA
|
85
|
+
type: part
|
86
|
+
id: 'D1'
|
87
|
+
hname: 'DÉV. PART I'
|
88
|
+
abs_start: 1/4
|
89
|
+
abs_duration: 1/4
|
90
|
+
items: ['premiere_action', 'premier_tiers', 'cle_de_voute']
|
91
|
+
action_1_part1:
|
92
|
+
printed: false
|
93
|
+
drawn: false # pas sur le PFA
|
94
|
+
required: false
|
95
|
+
type: noeud
|
96
|
+
id: "A1"
|
97
|
+
hname: "Première action"
|
98
|
+
description: "La toute première action entreprise par le protagoniste pour atteindre son objectif."
|
99
|
+
abs_start: 1/4
|
100
|
+
abs_duration: null
|
101
|
+
premier_tiers:
|
102
|
+
printed: true
|
103
|
+
drawn: true # sur le PFA
|
104
|
+
required: false
|
105
|
+
type: noeud
|
106
|
+
id: "T1"
|
107
|
+
hname: "Premier tiers"
|
108
|
+
description: "Souvent, à un tiers du film, il se passe quelque chose qui résonnera avec le 2 tiers, et/ou qui découpage le film en trois parties."
|
109
|
+
abs_start: 1/3
|
110
|
+
abs_duration: null
|
111
|
+
cle_de_voute:
|
112
|
+
printed: true
|
113
|
+
drawn: true # sur le PFA
|
114
|
+
required: false
|
115
|
+
type: noeud
|
116
|
+
id: 'CV'
|
117
|
+
hname: "Clé de voûte" # insécable pour ne pas être coupé là à l'affichage dans le graphique
|
118
|
+
description: "Scène faisant basculer l'histoire vers un autre pan, découpant le film en deux parties distinctes."
|
119
|
+
abs_start: 1/2 - 1/48 # p.e. 60 mn - 2,5 mn
|
120
|
+
abs_duration: 1/24 # p.e. 5 mn
|
121
|
+
|
122
|
+
# --- DÉVELOPPEMENT PARTIE 2 ---
|
123
|
+
developpement_part2:
|
124
|
+
printed: true
|
125
|
+
drawn: true # sur le PFA
|
126
|
+
type: part
|
127
|
+
id: 'D2'
|
128
|
+
hname: 'DÉV. PART II'
|
129
|
+
abs_start: 1/2
|
130
|
+
abs_duration: 1/4
|
131
|
+
items: ['premiere_action_dev2', 'deuxieme_tiers', 'crise', 'pivot2']
|
132
|
+
action_1_part2:
|
133
|
+
printed: false
|
134
|
+
drawn: false # pas sur le PFA
|
135
|
+
required: false
|
136
|
+
type: noeud
|
137
|
+
id: "A2"
|
138
|
+
hname: "Première action de 2e partie"
|
139
|
+
description: "Pendant de la première action du développement, après la clé de voûte."
|
140
|
+
abs_start: 1/2 + 1/48 # p.e. 60 + 2,5 mn = 62,5 mn
|
141
|
+
abs_duration: null
|
142
|
+
deuxieme_tiers:
|
143
|
+
printed: true
|
144
|
+
drawn: true # sur le PFA
|
145
|
+
required: false
|
146
|
+
type: noeud
|
147
|
+
id: "T2"
|
148
|
+
hname: "Deuxième tiers"
|
149
|
+
description: "Deuxième temps de la découpe du film en 3 parties et/ou scène en résonance avec la scène à 1/3."
|
150
|
+
abs_start: 2/3
|
151
|
+
abs_duration: null
|
152
|
+
crise:
|
153
|
+
printed: true
|
154
|
+
drawn: true # sur le PFA
|
155
|
+
required: false
|
156
|
+
type: noeud
|
157
|
+
id: "CR"
|
158
|
+
hname: "Crise"
|
159
|
+
description: "Moment du film où tout semble définitivement perdu pour le protagoniste. Il ne semble ne plus jamais pouvoir atteindre son objectif."
|
160
|
+
abs_start: 3/4 - 2/24 # p.e. 90 mn - 10 mn = 80 mn
|
161
|
+
abs_duration: 1/24
|
162
|
+
pivot2:
|
163
|
+
printed: true
|
164
|
+
drawn: true # sur le PFA
|
165
|
+
required: true
|
166
|
+
type: noeud
|
167
|
+
id: "P2"
|
168
|
+
hname: "Second Pivot"
|
169
|
+
description: "Moment de l'histoire qui la fait basculer dans le dénouement (souvent la sortie de crise)."
|
170
|
+
abs_start: 3/4 - 1/24
|
171
|
+
abs_duration: 1/24
|
172
|
+
|
173
|
+
# --- DÉNOUEMENT ---
|
174
|
+
denouement:
|
175
|
+
printed: true
|
176
|
+
drawn: true # sur le PFA
|
177
|
+
type: part
|
178
|
+
id: 'DE' # IMPÉRATIF
|
179
|
+
hname: 'DÉNOUEMENT'
|
180
|
+
abs_start: 3/4
|
181
|
+
abs_duration: 1/4
|
182
|
+
items: ['premiere_action_den', 'climax', 'desinence']
|
183
|
+
action_1_denouement:
|
184
|
+
printed: false
|
185
|
+
drawn: false # pas sur le PFA
|
186
|
+
required: false
|
187
|
+
type: noeud
|
188
|
+
id: "A3"
|
189
|
+
hname: "Première action de dénouement"
|
190
|
+
description: "Première action entrepris par le protagoniste, volontairement ou involontairement, pour se rendre au climax."
|
191
|
+
abs_start: 3/4
|
192
|
+
abs_duration: null
|
193
|
+
climax:
|
194
|
+
printed: true
|
195
|
+
drawn: true # sur le PFA
|
196
|
+
required: true
|
197
|
+
type: noeud
|
198
|
+
id: "CX"
|
199
|
+
hname: "Climax"
|
200
|
+
description: "Scène d'opposition frontale entre le protagoniste et les forces antagonistes. Donne ou permet de donnée la RDF (Réponse Dramatique Fondamentale)."
|
201
|
+
abs_start: 1 - 3/24 # p.e. 120 mn - 15 mn = 105 mn
|
202
|
+
abs_duration: 2/24 # p.e. 10 mn => fin à 115 mn
|
203
|
+
desinence:
|
204
|
+
printed: true
|
205
|
+
drawn: false # pas sur le PFA
|
206
|
+
required: false
|
207
|
+
type: sequence
|
208
|
+
id: "DS"
|
209
|
+
hname: "Désinence"
|
210
|
+
description: "Terminaison extrême du film, après que le climax a été joué."
|
211
|
+
abs_start: 1 - 1/24 # p.e. 120 mn - 5 mn = 115 mn
|
212
|
+
abs_duration: 1/24 # p.e. 5mn
|
@@ -0,0 +1,107 @@
|
|
1
|
+
---
|
2
|
+
# Pour générer une de ces erreurs, utiliser :
|
3
|
+
# raise PFAFatalError.new(<code>[, <{template valeurs}>])
|
4
|
+
|
5
|
+
# --- Méthodes générales
|
6
|
+
|
7
|
+
50: >
|
8
|
+
La valeur %{value} devrait être un Time…
|
9
|
+
51: >
|
10
|
+
La valeur %{value} devrait être un nombre de secondes…
|
11
|
+
52: > # valeur incorrecte pour estimer un temps
|
12
|
+
La valeur de temps %{value} est incorrecte.
|
13
|
+
Les formats pour les temps valides sont :
|
14
|
+
- un nombre de secondes 126
|
15
|
+
- un Time Time.at(3600+56)
|
16
|
+
- une horloge "virgule" "1,46,12"
|
17
|
+
- une horloge "plus" "1+46+12"
|
18
|
+
- une horloge normale "0:12:45"
|
19
|
+
53: > # valeur incorrecte pour initialiser un NTime
|
20
|
+
La valeur %{value} est incorrecte pour initialiser un \PFA::NTime
|
21
|
+
Il faut fournir au choix :
|
22
|
+
- un nombre de secondes ([Integer|Float])
|
23
|
+
- un temps ([Time])
|
24
|
+
- une horloge valide ([String])
|
25
|
+
- une instance NTime ([PFA::NTime])
|
26
|
+
La valeur fournie est de classe %{classe}.
|
27
|
+
|
28
|
+
|
29
|
+
# --- Les données du PFA ---
|
30
|
+
100: >
|
31
|
+
La clé %{key} est inconnue des données du PFA…
|
32
|
+
101: |
|
33
|
+
Il faut définir les dimensions à utiliser en appelant la méthode
|
34
|
+
build avec une table contenant au moins :as dont la valeur est
|
35
|
+
une des valeurs contenues dans la constante DIMS_CONSTANTS_PER_THING
|
36
|
+
du fichier any_builder.rb ou une table définissant les valeurs
|
37
|
+
:pfa_width, :pfa_height, :pfa_left_margin et :pfa_right_margin
|
38
|
+
|
39
|
+
Par exemple :
|
40
|
+
|
41
|
+
pfa.build(**{as: real_book})
|
42
|
+
|
43
|
+
200: >
|
44
|
+
Le zéro doit être défini.
|
45
|
+
|
46
|
+
Utiliser pfa.add(:zero, 'H+M+S')
|
47
|
+
201: >
|
48
|
+
Le temps réel de fin doit être défini.
|
49
|
+
|
50
|
+
Utiliser pfa.add(:end_time, 'H+M+S')
|
51
|
+
202: >
|
52
|
+
L'incident déclencheur doit être défini.
|
53
|
+
|
54
|
+
Utiliser pfa.add(:incident_declencheur, {t:'h,m,s', d:"<description>"[, duree: <secondes>]})
|
55
|
+
203: >
|
56
|
+
Le premier pivot doit être défini.
|
57
|
+
|
58
|
+
Utiliser pfa.add(:pivot1, {t:'h,m,s', d:"<description>"[, duree: <secondes>]})
|
59
|
+
204: >
|
60
|
+
La première partie de développement doit être définie.
|
61
|
+
|
62
|
+
Utiliser pfa.add(:developpement_part1, {t:'h,m,s', d:"<description>"})
|
63
|
+
205: >
|
64
|
+
Le second pivot doit être défini.
|
65
|
+
|
66
|
+
Utiliser pfa.add(:pivot2, {t:'h,m,s', d:"<description>"[, duree: <secondes>]})
|
67
|
+
206: >
|
68
|
+
Le dénouement doit être défini.
|
69
|
+
|
70
|
+
Utiliser pfa.add(:denouement, {t:'h,m,s', d:"<description>"})
|
71
|
+
207: >
|
72
|
+
Le climax doit être défini.
|
73
|
+
|
74
|
+
Utiliser pfa.add(:climax, {t:'h,m,s', d:"<description>"[, duree: <secondes>]})
|
75
|
+
208: >
|
76
|
+
La seconde moitié de développement doit être définie.
|
77
|
+
|
78
|
+
Utiliser pfa.add(:developpement_part2, {t:'h,m,s', d:"<description>"})
|
79
|
+
209: >
|
80
|
+
L'exposition du film doit être définie.
|
81
|
+
|
82
|
+
Utiliser pfa.add(:exposition, {t:'<horloge>', d:'<description>'})
|
83
|
+
|
84
|
+
219: >
|
85
|
+
La propriété :%{key} est mal définie. Ça devrait être une table
|
86
|
+
contenant au minimum :t (ou :time) et :d (ou :description). Or,
|
87
|
+
c'est une instance de type %{classe}.
|
88
|
+
220: >
|
89
|
+
Les temps sont mal réglés.
|
90
|
+
Le temps de :%{key_before} (%{h_before}) devrait être avant le temps de
|
91
|
+
:%{key_after} (%{h_after})…
|
92
|
+
221: >
|
93
|
+
La table de donnée pour le noeud :%{noeud} doit définir le temps
|
94
|
+
(avec la clé :t ou :time).
|
95
|
+
222: >
|
96
|
+
La table de donnée pour le noeud :%{noeud} doit définir la description
|
97
|
+
humaine du noeud, à l'aide des clés :d ou :description.
|
98
|
+
|
99
|
+
# --- Image (building) ---
|
100
|
+
|
101
|
+
5000: >
|
102
|
+
L'image '%{path}' n'a pas pu être produite.
|
103
|
+
(pour une raison malheureusement inconnue de nos services…)
|
104
|
+
|
105
|
+
5001: >
|
106
|
+
Une erreur s'est produite avec la commande `convert' :
|
107
|
+
%{error}.
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#
|
2
|
+
# Singleton AbsolutePFA
|
3
|
+
# ---------------------
|
4
|
+
#
|
5
|
+
#
|
6
|
+
# @note
|
7
|
+
#
|
8
|
+
# Les DATA absolues du paradigme sont définies dans le fichier
|
9
|
+
# PFA_ABSOLUTE_DATA.yaml dans le dossier assets/<LANG>
|
10
|
+
#
|
11
|
+
module PFA
|
12
|
+
class AbsolutePFAClass
|
13
|
+
include Singleton
|
14
|
+
|
15
|
+
# @return Data absolues du Paradigme de Field Augmenté
|
16
|
+
#
|
17
|
+
def data
|
18
|
+
@data ||= YAML.load_file(ABSOLUTE_DATA_PATH, **{symbolize_names:true})
|
19
|
+
end
|
20
|
+
|
21
|
+
end #/ AbsolutePFAClass
|
22
|
+
|
23
|
+
AbsolutePFA = AbsolutePFAClass.instance
|
24
|
+
|
25
|
+
end #/ module PFA
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module PFA
|
2
|
+
class RelativePFA
|
3
|
+
class AnyBuilder
|
4
|
+
|
5
|
+
#
|
6
|
+
# Les nœuds minimums pour pouvoir construire un PFA
|
7
|
+
#
|
8
|
+
REQUIRED_NODES_FOR_BUILDING = [
|
9
|
+
:exposition,
|
10
|
+
:incident_declencheur,
|
11
|
+
:pivot1,
|
12
|
+
:developpement_part1,
|
13
|
+
:developpement_part2,
|
14
|
+
:pivot2,
|
15
|
+
:denouement,
|
16
|
+
:climax,
|
17
|
+
]
|
18
|
+
|
19
|
+
# Instance \PFA::RelativePFA du paradigme de Field augmenté
|
20
|
+
attr_reader :pfa
|
21
|
+
|
22
|
+
def initialize(pfa)
|
23
|
+
@pfa = pfa
|
24
|
+
end
|
25
|
+
|
26
|
+
end #/class AnyBuilder
|
27
|
+
end #/class RelativePFA
|
28
|
+
end #/module PFA
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module PFA
|
2
|
+
|
3
|
+
#
|
4
|
+
# La langue, pour le moment fixe
|
5
|
+
#
|
6
|
+
LANG = 'fr'
|
7
|
+
|
8
|
+
#
|
9
|
+
# Chemin d'accès au dossier ASSETS
|
10
|
+
#
|
11
|
+
ASSETS_FOLDER = File.absolute_path(File.join('.','lib','assets'))
|
12
|
+
|
13
|
+
#
|
14
|
+
# Chemin d'accès au dossier de LANGUE dans les ASSETS
|
15
|
+
#
|
16
|
+
ASSETS_LANG_FOLDER = File.join(ASSETS_FOLDER, LANG)
|
17
|
+
|
18
|
+
#
|
19
|
+
# Chemin d'accès au fichier définissant les données absolues du
|
20
|
+
# Paradigme de Field Augmenté
|
21
|
+
#
|
22
|
+
ABSOLUTE_DATA_PATH = File.join(ASSETS_LANG_FOLDER,'PFA_ABSOLUTE_DATA.yaml')
|
23
|
+
|
24
|
+
end #/ module PFA
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module PFA
|
2
|
+
|
3
|
+
class PFAFatalError < StandardError
|
4
|
+
def initialize(err_num, params = nil)
|
5
|
+
err_msg = ERRORS[err_num]
|
6
|
+
err_msg = err_msg % params unless params.nil?
|
7
|
+
super(err_msg)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
class PFAError < StandardError; end
|
11
|
+
|
12
|
+
ERRORS = YAML.load_file(File.join(ASSETS_LANG_FOLDER,'errors.yaml'))
|
13
|
+
|
14
|
+
end #/module PFA
|