pfa 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|