noticesys 0.2.0 → 0.5.0

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