1
1
#include <u.h>
2
2
#include <libc.h>
3
3
#include <bio.h>
4
+ #include <String.h>
4
5
#include "xmlpull.h"
5
6
#include "rssfill.h"
6
7
@@ -10,6 +11,9 @@ char *prefix = "";
10
11
int chatty = 0 ;
11
12
int dry = 0 ;
12
13
14
+ int dohtml ;
15
+ int typehtml ;
16
+
13
17
void
14
18
usage (void )
15
19
{
@@ -20,6 +24,59 @@ usage(void)
20
24
exits ("usage" );
21
25
}
22
26
27
+ char *
28
+ html (char * text )
29
+ {
30
+ char * s , buf [8192 ];
31
+ String * str ;
32
+ int n , m , written ;
33
+ int p [2 ];
34
+
35
+ if (!dohtml )
36
+ return strdup (text );
37
+ dohtml = 0 ;
38
+
39
+ if (pipe (p ) < 0 )
40
+ sysfatal ("pipe: %r" );
41
+
42
+ s = nil ;
43
+ switch (fork ()){
44
+ case -1 :
45
+ close (p [0 ]);
46
+ close (p [1 ]);
47
+ return strdup (text );
48
+ break ;
49
+ case 0 :
50
+ dup (p [1 ], 0 );
51
+ dup (p [1 ], 1 );
52
+ close (p [1 ]);
53
+ close (p [0 ]);
54
+ execl ("/bin/htmlfmt" , "htmlfmt" , "-cutf-8" , nil );
55
+ exits (nil );
56
+ default :
57
+ close (p [1 ]);
58
+ str = s_new ();
59
+ written = 0 ;
60
+ while (written < strlen (text ) && (n = write (p [0 ], & text [written ], strlen (& text [written ]))) > 0 ){
61
+ written += n ;
62
+ write (p [0 ], "" , 0 ); // htmlfmt needs double flush, idk why
63
+ write (p [0 ], "" , 0 );
64
+ m = read (p [0 ], buf , 8191 );
65
+ buf [m ] = 0 ;
66
+ str = s_append (str , buf );
67
+ }
68
+ close (p [0 ]);
69
+ while (waitpid () > 0 )
70
+ ;
71
+ s = strdup (s_to_c (str ));
72
+ s_free (str );
73
+ }
74
+
75
+ if (s )
76
+ return s ;
77
+ return strdup (text );
78
+ }
79
+
23
80
void
24
81
writefeedfiles (Feed * f )
25
82
{
@@ -208,7 +265,7 @@ main(int argc, char **argv)
208
265
xmlpull * x , * a ;
209
266
char st ;
210
267
Feed * f , * r ;
211
-
268
+
212
269
ARGBEGIN {
213
270
case 'd' :
214
271
directory = EARGF (usage ());
@@ -223,14 +280,14 @@ main(int argc, char **argv)
223
280
chatty = 1 ;
224
281
break ;
225
282
} ARGEND ;
226
-
283
+
227
284
if (dry )
228
285
chatty = 1 ;
229
-
286
+
230
287
st = NONE ;
231
288
f = nil ;
232
289
r = nil ;
233
-
290
+
234
291
x = openxmlpull (0 );
235
292
while ((a = nextxmlpull (x )) != nil && st != END ){
236
293
switch (a -> ev ){
@@ -277,25 +334,29 @@ main(int argc, char **argv)
277
334
case ATTR :
278
335
if (!strcmp (x -> na , "href" ) && st == LINK )
279
336
f -> link = strdup (x -> va );
337
+ if (!strcmp (x -> na , "type" ) && !cistrcmp (x -> va , "html" ))
338
+ typehtml = 1 ;
280
339
break ;
281
340
case CDATA :
341
+ /* if typehtml AND cdata, do html */
342
+ dohtml = typehtml ;
282
343
case TEXT :
283
344
switch (st ){
284
345
case TITLE :
285
346
if (!f -> title || strlen (f -> title ) == 0 )
286
- f -> title = strdup (x -> na );
347
+ f -> title = html (x -> na );
287
348
break ;
288
349
case LINK :
289
350
if (!f -> link || strlen (f -> link ) == 0 )
290
351
f -> link = strdup (x -> na );
291
352
break ;
292
353
case DESC :
293
354
if (!f -> desc || strlen (f -> desc ) == 0 )
294
- f -> desc = strdup (x -> na );
355
+ f -> desc = html (x -> na );
295
356
break ;
296
357
case CONTENT :
297
358
if (!f -> cont || strlen (f -> cont ) == 0 )
298
- f -> cont = strdup (x -> na );
359
+ f -> cont = html (x -> na );
299
360
break ;
300
361
case DATE :
301
362
if (!f -> date || strlen (f -> date ) == 0 )
@@ -362,6 +423,6 @@ main(int argc, char **argv)
362
423
}
363
424
}
364
425
freexmlpull (x );
365
- freefeedt (r );
426
+ // freefeedt(r);
366
427
exits (nil );
367
428
}
0 commit comments