noticesys 0.2.0 → 0.5.0

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: 8d47b4798cd650f73da406bbbd5f933ab8e78737e8ff3f6293db2987f0aa648f
4
- data.tar.gz: 2fd00aa95f34e6ca2071d823ca5d71ffcab4cedd753f8c1c2379ad1cf1c8a325
3
+ metadata.gz: bf9532117e42a35fa3b0196ff47210fa9cc2968beb42a5173252089a88b77cf7
4
+ data.tar.gz: eeecec25eca1dede7391080e7f9c7cc49bd0789c25e08638a71f3a12049dbe0e
5
5
  SHA512:
6
- metadata.gz: d01f5892de2b3b9ecb016406c91bb88d57fa63066c8337d51c171b50f52d5c14b8c8f32835fafa8abc052298a9c128f551dee57632c2c870ddd5ad1fb0484643
7
- data.tar.gz: e85808cf07aab7fab2801ca6f448bbfa9202c23391fdf28bd2d6ee46c1d3f838c72b3031df05244929448b918b4617c16375017c1942eb2ddbc699ee729e2759
6
+ metadata.gz: d2deb98851a747c78efc17dbc85b5c58f5b99c87a13eb5f94d7e562196b84d148cfc34784a462198c3a835e24e553dc83978e737c5b0ab78350eaf645c3b0110
7
+ data.tar.gz: 775e5efb2b4c7cb45cc3bff671648dbd6e5504d812de11899453976a4f61a72085f72031b0eab29710c7b6dff46cb02d24c2a34fd506589d0f48750498ecd49b
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/data/css.txt ADDED
@@ -0,0 +1,490 @@
1
+ %main
2
+
3
+ #wrap {max-width: 1100px}
4
+
5
+ header {
6
+ background-color: transparent;
7
+ margin: 0.2em 0em;
8
+ padding: 0em;
9
+ color: #fff;
10
+ font-size: 1.0em;
11
+ /* overflow: hidden;*/
12
+ }
13
+
14
+ %user
15
+
16
+
17
+ .main header #banner {
18
+ background-color: #113;
19
+ /*background-image: url("www.yourwebsite.com/banner.jpg");*/
20
+ background-repeat: no-repeat, repeat;
21
+ background-position: center;
22
+
23
+ background-size: cover;
24
+ /*margin: 0.2em 0em;*/
25
+ margin: 0em;
26
+ padding: 1em;
27
+ color: #fff;
28
+ min-height: 140px;
29
+
30
+ }
31
+
32
+
33
+ header h1 {
34
+ background-color: transparent;
35
+ font-size: 1.7em; color: #fff; font-family: Monaco, Papyrus;
36
+ margin-top: 1.4em;
37
+ }
38
+
39
+ #search {
40
+ background-color: transparent; float: right; width: 150px; margin: 0.4em; padding: 0.9em;
41
+ margin-right: 2em;
42
+ }
43
+
44
+
45
+ .column {max-width: 600px;}
46
+ #ptop {background-color: transparent; font-size: 1.1em; font-family: Sans-serif, Arial, Verdana ; margin-top: -120px; }
47
+ #ptop img {background-color: transparent; width: 140px; margin: 0em; padding: 0em; border-radius: 50%;border: 4px solid white}
48
+ #ptop span {background-color: transparent; display: block}
49
+ #ptop #title {background-color: transparent; font-size: 1.2em; margin: 0.03em 0em; padding: 0.1em; font-weight: 600}
50
+ #ptop #user {background-color: transparent; font-size: 0.8em; margin: 0em 0.1em; padding: 0.04em 0.1em; color: #444}
51
+ #ptop p {background-color: transparent; font-size: 0.9em; margin: 0.3em 0.1em; padding: 0.5em 0.1em; color: #000}
52
+
53
+ hr {margin: 2em 0.5em}
54
+
55
+ %noticelist
56
+
57
+
58
+
59
+ .column:last-child {
60
+ background-color: #dfd;
61
+ border-radius: 18px;
62
+ margin: 1.1em 0.9em;
63
+ padding: 1em;
64
+ color: #141;
65
+ }
66
+
67
+
68
+ /* Clear floats after the columns */
69
+ .row:after {
70
+ content: "";
71
+ display: table;
72
+ clear: both;
73
+ }
74
+
75
+ .backarrow {background-color: #e888; width: 20px}
76
+
77
+
78
+ %footer
79
+
80
+ #footer {
81
+ background-color: #113;
82
+ color: #fff;
83
+ margin: 0.3em;
84
+ padding: 1em;
85
+ }
86
+ #footer h2 {font-size: 0.9em}
87
+ #footer ul {list-style-type: none}
88
+ #footer ul li a { text-decoration: none}
89
+ #footer ul li a:link { color: #ee3}
90
+ #footer ul li a:hover { text-decoration: underline; color: #4a0}
91
+ #footer ul li a:visited { color: #fee}
92
+
93
+ @media only screen and (min-width: 860px) {
94
+ .column {
95
+ float: left;
96
+ background-color: transparent;
97
+ }
98
+
99
+ .notice {background-color: transparent; min-width: 590px;}
100
+ }
101
+
102
+ @media only screen and (min-width: 9000px) {
103
+
104
+ .notice {background-color: transparent; min-width: 700px;}
105
+ }
106
+
107
+
108
+ %notice
109
+ .notice {
110
+ background-color: transparent;
111
+ max-width: 500px;
112
+ margin: 0em 0.5em;
113
+ padding: 0.8em 0.4em;
114
+ font-family: Arial, Helvetica, sans-serif;
115
+ font-size: 0.965em;
116
+ border: 0.002em solid rgba(80,80,150, 0.1);
117
+ border-bottom-style: 2em solid #e33;
118
+ min-height: 65px;
119
+
120
+ }
121
+
122
+ .notice {
123
+ background-color: transparent;
124
+ max-width: 500px;
125
+ margin: 0em 0.5em;
126
+ padding: 0.8em 0.4em;
127
+ font-family: Arial, Helvetica, sans-serif;
128
+ font-size: 0.965em;
129
+ border: 0.002em solid rgba(80,80,150, 0.1);
130
+ border-bottom-style: 2em solid #e33;
131
+ min-height: 65px;
132
+
133
+ }
134
+ .notice:hover {background-color: #ededfe}
135
+ .notice div#avatar {background-color: transparent; float: left; width: 72px; }
136
+ .notice .user {background-color: transparent}
137
+ .notice .user a:first-child {background-color: transparent; color: #000; font-weight: 600}
138
+ .notice .user .ellipsis {width: 17px; background-color: transparent; vertical-align: text-bottom; float: right; display: none}
139
+
140
+
141
+
142
+ .notice .card {background-color: transparent; max-width: 500px;}
143
+
144
+ .notice div#avatar img {
145
+ background-color: transparent;
146
+ width: 35px;
147
+ display: block;
148
+ margin: 0.2em 0.9em;
149
+ padding: 0.4em;
150
+ /*margin-top: 0.4em;
151
+ margin-right: 0.4em*/
152
+ }
153
+
154
+ .notice div#avatar img:hover {filter: brightness(90%);}
155
+
156
+ .profile {
157
+ position: relative;
158
+ display: inline-block;
159
+ }
160
+
161
+ #ucard {
162
+ visibility: hidden;
163
+ width: 276px;
164
+ height: 264px;
165
+ background-color: #fff;
166
+ color: #fff;
167
+ border-radius: 15px;
168
+ margin: 0.2em;
169
+ padding: 1em;
170
+
171
+ /* Position the tooltip */
172
+ position: absolute;
173
+ z-index: 1;
174
+ border: 1px solid #ccc;
175
+ box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), 0 3px 10px 0 rgba(0, 0, 0, 0.19);
176
+ }
177
+
178
+ #ucard div img {width: 90px}
179
+ #ucard .title {color: #000; display: block; font-weight: 600; margin: 0.1em; padding: 0.2em}
180
+ #ucard .username {color: #000; display: block; margin: 0.1em; padding: 0.2em; color: #333}
181
+ #ucard p {margin: 0.1em; padding: 0.2em; line-height: 1.3em}
182
+ .profile:hover #ucard {
183
+ visibility: visible;
184
+ transition: 0.5s;
185
+ transition-delay:0.9s;
186
+ opacity: 1;
187
+ animation-name: fadeInOpacity;
188
+ animation-iteration-count: 1;
189
+ animation-timing-function: ease-in;
190
+ animation-duration: 1.2s;
191
+ }
192
+
193
+
194
+ @keyframes fadeInOpacity {
195
+ 0% {
196
+ opacity: 0;
197
+ }
198
+ 100% {
199
+ opacity: 1;
200
+ }
201
+ }
202
+ .notice div2 span {font-weight: 600}
203
+ .notice div2 ~ div {background-color: transparent; min-width: 330px}
204
+ /*.notice:hover {background-color: rgba(244,244,255, 0.5); color: #000} */
205
+ .notice div a {text-decoration: none; color: #555}
206
+ .notice div:first-child a:hover {text-decoration: underline}
207
+ .notice p {background-color: transparent; color: #000; margin: 0.1em 0; padding: 0.3em 0; }
208
+ .notice p a {background-color: transparent; text-decoration: none}
209
+ .notice p a:link {background-color: transparent; color: #448}
210
+ .notice p a:visited {background-color: transparent; color: #774}
211
+ .notice p a:hover {background-color: transparent; text-decoration: underline}
212
+ .top-crop {
213
+ background-color: #422;
214
+ overflow: hidden;
215
+ border-radius: 15px;
216
+ max-height: 280px;
217
+ /*display: flex;*/
218
+ /*align-items: flex-end;*/
219
+ /*justify-content: center*/
220
+ /*align-items: center; */
221
+ }
222
+
223
+ .top-crop img {
224
+ max-width: initial;
225
+
226
+ }
227
+
228
+ .y10 img {
229
+ margin-top: -18%
230
+ }
231
+
232
+ .y20 img {
233
+ margin-top: -30%
234
+ }
235
+
236
+ .center {
237
+ display: flex;
238
+ justify-content: center;
239
+ align-items: center;
240
+ }
241
+
242
+ .bottom {
243
+ display: flex;
244
+ align-items: center;
245
+ align-items: flex-end;
246
+
247
+ }
248
+
249
+ .img1 {background-color: #000; max-width: 380px; border-radius: 15px;}
250
+
251
+ %cards
252
+ /* Twitter card */
253
+
254
+ .card { background-color: #e00; font-size: 0.8em; color: #f22; clear: both; border: 1px solid #ccc; border-radius: 15px; padding-bottom: 1em;}
255
+ /*.card:hover { background-color: #000}*/
256
+ .card img {width: 100%; border-radius: 15px 15px 0 0;}
257
+ .card a {text-decoration: none; color: #900}
258
+ .card a:hover {text-decoration: none; color: #900}
259
+ .card span {color: #000; font-size: 1.0em;}
260
+ .card .title {background-color: transparent; display: block; font-size: 1.18em; font-weight: 300; font-family: Verdana, Arial; margin: 0.8em 0.5em 0.4em 0.4em; padding: 0.1em 0.4em}
261
+ .card .desc {background-color: transparent; color: #555; display: block; font-size: 1.18em; font-weight: 500; margin: 0.1em 0.3em; padding: 0.1em 0.9em 0.3em 0.6em;}
262
+ .card .link { display: block}
263
+ .card .linkurl {color: #555; font-weight: 300; font-size: 1.18em; margin: 0.3em 0em; padding: 0.5em 0em }
264
+ .card .link svg {fill: #555; width: 15px; margin-left: 16px; vertical-align: text-bottom}
265
+ .card .top-crop {border-radius: 15px 15px 0 0;}
266
+
267
+
268
+ /* end of Twitter card */
269
+
270
+
271
+ /* start of summary card */
272
+ .card2 {background-color: transparent; overflow: hidden; border-radius: 15px; border: 1px solid #ccc}
273
+ /*.card2:hover {background-color: #ee2; }*/
274
+ .card2 img {width: 170px; height: 130px; object-fit: cover;}
275
+ #content {
276
+ background-color: transparent;
277
+ font-family: Arial, Verda;
278
+ font-size: 0.9em;
279
+ margin: 0.4em; padding: 0.8em;
280
+ }
281
+ #col1 {
282
+ background-color: transparent; float: left;
283
+ border-right: 1px solid #ccc; margin: 0; padding: 0; width: 130px; overflow: hidden
284
+ }
285
+
286
+ .card2 #col1 svg {background-color: transparent; width: 30px; fill: #556}
287
+
288
+ #col2 {
289
+ background-color: transparent;
290
+ margin: 0em; padding: 0em;
291
+ }
292
+ #col1, #col2 {
293
+ height: 130px;
294
+ display: flex;
295
+ justify-content: center;
296
+ align-items: center;
297
+ }
298
+ /* Clear floats after the columns */
299
+ #col2:after {
300
+ content: "";
301
+ clear: both;
302
+ }
303
+ .card2 a {text-decoration: none;}
304
+ .card2 span {color: #000; font-size: 1.1em;}
305
+ .card2 .title {background-color: transparent; display: block; font-weight: 300; font-family: Verdana, Arial; margin: 0.1em 0em; padding: 0.2em 0em; font-size: 1.0em;}
306
+ .card2 .desc {background-color: transparent; color: #555; display: block; margin: 0.1em 0em; padding: 0.2em 0em; line-height: 1.2em;}
307
+ .card2 .link { display: block}
308
+ .card2 .linkurl {color: #555; font-size: 1.0em;}
309
+ .card2 .link svg {color: #555; width: 15px}
310
+ .card2 .link svg {fill: #555; width: 15px; vertical-align: text-bottom}
311
+ /* end of summary card */
312
+
313
+ .notice .ncol2 {background-color: transparent; float: left; width: 508px }
314
+
315
+ .notice:after {
316
+ content: "";
317
+ display: table;
318
+ clear: both;
319
+ }
320
+
321
+ .notice #actions svg {width: 20px; display: none}
322
+
323
+
324
+ %status
325
+
326
+ header {
327
+ background-color: transparent;
328
+ margin: 0.1em 0.1em ;
329
+ padding: 0.1em 0.2em;
330
+ }
331
+ header div {
332
+ background-color: transparent;
333
+ margin: 0.1em 0.4em ;
334
+ padding: 0.2em 0.5em;
335
+ }
336
+ header div>div:first-child {
337
+ background-color: transparent;
338
+ float: left;
339
+ margin: 0.1em 0.4em ;
340
+ padding: 0.2em 0.5em;
341
+ width: 26px;
342
+ }
343
+ header div>div:last-child {
344
+ background-color: transparent;
345
+ margin: 0.1em 0.2em ;
346
+ padding: 0.2em 0.2em;
347
+ }
348
+ #back {
349
+ background-color; transparent
350
+ width: 23px; height: 34px;
351
+ margin-top: -0.2em;
352
+ display: block
353
+ }
354
+
355
+ #back:hover {
356
+
357
+ border-radius: 50%;
358
+ /*border: 1px solid;*/
359
+ background-color: #eee;
360
+ color: #000;
361
+
362
+ }
363
+
364
+ .backarrow {
365
+ background-color: transparent;
366
+ width: 21px;
367
+ margin: 0.1em;
368
+ margin-left: -0.05em;
369
+ padding: 0.2em;
370
+ }
371
+
372
+ h1 {}
373
+
374
+ h1 {
375
+ background-color: transparent;
376
+ font-family: Arial,sans-serif;
377
+ font-size: 1.12em;
378
+ margin: 0.9em 0.6em 0.3em 0.2em;
379
+ padding: 0.4em 0.4em;
380
+ display: inline
381
+ }
382
+
383
+ #notice {
384
+ background-color: transparent;
385
+ margin: 0.9em 0.9em;
386
+ padding: 0.6em 0.2em;
387
+ max-width: 590px;
388
+ font-family: Arial,sans-serif;
389
+ border: 1px solid rgba(150, 150, 200, 0.3)
390
+ }
391
+ #avatar {
392
+ background-color: transparent;
393
+ width: 54px;
394
+ float: left;
395
+ margin: 0.1em;
396
+ padding: 0.3em 0.2em;
397
+ }
398
+ #avatar img {
399
+ background-color: transparent;
400
+ width: 35px;
401
+ margin: 0.1em 0.5em;
402
+ margin-top: -0.7em;
403
+ padding: 0.5em 0.1em;
404
+ }
405
+
406
+ #title {
407
+ background-color: transparent;
408
+ font-size: 0.9em;
409
+ min-height: 48px
410
+ }
411
+
412
+ #title div:first-child {
413
+ background-color: transparent;
414
+ margin: 0 0.2em;
415
+ padding: 0.2em 0.5em;
416
+ font-weight: 700;
417
+ }
418
+
419
+ #title div a {color: #000; text-decoration: none}
420
+ #title div a:hover {text-decoration: underline}
421
+
422
+ #title div+div {
423
+ background-color: transparent;
424
+ margin: 0 0.2em;
425
+ padding: 0.1em 0.5em;
426
+ font-size: 1.0em;
427
+ color: #888;
428
+ font-weight: 500;
429
+ }
430
+
431
+ #desc {
432
+ background-color: transparent;
433
+ margin: 0.2em;
434
+ padding: 0.4em;
435
+ font-size: 1.4em;
436
+
437
+ }
438
+
439
+ #time {
440
+ background-color: transparent;
441
+ margin: 0.1em 0.3em;
442
+ padding: 0.3em 0.86em;
443
+ font-size: 0.9em;
444
+ color: #777;
445
+ }
446
+
447
+ #time a:link {
448
+ background-color: transparent;
449
+ color: #224;
450
+ text-decoration: none;
451
+ }
452
+ #time a:hover {
453
+ background-color: transparent;
454
+ text-decoration: underline
455
+ }
456
+
457
+ #time a:visited {
458
+ background-color: transparent;
459
+ color: #555;
460
+ text-decoration: none;
461
+ }
462
+
463
+ /* status/photo */
464
+
465
+ .photo img {width:50%; }
466
+ .img1 {max-width: 560px; border-radius: 15px;}
467
+
468
+ .top-crop {
469
+ background-color: #422;
470
+ overflow: hidden;
471
+ border-radius: 15px;
472
+ max-height: 280px;
473
+ /*display: flex;*/
474
+ /*align-items: flex-end;*/
475
+ /*justify-content: center*/
476
+ /*align-items: center; */
477
+ }
478
+
479
+ .top-crop img {
480
+ max-width: initial;
481
+
482
+ }
483
+
484
+
485
+ .center {
486
+ display: flex;
487
+ justify-content: center;
488
+ align-items: center;
489
+ }
490
+
@@ -0,0 +1,204 @@
1
+ %card
2
+
3
+ <div class='card'>
4
+ <a href='#{url}' target='_blank'>
5
+ <div class='top-crop center'>
6
+ <img src='#{img}'/>
7
+ </div>
8
+ <span class='title'>#{title}</span>
9
+ <span class='desc'>#{desc}</span>
10
+ <span class='link'>
11
+
12
+ <:svg/link>
13
+
14
+ <span class='linkurl'>#{site}</span>
15
+ </span>
16
+ </a>
17
+ </div>
18
+
19
+ %card2
20
+
21
+ <div class="card2">
22
+ <a href="#{url}" target="_blank">
23
+ <div>
24
+ <div id='col1'>
25
+ #{img_element}
26
+ </div>
27
+ <div id='col2'>
28
+ <div id='content'>
29
+ <span class="title">#{title}</span>
30
+ <span class="desc">#{desc}</span>
31
+ <span class="link">
32
+ <:svg/link>
33
+ <span class="linkurl">#{site}</span>
34
+ </span>
35
+ </div>
36
+ </div>
37
+ </div>
38
+ </a>
39
+ </div>
40
+
41
+ %search_pg
42
+
43
+ <html>
44
+ <head>
45
+ <title>##{q} - Microblog Search</title>
46
+ <meta charset='UTF-8'/>
47
+ <meta name='viewport' content='width=device-width, initial-scale=1'>
48
+ <link rel='stylesheet' type='text/css' href='#{@css_url}'/>
49
+
50
+ </head>
51
+ <body>
52
+ <header>
53
+
54
+ #{back}
55
+ <form action='/search' method='get'>
56
+ <input type='text' name='q' id='q' placeholder='search notices' value='##{q}'/>
57
+ <input type='submit' value='search'/>
58
+ </form>
59
+ </header>
60
+ #{s}
61
+ </body>
62
+ </html>
63
+
64
+ %meta
65
+ <meta name="twitter:card" content="#{type}"/>
66
+ <meta name="twitter:title" property="og:title" content="#{h[:title]}"/>
67
+ <meta name="twitter:image" property="og:image" content="#{img}"/>
68
+ <meta name="twitter:description" property="og:descrtiption" content="#{h[:desc]}"/>
69
+ <meta property="og:url" content="#{h[:url]}"/>
70
+ <meta name="noticesys:card" content="notice"/>
71
+
72
+ %notice
73
+
74
+ <div class='notice'>
75
+ <div id='avatar' class='profile'>
76
+ <a href="/#{rx.topic}"><img src='#{uimage}'/></a>
77
+ <div id='ucard'>
78
+ <div>
79
+ <img src='#{uimage}'/>
80
+ </div>
81
+ <a href="/#{rx.topic}"><span class='title'>#{utitle}</span></a>
82
+ <span class='username'>@#{rx.topic}</span>
83
+ <p>#{ubio}</p>
84
+
85
+ </div>
86
+ </div>
87
+ <div class='ncol2'>
88
+ <div class='user'><a href="#{rx.topic}"><span>#{utitle}</span></a> @#{rx.topic} &middot; <a href="#{rx.link}" title="#{d}">#{relative_time
89
+ }</a><:svg/ellipsis>
90
+ </div>
91
+
92
+ #{description}
93
+ #{card2}
94
+ <div id='actions'>
95
+ <:svg/reply>
96
+ </div>
97
+ </div>
98
+ </div>
99
+
100
+ %status
101
+
102
+ <html>
103
+ <head>
104
+ <title>#{dx.title}</title>
105
+ <meta charset='UTF-8'/>
106
+ <meta name='viewport' content='width=device-width, initial-scale=1'/>
107
+ #{meta}
108
+ <link rel='stylesheet' type='text/css' href='#{@css_url}'/>
109
+ </head>
110
+ <body>
111
+ <header>
112
+ <div>
113
+ #{back}
114
+ <div><h1>Notice</h1></div>
115
+ </div>
116
+ </header>
117
+ #{e.xml}
118
+ </body>
119
+ </html>
120
+
121
+ %user
122
+
123
+ <html>
124
+ <head>
125
+ <title>#{dx.title} (@#{username}) | Microblog</title>
126
+ <meta charset='UTF-8'/>
127
+ <meta name='viewport' content='width=device-width, initial-scale=1'>
128
+ <link rel='stylesheet' type='text/css' href='#{@css_url}'/>
129
+
130
+ </head>
131
+ <body>
132
+ <div id='wrap' class='main'>
133
+ <header>
134
+ <div id='banner'>
135
+
136
+ </div>
137
+ <div id='search'>
138
+ <form action='/search'>
139
+ <input type='text' name='q' id='q' placeholder='Search microblogs'/>
140
+ </form>
141
+ </div>
142
+ </header>
143
+ <div style='clear: both'/>
144
+ <div class='row'>
145
+ <div class='column'>
146
+
147
+ </div>
148
+ <div class='column'>
149
+ #{s}
150
+
151
+ </div>
152
+ <div class='column'>
153
+ <h2>Currently</h2>
154
+
155
+ </div>
156
+ </div>
157
+ <div id='footer'>
158
+ <h2>Links</h2>
159
+ <ul>
160
+ <li><a href='about:blank'>blank</a></li>
161
+ </ul>
162
+ </div>
163
+ </div>
164
+ </body>
165
+ </html>
166
+
167
+ %ptop
168
+
169
+ <div id='ptop'>
170
+ <img src='#{dx.image}'/>
171
+ <span id='title'>#{dx.title}</span>
172
+ <span id='user'>@#{username}</span>
173
+ <p>#{dx.bio}</p>
174
+ </div>
175
+
176
+ <hr/>
177
+
178
+ %rsslink
179
+
180
+ <hr/>
181
+ <a href="//#{@static_urlbase}/microblog/u/#{username}/rss.xml">rss</a>
182
+
183
+ %svg
184
+ %article
185
+
186
+ <svg viewBox="0 0 24 24" class="r-m0bqgq r-4qtqp9 r-yyyyoo r-yucp9h r-dnmrzs r-bnwqim r-1plcrui r-lrvibr"><g><path d="M14 11.25H6c-.414 0-.75.336-.75.75s.336.75.75.75h8c.414 0 .75-.336.75-.75s-.336-.75-.75-.75zm0-4H6c-.414 0-.75.336-.75.75s.336.75.75.75h8c.414 0 .75-.336.75-.75s-.336-.75-.75-.75zm-3.25 8H6c-.414 0-.75.336-.75.75s.336.75.75.75h4.75c.414 0 .75-.336.75-.75s-.336-.75-.75-.75z"></path><path d="M21.5 11.25h-3.25v-7C18.25 3.01 17.24 2 16 2H4C2.76 2 1.75 3.01 1.75 4.25v15.5C1.75 20.99 2.76 22 4 22h15.5c1.517 0 2.75-1.233 2.75-2.75V12c0-.414-.336-.75-.75-.75zm-18.25 8.5V4.25c0-.413.337-.75.75-.75h12c.413 0 .75.337.75.75v15c0 .452.12.873.315 1.25H4c-.413 0-.75-.337-.75-.75zm16.25.75c-.69 0-1.25-.56-1.25-1.25v-6.5h2.5v6.5c0 .69-.56 1.25-1.25 1.25z"></path></g></svg>
187
+
188
+ %backarrow
189
+
190
+ <svg viewBox="0 0 24 24" class="backarrow"><g><path d="M20 11H7.414l4.293-4.293c.39-.39.39-1.023 0-1.414s-1.023-.39-1.414 0l-6 6c-.39.39-.39 1.023 0 1.414l6 6c.195.195.45.293.707.293s.512-.098.707-.293c.39-.39.39-1.023 0-1.414L7.414 13H20c.553 0 1-.447 1-1s-.447-1-1-1z"></path></g></svg>
191
+
192
+ %ellipsis
193
+
194
+ <svg viewBox="0 0 24 24" class="ellipsis"><g><circle cx="5" cy="12" r="2"></circle><circle cx="12" cy="12" r="2"></circle><circle cx="19" cy="12" r="2"></circle></g></svg>
195
+
196
+
197
+ %link
198
+
199
+ <svg viewBox="0 0 24 24"><g><path d="M11.96 14.945c-.067 0-.136-.01-.203-.027-1.13-.318-2.097-.986-2.795-1.932-.832-1.125-1.176-2.508-.968-3.893s.942-2.605 2.068-3.438l3.53-2.608c2.322-1.716 5.61-1.224 7.33 1.1.83 1.127 1.175 2.51.967 3.895s-.943 2.605-2.07 3.438l-1.48 1.094c-.333.246-.804.175-1.05-.158-.246-.334-.176-.804.158-1.05l1.48-1.095c.803-.592 1.327-1.463 1.476-2.45.148-.988-.098-1.975-.69-2.778-1.225-1.656-3.572-2.01-5.23-.784l-3.53 2.608c-.802.593-1.326 1.464-1.475 2.45-.15.99.097 1.975.69 2.778.498.675 1.187 1.15 1.992 1.377.4.114.633.528.52.928-.092.33-.394.547-.722.547z"></path><path d="M7.27 22.054c-1.61 0-3.197-.735-4.225-2.125-.832-1.127-1.176-2.51-.968-3.894s.943-2.605 2.07-3.438l1.478-1.094c.334-.245.805-.175 1.05.158s.177.804-.157 1.05l-1.48 1.095c-.803.593-1.326 1.464-1.475 2.45-.148.99.097 1.975.69 2.778 1.225 1.657 3.57 2.01 5.23.785l3.528-2.608c1.658-1.225 2.01-3.57.785-5.23-.498-.674-1.187-1.15-1.992-1.376-.4-.113-.633-.527-.52-.927.112-.4.528-.63.926-.522 1.13.318 2.096.986 2.794 1.932 1.717 2.324 1.224 5.612-1.1 7.33l-3.53 2.608c-.933.693-2.023 1.026-3.105 1.026z"></path></g></svg>
200
+
201
+ %reply
202
+
203
+ <svg viewBox="0 0 24 24" <g><path d="M14.046 2.242l-4.148-.01h-.002c-4.374 0-7.8 3.427-7.8 7.802 0 4.098 3.186 7.206 7.465 7.37v3.828c0 .108.044.286.12.403.142.225.384.347.632.347.138 0 .277-.038.402-.118.264-.168 6.473-4.14 8.088-5.506 1.902-1.61 3.04-3.97 3.043-6.312v-.017c-.006-4.367-3.43-7.787-7.8-7.788zm3.787 12.972c-1.134.96-4.862 3.405-6.772 4.643V16.67c0-.414-.335-.75-.75-.75h-.396c-3.66 0-6.318-2.476-6.318-5.886 0-3.534 2.768-6.302 6.3-6.302l4.147.01h.002c3.532 0 6.3 2.766 6.302 6.296-.003 1.91-.942 3.844-2.514 5.176z"></path></g></svg>
204
+
data/lib/noticesys.rb CHANGED
@@ -5,9 +5,20 @@
5
5
  require 'down' # file downloader
6
6
  require 'weblet' # HTML retrieval
7
7
  require 'dynarex' # flat file storage system
8
+ require 'unichron' # universal chron tool (i.e. time calculation)
8
9
  require 'ogextractor' # extract metadata
10
+ require 'recordx_sqlite'
9
11
 
10
12
 
13
+ # classes:
14
+ #
15
+ # Client - sends the msg to the messaging broker
16
+ # StatusView - renders the HTML for a user status
17
+ # StatusListView - renders the HTML for a user timeline
18
+ # CardView - renders the HTML for a card; used within a status
19
+ # HashtagQueryView - renders the HTML for the results for a hashtag search
20
+ # SearchQueryView - renders the HTML for the results for a keyword search
21
+ # CssView - outputs the default CSS used by the microblog
11
22
 
12
23
  module NoticeSys
13
24
 
@@ -127,14 +138,74 @@ module NoticeSys
127
138
 
128
139
  end
129
140
 
141
+
142
+ class CardView
143
+
144
+ def initialize(weblet)
145
+
146
+ @w = weblet
147
+
148
+ end
149
+
150
+ def render(dx, rx, card)
151
+
152
+ card2 = case card.keys.first
153
+ when :images
154
+
155
+ card[:images].map.with_index do |img, i|
156
+
157
+ href = [dx.link.sub(/\/$/,''), rx.topic, 'status', rx.id,
158
+ 'photo', (i+1).to_s ].join('/')
159
+ url, align = img[:url], img[:align]
160
+ "<a href='%s'><div class='top-crop %s'><img class='img1' src='%s'/></div></a>" % [href, align, url]
161
+
162
+ end.join
163
+
164
+ when :summary_large_image
165
+
166
+ h2 = card[:summary_large_image]
167
+
168
+ rawdesc = h2[:desc]
169
+
170
+ desc = rawdesc.length > 147 ? rawdesc[0..147] + '...' : rawdesc
171
+ site = h2[:url][/https?:\/\/([^\/]+)/,1].sub(/^www\./,'')
172
+ title = h2[:title]
173
+ img = h2[:img]
174
+ url = h2[:url]
175
+
176
+ @w.render('card', binding)
177
+
178
+ when :summary
179
+
180
+ h2 = card[:summary]
181
+
182
+ rawdesc = h2[:desc]
183
+
184
+ desc = rawdesc.length > 95 ? rawdesc[0..95] + '...' : rawdesc
185
+ site = h2[:url][/https?:\/\/([^\/]+)/,1].sub(/^www\./,'')
186
+ title = h2[:title].length > 46 ? h2[:title][0..46] + '...' : h2[:title]
187
+ img = h2[:img]
188
+ url = h2[:url]
189
+
190
+ img_element = if img then
191
+ "<img src='#{img}'>"
192
+ else
193
+ @w.render('svg/article')
194
+ end
195
+
196
+ @w.render('card2', binding)
197
+
198
+ end
199
+ end
200
+ end
201
+
130
202
  class StatusView
131
203
 
132
- def initialize(basepath, xslfile, css_url, weblet_file=nil)
204
+ def initialize(basepath, xslfile, css_url, weblet)
133
205
 
134
206
  @basepath, @xslfile, @css_url = basepath, xslfile, css_url
135
- weblet_file ||= File.join(File.dirname(__FILE__), '..',
136
- 'data', 'microblog.txt')
137
- @w = Weblet.new(weblet_file, binding)
207
+ @w = weblet
208
+ @card = CardView.new(@w)
138
209
 
139
210
  end
140
211
 
@@ -142,7 +213,7 @@ module NoticeSys
142
213
 
143
214
  id = rawid[0..9].to_i
144
215
 
145
- filepath = File.join(@basepath, topic)
216
+ filepath = File.join(@basepath, 'u', topic)
146
217
  a = [Time.at(id).strftime("%Y/%b/%-d").downcase, rawid]
147
218
  xmlfile = File.join(filepath, "%s/%s/index.xml" % a)
148
219
  xslfile = File.join(@basepath, "/xsl/notices/#{topic}.xsl")
@@ -190,7 +261,7 @@ module NoticeSys
190
261
  #img = h[:img].sub(/small(?=\.\w+$)/,'large')
191
262
  img = h[:img]
192
263
  metadata = @w.render(:meta, binding)
193
- [render_card(dx, rx, card), metadata]
264
+ [@card.render(dx, rx, card), metadata]
194
265
 
195
266
  end
196
267
  else
@@ -215,58 +286,364 @@ module NoticeSys
215
286
 
216
287
  end
217
288
 
218
- private
289
+ end
219
290
 
220
- def render_card(dx, rx, card)
291
+ class CssView
292
+
293
+ def initialize(weblet_file)
221
294
 
222
- card2 = case card.keys.first
223
- when :images
295
+ @weblet_file = weblet_file
224
296
 
225
- card[:images].map.with_index do |img, i|
297
+ end
298
+
299
+ def noticelist_css()
300
+
301
+ w = Weblet.new(@weblet_file)
302
+
303
+ lines = []
304
+ lines << w.render(:main)
305
+ lines << w.render('main/user')
306
+ lines << w.render(:notice)
307
+ lines << w.render('notice/cards')
308
+ lines << w.render('main/noticelist')
309
+ lines << w.render('main/footer')
310
+ lines.join("\n")
311
+
312
+ end
313
+
314
+ def notice_css()
315
+
316
+ w = Weblet.new(@weblet_file)
317
+
318
+ lines = []
319
+ lines << w.render(:status)
320
+ lines << w.render(:cards)
321
+ lines.join("\n")
322
+
323
+ end
324
+
325
+ end
326
+
327
+ class NoticeView
328
+
329
+ def render()
330
+ end
331
+
332
+ end
333
+
334
+
335
+ class StatusListView
336
+
337
+ def initialize(basepath, css_url, static_urlbase, weblet)
338
+
339
+ @basepath, @css_url, @static_urlbase = basepath, css_url, static_urlbase
340
+ @w = weblet
341
+ @card = CardView.new(@w)
342
+
343
+ end
344
+
345
+ def render(username)
346
+
347
+ s = ''
348
+
349
+ dx = Dynarex.new(File.join(@basepath, 'u', username, 'feed.xml'))
350
+
351
+ s += @w.render 'user/ptop', binding
352
+
353
+ notices = dx.all.map do |rx|
354
+
355
+ card2 = ''
356
+ rawcard = rx.to_h[:card]
226
357
 
227
- href = [dx.link.sub(/\/$/,''), rx.topic, 'status', rx.id,
228
- 'photo', (i+1).to_s ].join('/')
229
- url, align = img[:url], img[:align]
230
- "<a href='%s'><div class='top-crop %s'><img class='img1' src='%s'/></div></a>" % [href, align, url]
358
+ card2 = if rawcard and rawcard.length > 10 then
359
+
360
+ card = JSON.parse(rawcard, symbolize_names: true)
231
361
 
232
- end.join
362
+ if card.is_a? Hash then
363
+ @card.render(dx, rx, card)
364
+ end
365
+
366
+ else
367
+ ''
368
+ end
369
+
370
+ t2 = Time.at rx.id.to_s[0..9].to_i
371
+ relative_time = Unichron.new(t2).elapsed
233
372
 
234
- when :summary_large_image
373
+ d = t2.strftime("%I:%M%p %b %d %Y")
374
+
375
+ description = if rx.description.length > 1 then
376
+ doc = Rexle.new "<node>%s</node>" % rx.description.gsub(/<\/?p>/,'')
377
+ doc.root.xpath('img|div').each(&:delete)
378
+ "<p>%s</p>" % doc.root.xml
379
+ else
380
+ ''
381
+ end
235
382
 
236
- h2 = card[:summary_large_image]
383
+ utitle, uimage, ubio = dx.title, dx.image, dx.bio
384
+ @w.render :notice, binding
385
+
386
+ end
237
387
 
238
- rawdesc = h2[:desc]
388
+ s += notices.join
389
+ s += @w.render 'user/rsslink', binding
390
+ @w.render :user, binding
391
+
392
+ end
393
+ end
394
+
395
+ class HashtagQueryView
396
+
397
+ def initialize(basepath, css_url, weblet, static_urlbase, urlbase)
398
+
399
+ @basepath, @css_url, @static_urlbase = basepath, css_url, static_urlbase
400
+ @w, @urlbase = weblet, urlbase
401
+ @card = CardView.new(@w)
402
+
403
+ end
404
+
405
+ def render(q, referer)
406
+ #q = args.first
407
+ dbpath = File.join(@basepath, '/hashtag/index.db')
408
+ db = RecordxSqlite.new(dbpath, table: 'hashtags')
409
+
410
+
411
+ a = db.find_all_by_tag q
239
412
 
240
- desc = rawdesc.length > 147 ? rawdesc[0..147] + '...' : rawdesc
241
- site = h2[:url][/https?:\/\/([^\/]+)/,1].sub(/^www\./,'')
242
- title = h2[:title]
243
- img = h2[:img]
244
- url = h2[:url]
413
+ topics = a.map(&:topic).uniq.map do |topic|
245
414
 
246
- @w.render('card', binding)
415
+ topicpath = File.join(@basepath, 'u', topic)
416
+ filepath = File.join(topicpath, "notices.db")
417
+ db = RecordxSqlite.new(filepath, table: 'notices')
247
418
 
248
- when :summary
419
+ dx = Dynarex.new(File.join(topicpath, 'feed.xml'))
420
+ [topic, OpenStruct.new(title: dx.title, image: dx.image, db: db)]
249
421
 
250
- h2 = card[:summary]
422
+ end.to_h
251
423
 
252
- rawdesc = h2[:desc]
253
424
 
254
- desc = rawdesc.length > 95 ? rawdesc[0..95] + '...' : rawdesc
255
- site = h2[:url][/https?:\/\/([^\/]+)/,1].sub(/^www\./,'')
256
- title = h2[:title].length > 46 ? h2[:title][0..46] + '...' : h2[:title]
257
- img = h2[:img]
258
- url = h2[:url]
425
+ rows = a.map do |x|
426
+
427
+ r = topics[x.topic]
428
+ rx = r.db.find x.noticeid
429
+ link = "%s/%s/status/%s" % [@urlbase, x.topic, x.noticeid]
430
+ OpenStruct.new(rx.to_h.merge({topic: x.topic, title: r.title,
431
+ image: r.image, bio: r.bio, link: link}))
432
+
433
+ end
434
+
435
+
436
+ s = ''
437
+
438
+ notices = rows.sort_by {|x| -(x.id.to_i)}.take(20).map do |rx|
439
+
440
+ next unless rx.description
441
+
442
+ card2 = ''
443
+ rawcard = rx.to_h[:card]
259
444
 
260
- img_element = if img then
261
- "<img src='#{img}'>"
445
+ card2 = if rawcard and rawcard.length > 10 then
446
+
447
+ card = JSON.parse(rawcard, symbolize_names: true)
448
+
449
+ if card.is_a? Hash then
450
+ @card.render(dx, rx, card)
451
+ end
452
+
262
453
  else
263
- @w.render('svg/article')
454
+ ''
455
+ end
456
+
457
+ t2 = Time.at rx.id.to_s[0..9].to_i
458
+ relative_time = Unichron.new(t2).elapsed
459
+
460
+ d = t2.strftime("%I:%M%p %b %d %Y")
461
+
462
+ description = if rx.description.length > 1 then
463
+ doc = Rexle.new "<node>%s</node>" % rx.description.gsub(/<\/?p>/,'')
464
+ doc.root.xpath('img|div').each(&:delete)
465
+ "<p>%s</p>" % doc.root.xml
466
+ else
467
+ ''
468
+ end
469
+
470
+ utitle, uimage, ubio = rx.title, rx.image, rx.bio
471
+ @w.render :notice, binding
472
+
473
+ end
474
+
475
+ s += if notices.any? then
476
+ notices.compact.join
477
+ else
478
+ "<p>No results for #{q}</p>"
479
+ end
480
+
481
+ ref = referer
482
+ ref = '../' if ref =~ /(?:status|hashtag)\/\d+/
483
+
484
+ svg = @w.render 'svg/backarrow', binding
485
+ back = ref ? "<a href='#{ref}'>#{svg}</a>" : ''
486
+
487
+ @w.render :search_pg, binding
488
+
489
+ end
490
+
491
+
492
+ end
493
+
494
+ class SearchQueryView
495
+
496
+ def initialize(basepath, css_url, weblet, static_urlbase, urlbase)
497
+
498
+ @basepath, @css_url, @static_urlbase = basepath, css_url, static_urlbase
499
+ @w, @urlbase = weblet, urlbase
500
+ @card = CardView.new(@w)
501
+
502
+ end
503
+
504
+ def render(q, referer)
505
+
506
+
507
+ users = Dir.glob(File.join(@basepath, 'u', '*')).map do |x|
508
+ File.basename(x)
509
+ end
510
+
511
+ topics = users.map do |topic|
512
+
513
+ topicpath = File.join(@basepath, 'u', topic)
514
+ filepath = File.join(topicpath, "notices.db")
515
+ db = RecordxSqlite.new(filepath, table: 'notices')
516
+
517
+ dx = Dynarex.new(File.join(topicpath, 'feed.xml'))
518
+ [topic, OpenStruct.new(title: dx.title, image: dx.image, bio: dx.bio, db: db)]
519
+
520
+ end.to_h
521
+
522
+ #return topics.inspect
523
+ rows = topics.flat_map do |topic, r|
524
+
525
+ a = r.db.all.select {|x| x.description =~ /#{q}/i}
526
+ a.map do |rx|
527
+ link = "%s/%s/status/%s" % [@urlbase, topic, rx.noticeid]
528
+ OpenStruct.new(rx.to_h.merge({topic: topic, title: r.title, image: r.image, link: link}))
264
529
  end
265
530
 
266
- @w.render('card2', binding)
531
+ end
532
+
533
+
534
+ #return rows.inspect
535
+ s = ''
267
536
 
537
+ notices = rows.sort_by {|x| -(x.id.to_i)}.take(20).map do |rx|
538
+
539
+
540
+ card2 = ''
541
+ rawcard = rx.to_h[:card]
542
+
543
+ card2 = if rawcard and rawcard.length > 10 then
544
+
545
+ card = JSON.parse(rawcard, symbolize_names: true)
546
+
547
+ if card.is_a? Hash then
548
+ @card.render(dx, rx, card)
549
+ end
550
+
551
+ else
552
+ ''
553
+ end
554
+
555
+ #rx.description
556
+ t2 = Time.at rx.id.to_s[0..9].to_i
557
+ relative_time = Unichron.new(t2).elapsed
558
+
559
+ d = t2.strftime("%I:%M%p %b %d %Y")
560
+
561
+ #desc = rx.description.gsub(/<\/?p>/,'').gsub('&lt;','<').gsub('&gt;','>')
562
+
563
+ topic = rx.topic
564
+ title, image, bio = %i(title image bio).map do |x|
565
+ topics[topic].method(x).call
566
+ end
567
+
568
+ description = if rx.description.length > 1 then
569
+ doc = Rexle.new "<node>%s</node>" % rx.description.gsub(/<\/?p>/,'')
570
+ doc.root.xpath('img|div').each(&:delete)
571
+ "<p>%s</p>" % doc.root.xml
572
+ else
573
+ ''
574
+ end
575
+
576
+ utitle, uimage, ubio = title, image, bio
577
+ @w.render :notice, binding
578
+
579
+
268
580
  end
269
- end
581
+ #return notices.inspect
582
+
583
+ s += if notices.any? then
584
+ notices.join
585
+ else
586
+ "<p>No results for #{q}</p>"
587
+ end
588
+
589
+ #ref = @env["HTTP_REFERER"]
590
+ ref = referer
591
+ ref = '../' if ref =~ /(?:status\/\d+|search)/
592
+ svg = @w.render 'svg/backarrow', binding
593
+ back = ref ? "<a href='#{ref}'>#{svg}</a>" : ''
594
+
595
+ @w.render :search_pg, binding
596
+
597
+
598
+ end
599
+
600
+
601
+ end
602
+
603
+ class Main
604
+
605
+ def initialize(basepath, xslfile, statuscss_url, statuslistcss_url,
606
+ weblet_file, static_urlbase, urlbase, weblet_cssfile)
607
+
608
+ weblet = Weblet.new(weblet_file)
609
+ @status = StatusView.new(basepath, xslfile, statuscss_url, weblet)
610
+ @statuslist = StatusListView.new(basepath, statuslistcss_url,
611
+ static_urlbase, weblet)
612
+ @hashtag = HashtagQueryView.new(basepath, statuslistcss_url, weblet,
613
+ static_urlbase, urlbase)
614
+ @search = SearchQueryView.new(basepath, statuslistcss_url, weblet,
615
+ static_urlbase, urlbase)
616
+
617
+ @css = CssView.new(weblet_cssfile)
618
+
619
+ end
620
+
621
+ def notice_css()
622
+ @css.notice_css()
623
+ end
624
+
625
+ def noticelist_css()
626
+ @css.noticelist_css()
627
+ end
628
+
629
+ def status(topic, rawid, referer)
630
+ @status.render topic, rawid, referer
631
+ end
632
+
633
+ def status_list(username)
634
+ @statuslist.render username
635
+ end
636
+
637
+ def hashtag_query(s, referer)
638
+ @hashtag.render s, referer
639
+ end
640
+
641
+ def search_query(s, referer)
642
+ @search.render s, referer
643
+ end
644
+
645
+
646
+
270
647
  end
271
648
 
272
649
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: noticesys
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -35,7 +35,7 @@ cert_chain:
35
35
  iGAgDWBQqM/kdjDslqjBGtyWyFyuYHzXMU1gO/P0aE3rh1enqahZ8BqY+gxXLGrR
36
36
  sU+WFV9qPqoqNOG0tOknOZXN
37
37
  -----END CERTIFICATE-----
38
- date: 2021-04-04 00:00:00.000000000 Z
38
+ date: 2021-04-06 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: down
@@ -66,7 +66,7 @@ dependencies:
66
66
  version: '0.3'
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
- version: 0.3.2
69
+ version: 0.3.3
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: '0.3'
77
77
  - - ">="
78
78
  - !ruby/object:Gem::Version
79
- version: 0.3.2
79
+ version: 0.3.3
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: dynarex
82
82
  requirement: !ruby/object:Gem::Requirement
@@ -97,6 +97,26 @@ dependencies:
97
97
  - - ">="
98
98
  - !ruby/object:Gem::Version
99
99
  version: 1.8.27
100
+ - !ruby/object:Gem::Dependency
101
+ name: unichron
102
+ requirement: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - "~>"
105
+ - !ruby/object:Gem::Version
106
+ version: '0.3'
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: 0.3.2
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '0.3'
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: 0.3.2
100
120
  - !ruby/object:Gem::Dependency
101
121
  name: ogextractor
102
122
  requirement: !ruby/object:Gem::Requirement
@@ -117,12 +137,34 @@ dependencies:
117
137
  - - ">="
118
138
  - !ruby/object:Gem::Version
119
139
  version: 0.1.3
140
+ - !ruby/object:Gem::Dependency
141
+ name: recordx_sqlite
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: '0.3'
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: 0.3.1
150
+ type: :runtime
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - "~>"
155
+ - !ruby/object:Gem::Version
156
+ version: '0.3'
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: 0.3.1
120
160
  description:
121
161
  email: digital.robertson@gmail.com
122
162
  executables: []
123
163
  extensions: []
124
164
  extra_rdoc_files: []
125
165
  files:
166
+ - data/css.txt
167
+ - data/microblog.txt
126
168
  - lib/noticesys.rb
127
169
  homepage: https://github.com/jrobertson/noticesys
128
170
  licenses:
metadata.gz.sig CHANGED
Binary file