sfeed_frames.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_frames.c (5266B)
---
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 char *line;
10 static size_t linesize;
11 static time_t comparetime;
12 static unsigned long totalnew, total;
13
14 static void
15 printfeed(FILE *fpitems, FILE *fpin, struct feed *f)
16 {
17 char *fields[FieldLast];
18 ssize_t linelen;
19 unsigned int isnew;
20 struct tm rtm, *tm;
21 time_t parsedtime;
22
23 /* menu if not unnamed */
24 if (f->name[0]) {
25 fputs("<h2 id=\"", fpitems);
26 xmlencode(f->name, fpitems);
27 fputs("\"><a href=\"#", fpitems);
28 xmlencode(f->name, fpitems);
29 fputs("\">", fpitems);
30 xmlencode(f->name, fpitems);
31 fputs("</a></h2>\n", fpitems);
32 }
33 fputs("<pre>\n", fpitems);
34
35 while ((linelen = getline(&line, &linesize, fpin)) > 0 &&
36 !ferror(fpitems)) {
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 fprintf(fpitems, "%04d-%02d-%02d %02d:%02d ",
48 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
49 tm->tm_hour, tm->tm_min);
50 } else {
51 isnew = 0;
52 fputs(" ", fpitems);
53 }
54 f->total++;
55 total++;
56
57 if (fields[FieldLink][0]) {
58 fputs("<a href=\"", fpitems);
59 xmlencode(fields[FieldLink], fpitems);
60 fputs("\">", fpitems);
61 }
62 if (isnew)
63 fputs("<b><u>", fpitems);
64 xmlencode(fields[FieldTitle], fpitems);
65 if (isnew)
66 fputs("</u></b>", fpitems);
67 if (fields[FieldLink][0])
68 fputs("</a>", fpitems);
69 fputs("\n", fpitems);
70 }
71 fputs("</pre>\n", fpitems);
72 }
73
74 int
75 main(int argc, char *argv[])
76 {
77 FILE *fpindex, *fpitems, *fpmenu = NULL, *fp;
78 char *name;
79 int i, showsidebar = (argc > 1);
80 struct feed *f;
81
82 if (pledge("stdio rpath wpath cpath", NULL) == -1)
83 err(1, "pledge");
84
85 if (!(feeds = calloc(argc <= 1 ? 1 : argc, sizeof(struct feed))))
86 err(1, "calloc");
87
88 if ((comparetime = getcomparetime()) == (time_t)-1)
89 errx(1, "getcomparetime");
90
91 /* write main index page */
92 if (!(fpindex = fopen("index.html", "wb")))
93 err(1, "fopen: index.html");
94 if (!(fpitems = fopen("items.html", "wb")))
95 err(1, "fopen: items.html");
96 if (showsidebar && !(fpmenu = fopen("menu.html", "wb")))
97 err(1, "fopen: menu.html");
98
99 if (pledge(argc <= 1 ? "stdio" : "stdio rpath", NULL) == -1)
100 err(1, "pledge");
101
102 fputs("<!DOCTYPE HTML>\n"
103 "<html>\n"
104 "\t<head>\n"
105 "\t<meta name=\"referrer\" content=\"no-referrer\" />\n"
106 "\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n"
107 "\t<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\" />\n"
108 "</head>\n"
109 "<body class=\"frame\"><div id=\"items\">", fpitems);
110
111 if (argc <= 1) {
112 feeds[0].name = "";
113 printfeed(fpitems, stdin, &feeds[0]);
114 checkfileerror(stdin, "<stdin>", 'r');
115 } else {
116 for (i = 1; i < argc; i++) {
117 name = ((name = strrchr(argv[i], '/'))) ? name + 1 : argv[i];
118 feeds[i - 1].name = name;
119
120 if (!(fp = fopen(argv[i], "r")))
121 err(1, "fopen: %s", argv[i]);
122 printfeed(fpitems, fp, &feeds[i - 1]);
123 checkfileerror(fp, argv[i], 'r');
124 checkfileerror(fpitems, "items.html", 'w');
125 fclose(fp);
126 }
127 }
128 fputs("</div></body>\n</html>\n", fpitems); /* div items */
129
130 if (showsidebar) {
131 fputs("<!DOCTYPE HTML>\n"
132 "<html>\n"
133 "<head>\n"
134 "\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n"
135 "\t<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\" />\n"
136 "</head>\n"
137 "<body class=\"frame\">\n<div id=\"sidebar\">\n", fpmenu);
138
139 for (i = 1; i < argc; i++) {
140 f = &feeds[i - 1];
141 if (f->totalnew)
142 fputs("<a class=\"n\" href=\"items.html#", fpmenu);
143 else
144 fputs("<a href=\"items.html#", fpmenu);
145 xmlencode(f->name, fpmenu);
146 fputs("\" target=\"items\">", fpmenu);
147 if (f->totalnew > 0)
148 fputs("<b><u>", fpmenu);
149 xmlencode(f->name, fpmenu);
150 fprintf(fpmenu, " (%lu)", f->totalnew);
151 if (f->totalnew > 0)
152 fputs("</u></b>", fpmenu);
153 fputs("</a><br/>\n", fpmenu);
154 }
155 fputs("</div></body></html>\n", fpmenu);
156 }
157 fputs("<!DOCTYPE html>\n<html>\n<head>\n"
158 "\t<meta name=\"referrer\" content=\"no-referrer\" />\n"
159 "\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n"
160 "\t<title>(", fpindex);
161 fprintf(fpindex, "%lu/%lu", totalnew, total);
162 fputs(") - Newsfeed</title>\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\" />\n"
163 "</head>\n", fpindex);
164 if (showsidebar) {
165 fputs("<frameset framespacing=\"0\" cols=\"250,*\" frameborder=\"1\">\n"
166 "\t<frame name=\"menu\" src=\"menu.html\" target=\"menu\">\n", fpindex);
167 } else {
168 fputs("<frameset framespacing=\"0\" cols=\"*\" frameborder=\"1\">\n", fpindex);
169 }
170 fputs(
171 "\t<frame name=\"items\" src=\"items.html\" target=\"items\">\n"
172 "</frameset>\n"
173 "</html>\n", fpindex);
174
175 checkfileerror(fpindex, "index.html", 'w');
176 checkfileerror(fpitems, "items.html", 'w');
177
178 fclose(fpindex);
179 fclose(fpitems);
180 if (fpmenu) {
181 checkfileerror(fpmenu, "menu.html", 'w');
182 fclose(fpmenu);
183 }
184
185 return 0;
186 }