flnews_post_proc 1.62 → 1.71

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 06e2f2f46c1d30f65062366e6b02d4e3b84eb21f6e65d1e746ab54b5d964e13a
4
- data.tar.gz: 6ab18c57da83155d698b57f0544063e12d1a218eb4da89ac816cc70dcb980da6
3
+ metadata.gz: 7cede40b08799a20bef9bb5b631371f5837269f17d16f4401190f73b953ea748
4
+ data.tar.gz: 682eea779a029ed1078ef6ce5cb09d5aa877b8bb0d62c3df238e26db5dbf3ba1
5
5
  SHA512:
6
- metadata.gz: 8a5e692db21786d8689c8b4f2d90a7f7997acc8b1e0561265d36ff46e69bb0ae38ae63cdea1dafebeb09c881aa760c34cec758af9b243b54f483361236ebcbe6
7
- data.tar.gz: 2526a34226e03405cd773599964e762437bbc07210b2aa5cdba760001fa0cccef58f2c16e4e8e9d4c0741d1da290a4416a1850249b0768e4bd6844d62279cbfd
6
+ metadata.gz: caca97eb88abfe09b7fae35da0389c0f7a3a0a336b59ac83432f8cdb958fbc98076ede8b52fa095044d51a04f4178c9227b6d2d596deb9e1504d51fb336a6bbd
7
+ data.tar.gz: bfe1dc4048ff44e1f712fdd98eeab6512b6f60d95c122279d80e4d4d7a2f8a2f29078dc3ecee22ff1bcde7caf2412169a8e2645c86ddfa6b53311b3c183704aa
data/README.md CHANGED
@@ -83,7 +83,8 @@ some users may not always agree with the result and for arbitrary reasons:
83
83
  would like to replace it against another, based on the newsgroup you are
84
84
  about to post to.
85
85
  The post-processor program sets specific signatures as configured for one
86
- or several newsgroups.
86
+ or several newsgroups. You can even define a list of signatures and have
87
+ the program pick one from the list.
87
88
 
88
89
  * Some custom headers may serve to convey additional information to
89
90
  interested readers of your post, like GnuPG key IDs, your language skills
@@ -210,6 +211,9 @@ intact.
210
211
 
211
212
  **GROUP_SIGS**
212
213
  A signature line per Newsgroup.
214
+ If a file is named instead, the program will pick randomly one signature from
215
+ that file. The file should contain signatures, separated by 1 empty line.
216
+
213
217
  ATTN! In multi line signatures, you have to use \r\n for line breaks.
214
218
 
215
219
  CONTENT: A newsgroup or regexp per line, followed by a colon, a space and a String.
@@ -217,6 +221,7 @@ intact.
217
221
  DEFAULT: As configured in flnews
218
222
 
219
223
  EXAMPLE: alt.test: _"Signature for alt.test\\\\r\\\\nsecond line"_
224
+ EXAMPLE: comp.*: /home/user/.my_sigs
220
225
 
221
226
  **CUSTOM_HEADERS**
222
227
  Additional headers for the outgoing article
data/bin/flnews_post_proc CHANGED
@@ -15,7 +15,7 @@
15
15
  ***************************************************************************/
16
16
  =end
17
17
  # This program is Linux only
18
- if ! /linux/ =~ RUBY_PLATFORM
18
+ if ! (/linux/ =~ RUBY_PLATFORM)
19
19
  msg = "ERROR ! This script #{$0} cannot be used with #{RUBY_PLATFORM}"
20
20
  msg << "\n\tABORTING! Bye."
21
21
  STDERR.puts msg
@@ -3,360 +3,47 @@
3
3
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
4
  <head>
5
5
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
- <meta name="generator" content="Docutils 0.20.1: https://docutils.sourceforge.io/" />
7
- <title>Flnews_post_proc</title>
6
+ <meta name="generator" content="Docutils 0.21.2: https://docutils.sourceforge.io/" />
7
+ <title>flnews_post_proc</title>
8
8
  <style type="text/css">
9
9
 
10
10
  /*
11
- :Author: David Goodger (goodger@python.org)
12
- :Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
13
- :Copyright: This stylesheet has been placed in the public domain.
11
+ :Author: Michael Uplawski
12
+ :Contact: michael.uplawski@uplawski.eu
13
+ :License: WTFPL 2.0, see http://www.wtfpl.net/about/
14
14
 
15
- Default cascading style sheet for the HTML output of Docutils.
16
-
17
- See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
18
- customize this style sheet.
15
+ Stylesheet for use with Docutils.
19
16
  */
20
17
 
21
- /* used to remove borders from tables and images */
22
- .borderless, table.borderless td, table.borderless th {
23
- border: 0 }
24
-
25
- table.borderless td, table.borderless th {
26
- /* Override padding for "table.docutils td" with "! important".
27
- The right padding separates the table cells. */
28
- padding: 0 0.5em 0 0 ! important }
29
-
30
- .first {
31
- /* Override more specific margin styles with "! important". */
32
- margin-top: 0 ! important }
33
-
34
- .last, .with-subtitle {
35
- margin-bottom: 0 ! important }
36
-
37
- .hidden {
38
- display: none }
39
-
40
- .subscript {
41
- vertical-align: sub;
42
- font-size: smaller }
43
-
44
- .superscript {
45
- vertical-align: super;
46
- font-size: smaller }
47
-
48
- a.toc-backref {
49
- text-decoration: none ;
50
- color: black }
51
-
52
- blockquote.epigraph {
53
- margin: 2em 5em ; }
54
-
55
- dl.docutils dd {
56
- margin-bottom: 0.5em }
18
+ /* The defaults for docutils */
19
+ @import url(html4css1.css);
57
20
 
58
- object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
59
- overflow: hidden;
21
+ body {
22
+ background-color:#e0f0a0;
23
+ font-family: Verdana,Helvetica,Univers;
60
24
  }
61
25
 
62
- /* Uncomment (and remove this text!) to get bold-faced definition list terms
63
- dl.docutils dt {
64
- font-weight: bold }
65
- */
66
-
67
- div.abstract {
68
- margin: 2em 5em }
69
-
70
- div.abstract p.topic-title {
71
- font-weight: bold ;
72
- text-align: center }
73
-
74
- div.admonition, div.attention, div.caution, div.danger, div.error,
75
- div.hint, div.important, div.note, div.tip, div.warning {
76
- margin: 2em ;
77
- border: medium outset ;
78
- padding: 1em }
79
-
80
- div.admonition p.admonition-title, div.hint p.admonition-title,
81
- div.important p.admonition-title, div.note p.admonition-title,
82
- div.tip p.admonition-title {
83
- font-weight: bold ;
84
- font-family: sans-serif }
85
-
86
- div.attention p.admonition-title, div.caution p.admonition-title,
87
- div.danger p.admonition-title, div.error p.admonition-title,
88
- div.warning p.admonition-title, .code .error {
89
- color: red ;
90
- font-weight: bold ;
91
- font-family: sans-serif }
92
-
93
- /* Uncomment (and remove this text!) to get reduced vertical space in
94
- compound paragraphs.
95
- div.compound .compound-first, div.compound .compound-middle {
96
- margin-bottom: 0.5em }
97
-
98
- div.compound .compound-last, div.compound .compound-middle {
99
- margin-top: 0.5em }
100
- */
101
-
102
- div.dedication {
103
- margin: 2em 5em ;
104
- text-align: center ;
105
- font-style: italic }
26
+ h1 {color:darkblue;font-size:1.5em;}
27
+ h1.title {color:#a0a0f0;font-size:2em;}
106
28
 
107
- div.dedication p.topic-title {
108
- font-weight: bold ;
109
- font-style: normal }
29
+ p, ul.simple, ol.simple, dt {margin-left:2em;}
30
+ dd {margin-left:4em;}
110
31
 
111
- div.figure {
112
- margin-left: 2em ;
113
- margin-right: 2em }
32
+ /* correct left margin of nested block tags*/
33
+ dd p, li p {margin-left:0;}
34
+ dd * ul {margin-left:0 ! important; }
35
+ dd ul {margin-left:0 ! important; }
36
+ dd dl dt, dd dl dd {margin-left:0 ! important;}
114
37
 
115
- div.footer, div.header {
116
- clear: both;
117
- font-size: smaller }
118
-
119
- div.line-block {
120
- display: block ;
121
- margin-top: 1em ;
122
- margin-bottom: 1em }
123
-
124
- div.line-block div.line-block {
125
- margin-top: 0 ;
126
- margin-bottom: 0 ;
127
- margin-left: 1.5em }
128
-
129
- div.sidebar {
130
- margin: 0 0 0.5em 1em ;
131
- border: medium outset ;
132
- padding: 1em ;
133
- background-color: #ffffee ;
134
- width: 40% ;
135
- float: right ;
136
- clear: right }
137
-
138
- div.sidebar p.rubric {
139
- font-family: sans-serif ;
140
- font-size: medium }
141
-
142
- div.system-messages {
143
- margin: 5em }
144
-
145
- div.system-messages h1 {
146
- color: red }
147
-
148
- div.system-message {
149
- border: medium outset ;
150
- padding: 1em }
151
-
152
- div.system-message p.system-message-title {
153
- color: red ;
154
- font-weight: bold }
155
-
156
- div.topic {
157
- margin: 2em }
158
-
159
- h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
160
- h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
161
- margin-top: 0.4em }
162
-
163
- h1.title {
164
- text-align: center }
165
-
166
- h2.subtitle {
167
- text-align: center }
168
-
169
- hr.docutils {
170
- width: 75% }
171
-
172
- img.align-left, .figure.align-left, object.align-left, table.align-left {
173
- clear: left ;
174
- float: left ;
175
- margin-right: 1em }
176
-
177
- img.align-right, .figure.align-right, object.align-right, table.align-right {
178
- clear: right ;
179
- float: right ;
180
- margin-left: 1em }
181
-
182
- img.align-center, .figure.align-center, object.align-center {
183
- display: block;
184
- margin-left: auto;
185
- margin-right: auto;
186
- }
187
-
188
- table.align-center {
189
- margin-left: auto;
190
- margin-right: auto;
38
+ em {color:#000080;
39
+ background-color:#ffffa0;
191
40
  }
192
41
 
193
- .align-left {
194
- text-align: left }
195
-
196
- .align-center {
197
- clear: both ;
198
- text-align: center }
199
-
200
- .align-right {
201
- text-align: right }
202
-
203
- /* reset inner alignment in figures */
204
- div.align-right {
205
- text-align: inherit }
206
-
207
- /* div.align-center * { */
208
- /* text-align: left } */
209
-
210
- .align-top {
211
- vertical-align: top }
212
-
213
- .align-middle {
214
- vertical-align: middle }
215
-
216
- .align-bottom {
217
- vertical-align: bottom }
218
-
219
- ol.simple, ul.simple {
220
- margin-bottom: 1em }
221
-
222
- ol.arabic {
223
- list-style: decimal }
224
-
225
- ol.loweralpha {
226
- list-style: lower-alpha }
227
-
228
- ol.upperalpha {
229
- list-style: upper-alpha }
230
-
231
- ol.lowerroman {
232
- list-style: lower-roman }
233
-
234
- ol.upperroman {
235
- list-style: upper-roman }
236
-
237
- p.attribution {
238
- text-align: right ;
239
- margin-left: 50% }
240
-
241
- p.caption {
242
- font-style: italic }
243
-
244
- p.credits {
245
- font-style: italic ;
246
- font-size: smaller }
247
-
248
- p.label {
249
- white-space: nowrap }
250
-
251
- p.rubric {
252
- font-weight: bold ;
253
- font-size: larger ;
254
- color: maroon ;
255
- text-align: center }
256
-
257
- p.sidebar-title {
258
- font-family: sans-serif ;
259
- font-weight: bold ;
260
- font-size: larger }
261
-
262
- p.sidebar-subtitle {
263
- font-family: sans-serif ;
264
- font-weight: bold }
265
-
266
- p.topic-title {
267
- font-weight: bold }
268
-
269
- pre.address {
270
- margin-bottom: 0 ;
271
- margin-top: 0 ;
272
- font: inherit }
273
-
274
- pre.literal-block, pre.doctest-block, pre.math, pre.code {
275
- margin-left: 2em ;
276
- margin-right: 2em }
277
-
278
- pre.code .ln { color: grey; } /* line numbers */
279
- pre.code, code { background-color: #eeeeee }
280
- pre.code .comment, code .comment { color: #5C6576 }
281
- pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
282
- pre.code .literal.string, code .literal.string { color: #0C5404 }
283
- pre.code .name.builtin, code .name.builtin { color: #352B84 }
284
- pre.code .deleted, code .deleted { background-color: #DEB0A1}
285
- pre.code .inserted, code .inserted { background-color: #A3D289}
286
-
287
- span.classifier {
288
- font-family: sans-serif ;
289
- font-style: oblique }
290
-
291
- span.classifier-delimiter {
292
- font-family: sans-serif ;
293
- font-weight: bold }
294
-
295
- span.interpreted {
296
- font-family: sans-serif }
297
-
298
- span.option {
299
- white-space: nowrap }
300
-
301
- span.pre {
302
- white-space: pre }
303
-
304
- span.problematic {
305
- color: red }
306
-
307
- span.section-subtitle {
308
- /* font-size relative to parent (h1..h6 element) */
309
- font-size: 80% }
310
-
311
- table.citation {
312
- border-left: solid 1px gray;
313
- margin-left: 1px }
314
-
315
- table.docinfo {
316
- margin: 2em 4em }
317
-
318
- table.docutils {
319
- margin-top: 0.5em ;
320
- margin-bottom: 0.5em }
321
-
322
- table.footnote {
323
- border-left: solid 1px black;
324
- margin-left: 1px }
325
-
326
- table.docutils td, table.docutils th,
327
- table.docinfo td, table.docinfo th {
328
- padding-left: 0.5em ;
329
- padding-right: 0.5em ;
330
- vertical-align: top }
331
-
332
- table.docutils th.field-name, table.docinfo th.docinfo-name {
333
- font-weight: bold ;
334
- text-align: left ;
335
- white-space: nowrap ;
336
- padding-left: 0 }
337
-
338
- /* "booktabs" style (no vertical lines) */
339
- table.docutils.booktabs {
340
- border: 0px;
341
- border-top: 2px solid;
342
- border-bottom: 2px solid;
343
- border-collapse: collapse;
344
- }
345
- table.docutils.booktabs * {
346
- border: 0px;
347
- }
348
- table.docutils.booktabs th {
349
- border-bottom: thin solid;
350
- text-align: left;
42
+ blockquote {background-color:#ffc090;
43
+ padding:0.5em;
44
+ border-radius:0.5em;
351
45
  }
352
46
 
353
- h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
354
- h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
355
- font-size: 100% }
356
-
357
- ul.auto-toc {
358
- list-style-type: none }
359
-
360
47
  </style>
361
48
  </head>
362
49
  <body>
@@ -411,7 +98,9 @@ spécifiques, à chaque fois pour une ou plusieurs newsgroups.</p>
411
98
  la remplacer contre une autre, selon le groupe dans lequel vous êtes en train
412
99
  de poster.</p>
413
100
  <p>flnews_post_proc peut faire exactement ça, quand vous avez configuré quel
414
- signature doit apparaître dans quel newsgroup ou liste de newsgroups.</p>
101
+ signature doit apparaître dans quel newsgroup ou liste de newsgroups. Le
102
+ logiciel peut même choisir par hazard une signature, si un fichier, qui en
103
+ contient plusieurs, est noté dans la configuration.</p>
415
104
  </li>
416
105
  <li><p class="first">Quelques entêtes supplémentaires peuvent servir à transmettre des informations
417
106
  aux lecteurs intéressés, comme l'ID de votre clé GnuPG, vos connaissances en
@@ -534,13 +223,15 @@ dans l'introduction resultant.</p>
534
223
  </div>
535
224
  </dd>
536
225
  <dt><strong>GROUP_SIGS</strong></dt>
537
- <dd><p class="first">Une signature par newsgroup ou expression.
538
- ATTN! Vous devez noter \r\n pour les sautes de lignes, si une signature
226
+ <dd><p class="first">Une signature par newsgroup ou expression ou le chemin d'accès d'un fichier,
227
+ contenant plusieurs signatures, séparé par une ligne vide.</p>
228
+ <p>ATTN! Vous devez noter \r\n pour les sautes de lignes, si une signature
539
229
  s'étend sur plusieurs lignes.</p>
540
230
  <p>CONTENU : un newsgroup ou expression par ligne, suivi de deux poins, un espace
541
231
  et une chaîne de caractères.</p>
542
232
  <p>PAR DÉFAUT : Comme configuré dans flnews.</p>
543
- <p class="last">EXEMPLE : fr.test: &quot;Signature pour alt.test\r\nseconde ligne&quot;</p>
233
+ <p>EXEMPLE : fr.test: &quot;Signature pour alt.test\r\nseconde ligne&quot;</p>
234
+ <p class="last">EXEMPLE : alt.fr.test: /home/[utilisateur]/.signatures</p>
544
235
  </dd>
545
236
  <dt><strong>CUSTOM_HEADERS</strong></dt>
546
237
  <dd><p class="first">Entêtes supplémentaires pour l'article sortant.</p>
Binary file
Binary file
@@ -62,7 +62,9 @@ et ce pour des raisons arbitraires :
62
62
  de poster.
63
63
 
64
64
  flnews_post_proc peut faire exactement ça, quand vous avez configuré quel
65
- signature doit apparaître dans quel newsgroup ou liste de newsgroups.
65
+ signature doit apparaître dans quel newsgroup ou liste de newsgroups. Le
66
+ logiciel peut même choisir par hazard une signature, si un fichier, qui en
67
+ contient plusieurs, est noté dans la configuration.
66
68
 
67
69
  * Quelques entêtes supplémentaires peuvent servir à transmettre des informations
68
70
  aux lecteurs intéressés, comme l'ID de votre clé GnuPG, vos connaissances en
@@ -198,7 +200,9 @@ variables définis dans ce fichier peuvent être classées en deux catégories :
198
200
  | fr\\.*: "C'était dans %fup_group%, que %fup_name% c'est exprimé ainsi"
199
201
 
200
202
  **GROUP_SIGS**
201
- Une signature par newsgroup ou expression.
203
+ Une signature par newsgroup ou expression ou le chemin d'accès d'un fichier,
204
+ contenant plusieurs signatures, séparé par une ligne vide.
205
+
202
206
  ATTN! Vous devez noter \\r\\n pour les sautes de lignes, si une signature
203
207
  s'étend sur plusieurs lignes.
204
208
 
@@ -209,6 +213,8 @@ variables définis dans ce fichier peuvent être classées en deux catégories :
209
213
 
210
214
  EXEMPLE : fr.test: "Signature pour alt.test\\r\\nseconde ligne"
211
215
 
216
+ EXEMPLE : alt.fr.test: /home/[utilisateur]/.signatures
217
+
212
218
  **CUSTOM_HEADERS**
213
219
  Entêtes supplémentaires pour l'article sortant.
214
220
 
@@ -3,360 +3,47 @@
3
3
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
4
  <head>
5
5
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
- <meta name="generator" content="Docutils 0.20.1: https://docutils.sourceforge.io/" />
7
- <title>Flnews_post_proc</title>
6
+ <meta name="generator" content="Docutils 0.21.2: https://docutils.sourceforge.io/" />
7
+ <title>flnews_post_proc</title>
8
8
  <style type="text/css">
9
9
 
10
10
  /*
11
- :Author: David Goodger (goodger@python.org)
12
- :Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
13
- :Copyright: This stylesheet has been placed in the public domain.
11
+ :Author: Michael Uplawski
12
+ :Contact: michael.uplawski@uplawski.eu
13
+ :License: WTFPL 2.0, see http://www.wtfpl.net/about/
14
14
 
15
- Default cascading style sheet for the HTML output of Docutils.
16
-
17
- See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
18
- customize this style sheet.
15
+ Stylesheet for use with Docutils.
19
16
  */
20
17
 
21
- /* used to remove borders from tables and images */
22
- .borderless, table.borderless td, table.borderless th {
23
- border: 0 }
24
-
25
- table.borderless td, table.borderless th {
26
- /* Override padding for "table.docutils td" with "! important".
27
- The right padding separates the table cells. */
28
- padding: 0 0.5em 0 0 ! important }
29
-
30
- .first {
31
- /* Override more specific margin styles with "! important". */
32
- margin-top: 0 ! important }
33
-
34
- .last, .with-subtitle {
35
- margin-bottom: 0 ! important }
36
-
37
- .hidden {
38
- display: none }
39
-
40
- .subscript {
41
- vertical-align: sub;
42
- font-size: smaller }
43
-
44
- .superscript {
45
- vertical-align: super;
46
- font-size: smaller }
47
-
48
- a.toc-backref {
49
- text-decoration: none ;
50
- color: black }
51
-
52
- blockquote.epigraph {
53
- margin: 2em 5em ; }
54
-
55
- dl.docutils dd {
56
- margin-bottom: 0.5em }
18
+ /* The defaults for docutils */
19
+ @import url(html4css1.css);
57
20
 
58
- object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
59
- overflow: hidden;
21
+ body {
22
+ background-color:#e0f0a0;
23
+ font-family: Verdana,Helvetica,Univers;
60
24
  }
61
25
 
62
- /* Uncomment (and remove this text!) to get bold-faced definition list terms
63
- dl.docutils dt {
64
- font-weight: bold }
65
- */
66
-
67
- div.abstract {
68
- margin: 2em 5em }
69
-
70
- div.abstract p.topic-title {
71
- font-weight: bold ;
72
- text-align: center }
73
-
74
- div.admonition, div.attention, div.caution, div.danger, div.error,
75
- div.hint, div.important, div.note, div.tip, div.warning {
76
- margin: 2em ;
77
- border: medium outset ;
78
- padding: 1em }
79
-
80
- div.admonition p.admonition-title, div.hint p.admonition-title,
81
- div.important p.admonition-title, div.note p.admonition-title,
82
- div.tip p.admonition-title {
83
- font-weight: bold ;
84
- font-family: sans-serif }
85
-
86
- div.attention p.admonition-title, div.caution p.admonition-title,
87
- div.danger p.admonition-title, div.error p.admonition-title,
88
- div.warning p.admonition-title, .code .error {
89
- color: red ;
90
- font-weight: bold ;
91
- font-family: sans-serif }
92
-
93
- /* Uncomment (and remove this text!) to get reduced vertical space in
94
- compound paragraphs.
95
- div.compound .compound-first, div.compound .compound-middle {
96
- margin-bottom: 0.5em }
97
-
98
- div.compound .compound-last, div.compound .compound-middle {
99
- margin-top: 0.5em }
100
- */
101
-
102
- div.dedication {
103
- margin: 2em 5em ;
104
- text-align: center ;
105
- font-style: italic }
26
+ h1 {color:darkblue;font-size:1.5em;}
27
+ h1.title {color:#a0a0f0;font-size:2em;}
106
28
 
107
- div.dedication p.topic-title {
108
- font-weight: bold ;
109
- font-style: normal }
29
+ p, ul.simple, ol.simple, dt {margin-left:2em;}
30
+ dd {margin-left:4em;}
110
31
 
111
- div.figure {
112
- margin-left: 2em ;
113
- margin-right: 2em }
32
+ /* correct left margin of nested block tags*/
33
+ dd p, li p {margin-left:0;}
34
+ dd * ul {margin-left:0 ! important; }
35
+ dd ul {margin-left:0 ! important; }
36
+ dd dl dt, dd dl dd {margin-left:0 ! important;}
114
37
 
115
- div.footer, div.header {
116
- clear: both;
117
- font-size: smaller }
118
-
119
- div.line-block {
120
- display: block ;
121
- margin-top: 1em ;
122
- margin-bottom: 1em }
123
-
124
- div.line-block div.line-block {
125
- margin-top: 0 ;
126
- margin-bottom: 0 ;
127
- margin-left: 1.5em }
128
-
129
- div.sidebar {
130
- margin: 0 0 0.5em 1em ;
131
- border: medium outset ;
132
- padding: 1em ;
133
- background-color: #ffffee ;
134
- width: 40% ;
135
- float: right ;
136
- clear: right }
137
-
138
- div.sidebar p.rubric {
139
- font-family: sans-serif ;
140
- font-size: medium }
141
-
142
- div.system-messages {
143
- margin: 5em }
144
-
145
- div.system-messages h1 {
146
- color: red }
147
-
148
- div.system-message {
149
- border: medium outset ;
150
- padding: 1em }
151
-
152
- div.system-message p.system-message-title {
153
- color: red ;
154
- font-weight: bold }
155
-
156
- div.topic {
157
- margin: 2em }
158
-
159
- h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
160
- h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
161
- margin-top: 0.4em }
162
-
163
- h1.title {
164
- text-align: center }
165
-
166
- h2.subtitle {
167
- text-align: center }
168
-
169
- hr.docutils {
170
- width: 75% }
171
-
172
- img.align-left, .figure.align-left, object.align-left, table.align-left {
173
- clear: left ;
174
- float: left ;
175
- margin-right: 1em }
176
-
177
- img.align-right, .figure.align-right, object.align-right, table.align-right {
178
- clear: right ;
179
- float: right ;
180
- margin-left: 1em }
181
-
182
- img.align-center, .figure.align-center, object.align-center {
183
- display: block;
184
- margin-left: auto;
185
- margin-right: auto;
186
- }
187
-
188
- table.align-center {
189
- margin-left: auto;
190
- margin-right: auto;
38
+ em {color:#000080;
39
+ background-color:#ffffa0;
191
40
  }
192
41
 
193
- .align-left {
194
- text-align: left }
195
-
196
- .align-center {
197
- clear: both ;
198
- text-align: center }
199
-
200
- .align-right {
201
- text-align: right }
202
-
203
- /* reset inner alignment in figures */
204
- div.align-right {
205
- text-align: inherit }
206
-
207
- /* div.align-center * { */
208
- /* text-align: left } */
209
-
210
- .align-top {
211
- vertical-align: top }
212
-
213
- .align-middle {
214
- vertical-align: middle }
215
-
216
- .align-bottom {
217
- vertical-align: bottom }
218
-
219
- ol.simple, ul.simple {
220
- margin-bottom: 1em }
221
-
222
- ol.arabic {
223
- list-style: decimal }
224
-
225
- ol.loweralpha {
226
- list-style: lower-alpha }
227
-
228
- ol.upperalpha {
229
- list-style: upper-alpha }
230
-
231
- ol.lowerroman {
232
- list-style: lower-roman }
233
-
234
- ol.upperroman {
235
- list-style: upper-roman }
236
-
237
- p.attribution {
238
- text-align: right ;
239
- margin-left: 50% }
240
-
241
- p.caption {
242
- font-style: italic }
243
-
244
- p.credits {
245
- font-style: italic ;
246
- font-size: smaller }
247
-
248
- p.label {
249
- white-space: nowrap }
250
-
251
- p.rubric {
252
- font-weight: bold ;
253
- font-size: larger ;
254
- color: maroon ;
255
- text-align: center }
256
-
257
- p.sidebar-title {
258
- font-family: sans-serif ;
259
- font-weight: bold ;
260
- font-size: larger }
261
-
262
- p.sidebar-subtitle {
263
- font-family: sans-serif ;
264
- font-weight: bold }
265
-
266
- p.topic-title {
267
- font-weight: bold }
268
-
269
- pre.address {
270
- margin-bottom: 0 ;
271
- margin-top: 0 ;
272
- font: inherit }
273
-
274
- pre.literal-block, pre.doctest-block, pre.math, pre.code {
275
- margin-left: 2em ;
276
- margin-right: 2em }
277
-
278
- pre.code .ln { color: grey; } /* line numbers */
279
- pre.code, code { background-color: #eeeeee }
280
- pre.code .comment, code .comment { color: #5C6576 }
281
- pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
282
- pre.code .literal.string, code .literal.string { color: #0C5404 }
283
- pre.code .name.builtin, code .name.builtin { color: #352B84 }
284
- pre.code .deleted, code .deleted { background-color: #DEB0A1}
285
- pre.code .inserted, code .inserted { background-color: #A3D289}
286
-
287
- span.classifier {
288
- font-family: sans-serif ;
289
- font-style: oblique }
290
-
291
- span.classifier-delimiter {
292
- font-family: sans-serif ;
293
- font-weight: bold }
294
-
295
- span.interpreted {
296
- font-family: sans-serif }
297
-
298
- span.option {
299
- white-space: nowrap }
300
-
301
- span.pre {
302
- white-space: pre }
303
-
304
- span.problematic {
305
- color: red }
306
-
307
- span.section-subtitle {
308
- /* font-size relative to parent (h1..h6 element) */
309
- font-size: 80% }
310
-
311
- table.citation {
312
- border-left: solid 1px gray;
313
- margin-left: 1px }
314
-
315
- table.docinfo {
316
- margin: 2em 4em }
317
-
318
- table.docutils {
319
- margin-top: 0.5em ;
320
- margin-bottom: 0.5em }
321
-
322
- table.footnote {
323
- border-left: solid 1px black;
324
- margin-left: 1px }
325
-
326
- table.docutils td, table.docutils th,
327
- table.docinfo td, table.docinfo th {
328
- padding-left: 0.5em ;
329
- padding-right: 0.5em ;
330
- vertical-align: top }
331
-
332
- table.docutils th.field-name, table.docinfo th.docinfo-name {
333
- font-weight: bold ;
334
- text-align: left ;
335
- white-space: nowrap ;
336
- padding-left: 0 }
337
-
338
- /* "booktabs" style (no vertical lines) */
339
- table.docutils.booktabs {
340
- border: 0px;
341
- border-top: 2px solid;
342
- border-bottom: 2px solid;
343
- border-collapse: collapse;
344
- }
345
- table.docutils.booktabs * {
346
- border: 0px;
347
- }
348
- table.docutils.booktabs th {
349
- border-bottom: thin solid;
350
- text-align: left;
42
+ blockquote {background-color:#ffc090;
43
+ padding:0.5em;
44
+ border-radius:0.5em;
351
45
  }
352
46
 
353
- h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
354
- h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
355
- font-size: 100% }
356
-
357
- ul.auto-toc {
358
- list-style-type: none }
359
-
360
47
  </style>
361
48
  </head>
362
49
  <body>
@@ -403,7 +90,8 @@ chosen for one or several newsgroups.</p>
403
90
  would like to replace it against another, based on the newsgroup you are
404
91
  about to post to.
405
92
  The post-processor program sets specific signatures as configured for one
406
- or several newsgroups.</p>
93
+ or several newsgroups. You can even specify that a signature should be
94
+ picked randomly from a file, containing several signatures.</p>
407
95
  </li>
408
96
  <li><p class="first">Some custom headers may serve to convey additional information to
409
97
  interested readers of your post, like GnuPG key IDs, your language skills
@@ -507,11 +195,14 @@ introductory string.</p>
507
195
  <p class="last">EXAMPLE: alt.test: &quot;Thus spoke %fup_name% on that baleful %fup_date%:&quot;</p>
508
196
  </dd>
509
197
  <dt><strong>GROUP_SIGS</strong></dt>
510
- <dd><p class="first">A signature line per Newsgroup.
511
- ATTN! In multi line signatures, you have to use \r\n for line breaks.</p>
198
+ <dd><p class="first">A signature line per Newsgroup or a file path. The file should contain signatures,
199
+ already formatted and separated by 1 empty line. The program will randomly pick
200
+ one signature from the list.</p>
201
+ <p>ATTN! In multi line signatures, you have to use \r\n for line breaks.</p>
512
202
  <p>CONTENT: A newsgroup or regexp per line, followed by a colon, a space and a String.</p>
513
203
  <p>DEFAULT: As configured in flnews</p>
514
- <p class="last">EXAMPLE: alt.test: &quot;Signature for alt.test\r\nsecond line&quot;</p>
204
+ <p>EXAMPLE: alt.test: &quot;Signature for alt.test\r\nsecond line&quot;</p>
205
+ <p class="last">EXAMPLE: comp.*: /home/[user]/.my_sigs</p>
515
206
  </dd>
516
207
  <dt><strong>CUSTOM_HEADERS</strong></dt>
517
208
  <dd><p class="first">Additional headers for the outgoing article</p>
Binary file
Binary file
@@ -50,7 +50,8 @@ some users may not always agree with the result and for arbitrary reasons:
50
50
  would like to replace it against another, based on the newsgroup you are
51
51
  about to post to.
52
52
  The post-processor program sets specific signatures as configured for one
53
- or several newsgroups.
53
+ or several newsgroups. You can even specify that a signature should be
54
+ picked randomly from a file, containing several signatures.
54
55
 
55
56
  * Some custom headers may serve to convey additional information to
56
57
  interested readers of your post, like GnuPG key IDs, your language skills
@@ -167,7 +168,10 @@ categories:
167
168
  EXAMPLE: alt.test: "Thus spoke %fup_name% on that baleful %fup_date%:"
168
169
 
169
170
  **GROUP_SIGS**
170
- A signature line per Newsgroup.
171
+ A signature line per Newsgroup or a file path. The file should contain signatures,
172
+ already formatted and separated by 1 empty line. The program will randomly pick
173
+ one signature from the list.
174
+
171
175
  ATTN! In multi line signatures, you have to use \\r\\n for line breaks.
172
176
 
173
177
  CONTENT: A newsgroup or regexp per line, followed by a colon, a space and a String.
@@ -175,6 +179,8 @@ categories:
175
179
  DEFAULT: As configured in flnews
176
180
 
177
181
  EXAMPLE: alt.test: "Signature for alt.test\\r\\nsecond line"
182
+
183
+ EXAMPLE: comp.*: /home/[user]/.my_sigs
178
184
 
179
185
  **CUSTOM_HEADERS**
180
186
  Additional headers for the outgoing article
@@ -59,19 +59,6 @@ class PostProcessor
59
59
  # Will only handle http(s) for the time.
60
60
  body.handle_uris
61
61
 
62
- =begin
63
- require 'gpgme'
64
-
65
- debug('signing')
66
- if ENV['GPG_AGENT_INFO']
67
- crypto = GPGME::Crypto.new
68
- data = GPGME::Data.new(body)
69
- signature = crypto.clearsign(data, {
70
- :output => File.new("/tmp/crypt_out.asc", 'w+')
71
- })
72
- end
73
- =end
74
-
75
62
  # get the headers and the body as a string.
76
63
  # Assemble.
77
64
  @article = headers.join << $LN << body.join
data/lib/headers.rb CHANGED
@@ -95,7 +95,8 @@ class Headers
95
95
  # or add a new value
96
96
  @headers[cur_header] = val
97
97
  end
98
- #@headers[l.match(/^(.*?):/)[1].to_sym] = l.match(/:(.*)/)[1].strip
98
+ # CURRENTLY UNUSED
99
+ # @headers[l.match(/^(.*?):/)[1].to_sym] = l.match(/:(.*)/)[1].strip
99
100
  # h = l.split(':')
100
101
  # @headers[h[0].strip.to_sym] = h[1...h.size].join(':').strip
101
102
  end
@@ -116,7 +117,7 @@ class Headers
116
117
  end
117
118
  end
118
119
 
119
- # Modify headers, if need be.
120
+ # Add headers, if need be. Set values where necessary.
120
121
  def update()
121
122
  no_archive = @newsgroups.no_archive
122
123
  debug('no_archive should be set now : ' << no_archive.to_s)
data/lib/newsgroups.rb CHANGED
@@ -75,6 +75,7 @@ class Newsgroups
75
75
 
76
76
  # replace all \n by \r\n
77
77
  def correct_linebreaks(text)
78
+ debug 'correcting linebreaks in ' << text
78
79
  warned = false
79
80
  # find all lonely \n
80
81
  while text.match(/([^\r])\n/) do
@@ -82,6 +83,7 @@ class Newsgroups
82
83
  warned ||= true
83
84
  # ... and silently marry them to \r
84
85
  text.gsub!($~[0],$~[1] + "\r\n")
86
+ text.gsub!("\n ", "\n")
85
87
  # Luxury you can afford.
86
88
  end # \n
87
89
  text
@@ -93,27 +95,31 @@ class Newsgroups
93
95
  # 1 group
94
96
  group = @groups[0]
95
97
  gsigs = @config.GROUP_SIGS
98
+ tsig = nil
96
99
 
97
100
  if gsigs && gsigs.respond_to?(:to_hash)
98
101
  # find the signature for the group
99
102
  # either by name
100
103
  if gsigs.keys.include?(group)
101
- @signature = gsigs[group]
102
- debug('signature is ' << @signature ) if @signature
104
+ tsig = gsigs[group]
105
+ debug('signature is ' << tsig ) if tsig
103
106
  # .., or by applying a regexp.
104
107
  else
105
108
  gsigs.each do |g, s|
106
- unless @signature
109
+ unless tsig
107
110
  rg = Regexp.new(g)
108
111
  sm = group.match(rg)
109
112
  debug('signature for group(s) ' << g << ': ' << s) if sm
110
113
  if sm
111
- @signature = correct_linebreaks(s)
112
- @signature.gsub!("\n ", "\n")
114
+ tsig = s
113
115
  end # if sm
114
116
  end # if no signature
115
117
  end # gsigs.each
116
118
  end # gsigs for group?
119
+ if tsig && tsig.start_with?('/')
120
+ tsig = pick_sig(tsig)
121
+ end
122
+ @signature = correct_linebreaks(tsig) if tsig
117
123
  else # gsigs and is hash?
118
124
  msg = "Cannot read the signatures from the configuration."
119
125
  msg << "\nPlease verify that GROUP_SIGS is set."
@@ -121,6 +127,47 @@ class Newsgroups
121
127
  end
122
128
  end
123
129
 
130
+ # pick a random signature, if a list is available.
131
+ def pick_sig(sigfile)
132
+ debug 'picking signature from ' << sigfile.to_s
133
+ allSigs = nil
134
+ sig = nil
135
+ if sigfile && !sigfile.empty? && File.exist?(sigfile) && File.readable?(sigfile)
136
+ File.open(sigfile, 'r') do |sfile|
137
+ allSigs = sfile.read.split("\n\n")
138
+ numSigs = allSigs.length
139
+ srand(Time.now.nsec)
140
+ sig = allSigs[rand(numSigs)]
141
+ end
142
+ # improve hazard for the next time.
143
+ rearrange_sigs(sigfile, allSigs)
144
+ else
145
+ error 'Cannot read signature from file ' << sigfile
146
+ nil
147
+ end
148
+ return sig
149
+ end
150
+
151
+ # write a new rearranged version of the signature file for
152
+ # better hazard.
153
+ def rearrange_sigs(sigfile, all_sigs)
154
+ if File.writable?(sigfile)
155
+ new_sigs = Array.new(all_sigs.length)
156
+ until all_sigs.compact.empty? do
157
+ srand(Time.now.nsec)
158
+ sig = all_sigs.delete_at(rand(all_sigs.length))
159
+ new_sigs.push(sig)
160
+ end
161
+ new_sigs.compact!
162
+ File.open(sigfile, 'w') do |sfile|
163
+ debug 'Have ' << new_sigs.length.to_s << ' rearranged sigs'
164
+ sfile.write(new_sigs.join("\n\n") )
165
+ end
166
+ else
167
+ error 'Cannot write rearranged list of signatures to ' << sigfile
168
+ end
169
+ end
170
+
124
171
  # define the no_archive header.
125
172
  def set_no_archive
126
173
  @no_archive = nil
data/lib/override.rb CHANGED
@@ -19,7 +19,6 @@
19
19
  # notably to deactivate them.
20
20
  #
21
21
  # Post-processing CANNOT be deactivated completely in this dialog.
22
- # I do not remember, why a previous comment stated the contrary.
23
22
 
24
23
  require_relative 'basic_logging'
25
24
 
@@ -141,7 +140,12 @@ class OverrideDlg
141
140
  return nopts
142
141
  end
143
142
 
144
- # creates a textual dialog in xterm.
143
+ # Creates a textual dialog in xterm.
144
+ # Some duplicate code, here, but I am afraid to oversee
145
+ # unique requirements of the external programs. It had
146
+ # not been necessary to correct the global behavior,
147
+ # but adaptations in each single method should be
148
+ # possible.
145
149
  def ruby_dlg
146
150
  debug('xterm dialog')
147
151
  tf = Tempfile.new
data/lib/version.rb CHANGED
@@ -14,9 +14,9 @@
14
14
  =end
15
15
 
16
16
  PROGNAME = 'flnews_post_proc'
17
- PROGVERSION = "1.62"
17
+ PROGVERSION = "1.71"
18
18
  AUTHORS = "Michael Uplawski"
19
19
  EMAIL = "michael.uplawski@uplawski.eu"
20
- YEARS = "2023 - 2024"
21
- SUMMARY = "Further attenuated reaction to mime-type, accepting all."
20
+ YEARS = "2023 - 2025"
21
+ SUMMARY = "Improve randomness of signatures, if need be."
22
22
 
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flnews_post_proc
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.62'
4
+ version: '1.71'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Uplawski
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-09-06 00:00:00.000000000 Z
10
+ date: 2025-03-09 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: diffy
@@ -87,7 +86,6 @@ homepage: https://rubygems.org
87
86
  licenses:
88
87
  - Nonstandard
89
88
  metadata: {}
90
- post_install_message:
91
89
  rdoc_options: []
92
90
  require_paths:
93
91
  - lib
@@ -102,8 +100,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
100
  - !ruby/object:Gem::Version
103
101
  version: '0'
104
102
  requirements: []
105
- rubygems_version: 3.5.3
106
- signing_key:
103
+ rubygems_version: 3.6.3
107
104
  specification_version: 4
108
- summary: Further attenuated reaction to mime-type, accepting all.
105
+ summary: Improve randomness of signatures, if need be.
109
106
  test_files: []