/[suikacvs]/webroot/commitfeed/mkcommitfeed.pl
Suika

Contents of /webroot/commitfeed/mkcommitfeed.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (hide annotations) (download)
Mon Nov 24 05:21:35 2008 UTC (15 years, 5 months ago) by wakaba
Branch: MAIN
Changes since 1.1: +4 -1 lines
File MIME type: text/plain
++ ChangeLog	24 Nov 2008 05:21:19 -0000
	* mkcommitfeed-example: Allow shell special characters in
	arguments.

2008-11-24  Wakaba  <wakaba@suika.fam.cx>

1 wakaba 1.1 #!/usr/bin/perl
2     use strict;
3    
4 wakaba 1.2 use Data::Dumper;
5     print Dumper \@ARGV;
6    
7 wakaba 1.1 use Getopt::Long;
8     use Pod::Usage;
9     use Time::Local;
10    
11     my $file_name;
12     my $feed_url;
13     my $feed_title = 'ChangeLog';
14     my $feed_author_name;
15     my $feed_author_mail;
16     my $feed_author_url;
17     my $feed_lang = 'i-default';
18     my $feed_related_url;
19     my $feed_license_url;
20     my $feed_rights;
21     my $entry_content;
22     my $entry_author_name;
23     my $entry_author_mail;
24     my $entry_date;
25     my $entry_title;
26    
27     GetOptions (
28     'entry-author-mail=s' => \$entry_author_mail,
29     'entry-author-name=s' => \$entry_author_name,
30     'entry-content=s' => \$entry_content,
31     'entry-title=s' => \$entry_title,
32     'feed-author-mail=s' => \$feed_author_mail,
33     'feed-author-name=s' => \$feed_author_name,
34     'feed-author-url=s' => \$feed_author_url,
35     'feed-lang=s' => \$feed_lang,
36     'feed-license-url=s' => \$feed_license_url,
37     'feed-related-url=s' => \$feed_related_url,
38     'feed-rights=s' => \$feed_rights,
39     'feed-title=s' => \$feed_title,
40     'feed-url=s' => \$feed_url,
41     'file-name=s' => \$file_name,
42     'help' => sub {
43     pod2usage (-exitval => 0, -verbose => 2);
44     },
45     ) or pod2usage (-exitval => 1, -verbose => 1);
46     pod2usage (-exitval => 1, -verbose => 1,
47     -msg => "Required argument --file-name is not specified.\n")
48     unless defined $file_name;
49     pod2usage (-exitval => 1, -verbose => 1,
50     -msg => "Required argument --feed-url is not specified.\n")
51     unless defined $feed_url;
52    
53     unless (defined $entry_content) {
54     $entry_content = '';
55     $entry_content .= $_ while <>;
56     }
57    
58     if ($entry_content =~ /^(\d+)-(\d+)-(\d+)\s+(.+)<([^<>]+)>/m) {
59     # $entry_date //= timegm (0, 0, 0, $3, $2-1, $1);
60     $entry_author_name //= $4;
61     $entry_author_mail //= $5;
62     $entry_author_name =~ s/\s+$//;
63     }
64     $entry_date //= time;
65    
66     pod2usage (-exitval => 1, -verbose => 1,
67     -msg => "Required argument --entry-author-name is not specified.\n")
68     unless defined $entry_author_name;
69    
70     unless (defined $entry_title) {
71     my $time = [gmtime $entry_date];
72     $entry_title = sprintf '%04d-%02d-%02d %s', 1900+$time->[5], 1+$time->[4],
73     $time->[3], $entry_author_name;
74     }
75    
76     require Message::DOM::DOMImplementation;
77     my $dom = Message::DOM::DOMImplementation->new;
78     my $doc;
79    
80     {
81     if (-f $file_name) {
82     open my $file, '<:encoding(utf8)', $file_name or die "$0: $file_name: $!";
83     local $/ = undef;
84     $doc = $dom->create_document;
85     $doc->inner_html (<$file>);
86     } else {
87     $doc = $dom->create_atom_feed_document
88     ($feed_url, $feed_title, $feed_lang);
89     }
90     }
91    
92     $doc->dom_config
93     ->{q<http://suika.fam.cx/www/2006/dom-config/create-child-element>} = 1;
94     my $feed = $doc->document_element;
95     unless ($feed) {
96     $feed = $doc->create_element_ns ('http://www.w3.org/2005/Atom', 'feed');
97     $doc->append_child ($feed);
98     }
99     $feed->set_attribute_ns ('http://www.w3.org/2000/xmlns/',
100     'xmlns', $feed->namespace_uri);
101    
102     unless (@{$feed->author_elements}) {
103     if (defined $feed_author_name) {
104     my $author = $doc->create_element_ns ($feed->namespace_uri, 'author');
105     $author->name ($feed_author_name);
106     $author->email ($feed_author_mail) if defined $feed_author_mail;
107     $author->uri ($feed_author_url) if defined $feed_author_url;
108     $feed->append_child ($author);
109     }
110     }
111     unless (@{$feed->link_elements}) {
112     my $link_self = $doc->create_element_ns ($feed->namespace_uri, 'link');
113     $link_self->rel ('self');
114     $link_self->type ('application/atom+xml');
115     $link_self->hreflang ($feed_lang);
116     $link_self->href ($feed_url);
117     $feed->append_child ($link_self);
118    
119     if (defined $feed_related_url) {
120     my $link = $doc->create_element_ns ($feed->namespace_uri, 'link');
121     $link->rel ('related');
122     $link->href ($feed_related_url);
123     $feed->append_child ($link);
124     }
125    
126     if (defined $feed_license_url) {
127     my $link = $doc->create_element_ns ($feed->namespace_uri, 'link');
128     $link->rel ('license');
129     $link->href ($feed_license_url);
130     $feed->append_child ($link);
131     }
132     }
133    
134     if (defined $feed_rights) {
135     $feed->rights_element->text_content ($feed_rights);
136     }
137    
138     my $entry_id = 'entry-' . time;
139     my $entry = $feed->add_new_entry ($feed_url . '#' . $entry_id,
140     $entry_title);
141     $entry->set_attribute_ns ('http://www.w3.org/XML/1998/namespace',
142     'xml:id' => $entry_id);
143     if (defined $entry_author_name) {
144     my $author = $doc->create_element_ns ($feed->namespace_uri, 'author');
145     $author->name ($entry_author_name);
146     $author->email ($entry_author_mail) if defined $entry_author_mail;
147     $entry->append_child ($author);
148     }
149     $entry->updated_element->value ($entry_date);
150     my $content = $entry->content_element;
151     $content->type ('text');
152     $content->text_content ($entry_content);
153    
154     {
155     open my $file, '>:utf8', $file_name or die "$0: $file_name: $!";
156     print $file $doc->inner_html;
157     }
158    
159 wakaba 1.2 ## $Date: 2008/11/24 04:54:25 $

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24