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,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