sfeed_html.c - sfeed - RSS and Atom parser
(HTM) git clone git://git.codemadness.org/sfeed
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
sfeed_html.c (3781B)
---
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <time.h>
5
6 #include "util.h"
7
8 static struct feed *feeds;
9 static int showsidebar;
10 static char *line;
11 static size_t linesize;
12 static unsigned long totalnew, total;
13 static time_t comparetime;
14
15 static void
16 printfeed(FILE *fp, struct feed *f)
17 {
18 char *fields[FieldLast];
19 struct tm rtm, *tm;
20 time_t parsedtime;
21 unsigned int isnew;
22 ssize_t linelen;
23
24 if (f->name[0]) {
25 fputs("<h2 id=\"", stdout);
26 xmlencode(f->name, stdout);
27 fputs("\"><a href=\"#", stdout);
28 xmlencode(f->name, stdout);
29 fputs("\">", stdout);
30 xmlencode(f->name, stdout);
31 fputs("</a></h2>\n", stdout);
32 }
33 fputs("<pre>\n", stdout);
34
35 while ((linelen = getline(&line, &linesize, fp)) > 0 &&
36 !ferror(stdout)) {
37 if (line[linelen - 1] == '\n')
38 line[--linelen] = '\0';
39 parseline(line, fields);
40
41 parsedtime = 0;
42 if (!strtotime(fields[FieldUnixTimestamp], &parsedtime) &&
43 (tm = localtime_r(&parsedtime, &rtm))) {
44 isnew = (parsedtime >= comparetime) ? 1 : 0;
45 totalnew += isnew;
46 f->totalnew += isnew;
47
48 fprintf(stdout, "%04d-%02d-%02d %02d:%02d ",
49 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
50 tm->tm_hour, tm->tm_min);
51 } else {
52 isnew = 0;
53 fputs(" ", stdout);
54 }
55 f->total++;
56 total++;
57
58 if (fields[FieldLink][0]) {
59 fputs("<a href=\"", stdout);
60 xmlencode(fields[FieldLink], stdout);
61 fputs("\">", stdout);
62 }
63 if (isnew)
64 fputs("<b><u>", stdout);
65 xmlencode(fields[FieldTitle], stdout);
66 if (isnew)
67 fputs("</u></b>", stdout);
68 if (fields[FieldLink][0])
69 fputs("</a>", stdout);
70 fputs("\n", stdout);
71 }
72 fputs("</pre>\n", stdout);
73 }
74
75 int
76 main(int argc, char *argv[])
77 {
78 struct feed *f;
79 char *name;
80 FILE *fp;
81 int i;
82
83 if (pledge(argc <= 1 ? "stdio" : "stdio rpath", NULL) == -1)
84 err(1, "pledge");
85
86 if (!(feeds = calloc(argc <= 1 ? 1 : argc, sizeof(struct feed))))
87 err(1, "calloc");
88 if ((comparetime = getcomparetime()) == (time_t)-1)
89 errx(1, "getcomparetime");
90
91 fputs("<!DOCTYPE HTML>\n"
92 "<html>\n"
93 "\t<head>\n"
94 "\t<meta name=\"referrer\" content=\"no-referrer\" />\n"
95 "\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n"
96 "\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\" />\n"
97 "\t</head>\n"
98 "\t<body class=\"noframe\">\n", stdout);
99
100 showsidebar = (argc > 1);
101 if (showsidebar)
102 fputs("\t\t<div id=\"items\">\n", stdout);
103 else
104 fputs("\t\t<div id=\"items\" class=\"nosidebar\">\n", stdout);
105
106 if (argc <= 1) {
107 feeds[0].name = "";
108 printfeed(stdin, &feeds[0]);
109 checkfileerror(stdin, "<stdin>", 'r');
110 } else {
111 for (i = 1; i < argc; i++) {
112 name = ((name = strrchr(argv[i], '/'))) ? name + 1 : argv[i];
113 feeds[i - 1].name = name;
114 if (!(fp = fopen(argv[i], "r")))
115 err(1, "fopen: %s", argv[i]);
116 printfeed(fp, &feeds[i - 1]);
117 checkfileerror(fp, argv[i], 'r');
118 checkfileerror(stdout, "<stdout>", 'w');
119 fclose(fp);
120 }
121 }
122 fputs("</div>\n", stdout); /* div items */
123
124 if (showsidebar) {
125 fputs("\t<div id=\"sidebar\">\n\t\t<ul>\n", stdout);
126
127 for (i = 1; i < argc; i++) {
128 f = &feeds[i - 1];
129 if (f->totalnew > 0)
130 fputs("<li class=\"n\"><a href=\"#", stdout);
131 else
132 fputs("<li><a href=\"#", stdout);
133 xmlencode(f->name, stdout);
134 fputs("\">", stdout);
135 if (f->totalnew > 0)
136 fputs("<b><u>", stdout);
137 xmlencode(f->name, stdout);
138 fprintf(stdout, " (%lu)", f->totalnew);
139 if (f->totalnew > 0)
140 fputs("</u></b>", stdout);
141 fputs("</a></li>\n", stdout);
142 }
143 fputs("\t\t</ul>\n\t</div>\n", stdout);
144 }
145
146 fprintf(stdout, "\t</body>\n\t<title>(%lu/%lu) - Newsfeed</title>\n</html>\n",
147 totalnew, total);
148
149 checkfileerror(stdout, "<stdout>", 'w');
150
151 return 0;
152 }