libwww-mediawiki-client-perl-0.31/0000711001161000116100000000000010451515472014031 5ustar libwww-mediawiki-client-perl-0.31/ChangeLog0000600001161000116100000006221010451515444015603 0ustar # do not edit -- automatically generated by arch changelog # arch-tag: automatic-ChangeLog--mark@sdf-eu.org--arch/WWW-Mediawiki-Client--0.25 # 2006-07-01 17:55:03 GMT Mark Jaroski patch-49 Summary: Fixed an errant test failure in wikitravel related urls. 2006-06-29 15:46:45 GMT Mark Jaroski patch-49 Summary: Removed file t/files/.mediawiki which was errently causing the server tests to be run for users who had not set up a server. 2006-06-27 07:01:15 GMT Mark Jaroski patch-48 Summary: Fixed a number of bugs from RT, and one that I found. 2005-06-06 13:12:06 GMT Mark Jaroski patch-47 Summary: Fixed a couple of minor bugs, added documentation Revision: WWW-Mediawiki-Client--0.25--patch-47 Fixed two bugs that had to do with dependencies, including changing the version number of URI required to 1.31, and added a use Encode line. Added to the documentation to highlight differences. -mark modified files: ChangeLog Makefile.PL bin/mvs lib/WWW/Mediawiki/Client.pm 2005-06-03 15:16:58 GMT Mark Jaroski patch-46 Summary: added encoding field Revision: WWW-Mediawiki-Client--0.25--patch-46 Some Mediawiki servers use encodings other than UTF-8. For these servers it's necessary to detect the encoding and use it for uploading content. modified files: bin/mvs lib/WWW/Mediawiki/Client.pm 2005-05-30 14:00:48 GMT Mark Jaroski patch-45 Summary: added hack to correct UTF-8 file upload problem Revision: WWW-Mediawiki-Client--0.25--patch-45 Added a hack to correct a problem with multibyte characters in URL::Encode which is used when uploading data through LWP. modified files: lib/WWW/Mediawiki/Client.pm 2005-05-30 07:24:31 GMT Mark Jaroski patch-44 Summary: got rid of wide character warnings Revision: WWW-Mediawiki-Client--0.25--patch-44 Perl issues "wide character" warnings when writing UNICODE to non-unicode streams and filehandles. This fixes that. I worry that it's broken iso-8859-1 support though. modified files: bin/mvs lib/WWW/Mediawiki/Client.pm t/client.t 2005-05-28 13:12:49 GMT Mark Jaroski patch-43 Summary: added documentation for using a PROXY Revision: WWW-Mediawiki-Client--0.25--patch-43 Added documentation on how configure mvs to work with an http proxy. modified files: ChangeLog bin/mvs 2005-05-27 16:02:08 GMT Mark Jaroski patch-42 Summary: fixed update output, got rid of utf8 warning Revision: WWW-Mediawiki-Client--0.25--patch-42 I had messed up the update output by leaving it dependant on the @files variable even when it was empty because that is now being done within the library. modified files: bin/mvs lib/WWW/Mediawiki/Client.pm 2005-05-27 14:55:54 GMT Mark Jaroski patch-41 Summary: a little more about images Revision: WWW-Mediawiki-Client--0.25--patch-41 modified files: TODO 2005-05-27 14:37:05 GMT Mark Jaroski patch-40 Summary: added documentation for ENV variables Revision: WWW-Mediawiki-Client--0.25--patch-40 modified files: TODO bin/mvs 2005-05-26 14:04:46 GMT Mark Jaroski patch-39 Summary: Credit for Adrian Revision: WWW-Mediawiki-Client--0.25--patch-39 Patches applied: * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-30 Added self to authors list, and moved it =over for perldoc formatting. modified files: lib/WWW/Mediawiki/Client.pm new patches: wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-30 2005-05-25 19:17:07 GMT Mark Jaroski patch-38 Summary: fixed two POD errors, and a warning for commands with no status Revision: WWW-Mediawiki-Client--0.25--patch-38 modified files: ChangeLog bin/mvs 2005-05-25 15:53:30 GMT Mark Jaroski patch-37 Summary: took out introspection Revision: WWW-Mediawiki-Client--0.25--patch-37 I replaced the introspection methods with a simple call to list_wiki_files in do_update(). modified files: lib/WWW/Mediawiki/Client.pm 2005-05-25 15:35:57 GMT Mark Jaroski patch-36 Summary: CONSTANTS and style tidying Revision: WWW-Mediawiki-Client--0.25--patch-36 Some of the new code is in Adrian's style, which is fine on it's own, but it's probably better to be consistant here. modified files: bin/mvs lib/WWW/Mediawiki/Client.pm 2005-05-25 10:01:35 GMT Mark Jaroski patch-35 Summary: droped export_path, fixed problem with do_update retval Revision: WWW-Mediawiki-Client--0.25--patch-35 It's possible to reach the Special:Export page using the wiki_path field, so I've dropped the extra field as redundant, and a possible source of bugs. I've also changed the way the status field works (returns a hashref instead of a list) and so eliminated the failures which had recently been introduced in t/server.t modified files: bin/mvs lib/WWW/Mediawiki/Client.pm t/server.t 2005-05-24 20:16:04 GMT Mark Jaroski patch-34 Summary: bug fixes for Adrian's changes Revision: WWW-Mediawiki-Client--0.25--patch-34 Patches applied: * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-17 Switched to more descriptive and unified option variables. * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-18 Accept parameter values for --wikipath, --spaces (oops). * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-19 Fixed a missing field in the new option exception. * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-20 Fixed a couple of bugs in my recent W-M-C changes. * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-21 Added multi-state --minor and --watch options. * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-22 Documentation spelling and usage fixes. * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-23 Another documentation fix, re: single-file commit. * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-24 Added docs for 'preview'. * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-25 Added docs for 'clean'. * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-26 Fixed a couple of option handling bugs. * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-27 Another bug I left in W-M-C re: minor edits. * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-28 Proper reporting of watch and minor values. * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-29 Genericised English-to-option and option-to-English. modified files: bin/mvs lib/WWW/Mediawiki/Client.pm lib/WWW/Mediawiki/Client/Exceptions.pm new patches: wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-17 wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-18 wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-19 wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-20 wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-21 wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-22 wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-23 wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-24 wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-25 wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-26 wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-27 wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-28 wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-29 2005-05-24 20:07:41 GMT Mark Jaroski patch-33 Summary: Better use of information from Mediawiki server, from Adrian Irving-Beer Revision: WWW-Mediawiki-Client--0.25--patch-33 Patches applied: * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-13 Added capturing of more information from the edit page (watch now, default watch/minor). * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-14 Changed 'watch' and 'minor_edit' to quad- and tri-state options, respectively. * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-15 Added 'use strict' to all tests. * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-16 Got rid of extraneous debug Dumper use. modified files: lib/WWW/Mediawiki/Client.pm lib/WWW/Mediawiki/Client/Exceptions.pm t/client.t t/exceptions.t t/mvs.t t/server.t new patches: wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-13 wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-14 wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-15 wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-16 2005-05-24 20:04:34 GMT Mark Jaroski patch-32 Summary: previw support from Adrian Irving-Beer Revision: WWW-Mediawiki-Client--0.25--patch-32 Patches applied: * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-10 Added explicit return, because I run 'mvs' wrapped for testing. * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-11 Getopt::Long support, and option support conditional on command. * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-12 Preview support. modified files: bin/mvs lib/WWW/Mediawiki/Client.pm new patches: wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-10 wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-11 wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-12 2005-05-24 20:00:05 GMT Mark Jaroski patch-31 Summary: added clean command from Adrian Irving-Beer Revision: WWW-Mediawiki-Client--0.25--patch-31 Patches applied: * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-9 Added 'clean' command. modified files: lib/WWW/Mediawiki/Client.pm new patches: wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-9 2005-05-24 19:57:01 GMT Mark Jaroski patch-30 Summary: Special:Export support from Adrian Irving-Beer Revision: WWW-Mediawiki-Client--0.25--patch-30 Patches applied: * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-4 Basic export support. Multi-file update too, but not supported yet. * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-5 Added multi-file support for update (no default yet). * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-6 Added doc block for export_path, mostly the same as wiki_path. * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-7 Add default_files method. (Unsure about this; see patch log.) modified files: ChangeLog bin/mvs lib/WWW/Mediawiki/Client.pm new patches: wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-4 wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-5 wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-6 wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-7 2005-05-24 09:30:44 GMT Mark Jaroski patch-29 Summary: error check for non-exception errors Revision: WWW-Mediawiki-Client--0.25--patch-29 Patches applied: * wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-3 Report unknown run-time errors, e.g. syntax. modified files: bin/mvs new patches: wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-3 2005-05-24 09:20:56 GMT Mark Jaroski patch-28 Summary: No-read test fails for root or fakeroot, skip it. Revision: WWW-Mediawiki-Client--0.25--patch-28 Applied patch from Adrian Irving-Beer . This test was failing as root, which is a problem when building a debian package. modified files: t/client.t new patches: wisq@wisq.net--2004/libwww-mediawiki-client-perl--devo--0.25--patch-1 2005-05-22 14:25:33 GMT Mark Jaroski patch-27 Summary: applied patch from Sbastien Aperghis Revision: WWW-Mediawiki-Client--0.25--patch-27 Here is a documentation patch that corrects the =head1 NAME of one of the modules so that it appears correctly. Thanks Sbastien! modified files: ChangeLog lib/WWW/Mediawiki/Client/Exceptions.pm 2005-05-19 09:40:37 GMT Mark Jaroski patch-26 Summary: documentation for new exception Revision: WWW-Mediawiki-Client--0.25--patch-26 Added documentation for the CommitException. modified files: lib/WWW/Mediawiki/Client/Exceptions.pm 2005-05-16 16:21:35 GMT Mark Jaroski patch-25 Summary: created exception for spam filter response Revision: WWW-Mediawiki-Client--0.25--patch-25 If the page you are trying to commit contains a URL which trips the spam filter the page cannot be commited. The client now recogizes this situation and throws an appropriate exception. modified files: bin/mvs lib/WWW/Mediawiki/Client.pm lib/WWW/Mediawiki/Client/Exceptions.pm 2005-05-16 09:22:07 GMT Mark Jaroski patch-24 Summary: simplified reporting Revision: WWW-Mediawiki-Client--0.25--patch-24 Made the reporting just a tiny bit friendlier. modified files: bin/mvs 2005-05-11 12:27:19 GMT Mark Jaroski patch-23 Summary: documented switch to VCS::Lite Revision: WWW-Mediawiki-Client--0.25--patch-23 Documented the switch to VCS::Lite modified files: bin/mvs lib/WWW/Mediawiki/Client.pm 2005-05-08 09:38:19 GMT Mark Jaroski patch-22 Summary: credits Revision: WWW-Mediawiki-Client--0.25--patch-22 Credit for bug reports and feedback. modified files: bin/mvs lib/WWW/Mediawiki/Client.pm 2005-05-08 09:21:00 GMT Mark Jaroski patch-21 Summary: added credits and listinfo Revision: WWW-Mediawiki-Client--0.25--patch-21 Added credits and mailing list information modified files: bin/mvs lib/WWW/Mediawiki/Client.pm 2005-05-06 15:45:46 GMT Mark Jaroski patch-20 Summary: fixed major merge bug Revision: WWW-Mediawiki-Client--0.25--patch-20 There have been merge problems all along with Algorithm::Diff::Apply, in that it sometimes would loose the local changes, in trying to abstract away conflicts. I had tried Algorithm::Merge, but that was even worse, since it completely destroyed files. So now we are on VCS::Lite, which seems to work better. modified files: Makefile.PL lib/WWW/Mediawiki/Client.pm t/files/merged.wiki 2005-05-06 14:05:26 GMT Mark Jaroski patch-19 Summary: documentation and bugfix Revision: WWW-Mediawiki-Client--0.25--patch-19 Fixed a bug in which update was not getting default values. Updated the perldoc for mvs. modified files: bin/mvs lib/WWW/Mediawiki/Client.pm t/files/example.mediawiki 2005-05-04 16:14:29 GMT Mark Jaroski patch-18 Summary: Fixed pagename bug Revision: WWW-Mediawiki-Client--0.25--patch-18 Fixed a bug in which an error would be thrown even though a page was successfully downloaded. modified files: lib/WWW/Mediawiki/Client.pm t/client.t 2005-05-03 16:25:30 GMT Mark Jaroski patch-17 Summary: mvs works again Revision: WWW-Mediawiki-Client--0.25--patch-17 I'm in the process now of doing monkey testing, and using my observations to write new tests. modified files: bin/mvs lib/WWW/Mediawiki/Client.pm t/server.t 2005-05-03 10:51:33 GMT Mark Jaroski patch-16 Summary: All tests passing Revision: WWW-Mediawiki-Client--0.25--patch-16 Both the client and server tests are all passing now. Documented the Exception classes. Now I just have to finish the wrapper script. modified files: Makefile.PL lib/WWW/Mediawiki/Client.pm lib/WWW/Mediawiki/Client/Exceptions.pm t/files/merged.wiki t/server.t 2005-05-03 08:27:26 GMT Mark Jaroski patch-15 Summary: server conflict check works again Revision: WWW-Mediawiki-Client--0.25--patch-15 The do_commit method now correctly throws an exception if the version on the server has changed. I went back to taking down the server version and comparing it. I was hoping to have the server make the decision by sending it the wpEditTime field, that however seems to be a struggle, and is in some ways *more* error prone than doing the comparison. That said there is still the tiny chance of somebody making a change during the few cycles between our comparison and our upload. That's a race condition, so if sending the date can be made reliable then that's the way to do it. modified files: lib/WWW/Mediawiki/Client.pm t/server.t 2005-05-02 16:25:50 GMT Mark Jaroski patch-14 Summary: more tests, site_url -> host Revision: WWW-Mediawiki-Client--0.25--patch-14 site_url is DEPRECATED NOW, to be replaced by host. modified files: lib/WWW/Mediawiki/Client.pm t/server.t 2005-05-02 08:16:03 GMT Mark Jaroski patch-13 Summary: do_update tested Revision: WWW-Mediawiki-Client--0.25--patch-13 The basic server tests for do_update (and do_commit) are working now. I still have to do some more exception testing, and try to find and test any boundary conditions. modified files: lib/WWW/Mediawiki/Client.pm lib/WWW/Mediawiki/Client/Exceptions.pm t/client.t t/files/example.mediawiki t/files/merged.wiki t/server.t 2005-04-29 16:14:17 GMT Mark Jaroski patch-12 Summary: more test wiki files Revision: WWW-Mediawiki-Client--0.25--patch-12 new files: t/files/.arch-ids/Main_Page.html.id t/files/.arch-ids/Main_Page.wiki.id t/files/Main_Page.html t/files/Main_Page.wiki 2005-04-29 16:13:42 GMT Mark Jaroski patch-11 Summary: Worked out mechanism for server tests Revision: WWW-Mediawiki-Client--0.25--patch-11 new files: t/files/.arch-ids/example.mediawiki.id t/files/example.mediawiki modified files: lib/WWW/Mediawiki/Client.pm lib/WWW/Mediawiki/Client/Exceptions.pm t/client.t t/exceptions.t t/server.t {arch}/=tagging-method 2005-04-28 17:38:04 GMT Mark Jaroski patch-10 Summary: Finished tests Revision: WWW-Mediawiki-Client--0.25--patch-10 I've written all of the tests I've thought of so far, and gotten the code to pass them. Seems like a good place to stop for just now. modified files: lib/WWW/Mediawiki/Client.pm lib/WWW/Mediawiki/Client/Exceptions.pm t/client.t 2005-04-28 15:07:07 GMT Mark Jaroski patch-9 Summary: Added tests for all accessors Revision: WWW-Mediawiki-Client--0.25--patch-9 I've finished the accessor tests and fixed some bugs found while writing them. modified files: lib/WWW/Mediawiki/Client.pm lib/WWW/Mediawiki/Client/Exceptions.pm t/client.t t/files/merged.wiki 2005-04-28 09:07:10 GMT Mark Jaroski patch-8 Summary: Added tests Revision: WWW-Mediawiki-Client--0.25--patch-8 Added a few client-only tests, and ideas for a bunch more. modified files: ChangeLog lib/WWW/Mediawiki/Client.pm t/client.t 2005-04-27 16:15:44 GMT Mark Jaroski patch-7 Summary: added $lang test Revision: WWW-Mediawiki-Client--0.25--patch-7 Added first test of $lang... fails so far modified files: t/client.t 2005-04-27 15:42:06 GMT Mark Jaroski patch-6 Summary: All of the old tests pass Revision: WWW-Mediawiki-Client--0.25--patch-6 There are a lot more tests to be written, but at least now all of the old tests are passing. modified files: ChangeLog lib/WWW/Mediawiki/Client.pm t/client.t t/server.t {arch}/=tagging-method 2005-04-26 18:52:39 GMT Mark Jaroski patch-5 Summary: code complete (I think) Revision: WWW-Mediawiki-Client--0.25--patch-5 The library is now roughly code-complete. I still have to do all of the tests. modified files: ChangeLog lib/WWW/Mediawiki/Client.pm lib/WWW/Mediawiki/Client/Exceptions.pm 2005-04-26 17:47:10 GMT Mark Jaroski patch-4 Summary: added watch attr Revision: WWW-Mediawiki-Client--0.25--patch-4 Added support for adding or removing a page to/from user's watchlist. modified files: lib/WWW/Mediawiki/Client.pm 2005-04-25 16:25:05 GMT Mark Jaroski patch-3 Summary: More work on newly exposed methods Revision: WWW-Mediawiki-Client--0.25--patch-3 Added more documentation for the newly exposed methods. Also encorporated the upload method into do_commit, and changed the way that conflicts are detected. Previously the local version, server version, and reference version of a page was compared. Now the mtime stamp of the reference file gets sent up to the server as the edit time so that the server can tell us if there is a conflict. modified files: lib/WWW/Mediawiki/Client.pm {arch}/=tagging-method 2005-04-25 10:53:01 GMT Mark Jaroski patch-2 Summary: method documentation Revision: WWW-Mediawiki-Client--0.25--patch-2 Started documenting newly exposed methods. Simplified upload. modified files: lib/WWW/Mediawiki/Client.pm 2005-04-24 15:08:24 GMT Mark Jaroski patch-1 Summary: added real exceptions, started overhaul of API Revision: WWW-Mediawiki-Client--0.25--patch-1 The tree is decidedly broken at this point, but I'm commiting anyhow as a checkpoint. So far I've done this: * Added real exceptions and verified that they didn't break anything * Broke everything by starting some reforms in the way URLs get built * Exposed a number of private methods which could be of use to others TODO before this is stable and releasable: * Write docs for the newly exposed methods * Finish the URL reforms and test them * Delete tests which are no longer applicable * Write tests against a real server * Write tests for WWW::Mediawiki::Client::Exceptions * Fix bin/mvs to work with the changes and exceptions new files: t/.arch-ids/exceptions.t.id t/exceptions.t modified files: ChangeLog bin/mvs lib/WWW/Mediawiki/Client.pm lib/WWW/Mediawiki/Client/Exceptions.pm t/client.t t/mvs.t t/server.t renamed files: t/.arch-ids/live.t.id ==> t/.arch-ids/server.t.id t/live.t ==> t/server.t 2005-04-19 16:18:35 GMT Mark Jaroski base-0 Summary: New archive Revision: WWW-Mediawiki-Client--0.25--base-0 In preparation for some major changes in error handling I've created a new archive at http://mark.sdf-eu.org/arch/. This is the initial import. new files: ChangeLog Makefile.PL README TODO bin/mvs lib/WWW/Mediawiki/Client.pm lib/WWW/Mediawiki/Client/Exceptions.pm t/client.t t/files/local.wiki t/files/merged.wiki t/files/paris.html t/files/paris.wiki t/files/reference.wiki t/files/server.wiki t/live.t t/mvs.t libwww-mediawiki-client-perl-0.31/MANIFEST0000600001161000116100000000053710451225604015162 0ustar bin/mvs ChangeLog lib/WWW/Mediawiki/Client.pm lib/WWW/Mediawiki/Client/Exceptions.pm Makefile.PL README t/client.t t/exceptions.t t/files/example.mediawiki t/files/local.wiki t/files/Main_Page.html t/files/Main_Page.wiki t/files/merged.wiki t/files/paris.html t/files/paris.wiki t/files/reference.wiki t/files/server.wiki t/mvs.t t/server.t tags TODO libwww-mediawiki-client-perl-0.31/Makefile.PL0000600001161000116100000000154010442767660016013 0ustar use ExtUtils::MakeMaker; WriteMakefile( NAME => 'WWW::Mediawiki::Client', VERSION_FROM => 'lib/WWW/Mediawiki/Client.pm', EXE_FILES => ['bin/mvs'], PREREQ_PM => { 'Test::Differences'=> 0, 'VCS::Lite' => 0, 'Getopt::Std'=> 0, 'Pod::Usage' => 0, 'File::Spec' => 0, 'File::Find' => 0, 'Bundle::LWP' => 1.11, 'HTML::TokeParser' => 0, 'HTTP::Message' => 1.56, 'HTTP::Request' => 1.40, 'HTTP::Request::Common' => 1.26, 'HTTP::Cookies' => 0, 'XML::LibXML' => 0, 'URI' => 1.31, 'Carp' => 0, 'Data::Dumper' => 0, 'Exception::Class' => 0, 'Encode' => 1.75, 'Encode::Guess' => 0, }, ); libwww-mediawiki-client-perl-0.31/README0000600001161000116100000000223110442767660014717 0ustar Copyright 2004, Mark Jaroski. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. WWW::Mediawiki::Client provides a very simple cvs-like interface for Mediawiki driven WikiWiki websites, such as Wikitravel or Wikipedia. The interface mimics the two most basic cvs commands: update and commit with similarly named methods. Each of these has a shorter alias, as in cvs. Verbosity is controled through an output_level accessor method. Included with the module is a command line wrapper called "mvs": mvs is a command line client whose purpose is to simplify offline editing of Wiki content. It allows you to get any number of pages from a given Mediawiki site, edit the pages with any editor, get and merge any concurrent updates of the pages, and then safely commit the users own changes back to the version of the page on the server. All mvs commands allow you to specify one or more files to get from the wiki server. If no file is specified on the command line mvs will attempt to perform the specified commnd on all files under the current working directory with the extension .wiki. libwww-mediawiki-client-perl-0.31/TODO0000600001161000116100000000253010450144635014517 0ustar I think at this point a more or less complete rewrite is in order, and so I'll be working on that over the next month or so. My idea is to make the API a lot more OO. For some reason I was having an anti-OO fit when I wrote this in the first place. I seem to have recovered. -- mark, Tuesday 27 June 2006 --------------------------------------------------------------------------- * Check for code 3xx redirects and try to reset the wiki_host value to the correct host to which we are redirected. (target: 0.28) * Add a flag allowing the user to choose whether to proceed with commits if not logged in. (target: 0.28) * Add a command to return a diff between the local version and the server version. (0.28) * Image handling, upload and download of images * Use of "Special:All pages" to return a list of every page in the host wiki * Image handling, upload and download of images * Add a commit comment editor * The ability to access data from robots.txt for use by programmers using the library to create Mediawiki bots * Multi-file commits which respect the delay between uploads as specified in robots.txt * Win32-Perl support * A *nix GUI (this could be done as an outside project) * Win 32 GUI (possibly like tortoise CVS or tortoise SVN) * A Vim plugin supporting mvs * An EMACS macro supporting mvs * A KDE Kate plugin for mvs libwww-mediawiki-client-perl-0.31/bin/0000711001161000116100000000000010443015365014576 5ustar libwww-mediawiki-client-perl-0.31/bin/mvs0000711001161000116100000005130510443015364015334 0ustar #!/usr/bin/perl -w use strict; use WWW::Mediawiki::Client; use Getopt::Long (); use Pod::Usage; use Data::Dumper; ############################################################################## # Fields # ############################################################################## # Options: our ( $opt_help, $opt_verbose, $opt_defaults, $opt_host, $opt_lang, $opt_username, $opt_password, $opt_version, $opt_wiki_path, $opt_space_sub, $opt_message, $opt_watch, $opt_minor, $opt_tls ); $opt_verbose = 0; # Multi-state options: use constant OPTION_STATES => ( yes => WWW::Mediawiki::Client->OPT_YES, no => WWW::Mediawiki::Client->OPT_NO, keep => WWW::Mediawiki::Client->OPT_KEEP, default => WWW::Mediawiki::Client->OPT_DEFAULT, ); our $VERSION = $WWW::Mediawiki::Client::VERSION; my $LOGFILE = '.mediawiki.errors'; ############################################################################## # Subroutines # ############################################################################## sub print_defaults { my $DEFAULTS = WWW::Mediawiki::Client->DEFAULTS; for my $host (keys %$DEFAULTS) { print "Hostname: $host\n"; for my $field (keys %{$DEFAULTS->{$host}}) { print " $field: " . $DEFAULTS->{$host}->{$field} . "\n"; } print "\n"; } exit 1; } sub main { my ($command, @files) = @_; print_defaults if $opt_defaults; version_message() if $opt_version; pod2usage unless $command; my $method= "do_$command"; # do help if indicated pod2usage(-verbose => 1) if $opt_help; # create the init array, and maybe pre-populate it my $wmc = WWW::Mediawiki::Client->new(); unless ($wmc->can($method)) { print "Command \"$command\" not supported.\n\n"; pod2usage(-verbose => 1); } $wmc->host($opt_host) if $opt_host; $wmc->protocol('https') if $opt_tls; $wmc->commit_message($opt_message) if $opt_message; $wmc->language_code($opt_lang) if $opt_lang; $wmc->username($opt_username) if $opt_username; $wmc->password($opt_password) if $opt_password; $wmc->space_substitute($opt_space_sub) if $opt_space_sub; $wmc->wiki_path($opt_wiki_path) if $opt_wiki_path; $wmc->minor_edit($opt_minor) if defined($opt_minor); $wmc->watch($opt_watch) if defined($opt_watch); # run command my $message = "Doing $command "; $message .= @files ? join(' ', @files) . ' ' : ''; $message .= "with host: " . $wmc->host . " and lang: " . $wmc->language_code . "\n"; my $watch = multistate_text($wmc->watch); my $minor = multistate_text($wmc->minor_edit); $message .= " wiki_path: " . $wmc->wiki_path . "\n" . " space_substitute: " . $wmc->space_substitute . "\n" . " watch this page?: $watch\n" . " minor edit?: $minor\n" if $opt_verbose >= 1; print $message unless $opt_verbose <= -1; eval { $wmc->$method(@files) }; if (UNIVERSAL::isa($@, 'WWW::Mediawiki::Client::Exception')) { open (LOG, ">>$LOGFILE"); print LOG "\n-----------------\n$@"; warn "\n-----------------\n$@" if $opt_verbose >= 1; if ($@->isa('WWW::Mediawiki::Client::LoginException')) { print LOG Data::Dumper->Dump([$@->res], ['res'] ) . "\n"; print LOG Data::Dumper->Dump([$@->cookie_jar], ['cookie_jar']) . "\n"; close LOG; die $@->error . " See $LOGFILE for details.\n" ; } elsif ($@->isa('WWW::Mediawiki::Client::CommitException')) { print LOG Data::Dumper->Dump([$@->res], ['res']) . "\n"; } elsif ($@->isa('WWW::Mediawiki::Client::ServerPageException')) { print LOG Data::Dumper->Dump([$@->res], ['res']) . "\n"; } warn $@->error . " See $LOGFILE for details.\n" ; } elsif ($@) { die $@; } return 1 unless $wmc->status; my %status = %{$wmc->status}; foreach my $file (keys %status) { print $status{$file} . " $file\n" if $status{$file}; } return 1; } sub HELP_MESSAGE { pod2usage(-verbose => 1); } sub version_message { print "Mediawiki versioning system version $VERSION\n"; exit 1; } sub parse_command { local @ARGV = @{$_[0]}; my $command; Getopt::Long::Configure('bundling', 'pass_through'); Getopt::Long::GetOptions('<>' => sub { $command = $_[0] unless $command; }); return $command; } sub multistate_map { my @states = @_; my %states = OPTION_STATES; my %statemap; foreach my $state (@states) { $statemap{$state} = $states{$state}; } return \%statemap; } sub multistate_text { my ($value) = @_; return 'not set' unless defined($value); my %states = OPTION_STATES; my %reverse = map {$states{$_} => $_} keys %states; return $reverse{$value} if defined($reverse{$value}); return 'unknown'; } sub multistate_option { my ($ref, @states) = @_; my $statemap = multistate_map(@states); return sub { my ($name, $value) = @_; my $state = $statemap->{lc($value)}; die "Unknown setting for $name: $value\n" . "Valid settings: " . join(', ', @states) . "\n" unless defined($state); ${$ref} = $state; }; } sub parse_options { my $command = shift; local @ARGV = @{$_[0]}; $command ||= ""; my @addit; @addit = ( 'host|d=s' => \$opt_host, 'use_tls|T' => \$opt_tls, 'lang|l=s' => \$opt_lang, 'username|u=s' => \$opt_username, 'password|p=s' => \$opt_password, 'wikipath|w=s' => \$opt_wiki_path, 'spaces|S=s' => \$opt_space_sub, ) if $command eq 'login'; @addit = ( 'message|summary|m|s=s' => \$opt_message, 'minor=s' => multistate_option( \$opt_minor, qw(yes no default)), 'watch=s' => multistate_option( \$opt_watch, qw(yes no default keep)), 'M' => sub { $opt_minor = WWW::Mediawiki::Client->OPT_YES }, 'W' => sub { $opt_watch = WWW::Mediawiki::Client->OPT_YES }, ) if $command eq 'commit' or $command eq 'com' or $command eq 'preview'; Getopt::Long::Configure( 'no_ignore_case', 'bundling', 'no_pass_through'); Getopt::Long::GetOptions( 'verbose|v' => sub { $opt_verbose++ }, 'quiet|q' => sub { $opt_verbose-- }, 'help|h' => \$opt_help, 'version|V' => \$opt_version, @addit, ) or exit(-1); return @ARGV; } # parse command line my $command = parse_command(\@ARGV); my @args = parse_options($command, \@ARGV); main (@args); __END__ =head1 NAME mvs - A command line Mediawiki client =head1 SYNOPSIS mvs [Options] command [Options] [filename] mvs -h|--help mvs --version mvs -D mkdir wikistuff cd wikistuff mvs [-q|-v] login [-T] [-d ] [-l language_code ] [-u ] [-p ] [-w ] mvs [-q|-v] update [ ..] mvs [-q|-v] up [ ..] mvs [-q|-v] commit [-M] [-W] -m "commit message" mvs [-q|-v] com [-M] [-W] -m "commit message" mvs [-q|-v] preview [-M] [-W] [-m "commit message"] =head1 DESCRIPTION C is a command line client whose purpose is to simplify offline editing of Wiki content. It allows you to get any number of pages from a given Mediawiki site, edit the pages with any editor, get and merge any concurrent updates of the pages, and then safely commit the users own changes back to the version of the page on the server. The C commands which take a filename argument only accept a single filename as so to avoid taking up too much server bandwidth. BUsers of C from before version 0.27 will notice that in this documentation the options are mostly listed after the C sub-command. This makes C behave more like C, C, or C, and so should make it easier for people who are used to using those programs. If you prefer to use C the old way, that will still work, at least for the next few versions. =head1 QUICKSTART =head2 Step 1: Create an account on the Mediawiki server. This should be done the normal way, by visiting the Mediawiki website to which you want to contribute and creating a new account, setting the preferences, etc. It should hopefully go without saying that you will want to become familiar with the editorial, usage, and copyright guidelines of the site. You should probably also make some contributions through the normal UI, and learn about following recent changes before contributing using mvs. In addition for the sake of this test you should already have a user page like User: with something on it, where is the user name with which you established the account. =head2 Step 2: Create a working directory C works with Mediawiki formatted files with a C<.wiki> extension and which are stored together with server information in a I. You will have to have I one working directory for each Mediawiki site to which you contribute. Simply use C or the equivalent to make a new directory, and then before cd into that directory. mkdir wikitravel.en cd wikitravel.en All of the operations below should be done from this directory. =head2 Step 3: Login using C To use login you will need to know the Iname for the Mediawiki site to which you want to contribute. www.wikitravel.org Now use the I with your username and password to login. mvs login -d www.wikitravel.org -u -p 'secret' If C knows about your Mediawiki host it will set set the C to the correct default for that server. In this case it will also be able to select the language version of that Wiki for you if you specify a C: mvs login -d www.wikitravel.org -l fr -u -p 'secret' The code must match the one which your wiki host uses for a given language, and of course the language version must exist for the given host. If your Mediawiki install uses a nonstandard path to the wiki script you can specify it on login. The path to the wiki script is the part of the URL after the host name, and before the '?': mvs login \ -d www.wikitravel.org \ -u \ -p 'secret' \ -w 'mw/wiki.phtml' You can change the edit and action paths in the created .mediawiki file after successful login accordingly. Now anything you submit to the Mediawiki server will be credited to user "". B If you have been using an earlier version of C you should probably delete the .mediawiki file in your working directory. =head2 Step 4: Use C to fetch one or more working files You can fetch existing material off of the site, or create new pages with C, remembering that your files will need a C<.wiki> extension: mvs update User:.wiki User:/Test_Page.wiki This should produce the output: U User:.wiki A User:/Test_Page.wiki The U (for Updated) means that User: was found on the server and its contents inserted into the local files. The A (for Added) means that the User:/Test_Page.wiki page does not yet exist on the server, and will be added when you run C. Note that both of the pages we are working with are within I User Namespace. It's probably a good idea to restrict yourself to working with such pages while you are experimenting with C =head2 Step 5: Edit the files to make corrections and contributions Use your favorite text editor to edit the files. You might want to check out this page to see if there is a Mediawiki syntax highlighting file for your editor: http://en.wikipedia.org/wiki/Wikipedia:Syntax_highlighting Of course if you don't find a highlighting file for you editor you are welcome to create one and submit it to the page above. =head2 Step 6: Use C to submit your changes When you are done editing a file and would like to submit your changes to the wiki server use C to do so: mvs commit -m 'commit message' User:.wiki Where 'commit message' is whatever you want to say about the changes you are submitting and why. You must provide a commit message or C will fail. You might also find that C fails complaining that the file has changed on the server. If this is the case you will need to use C again to get the most recent changes. =head2 Step 7: Update your wiki files You can use C again at any time to reconcile any of your files with the most recent changes from the server. Your changes I be overwritten, but rather C will try to merge any server changes into the files as they exist in your working directory. Note that update and commit only work on one file at a time, as so to help prevent accidents and server congestion. If for some reason there is a conflict, i.e. you and someone else have made changes which appear to be incompatible, and cannot be resolved then your file will contain a I, as detailed in the documentation for C below. You I resolve any conflicts I attempting to use C on the file. This is usually a very simple matter of choosing one version of the change or another. You should use your best judgement, consulting the relevant C page to try to work out an agreement with the other contributor in cases where you just simply disagree. =head2 Repeat You can continue editing and committing changes with the files in your working directory. It might be a good idea for you to eventually create multiple working directories per site, perhaps grouping them by subject. This will work fine with C since it does I need to have a complete copy of all of the pages from a given server in a given working directory to work. =head1 CHARACTER ENCODING All of your C<.wiki> files should be stored with UTF-8 encoding. Upon login to a given server mvs will determine the encoding used by that server, and will upload in that encoding only. For servers using non-UTF-8 character sets you should use HTML entities for any character you want to represent which is outside of the server's character set. This includes the english Wikipedia. Most newer Mediawiki sites however do use UTF-8, on these sites HTML entities are I needed. =head1 ARGUMENTS =head2 Commands The first argument after the options should be one of the following two commands: =over 4 =item mvs login Allows the user to login to the Mediawiki server using an I login and password for that server. After calling C all Cs from the same working directory will be logged as from the logged-in user. =item mvs update Updates the specified file[s] with content from the Mediawiki server. If a file does not exist it is created and populated with the current online version. If there is no online version, the file either created and left blank, or just left as it is. If there is content in both the specified file and in the corresponding Wiki page, an attempt is made to merge the two, line by line. Files which are the same as the server version are ignored. If no filenames are given on the command line, all visible files with the .wiki extension are processed. Conflicting changes to a given line are detected on the basis of the date of the most recent update of the local file and date of the most recent change to the online Wiki page. If a line has changed in both the online page and the local file it is flagged as a conflict, as in CVS, but with a slightly different syntax: ********************Start of conflict 1 Insert to Primary, Insert to Secondary ************************************************************ The line as it appears on the server **************************************************************************************************** The line as it appears locally ********************End of conflict 1******************************************************************************** C reports the status of files which it touches to STDERR with a letter indicating the file status, and then name of the file, again like CVS. The status letters are: =over 4 =item = (Unchanged) The file is the same as the page on the server. =item A (Added) The file will become a new page on the wiki server. =item M (Modified) The file has been modified locally. =item U (Updated) The file has been updated with changes from the wiki server. =item C (Conflicts) The file contains conflict markers. =item ? (Unknown) Neither the file, nor a corresponding server page exist. =back =item commit Commits any changes in the specified local file to the Wiki site. A check is made first to make sure that there are no changes on the server more recent than the most recent update. Nothing will be comitted if the file and server version are identical. When running C you I use the C<-m> flag to send a commit message to the Mediawiki server. e.g.: mvs commit -m 'Added Hotel Eldorado' Paris.wiki =item preview This command functions identically to C, except that nothing is actually committed. Instead, the file is uploaded and the Mediawiki server sends back a formatted preview. The C<-m> flag is optional. If you set the L environmental variable to the path and filename of your favorite browser, mvs will launch it with the preview page. =item clean This command removes any local version reference files relating to pages you've deleted. rm Paris.wiki mvs clean =head2 File names Any additional arguments are taken as I filenames to be processed. The local filename of a given Mediawiki page will be the same as its URL encoded name with the extension ".wiki". If no arguments are given then any filenames with the "wiki" extension and under the current directory are processed. =head1 OPTIONS =head2 -h Display usage information. =head2 -D Print information about known Mediawiki servers, then exit. =head2 -q Causes the command to be quiet. Informational messages are suppressed. =head2 -u "" Specifies a username for C. =head2 -p "" Specifies a password for C. =head2 -l "" The language code the wiki server uses to differentiate between language versions. =head2 -m "" A commit message for C. Use this to explain the nature of your changes. =head2 -s "" Same as C<-m> =head2 --minor Choose whether to mark change as a minor edit. The default is to mark changes as minor if the Mediawiki user profile is set to do so by default. Use this when committing a change with C or previewing with C. =head2 -M Same as C<--minor yes>. =head2 --watch Choose whether to add the edited page to your watchlist. Specifying C will maintain the current watched status. The default is to watch the page if it is already being watched, or if the Mediawiki user profile is set to do so by default. Use this when committing a change with C or previewing with C. =head2 -W Same as C<--watch yes>. =head2 -w "" The path on the given C to the Mediawiki script. This defaults to I which is correct for a vanilla install of Mediawiki 1.4.x. =head2 -v Verbose. If this is set C will give you lots of extra information about what it's doing. The -q flag overrides this. =head1 ENVIRONMENTAL VARIABLES =head2 MVS_BROWSER The browser you prefer to use for previewing changes. =head2 HTTP_PROXY A proxy server to use (if any), expressed as a standard URL, something like this: export HTTP_PROXY=http://[username:password@]proxy.myorg.org:8080 =head1 CAVEATS This is an early version of this program. Future versions may have major differences which will effect your ability to use them interchangeably with this one. In particular the initial "command" arguments may become options and the handling of conflicts might change dramatically. =head1 BUGS Please submit bug reports to the CPAN bug tracker at L. =head1 DISCUSSION There is a discussion list. You can subscribe or read the archives at: L =head1 SEE ALSO =head2 Mediawiki L =head2 CVS L =head1 AUTHORS =item Mark Jaroski =item Bernhard Kaindl Improved error and usage messages. =item Oleg Alexandrov , Thomas Widmann Bug reports and feedback. =item Adrian Irving-Beer Preview support, export support for multi-page update, more 'minor' and 'watch' settings, and bug reports. =head1 COPYRIGHT Copyright 2004-2005, Mark Jaroski This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. libwww-mediawiki-client-perl-0.31/lib/0000711001161000116100000000000010442767660014607 5ustar libwww-mediawiki-client-perl-0.31/lib/WWW/0000711001161000116100000000000010442767660015273 5ustar libwww-mediawiki-client-perl-0.31/lib/WWW/Mediawiki/0000711001161000116100000000000010451515335017164 5ustar libwww-mediawiki-client-perl-0.31/lib/WWW/Mediawiki/Client/0000711001161000116100000000000010443015365020401 5ustar libwww-mediawiki-client-perl-0.31/lib/WWW/Mediawiki/Client/Exceptions.pm0000600001161000116100000001533110443011072023052 0ustar package WWW::Mediawiki::Client::Exceptions; use strict; use warnings; use Exception::Class ( 'WWW::Mediawiki::Client::Exception' => { description => 'A base clase for WWW::Mediawiki::Client exceptions.'}, 'WWW::Mediawiki::Client::URLConstructionException' => { isa => 'WWW::Mediawiki::Client::Exception', description => 'Indicates a problem with the URL with which we to call the Mediawiki server.', }, 'WWW::Mediawiki::Client::AuthException' => { isa => 'WWW::Mediawiki::Client::Exception', description => 'Indicates a problem with the provided authentication information', }, 'WWW::Mediawiki::Client::LoginException' => { isa => 'WWW::Mediawiki::Client::Exception', description => 'Indicates that login failed for an unknown reason', fields => ['res', 'cookie_jar'], }, 'WWW::Mediawiki::Client::CookieJarException' => { isa => 'WWW::Mediawiki::Client::Exception', description => 'Something went wrong saving or loading the cookie jar', }, 'WWW::Mediawiki::Client::FileAccessException' => { isa => 'WWW::Mediawiki::Client::Exception', description => 'Something went wrong saving or loading a file', }, 'WWW::Mediawiki::Client::FileTypeException' => { isa => 'WWW::Mediawiki::Client::Exception', description => 'The file which we attempted to operate on is not a .wiki file', }, 'WWW::Mediawiki::Client::AbsoluteFileNameException' => { isa => 'WWW::Mediawiki::Client::Exception', description => 'The file which we attempted to operate on is not a .wiki file', }, 'WWW::Mediawiki::Client::CommitException' => { isa => 'WWW::Mediawiki::Client::Exception', description => 'Something went wrong while committing a change.', fields => ['res'], }, 'WWW::Mediawiki::Client::CommitMessageException' => { isa => 'WWW::Mediawiki::Client::Exception', description => 'There is a problem with the commit message', }, 'WWW::Mediawiki::Client::PageDoesNotExistException' => { isa => 'WWW::Mediawiki::Client::Exception', description => 'There is no such page, either here or on the server', }, 'WWW::Mediawiki::Client::UpdateNeededException' => { isa => 'WWW::Mediawiki::Client::Exception', description => 'The page on the server has changed since the local file was last updated', }, 'WWW::Mediawiki::Client::ConflictsPresentException' => { isa => 'WWW::Mediawiki::Client::Exception', description => 'An attempt was made to commit a file containing conflicts', }, 'WWW::Mediawiki::Client::CorruptedConfigFileException' => { isa => 'WWW::Mediawiki::Client::Exception', description => 'The configuration file cannot be parsed.', }, 'WWW::Mediawiki::Client::ServerPageException' => { isa => 'WWW::Mediawiki::Client::Exception', description => 'Something went wrong fetching the server page.', fields => ['res'], }, 'WWW::Mediawiki::Client::ReadOnlyFieldException' => { isa => 'WWW::Mediawiki::Client::Exception', description => 'Client code tried to set a read-only field.', }, 'WWW::Mediawiki::Client::InvalidOptionException' => { isa => 'WWW::Mediawiki::Client::Exception', description => 'Client code tried to set an option to a value' . ' that cannot be used under the circumstances.', fields => ['field', 'option', 'value'], }, ); WWW::Mediawiki::Client::Exception->Trace(1); 1; __END__ =head1 NAME WWW::Mediawiki::Client::Exception =head1 SYNOPSIS use WWW::Mediawiki::Client::Exception; use Data::Dumper; # throw eval { WWW::Mediawiki::Client::LoginException->throw( error => 'Something bad happened', res => $res, cookie_jar => $cookie_jar, ); }; # catch if (UNIVERSAL::isa($@, 'WWW::Mediawiki::Client::LoginException') { print STDERR $@->error; print Dumper($@->res); } =head1 DESCRIPTION A base class for WWW::Mediawiki::Client exceptions. =head1 SUBCLASSES =head2 WWW::Mediawiki::Client::URLConstructionException Indicates a problem with the URL with which we to the Mediawiki server. =head2 WWW::Mediawiki::Client::AuthException Indicates a problem with the provided authentication information =head2 WWW::Mediawiki::Client::LoginException Indicates that login failed for an unknown reason B =over =item res For the apache response object returned by the attempt to log in. =item cookie_jar For the cookie jar which was returned by the attempt to log in. =back =head2 WWW::Mediawiki::Client::CookieJarException Something went wrong saving or loading the cookie jar =head2 WWW::Mediawiki::Client::FileAccessException Something went wrong saving or loading a file =head2 WWW::Mediawiki::Client::FileTypeException The file which we attempted to operate on is not a .wiki file =head2 WWW::Mediawiki::Client::AbsoluteFileNameException The file which we attempted to operate on is not a .wiki file =head2 WWW::Mediawiki::Client::CommitMessageException There is a problem with the commit message =head2 WWW::Mediawiki::Client::CommitException Something went wrong while committing a change =head2 WWW::Mediawiki::Client::PageDoesNotExistException There is no such page, either here or on the server =head2 WWW::Mediawiki::Client::UpdateNeededException The page on the server has changed since the local file was last updated =head2 WWW::Mediawiki::Client::ConflictsPresentException An attempt was made to commit a file containing conflicts =head2 WWW::Mediawiki::Client::CorruptedConfigFileException The configuration file cannot be parsed. =head2 WWW::Mediawiki::Client::ServerPageException Something went wrong fetching the server page. B =over =item res The apache response object which was returned in the attempt to fetch the page. =back =head2 WWW::Mediawiki::Client::ReadOnlyFieldException Client code tried to set a read-only field. =head1 SEE ALSO Exception::Class =head1 AUTHORS =item Mark Jaroski Author =item Bernhard Kaindl Inspired the improvement in error handling and reporting. =head1 LICENSE Copyright (c) 2004 Mark Jaroski. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. libwww-mediawiki-client-perl-0.31/lib/WWW/Mediawiki/Client.pm0000600001161000116100000013667210451515334020756 0ustar package WWW::Mediawiki::Client; use warnings; use strict; use File::Spec; use File::Find; use LWP::UserAgent; use HTML::TokeParser; use HTTP::Request; use HTTP::Request::Common; use HTTP::Cookies; use URI::Escape; use VCS::Lite; use Data::Dumper; use WWW::Mediawiki::Client::Exceptions; use XML::LibXML (); use HTML::Entities qw(encode_entities); use File::Temp (); use Encode; use Encode::Guess; use utf8; BEGIN { # If we tell LWP it's dealing with UTF-8 then URI::Escape will munge the text # So either we put up with warnings or do this: for (0x100 .. 0xd7ff, 0xf000 .. 0xfdcf) { $URI::Escape::escapes{chr($_)} = &URI::Escape::uri_escape_utf8(chr($_)); } } use base 'Exporter'; our %EXPORT_TAGS = ( options => [qw(OPT_YES OPT_NO OPT_DEFAULT OPT_KEEP)], ); our @EXPORT_OK = map { @{$EXPORT_TAGS{$_}} } keys %EXPORT_TAGS; =head1 NAME WWW::Mediawiki::Client =cut =head1 SYNOPSIS use WWW::Mediawiki::Client; my $filename = 'Subject.wiki'; my $mvs = WWW::Mediawiki::Client->new( host => 'www.wikitravel.org' ); # like cvs update $mvs->do_update($filename); # like cvs commit $mvs->do_commit($filename, $message); #aliases $mvs->do_up($filename); $mvs->do_com($filename, $message); =cut =head1 DESCRIPTION WWW::Mediawiki::Client provides a very simple cvs-like interface for Mediawiki driven WikiWiki websites, such as L or L The interface mimics the two most basic cvs commands: update and commit with similarly named methods. Each of these has a shorter alias, as in cvs. =cut =head1 CONSTANTS =cut use constant ACTION => 'action'; use constant TITLE => 'title'; use constant SUBMIT => 'submit'; use constant LOGIN => 'submitlogin'; use constant LOGIN_TITLE => 'Special:Userlogin'; use constant EDIT => 'edit'; # defaults for various known Mediawiki installations my %DEFAULTS; $DEFAULTS{'www.wikitravel.org'} = { 'host' => 'wikitravel.org', 'protocol' => 'http', 'space_substitute' => '_', 'wiki_path' => 'wiki/__LANG__/index.php', }; $DEFAULTS{'wikitravel.org'} = $DEFAULTS{'www.wikitravel.org'}; $DEFAULTS{'www.wikipedia.org'} = { 'host' => '__LANG__.wikipedia.org', 'protocol' => 'http', 'space_substitute' => '+', 'wiki_path' => 'w/wiki.phtml', }; $DEFAULTS{'wikipedia.org'} = $DEFAULTS{'www.wikipedia.org'}; $DEFAULTS{'www.wiktionary.org'} = { 'host' => '__LANG__.wiktionary.org', 'protocol' => 'http', 'space_substitute' => '_', 'wiki_path' => 'w/wiki.phtml', }; $DEFAULTS{'wiktionary.org'} = $DEFAULTS{'www.wiktionary.org'}; $DEFAULTS{'www.wikibooks.org'} = { 'host' => '__LANG__.wikibooks.org', 'protocol' => 'http', 'space_substitute' => '_', 'wiki_path' => 'w/wiki.phtml', }; $DEFAULTS{'wikibooks.org'} = $DEFAULTS{'www.wikibooks.org'}; sub DEFAULTS { \%DEFAULTS }; use constant SPACE_SUBSTITUTE => '_'; use constant WIKI_PATH => 'wiki/index.php'; use constant LANGUAGE_CODE => 'en'; use constant PROTOCOL => 'http'; use constant SPECIAL_EXPORT => 'Special:Export'; use constant SPECIAL_VERSION => 'Special:Version'; =head3 $VERSION =cut our $VERSION = 0.31; =head2 Update Status =head3 STATUS_UNKNOWN Indicates that C has no information about the file. =head3 STATUS_UNCHANGED Indicates that niether the file nor the server page have changed. =head3 STATUS_LOCAL_ADDED Indicates that the file is new locally, and does not exist on the server. =head3 STATUS_LOCAL_MODIFIED Indicates that the file has been modified locally. =head3 STATUS_SERVER_MODIFIED Indicates that the server page was modified, and that the modifications have been successfully merged into the local file. =head3 STATUS_CONFLICT Indicates that there are conflicts in the local file resulting from a failed merge between the server page and the local file. =cut use constant STATUS_UNKNOWN => '?'; use constant STATUS_UNCHANGED => '='; use constant STATUS_LOCAL_ADDED => 'A'; use constant STATUS_LOCAL_MODIFIED => 'M'; use constant STATUS_SERVER_MODIFIED => 'U'; use constant STATUS_CONFLICT => 'C'; =head2 Option Settings =head3 OPT_YES Indicates that the setting should always be applied. =head3 OPT_NO Indicates that the setting should never be applied. =head3 OPT_DEFAULT Indicates that the setting should be applied based on the user profile default on the Wikimedia server. =head3 OPT_KEEP Four-state options only. Indicates that the setting should not be changed from its current value on the server. =cut # Option values: use constant OPT_YES => 1; use constant OPT_NO => 0; use constant OPT_DEFAULT => -1; use constant OPT_KEEP => -2; # Only for watch. # Reverse lookup: use constant OPTION_SETTINGS => ( OPT_YES, 'OPT_YES', OPT_NO, 'OPT_NO', OPT_DEFAULT, 'OPT_DEFAULT', OPT_KEEP, 'OPT_KEEP', ); # Option defaults: use constant MINOR_DEFAULT => OPT_DEFAULT; use constant WATCH_DEFAULT => OPT_DEFAULT; =head2 Mediawiki form widgets =head3 TEXTAREA_NAME =head3 COMMENT_NAME =head3 EDIT_SUBMIT_NAME =head3 EDIT_SUBMIT_VALUE =head3 EDIT_PREVIEW_NAME =head3 EDIT_PREVIEW_VALUE =head3 EDIT_TIME_NAME =head3 EDIT_TOKEN_NAME =head3 EDIT_WATCH_NAME =head3 EDIT_MINOR_NAME =head3 CHECKED =head3 UNCHECKED =head3 USERNAME_NAME =head3 PASSWORD_NAME =head3 REMEMBER_NAME =head3 LOGIN_SUBMIT_NAME =head3 LOGIN_SUBMIT_VALUE =cut use constant TEXTAREA_NAME => 'wpTextbox1'; use constant COMMENT_NAME => 'wpSummary'; use constant EDIT_SUBMIT_NAME => 'wpSave'; use constant EDIT_SUBMIT_VALUE => 'Save Page'; use constant EDIT_PREVIEW_NAME => 'wpPreview'; use constant EDIT_PREVIEW_VALUE => 'Show preview'; use constant EDIT_TIME_NAME => 'wpEdittime'; use constant EDIT_TOKEN_NAME => 'wpEditToken'; use constant EDIT_WATCH_NAME => 'wpWatchthis'; use constant EDIT_MINOR_NAME => 'wpMinoredit'; use constant CHECKED => 1; use constant UNCHECKED => 0; use constant USERNAME_NAME => 'wpName'; use constant PASSWORD_NAME => 'wpPassword'; use constant REMEMBER_NAME => 'wpRemember'; use constant LOGIN_SUBMIT_NAME => 'wpLoginattempt'; use constant LOGIN_SUBMIT_VALUE => 'Log In'; =head2 Files =head3 CONFIG_FILE .mediawiki =head3 COOKIE_FILE .mediawiki.cookies =head3 SAVED_ATTRIBUTES Controls which attributes get saved out to the config file. =cut use constant CONFIG_FILE => '.mediawiki'; use constant COOKIE_FILE => '.mediawiki_cookies.dat'; use constant SAVED_ATTRIBUTES => ( qw(site_url host protocol language_code space_substitute username password wiki_path watch encoding minor_edit escape_filenames) ); # It's important that host goes first since it has side effects =head1 CONSTRUCTORS =cut =head2 new my $mvs = WWW::Mediawiki::Client->new(host = 'www.wikitravel.org'); Accepts name-value pairs which will be used as initial values for any of the fields which have accessors below. Throws the same execptions as the accessor for any field named. =cut sub new { my $pkg = shift; my %init = @_; my $self = bless {}; $self->load_state; foreach my $attr (SAVED_ATTRIBUTES) { next unless $init{$attr}; $self->$attr($init{$attr}); } $self->{ua} = LWP::UserAgent->new(); push @{ $self->{ua}->requests_redirectable }, 'POST'; my $agent = 'WWW::Mediawiki::Client/' . $VERSION; $self->{ua}->agent($agent); $self->{ua}->env_proxy; my $cookie_jar = HTTP::Cookies->new( file => COOKIE_FILE, autosave => 1, ); $self->{ua}->cookie_jar($cookie_jar); return $self; } =head1 ACCESSORS =cut =head2 host my $url = $mvs->host('www.wikipediea.org'); my $url = $mvs->host('www.wikitravel.org'); The C is the name of the Mediawiki server from which you want to obtain content, and to which your submissions will be made. There is no default. This has to be set before attempting to use any of the methods which attempt to access the server. B =over 4 =item Server defaults If WWW::Mediawiki::Client knows about the path settings for the Mediawiki installation you are trying to use then the various path fields will also be set as a side-effect. =item Trailing slashes Any trailing slashes are deleted I the value of C is set. =back =cut sub host { my ($self, $host) = @_; if ($host) { $host =~ s{/*$}{}; # remove any trailing /s $self->{host} = $host; my $defaults = $DEFAULTS{$host}; foreach my $k (keys %$defaults) { $self->{$k} = $defaults->{$k}; } } return $self->{host}; } =head2 protocol my $url = $mvs->protocol('www.wikipediea.org'); my $url = $mvs->protocol('www.wikitravel.org'); The C is the protocol used by the Mediawiki server from which you want to obtain content, and to which your submissions will be made. It can be one of C or C with the default value being http. B =over 4 =item Server defaults If WWW::Mediawiki::Client knows about the settings for the Mediawiki installation you are trying to use then the various path fields will also be set as a side-effect. =back =cut sub protocol { my ($self, $protocol) = @_; if ($protocol) { WWW::Mediawiki::Client::URLConstructionException->throw( "The protocol must be either 'http' or 'https'." . "You specified $protocol." ) unless $protocol =~ m/^http(s){0,1}$/; $self->{protocol} = $protocol; } return $self->{protocol} || PROTOCOL; } =head2 language_code my $lang = $mvs->language_code($lang); Most Mediawiki projects have multiple language versions. This field can be set to target a particular language version of the project the client is set up to address. When the C and C methods encounter the text '__LANG__' in any part of their constructed URL the C will be substituted. C defaults to 'en'. =cut sub language_code { my ($self, $char) = @_; $self->{language_code} = $char if $char; $self->{language_code} = LANGUAGE_CODE unless $self->{language_code}; return $self->{language_code}; } =head2 space_substitute my $char = $mvs->space_substitute($char); Mediawiki allows article names to have spaces, for instance the default Meidawiki main page is called "Main Page". The spaces need to be converted for the URL, and to avoid the normal but somewhat difficult to read URL escape the Mediawiki software substitutes some other character. Wikipedia uses a '+', as in "Main+Page" and Wikitravel uses a '_' as in "Main_page". WWW::Mediawiki::Client always writes wiki files using the '_', but converts them to whatever the C is set to for the URL. B =over =item WWW::Mediawiki::Client::URLConstructionException =back =cut sub space_substitute { my ($self, $char) = @_; if ($char) { WWW::Mediawiki::Client::URLConstructionException->throw( "Illegal Character in space_substitute $char" ) if $char =~ /[\&\?\=\\\/]/; $self->{space_substitute} = $char; } $self->{space_substitute} = SPACE_SUBSTITUTE unless $self->{space_substitute}; return $self->{space_substitute}; } =head2 escape_filenames my $char = $mvs->escape_filenames($do_escape); Mediawiki allows article names to be in UTF-8 and most international Wikipedias use this feature. That leads us to UTF-8 encoded file names and not all filesystems can handle them. So you can set this option to some true value to make all your local file names with wiki articles URL-escaped. =cut sub escape_filenames { my ($self, $do_escape) = @_; if ($do_escape) { $self->{escape_filenames} = $do_escape; } elsif (!defined $self->{escape_filenames}) { $self->{escape_filenames} = 0; } return $self->{escape_filenames}; } =head2 wiki_path my $path = $mvs->wiki_path($path); C is the path to the php page which handles all request to edit or submit a page, or to login. If you are using a Mediawiki site which WWW::Mediawiki::Client knows about this will be set for you when you set the C. Otherwise it defaults to the 'wiki/wiki.phtml' which is what you'll get if you follow the installation instructions that some with Mediawiki. B =over =item Leading slashes Leading slashes in any incoming value will be stripped. =back =cut sub wiki_path { my ($self, $wiki_path) = @_; if ($wiki_path) { $wiki_path =~ s{^/*}{}; # strip leading slashes $self->{wiki_path} = $wiki_path; } $self->{wiki_path} = WIKI_PATH unless $self->{wiki_path}; return $self->{wiki_path}; } =head2 encoding my $encoding = $mvs->encoding($encoding); C is the charset in which the Mediawiki server expects uploaded content to be encoded. This should be set the first time you use do_login. =cut sub encoding { my ($self, $encoding) = @_; $self->{encoding} = $encoding if $encoding; return $self->{encoding}; } =head2 username my $url = $mvs->username($url); The username to use if WWW::Mediawiki::Client is to log in to the Mediawiki server as a given user. =cut sub username { my ($self, $username) = @_; $self->{username} = $username if $username; return $self->{username}; } =head2 password my $url = $mvs->password($url); The password to use if WWW::Mediawiki::Client is to log in to the Mediawiki server as a given user. Note that this password is sent I, so it's probably not a good idea to use an important one. =cut sub password { my ($self, $password) = @_; $self->{password} = $password if $password; return $self->{password}; } =head2 commit_message my $msg = $mvs->commit_message($msg); A C must be specified before C can be run. This will be used as the comment when submitting pages to the Mediawiki server. =cut sub commit_message { my ($self, $msg) = @_; $self->{commit_message} = $msg if $msg; return $self->{commit_message}; } =head2 watch my $watch = $mvs->watch($watch); Mediawiki allows users to add a page to thier watchlist at submit time using using the "Watch this page" checkbox. The field C allows commits from this library to add or remove the page in question to/from your watchlist. This is a four-state option: =over =item C Always add pages to the watchlist. =item C Remove pages from the watchlist. =item C Maintain current watched state. =item C (default) Adhere to user profile default on the server. Watched pages will always remain watched, and all other pages will be watched if the "watch all pages by default" option is enabled in the user profile. =back B =over =item WWW::Mediawiki::Client::InvalidOptionException =back =cut sub watch { my ($self, $watch) = @_; if (defined($watch)) { $self->_option_verify('watch', $watch, [OPT_YES, OPT_NO, OPT_KEEP, OPT_DEFAULT]); $self->{watch} = $watch; } $self->{watch} = WATCH_DEFAULT unless defined $self->{watch}; return $self->{watch}; } =head2 minor_edit my $minor = $mvs->minor_edit($minor); Mediawiki allows users to mark some of their edits as minor using the "This is a minor edit" checkbox. The field C allows a commit from the mediawiki client to be marked as a minor edit. This is a three-state option: =over =item C Always declare change as minor. =item C Never declare change as minor. =item C (default) Adhere to user profile default on the server. Edits will be marked as minor if the "minor changes by default" option is enabled in the user profile. =back B =over =item WWW::Mediawiki::Client::InvalidOptionException =back =cut sub minor_edit { my ($self, $minor) = @_; if (defined($minor)) { $self->_option_verify('minor_edit', $minor, [OPT_YES, OPT_NO, OPT_DEFAULT]); $self->{minor_edit} = $minor; } $self->{minor_edit} = MINOR_DEFAULT unless defined $self->{minor_edit}; return $self->{minor_edit}; } =head2 status my %status = $mvs->status; This field will be empty until do_update has been called, after which it will be set to a hash of C => C pairs. Each C will be one of the following (see CONSTANTS for discriptions): =item WWW::Mediawiki::Client::STATUS_UNKNOWN; =item WWW::Mediawiki::Client::STATUS_UNCHANGED; =item WWW::Mediawiki::Client::STATUS_LOCAL_ADDED; =item WWW::Mediawiki::Client::STATUS_LOCAL_MODIFIED; =item WWW::Mediawiki::Client::STATUS_SERVER_MODIFIED; =item WWW::Mediawiki::Client::STATUS_CONFLICT; =cut sub status { my ($self, $arg) = @_; WWW::Mediawiki::Client::ReadOnlyFieldException->throw( "Tried to set read-only field 'status' to $arg.") if $arg; return unless defined($self->{status}); return $self->{status}; } =head2 site_url DEPRICATED my $url = $mvs->site_url($url); The site URL is the base url for reaching the Mediawiki server who's content you wish to edit. This field is now depricated in favor of the C field which is basically the same thing without the protocol string. B =over 4 =item Server defaults If WWW::Mediawiki::Client knows about the path settings for the Mediawiki installation you are trying to use then the various path fields will also be set as a side-effect. =item Trailing slashes Any trailing slashes are deleted I the value of C is set. =back =cut sub site_url { my ($self, $host) = @_; my ($pkg, $caller, $line) = caller; warn "Using depricated method 'site_url' at $caller line $line." unless $pkg =~ "WWW::Mediawiki::Client"; my $protocol = $self->protocol; $host =~ s{^$protocol://}{} if $host; $host = $self->host($host); return "$protocol://" . $host if $host; } =head1 Instance Methods =cut =head2 do_login $mvs->do_login; The C method operates like the cvs login command. The C, C, and C attributes must be set before attempting to login. Once C has been called successfully any successful commit from the same directory will be logged in the Mediawiki server as having been done by C. B =over =item WWW::Mediawiki::Client::AuthException =item WWW::Mediawiki::Client::CookieJarException =item WWW::Mediawiki::Client::LoginException =item WWW::Mediawiki::Client::URLConstructionException =back =cut sub do_login { my $self = shift; WWW::Mediawiki::Client::URLConstructionException->throw( "No Mediawiki host specified.") unless $self->host; WWW::Mediawiki::Client::URLConstructionException->throw( "No wiki_path specified.") unless $self->wiki_path; WWW::Mediawiki::Client::AuthException->throw( "Must have username and password to login.") unless $self->username && $self->password; my $host = $self->host; my $path = $self->wiki_path; my $lang = $self->language_code; $host =~ s/__LANG__/$lang/; $path =~ s/__LANG__/$lang/; my $protocol = $self->protocol; my $url = "$protocol://$host/$path" . "?" . ACTION . "=" . LOGIN . "&" . TITLE . "=" . LOGIN_TITLE; $self->{ua}->cookie_jar->clear; $self->{ua}->cookie_jar->save or WWW::Mediawiki::Client::CookieJarException->throw( "Could not save cookie jar."); my $res = $self->{ua}->request(POST $url, [ &USERNAME_NAME => $self->username, &PASSWORD_NAME => $self->password, &REMEMBER_NAME => 1, &LOGIN_SUBMIT_NAME => &LOGIN_SUBMIT_VALUE, ] ); # success == Mediawiki gave us a Password cookie if ($self->{ua}->cookie_jar->as_string =~ /UserID=/) { $self->encoding($self->_get_server_encoding); $self->save_state; $self->{ua}->cookie_jar->save or WWW::Mediawiki::Client::CookieJarException->throw( "Could not save cookie jar."); return $self; } elsif ($res->is_success) { # got a page, but not what we wanted WWW::Mediawiki::Client::LoginException->throw( error => "Login did not work, please check username and password.\n", res => $res, cookie_jar => $self->{ua}->cookie_jar, ); } else { # something else went wrong, send all the data in exception my $err = "Login to $url failed."; WWW::Mediawiki::Client::LoginException->throw( error => $err, res => $res, cookie_jar => $self->{ua}->cookie_jar, ); } } =head2 do_li $mvs->do_li; An alias for C. =cut sub do_li { do_login(@_); } =head2 do_update $self->do_update($filename, ...); The C method operates like a much-simplified version of the cvs update command. The argument is a list of filenames, whose contents will be compared to the version on the WikiMedia server and to a locally stored reference copy. Lines which have changed only in the server version will be merged into the local version, while lines which have changed in both the server and local version will be flagged as possible conflicts, and marked as such, somewhate in the manner of cvs (actually this syntax comes from the default conflict behavior of VCS::Lite): ********************Start of conflict 1 Insert to Primary, Insert to Secondary ************************************************************ The line as it appears on the server **************************************************************************************************** The line as it appears locally ********************End of conflict 1******************************************************************************** After the merging, and conflict marking is complete the server version will be copied into the reference version. If either the reference version or the local version are empty, or if either file does not exist they will both be created as a copy of the current server version. B =over =item WWW::Mediawiki::Client::URLConstructionException =item WWW::Mediawiki::Client::FileAccessException =item WWW::Mediawiki::Client::FileTypeException =item WWW::Mediawiki::Client::ServerPageException =item WWW::Mediawiki::Client::AbsoluteFileNameException =back =cut sub do_update { my ($self, @files) = @_; @files = $self->list_wiki_files unless @files; WWW::Mediawiki::Client::URLConstructionException->throw( "No server URL specified.") unless $self->{host}; my %pages; my %dirs; foreach my $filename (@files) { my ($vol, $dirs, $fn) = $self->_check_path($filename); my $pagename = $self->filename_to_pagename($filename); $pages{$filename} = $pagename; $dirs{$filename} = $dirs; } $self->_get_exported_pages(values %pages); foreach my $filename (@files) { my $pagename = $pages{$filename}; my $dirs = $dirs{$filename}; my $status = $self->_update_core($filename, $pagename, $dirs); $self->{status}->{$filename} = $status; } return $self->status; } sub _update_core { my ($self, $filename, $pagename, $dirs) = @_; my $sv = $self->get_server_page($pagename); my $lv = $self->get_local_page($filename); my $rv = $self->_get_reference_page($filename); my $nv = $self->_merge($filename, $rv, $sv, $lv); my $status = $self->_get_update_status($rv, $sv, $lv, $nv); return unless $status; # nothing changes, nothing to do return $status if $status eq STATUS_LOCAL_ADDED or $status eq STATUS_UNKNOWN or $status eq STATUS_UNCHANGED; # save the newly retrieved and/or merged version as our local copy my @dirs = split '/', $dirs; for my $d (@dirs) { mkdir $d; chdir $d; } for (@dirs) { chdir '..'; } open OUT, ">:utf8", $filename or WWW::Mediawiki::Client::FileAccessException->throw( "Cannot open $filename for writing."); print OUT $nv; # save the server version out as the reference file $filename = $self->_get_ref_filename($filename); open OUT, ">:utf8", $filename or WWW::Mediawiki::Client::FileAccessException->throw( "Cannot open $filename for writing."); print OUT $sv; close OUT; return $status; } =head2 do_up An alias for C. =cut sub do_up { do_update(@_); } =head2 do_commit $self->do_commit($filename); As with C the C method operates like a much simplified version of the cvs commit command. Again, the argument is a filename. In keeping with the operation of cvs, C does not automatically do an update, but does check the server version against the local reference copy, throwing an error if the server version has changed, thus forcing the user to do an update. A different error is thrown if the conflict pattern sometimes created by C is found. After the error checking is done the local copy is submitted to the server, and, if all goes well, copied to the local reference version. B =over =item WWW::Mediawiki::Client::CommitMessageException =item WWW::Mediawiki::Client::ConflictsPresentException =item WWW::Mediawiki::Client::FileAccessException =item WWW::Mediawiki::Client::FileTypeException =item WWW::Mediawiki::Client::URLConstructionException =item WWW::Mediawiki::Client::UpdateNeededException =item WWW::Mediawiki::Client::InvalidOptionException =back =cut sub do_commit { my ($self, $filename) = @_; WWW::Mediawiki::Client::CommitMessageException->throw( "No commit message specified") unless $self->{commit_message}; # Perform the actual upload: my ($res, $text) = $self->_upload_file($filename, 1); # save the local version as the reference version my $refname = $self->_get_ref_filename($filename); open OUT, ">:utf8", $refname or WWW::Mediawiki::Client::FileAccessException->throw( "Cannot open $refname for writing."); print OUT $text; close OUT; } =head2 do_com This is an alias for C. =cut sub do_com { do_commit(@_); } =head2 do_preview $self->do_preview($filename); The C method is a non-writing version of the C method. It uploads the given filename to test its formatting. Its behaviour and arguments are identical to C. The behaviour of C is currently based on the environment. If C is set, this program (typically a web browser) will be launched on a temporary file. Otherwise, the preview will be saved to the file specified by the C variable, or preview.html if this is unset. This behaviour is considered a prototype for future functionality, and is C in the near future. Returns the name of the preview file, or undef if the file was sent to a web browser. B =over =item WWW::Mediawiki::Client::ConflictsPresentException =item WWW::Mediawiki::Client::FileAccessException =item WWW::Mediawiki::Client::FileTypeException =item WWW::Mediawiki::Client::URLConstructionException =item WWW::Mediawiki::Client::UpdateNeededException =back =cut sub do_preview { my ($self, $filename) = @_; my ($response) = $self->_upload_file($filename, 0); my $url = encode_entities($response->request->uri); my $content = $response->decoded_content; $content =~ s##$&#; my $browser = $ENV{MVS_BROWSER}; if (defined($browser)) { my $fh = new File::Temp(UNLINK => 1, SUFFIX => '.html'); print $fh Encode::encode_utf8($content); $fh->close; system($browser, $fh->filename); return undef; } my $preview = $ENV{MVS_PREVIEW}; $preview = 'preview.html' unless defined($preview); open(PREVIEW, '>', $preview) or WWW::Mediawiki::Client::FileAccessException->throw( "Cannot open $preview for writing."); print PREVIEW $content; close(PREVIEW) or WWW::Mediawiki::Client::FileAccessException->throw( "Cannot close $preview."); print STDERR "Saved preview: $preview\n"; return $preview; } =head2 do_clean $self->do_clean; Removes all reference files under the current directory that have no corresponding Wiki files. B =over =item WWW::Mediawiki::Client::FileAccessException =back =cut sub do_clean { my ($self) = @_; my $dir = File::Spec->curdir(); find(sub { return unless m/^\..*\.ref\.wiki\z/s; my $name = $File::Find::name; $name = File::Spec->abs2rel($name); my $wiki = $self->_ref_to_filename($name); return if -e $wiki; warn "Deleting: $name\n"; unlink($name) or WWW::Mediawiki::Client::FileAccessException->throw( "Cannot delete reference file $name"); }, $dir); } =head2 save_state $mvs->save_state; Saves the current state of the wmc object in the current working directory. B =over =item WWW::Mediawiki::Client::FileAccessException =back =cut sub save_state { my $self = shift; my $conf = CONFIG_FILE; my %init; foreach my $attr (SAVED_ATTRIBUTES) { $init{$attr} = $self->$attr; } open OUT, ">:utf8", $conf or WWW::Mediawiki::Client::FileAccessException->throw( "Cannot write to config file, $conf."); print OUT Dumper(\%init); close OUT; } =head2 load_state $mvs = $mvs->load_state; Loads the state of the wmc object from that saved in the current working directory. B =over =item WWW::Mediawiki::Client::CorruptedConfigFileException =back =cut sub load_state { my $self = shift; my $config = CONFIG_FILE; return $self unless -e $config; our $VAR1; do $config or WWW::Mediawiki::Client::CorruptedConfigFileException->throw( "Could not read config file: $config."); my %init = %$VAR1; foreach my $attr (SAVED_ATTRIBUTES) { $self->$attr($init{$attr}); } return $self; } =head2 get_server_page my $wikitext = $mvs->get_server_page($pagename); Returns the wikitext of the given Mediawiki page name. B =over =item WWW::Mediawiki::Client::ServerPageException =back =cut sub get_server_page { my ($self, $pagename) = @_; my $export = delete $self->{export}->{$pagename}; return $export if defined($export); my $url = $self->pagename_to_url($pagename, EDIT); my $res = $self->{ua}->get($url); WWW::Mediawiki::Client::ServerPageException->throw( error => "Couldn't fetch \"$pagename\" from the server.", res => $res, ) unless $res->is_success; my $doc = $res->decoded_content; my $text = $self->_get_wiki_text($doc); $self->{edit}->{date} = $self->_get_edit_date($doc); $self->{edit}->{token} = $self->_get_edit_token($doc); $self->{edit}->{watch_now} = $self->_get_edit_is_watching($doc); $self->{edit}->{def_watch} = $self->_get_edit_watch_default($doc); $self->{edit}->{def_minor} = $self->_get_edit_minor_default($doc); my $headline = Encode::encode("utf8", $self->_get_page_headline($doc)); my $expected = lc $pagename; unless (lc($headline) =~ /\Q$expected\E$/) { WWW::Mediawiki::Client::ServerPageException->throw( error => "The server could not resolve the page name '$pagename', but responded that it was '$headline'.", res => $res, ) if ($headline && $headline =~ /^Editing /); WWW::Mediawiki::Client::ServerPageException->throw( error => "Error message from the server: '$headline'.", res => $res, ) if ($headline); WWW::Mediawiki::Client::ServerPageException->throw( error => "Could not identify the error in this context.", res => $res, ); } chomp $text; return $text; } =head2 get_local_page my $wikitext = $mvs->get_local_page($filename); Returns the wikitext from the given local file; B =over =item WWW::Mediawiki::Client::FileAccessException =item WWW::Mediawiki::Client::FileTypeException =item WWW::Mediawiki::Client::AbsoluteFileNameException =back =cut sub get_local_page { my ($self, $filename) = @_; $self->_check_path($filename); return '' unless -e $filename; open IN, "<:utf8", $filename or WWW::Mediawiki::Client::FileAccessException->throw( "Cannot open $filename."); local $/; my $text = ; close IN; return $text; } =head2 pagename_to_url my $url = $mvs->pagename_to_url($pagename); Returns the url at which a given pagename will be found on the Mediawiki server to which this instance of points. B =over =item WWW::Mediawiki::Client::URLConstructionException; =back =cut sub pagename_to_url { my ($self, $name, $action) = @_; WWW::Mediawiki::Client::URLConstructionException->throw( error => 'No action supplied.', ) unless $action; WWW::Mediawiki::Client::URLConstructionException->throw( error => "Page name $name ends with '.wiki'.", ) if $name =~ /.wiki$/; my $char = $self->space_substitute; $name =~ s/ /$char/; my $lang = $self->language_code; my $host = $self->host; $host =~ s/__LANG__/$lang/g; my $wiki_path = $self->wiki_path; $wiki_path =~ s/__LANG__/$lang/g; my $protocol = $self->protocol; return "$protocol://$host/$wiki_path?" . ACTION . "=$action&" . TITLE . "=$name"; } =head2 filename_to_pagename my $pagename = $mvs->filname_to_pagename($filename); Returns the cooresponding server page name given a filename. B =over =item WWW::Mediawiki::Client::AbsoluteFileNameException =item WWW::Mediawiki::Client::FileTypeException =back =cut sub filename_to_pagename { my ($self, $name) = @_; $self->_check_path($name); $name =~ s/.wiki$//; $self->{escape_filenames} and $name = decode('UTF-8', URI::Escape::uri_unescape($name)); $name =~ s/_/ /g; return ucfirst $name; } =head2 filename_to_url my $pagename = $mvs->filname_to_url($filename); Returns the cooresponding server URL given a filename. B =over =item WWW::Mediawiki::Client::AbsoluteFileNameException =item WWW::Mediawiki::Client::FileTypeException =back =cut sub filename_to_url { my ($self, $name, $action) = @_; $name = $self->filename_to_pagename($name); return $self->pagename_to_url($name, $action); } =head2 pagename_to_filename my $filename = $mvs->pagename_to_filename($pagename); Returns a local filename which cooresponds to the given Mediawiki page name. =cut sub pagename_to_filename { my ($self, $name) = @_; $name =~ s/ /_/; $self->{escape_filenames} and $name = URI::Escape::uri_escape_utf8($name); $name .= '.wiki'; return $name; } =head2 url_to_filename my $filename = $mvs->url_to_filename($url); Returns the local filename which cooresponds to a given URL. =cut sub url_to_filename { my ($self, $url) = @_; my $char = '\\' . $self->space_substitute; $url =~ s/$char/_/g; my $title = TITLE; $url =~ m/&$title=([^&]*)/; return "$1.wiki"; } =head2 list_wiki_files @filenames = $mvs->list_wiki_files; Returns a recursive list of all wikitext files in the local repository. =cut sub list_wiki_files { my $self = shift; my @files; my $dir = File::Spec->curdir(); find(sub { return unless /^[^.].*\.wiki\z/s; my $name = $File::Find::name; $name = File::Spec->abs2rel($name); push @files, $name; }, $dir); return @files; } =begin comment =head1 Private Methods =cut sub _merge { my ($self, $filename, $ref, $server, $local) = @_; my $control = { in => $\, out => $/, chomp => 1 }; $ref = VCS::Lite->new('ref', "\n", "$ref\n"); $server = VCS::Lite->new('server', "\n", "$server\n"); $local = VCS::Lite->new('local', "\n", "$local\n"); my $merge = $ref->merge($server, $local); return scalar $merge->text(); } sub _get_wiki_text { my ($self, $doc) = @_; my $p = HTML::TokeParser->new(\$doc); $p->get_tag("textarea"); my $text = $p->get_text; $text =~ s/ //gs; # convert endlines return $text; } sub _get_server_encoding { my ($self) = @_; my $url = $self->_get_version_url; my $res = $self->{ua}->get($url); my $doc = $res->decoded_content; my $p = HTML::TokeParser->new(\$doc); while ( my $t = $p->get_tag("meta") ) { next unless defined $t->[1]->{'http-equiv'} and ($t->[1]->{'http-equiv'} eq 'Content-Type' or $t->[1]->{'http-equiv'} eq 'Content-type'); my $cont = $t->[1]->{'content'}; $cont =~ m/charset=(.*)/; return $1; } } sub _get_page_headline { my ($self, $doc) = @_; my $p = HTML::TokeParser->new(\$doc); $p->get_tag("h1"); my $text = $p->get_text; $text =~ s/ //gs; # convert endlines return $text; } sub _get_edit_date { my ($self, $doc) = @_; my $p = HTML::TokeParser->new(\$doc); my $date; while (my $tag = $p->get_tag('input')) { next unless $tag->[1]->{type} eq 'hidden'; next unless $tag->[1]->{name} eq EDIT_TIME_NAME; $date = $tag->[1]->{value}; } return $date; } sub _get_edit_token { my ($self, $doc) = @_; my $p = HTML::TokeParser->new(\$doc); my $token; while (my $tag = $p->get_tag('input')) { next unless $tag->[1]->{type} eq 'hidden'; next unless $tag->[1]->{name} eq 'wpEditToken'; $token = $tag->[1]->{value}; } return $token; } sub _get_edit_is_watching { my ($self, $doc, $name) = @_; my $p = HTML::TokeParser->new(\$doc); my $status; while (my $tag = $p->get_tag('a')) { next unless $tag->[1]->{href} && $tag->[1]->{href} =~ m/&action=((?:un)?watch)/; # If 'un'watch, then it's watched; otherwise, it's not. $status = ($1 eq 'unwatch' ? 1 : 0); } return $status; } sub _get_edit_checkbox { my ($self, $doc, $name) = @_; my $p = HTML::TokeParser->new(\$doc); my $status; while (my $tag = $p->get_tag('input')) { next unless $tag->[1]->{type} eq 'checkbox'; next unless $tag->[1]->{name} eq $name; $status = ($tag->[1]->{checked} ? 1 : 0); } return $status; } sub _get_edit_watch_default { my ($self, $doc) = @_; return $self->_get_edit_checkbox($doc, EDIT_WATCH_NAME); } sub _get_edit_minor_default { my ($self, $doc) = @_; return $self->_get_edit_checkbox($doc, EDIT_MINOR_NAME); } sub _check_path { my ($self, $filename) = @_; WWW::Mediawiki::Client::FileTypeException->throw( "'$filename' doesn't appear to be a wiki file.") unless $filename =~ /\.wiki$/; WWW::Mediawiki::Client::AbsoluteFileNameException->throw( "No absolute filenames allowed!") if File::Spec->file_name_is_absolute($filename); return File::Spec->splitpath($filename); } sub _get_reference_page { my ($self, $filename) = @_; return '' unless -e $filename; $filename = $self->_get_ref_filename($filename); my $ref = $self->get_local_page($filename); return $ref; } sub _get_ref_filename { my ($self, $filename) = @_; WWW::Mediawiki::Client::FileTypeException->throw( "Not a .wiki file.") unless $filename =~ /\.wiki$/; my ($vol, $dirs, $fn) = File::Spec->splitpath($filename); $fn =~ s/(.*)\.wiki/.$1.ref.wiki/; return File::Spec->catfile('.', $dirs, $fn); } sub _ref_to_filename { my ($self, $ref) = @_; my ($vol, $dirs, $fn) = File::Spec->splitpath($ref); $fn =~ s/^\.(.*)\.ref\.wiki$/$1.wiki/ or WWW::Mediawiki::Client::FileTypeException->throw( "Not a .ref.wiki file."); return File::Spec->catpath($vol, $dirs, $fn); } sub _conflicts_found_in { my ($self, $text) = @_; return 1 if $text =~ /Start of conflict 1/m; return 0; } sub _get_update_status { my ($self, $rv, $sv, $lv, $nv) = @_; chomp ($rv, $sv, $lv, $nv); # double chomp chomp ($rv, $sv, $lv, $nv); # it's a nasty hack, but necessary until we re-write return STATUS_CONFLICT if $self->_conflicts_found_in($nv); return STATUS_UNKNOWN unless $sv or $lv; return STATUS_LOCAL_ADDED unless $sv; return STATUS_UNCHANGED if $sv eq $lv; return STATUS_LOCAL_MODIFIED if $lv ne $rv; return STATUS_SERVER_MODIFIED if $rv ne $sv; return STATUS_UNKNOWN; } sub _get_host_url { my ($self) = @_; my $lang = $self->language_code; my $host = $self->host; $host =~ s/__LANG__/$lang/g; my $protocol = $self->protocol; return "$protocol://$host/"; } sub _get_version_url { my ($self) = @_; my $lang = $self->language_code; my $path = $self->wiki_path; $path =~ s/__LANG__/$lang/g; return $self->_get_host_url . $path . '?' . TITLE . '=' . SPECIAL_VERSION; } sub _get_export_url { my ($self) = @_; my $lang = $self->language_code; my $path = $self->wiki_path; $path =~ s/__LANG__/$lang/g; return $self->_get_host_url . $path . '?' . TITLE . '=' . SPECIAL_EXPORT; } sub _get_exported_pages { my ($self, @pages) = @_; my $count = scalar @pages; my $url = $self->_get_export_url; my $response = $self->{ua}->request(POST $url, [ pages => join("\n", @pages), action => 'submit', curonly => 'true', ]); WWW::Mediawiki::Client::ServerPageException->throw( error => "Couldn't fetch $count pages from the server.", res => $response, ) unless $response->is_success; my $parser = XML::LibXML->new; my $doc = $parser->parse_string($response->decoded_content); my %expecting = map {$_ => 1} @pages; my %export = (); my %timestamp = (); foreach my $node ($doc->findnodes('/mediawiki/page')) { my $page = $node->findvalue(TITLE); my $text = $node->findvalue('revision/text'); my $time = $node->findvalue('revision/timestamp'); WWW::Mediawiki::Client::ServerPageException->throw( error => "Server returned unexpected page '$page'.", res => $response) unless $expecting{$page}; $export{$page} = $text; $timestamp{$page} = $time; } $self->{export} = \%export; $self->{timestamp} = \%timestamp; } sub _upload_file { my ($self, $filename, $commit) = @_; WWW::Mediawiki::Client::URLConstructionException->throw( "No server URL specified.") unless $self->{host}; WWW::Mediawiki::Client::FileAccessException->throw("No such file!") unless -e $filename; WWW::Mediawiki::Client::CommitException->throw( 'Could not determine charset for uploading to this server.' ) unless $self->encoding; my $text = $self->get_local_page($filename); my $pagename = $self->filename_to_pagename($filename); my $sp = $self->get_server_page($pagename); if ($self->{edit}->{date}) { my $ref = $self->_get_reference_page($filename); chomp ($sp, $ref); WWW::Mediawiki::Client::UpdateNeededException->throw( error => $self->filename_to_pagename($filename) . " has changed on the server.", ) unless $sp eq $ref; } chomp ($text); WWW::Mediawiki::Client::ConflictsPresentException->throw( "$filename appears to have unresolved conflicts") if $self->_conflicts_found_in($text); my @params; push(@params, EDIT_MINOR_NAME, CHECKED) if $self->_option_check( 'minor_edit', $self->{minor_edit}, $self->{edit}->{def_minor}); push(@params, EDIT_WATCH_NAME, CHECKED) if $self->_option_check( 'watch', $self->{watch}, $self->{edit}->{def_watch}, $self->{edit}->{watch_now}); my $act_name = ($commit ? EDIT_SUBMIT_NAME : EDIT_PREVIEW_NAME ); my $act_value = ($commit ? EDIT_SUBMIT_VALUE : EDIT_PREVIEW_VALUE); my $url = $self->filename_to_url($filename, SUBMIT); my $octets = Encode::encode($self->encoding, $text); my $res = $self->{ua}->post($url, [ $act_name => $act_value, &TEXTAREA_NAME => $octets, &COMMENT_NAME => $self->{commit_message}, &EDIT_TIME_NAME => $self->{edit}->{date}, &EDIT_TOKEN_NAME => $self->{edit}->{token}, @params, ], ); my $doc = $res->decoded_content; my $headline = $self->_get_page_headline($doc); my $expect = ($commit ? $pagename : "Editing $pagename"); unless (lc($headline) eq lc($expect)) { WWW::Mediawiki::Client::CommitException->throw( error => "The page you are trying to commit appears to contain a link which is associated with Wikispam.", res => $res, ) if ($headline eq 'Spam protection filter'); WWW::Mediawiki::Client::CommitException->throw( error => "When we tried to commit '$pagename' the server responded with '$headline'.", res => $res, ) if ($headline); } return ($res, $text); } sub _option_verify { my ($self, $name, $value, $r_accept) = @_; foreach my $acc (@{$r_accept}) { return 1 if $acc == $value; } my %opts = OPTION_SETTINGS; my $valstr = $opts{$value}; $valstr = "value '$value'" unless defined($valstr); WWW::Mediawiki::Client::InvalidOptionException->throw( error => "Cannot set field $name to $valstr.", field => $name, option => $opts{$value}, value => $value, ); } sub _option_check { my ($self, $name, $value, $default, $current) = @_; return 1 if $value == OPT_YES; return 0 if $value == OPT_NO; if ($value == OPT_DEFAULT) { return $default if defined($default); WWW::Mediawiki::Client::InvalidOptionException->throw( error => "Field '$name' cannot use OPT_DEFAULT:" . " Default information could not be determined.", field => $name, option => 'OPT_DEFAULT', value => $value, ); } if ($value == OPT_KEEP) { return $current if defined($current); WWW::Mediawiki::Client::InvalidOptionException->throw( error => "Field '$name' cannot use OPT_KEEP:" . " Current information could not be determined.", field => $name, option => 'OPT_DEFAULT', value => $value, ); } # Should never happen; these are verified at assignment time. my %opts = OPTION_SETTINGS; WWW::Mediawiki::Client::InvalidOptionException->throw( error => "Field '$name' is in unknown state '$value'.", field => $name, option => $opts{$value}, value => $value ); } 1; __END__ =end comment =head1 BUGS Please submit bug reports to the CPAN bug tracker at L. =head1 DISCUSSION There is a discussion list. You can subscribe or read the archives at: L =head1 AUTHORS =over =item Mark Jaroski Original author, maintainer =item Mike Wesemann Added support for Mediawiki 1.3.10+ edit tokens =item Bernhard Kaindl Improved error messages. =item Oleg Alexandrov , Thomas Widmann Bug reports and feedback. =item Adrian Irving-Beer Preview support, export support for multi-page update, more 'minor' and 'watch' settings, and bug reports. =item Nicolas Brouard Fixed content-type bug. =item Alex Kapranoff Added C in order to support UTF-8 filenames on filesystems lacking UTF-8 support. =back =head1 LICENSE Copyright (c) 2004-2006 Mark Jaroski. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. libwww-mediawiki-client-perl-0.31/t/0000711001161000116100000000000010451515335014272 5ustar libwww-mediawiki-client-perl-0.31/t/client.t0000711001161000116100000003314410451515276015751 0ustar #!/usr/bin/perl -w use strict; use Test::More tests => 102; use Test::Differences; use utf8; BEGIN { use_ok('WWW::Mediawiki::Client', ':options'); } # test the constructor first my $mvs; ok($mvs = WWW::Mediawiki::Client->new(host => 'localhost/'), 'Can instanciate a WWW::Mediawiki::Client object'); # load the test data undef $/; ok(open(IN, "<:utf8", "t/files/paris.html"), 'Can open our test HTML'); my $HtmlData = ; ok(open(IN, "<:utf8", "t/files/paris.wiki"), 'Can open our test Wiki file'); my $WikiData = ; ok(open(IN, "<:utf8", "t/files/reference.wiki"), 'Can open the reference Wiki file'); my $RefData = ; ok(open(IN, "<:utf8", "t/files/local.wiki"), 'Can open the local Wiki file'); my $LocalData = ; ok(open(IN, "<:utf8", "t/files/server.wiki"), 'Can open the server Wiki file'); my $ServerData = ; ok(open(IN, "<:utf8", "t/files/merged.wiki"), 'Can open our merged Wiki file'); my $MergedData = ; close IN; $MergedData =~ s/^.//; $/= "\n"; chomp ($RefData, $ServerData, $LocalData, $MergedData); # make a test repository my $Testdir = '/tmp/mvstest.' . time; mkdir $Testdir or die "Could not make $Testdir. Check the permissions on /tmp."; chdir $Testdir; # Test the filename method is($mvs->filename_to_url('San_Francisco.wiki', 'edit'), 'http://localhost/wiki/index.php?action=edit&title=San_Francisco', 'Can we convert the filename to the URL?'); $mvs->space_substitute('_'); is($mvs->filename_to_url('San_Francisco.wiki', 'submit'), 'http://localhost/wiki/index.php?action=submit&title=San_Francisco', 'Can we convert the filename to the URL?'); eval { $mvs->filename_to_url('/this/is/an/absolute/filename.wiki') }; isa_ok($@, 'WWW::Mediawiki::Client::AbsoluteFileNameException', 'Does filename_to_url throw an exception for absolute filenames?'); eval { $mvs->filename_to_url('foo/bar.foo') }; isa_ok($@, 'WWW::Mediawiki::Client::FileTypeException', 'Does filename_to_url throw an exception for non .wiki files?'); # Can we harvest the Wiki data from the HTML page? eq_or_diff($mvs->_get_wiki_text($HtmlData), $WikiData, 'get_wiki_text returns the correct text'); # Test the conflict detection and separation eq_or_diff( $mvs->_merge('Paris.wiki', $RefData, $ServerData, $LocalData), $MergedData, 'does a merge of our test files produce the expected result?'); # Test loading a configuration my $conf_file = WWW::Mediawiki::Client::CONFIG_FILE; open OUT, ">$conf_file" or die "Could not open conf file"; print OUT q{$VAR1 = { host => 'www.somewiki.org', output_level => 2, username => 'foo', password => 'bar', } }; close OUT; undef $mvs; $mvs = WWW::Mediawiki::Client->new(); ok($mvs = $mvs->load_state, 'can run load_state'); is($mvs->password, 'bar', 'retrieved correct password'); is($mvs->username, 'foo', 'retrieved correct username'); is($mvs->host, 'www.somewiki.org', 'retrieved correct host'); #cleanup unlink $conf_file; # Test saving configuration undef $mvs; $mvs = WWW::Mediawiki::Client->new(); $mvs->username('fred'); $mvs->password('3117p4sS'); $mvs->host('www.someotherwiki.org'); ok($mvs->save_state, 'can run save_state'); undef $mvs; $mvs = WWW::Mediawiki::Client->new(); $mvs = $mvs->load_state; is($mvs->password, '3117p4sS', 'retrieved correct password'); is($mvs->username, 'fred', 'retrieved correct username'); is($mvs->host, 'www.someotherwiki.org', 'retrieved correct host'); unlink $conf_file; # test the Wikitravel defaults with new $mvs = WWW::Mediawiki::Client->new(host => 'wikitravel.org'); is($mvs->wiki_path, 'wiki/__LANG__/index.php', 'Wikitravel defaults: wiki_path'); is($mvs->space_substitute, '_', 'Wikitravel defaults: space_substitute'); is($mvs->pagename_to_url('San Francisco', 'submit'), 'http://wikitravel.org/wiki/en/index.php?action=submit&title=San_Francisco', '... and convert the filename to the URL?'); # test the Wikipedia defaults with new $mvs = WWW::Mediawiki::Client->new(host => 'www.wikipedia.org'); is($mvs->wiki_path, 'w/wiki.phtml', 'Wikipedia defaults: wiki_path'); is($mvs->space_substitute, '+', 'Wikipedia defaults: space_substitute'); is($mvs->pagename_to_url('San Francisco', 'submit'), 'http://en.wikipedia.org/w/wiki.phtml?action=submit&title=San+Francisco', '... and convert the filename to the URL?'); # test the Wikitravel defaults with host ok($mvs->host('wikitravel.org'), 'Can change host to wikitravel'); is($mvs->wiki_path, 'wiki/__LANG__/index.php', '... and get the right wiki_path'); is($mvs->space_substitute, '_', '... and get the right space_substitute'); is($mvs->pagename_to_url('San Francisco', 'submit'), 'http://wikitravel.org/wiki/en/index.php?action=submit&title=San_Francisco', '... and convert the filename to the URL?'); # test the Wikipedia defaults with host ok($mvs->host('www.wikipedia.org'), 'Can change host to wikipedia'); is($mvs->wiki_path, 'w/wiki.phtml', '... and get the right wiki_path'); is($mvs->space_substitute, '+', '... and get the right space_substitute'); is($mvs->pagename_to_url('San Francisco', 'submit'), 'http://en.wikipedia.org/w/wiki.phtml?action=submit&title=San+Francisco', '... and convert the filename to the URL?'); # test the language code accessor is($mvs->language_code, 'en', 'Does the default language code get set?'); ok($mvs->language_code('ru'), '... and can we change it'); is($mvs->language_code, 'ru', '... and get back the string we changed it to'); # test the space_substitute accessor $mvs = WWW::Mediawiki::Client->new(host => 'www.wikifoo.org'); is($mvs->space_substitute, '_', 'Does the default space substitute get set?'); ok($mvs->space_substitute('-'), '... and can we change it'); is($mvs->space_substitute, '-', '... and get back the string we changed it to'); eval { $mvs->space_substitute('&') }; isa_ok($@, 'WWW::Mediawiki::Client::URLConstructionException', '... and throws an exception if you try to set it to "&"'); eval { $mvs->space_substitute('?') }; isa_ok($@, 'WWW::Mediawiki::Client::URLConstructionException', '... and throws an exception if you try to set it to "?"'); eval { $mvs->space_substitute('=') }; isa_ok($@, 'WWW::Mediawiki::Client::URLConstructionException', '... and throws an exception if you try to set it to "="'); eval { $mvs->space_substitute('\\') }; isa_ok($@, 'WWW::Mediawiki::Client::URLConstructionException', '... and throws an exception if you try to set it to "\\"'); eval { $mvs->space_substitute('/') }; isa_ok($@, 'WWW::Mediawiki::Client::URLConstructionException', '... and throws an exception if you try to set it to "/"'); # test the username accessor $mvs = WWW::Mediawiki::Client->new(host => 'www.wikifoo.org'); is($mvs->username, undef, 'Is the username undef by default?'); ok($mvs->username('joeuser'), '... and can we change it'); is($mvs->username, 'joeuser', '... and get back the string we changed it to'); # test the password accessor $mvs = WWW::Mediawiki::Client->new(host => 'www.wikifoo.org'); is($mvs->password, undef, 'Is the password undef by default?'); ok($mvs->password('joeuser'), '... and can we change it'); is($mvs->password, 'joeuser', '... and get back the string we changed it to'); # test the wiki_path accessor $mvs = WWW::Mediawiki::Client->new(host => 'www.wikifoo.org'); is($mvs->wiki_path, 'wiki/index.php', 'Does the default wiki path get set?'); ok($mvs->wiki_path('foo/index.php'), '... and can we change it'); is($mvs->wiki_path, 'foo/index.php', '... and get back the string we changed it to'); $mvs->wiki_path('/foo/index.php'); is($mvs->wiki_path, 'foo/index.php', '... and do leading slashes get stripped'); # test the commit_message accessor $mvs = WWW::Mediawiki::Client->new(host => 'www.wikifoo.org'); is($mvs->commit_message, undef, 'Is the commit_message undef by default?'); ok($mvs->commit_message('yo'), '... and can we change it'); is($mvs->commit_message, 'yo', '... and get back the string we changed it to'); # test the watch accessor $mvs = WWW::Mediawiki::Client->new(host => 'www.wikifoo.org'); is($mvs->watch, OPT_DEFAULT, 'Is the watch OPT_DEFAULT by default?'); foreach my $val (OPT_YES, OPT_NO, OPT_DEFAULT, OPT_KEEP) { is($mvs->watch($val), $val, '... and can we change it'); is($mvs->watch, $val, '... and get back the value we changed it to'); } # test the minor_edit accessor $mvs = WWW::Mediawiki::Client->new(host => 'www.wikifoo.org'); is($mvs->minor_edit, OPT_DEFAULT, 'Is the minor_edit OPT_DEFAULT by default?'); foreach my $val (OPT_YES, OPT_NO, OPT_DEFAULT) { is($mvs->minor_edit($val), $val, '... and can we change it'); is($mvs->minor_edit, $val, '... and get back the value we changed it to'); } # test the status accessor (should be undef) $mvs = WWW::Mediawiki::Client->new(host => 'www.wikifoo.org'); is($mvs->status, undef, 'Is the status undef by default?'); # ... and throws an error if you try to set it eval { $mvs->status('foo') }; isa_ok($@, 'WWW::Mediawiki::Client::ReadOnlyFieldException', '... and throws an exception if you try to set it'); # test the escape_filenames accessor $mvs = WWW::Mediawiki::Client->new(host => 'www.wikifoo.org'); is($mvs->escape_filenames, 0, 'Does the default escape_filenames get set?'); ok($mvs->escape_filenames(1), '... and can we change it'); is($mvs->escape_filenames, 1, '... and get back the string we changed it to'); # test get_local_page open(OUT, '>:utf8', 'Paris.wiki'); print OUT $WikiData; close OUT; eq_or_diff($mvs->get_local_page('Paris.wiki'), $WikiData, 'Can get_local_page'); # test for WWW::Mediawiki::Client::FileAccessException SKIP: { chmod 0200, 'Paris.wiki'; skip("Can't deny access to file. (Are you root?)", 1) if -r 'Paris.wiki'; eval { $mvs->get_local_page('Paris.wiki') }; isa_ok($@, 'WWW::Mediawiki::Client::FileAccessException', '... and throws an exception if the file is unreadable'); } # test for WWW::Mediawiki::Client::FileTypeException eval { $mvs->get_local_page('foo.bar') }; isa_ok($@, 'WWW::Mediawiki::Client::FileTypeException', '... and throws an exception if we try reading the wrong sort of file'); # test for WWW::Mediawiki::Client::AbsoluteFileNameException eval { $mvs->get_local_page("$Testdir/Paris.wiki") }; isa_ok($@, 'WWW::Mediawiki::Client::AbsoluteFileNameException', '... and throws an exception if we try using an absolute path'); # test pagename_to_url $mvs = WWW::Mediawiki::Client->new(host => 'www.wikifoo.org'); is($mvs->pagename_to_url('San Francisco', 'edit'), 'http://www.wikifoo.org/wiki/index.php?action=edit&title=San_Francisco', 'Can we convert a pagename to a URL?'); # ... with __LANG__ token in path ok($mvs->wiki_path('wiki/__LANG__/wiki.phtml'), '... and can add __LANG__ to wiki_path'); is($mvs->pagename_to_url('San Francisco', 'edit'), 'http://www.wikifoo.org/wiki/en/wiki.phtml?action=edit&title=San_Francisco', '... which gives us the right URL'); # ... with __LANG__ token in base url ok($mvs->host('__LANG__.wikifoo.org'), '... and can add __LANG__ to host'); is($mvs->pagename_to_url('San Francisco', 'edit'), 'http://en.wikifoo.org/wiki/en/wiki.phtml?action=edit&title=San_Francisco', '... which gives us the right URL'); # test filename_to_pagename is($mvs->filename_to_pagename('San_Francisco.wiki'), 'San Francisco', 'filename_to_pagename can convert a filename to a pagename.'); is($mvs->filename_to_pagename('Salt_Lake_City.wiki'), 'Salt Lake City', '... if it has more than one "_".'); eval { $mvs->filename_to_pagename('foo.bar') }; isa_ok($@, 'WWW::Mediawiki::Client::FileTypeException', '... and throws an exception if we try the wrong sort of file'); eval { $mvs->filename_to_pagename("$Testdir/Paris.wiki") }; isa_ok($@, 'WWW::Mediawiki::Client::AbsoluteFileNameException', '... and throws an exception if we try using an absolute path'); # test pagename_to_filename is($mvs->pagename_to_filename('San Francisco'), 'San_Francisco.wiki', 'pagename_to_filename can convert a page name into a filename'); is($mvs->pagename_to_filename('User:Mark/Maps'), 'User:Mark/Maps.wiki', '... even the sub-page of a User page.'); $mvs->escape_filenames(0); is($mvs->pagename_to_filename('Нижний Новгород'), 'Нижний_Новгород.wiki', 'pagename_to_filename with Unicode'); is($mvs->filename_to_pagename('Нижний_Новгород.wiki'), 'Нижний Новгород', 'filename_to_pagename with Unicode'); $mvs->escape_filenames(1); is($mvs->pagename_to_filename('Нижний Новгород'), '%D0%9D%D0%B8%D0%B6%D0%BD%D0%B8%D0%B9_%D0%9D%D0%BE%D0%B2%D0%B3%D0%BE%D1%80%D0%BE%D0%B4.wiki', 'pagename_to_filename with Unicode escaping'); is($mvs->filename_to_pagename('%D0%9D%D0%B8%D0%B6%D0%BD%D0%B8%D0%B9_%D0%9D%D0%BE%D0%B2%D0%B3%D0%BE%D1%80%D0%BE%D0%B4.wiki'), 'Нижний Новгород', 'filename_to_pagename with Unicode escaping'); # test url_to_filename $mvs->space_substitute('+'); is($mvs->url_to_filename('http://www.wikifoo.org/wiki/en/wiki.phtml?action=edit&title=San+Francisco'), 'San_Francisco.wiki', 'url_to_filename can convert a URL to a filename.'); $mvs->space_substitute('_'); is($mvs->url_to_filename('http://www.wikifoo.org/wiki/en/wiki.phtml?action=edit&title=San_Francisco'), 'San_Francisco.wiki', '... with underscores too.'); # test list_wiki_files open(OUT, '>:utf8', 'foo.wiki'); print OUT 'foo'; close OUT; mkdir 'foo'; open(OUT, '>:utf8', 'foo/bar.wiki'); print OUT 'bar'; close OUT; my @expect = qw(Paris.wiki foo.wiki foo/bar.wiki); my @got = $mvs->list_wiki_files; eq_array(\@got, \@expect, 'list_wiki_files returns a recursive list of wiki files.'); 1; __END__ # vim:syntax=perl: libwww-mediawiki-client-perl-0.31/t/exceptions.t0000711001161000116100000000550610442767660016663 0ustar #!/usr/bin/perl -w use strict; use Test::More tests=> 15; BEGIN { use_ok('WWW::Mediawiki::Client::Exceptions'); } eval { WWW::Mediawiki::Client::Exception->throw() }; isa_ok($@, 'WWW::Mediawiki::Client::Exception', 'Can throw a WWW::Mediawiki::Client::Exception.'); eval { WWW::Mediawiki::Client::URLConstructionException->throw() }; isa_ok($@, 'WWW::Mediawiki::Client::URLConstructionException', 'Can throw a WWW::Mediawiki::Client::URLConstructionException.'); eval { WWW::Mediawiki::Client::AuthException->throw() }; isa_ok($@, 'WWW::Mediawiki::Client::AuthException', 'Can throw a WWW::Mediawiki::Client::AuthException.'); eval { WWW::Mediawiki::Client::LoginException->throw() }; isa_ok($@, 'WWW::Mediawiki::Client::LoginException', 'Can throw a WWW::Mediawiki::Client::LoginException.'); eval { WWW::Mediawiki::Client::CookieJarException->throw() }; isa_ok($@, 'WWW::Mediawiki::Client::CookieJarException', 'Can throw a WWW::Mediawiki::Client::CookieJarException.'); eval { WWW::Mediawiki::Client::FileAccessException->throw() }; isa_ok($@, 'WWW::Mediawiki::Client::FileAccessException', 'Can throw a WWW::Mediawiki::Client::FileAccessException.'); eval { WWW::Mediawiki::Client::FileTypeException->throw() }; isa_ok($@, 'WWW::Mediawiki::Client::FileTypeException', 'Can throw a WWW::Mediawiki::Client::FileTypeException.'); eval { WWW::Mediawiki::Client::CommitMessageException->throw() }; isa_ok($@, 'WWW::Mediawiki::Client::CommitMessageException', 'Can throw a WWW::Mediawiki::Client::CommitMessageException.'); eval { WWW::Mediawiki::Client::PageDoesNotExistException->throw() }; isa_ok($@, 'WWW::Mediawiki::Client::PageDoesNotExistException', 'Can throw a WWW::Mediawiki::Client::PageDoesNotExistException.'); eval { WWW::Mediawiki::Client::UpdateNeededException->throw() }; isa_ok($@, 'WWW::Mediawiki::Client::UpdateNeededException', 'Can throw a WWW::Mediawiki::Client::UpdateNeededException.'); eval { WWW::Mediawiki::Client::ConflictsPresentException->throw() }; isa_ok($@, 'WWW::Mediawiki::Client::ConflictsPresentException', 'Can throw a WWW::Mediawiki::Client::ConflictsPresentException.'); eval { WWW::Mediawiki::Client::CorruptedConfigFileException->throw() }; isa_ok($@, 'WWW::Mediawiki::Client::CorruptedConfigFileException', 'Can throw a WWW::Mediawiki::Client::CorruptedConfigFileException.'); eval { WWW::Mediawiki::Client::ServerPageException->throw() }; isa_ok($@, 'WWW::Mediawiki::Client::ServerPageException', 'Can throw a WWW::Mediawiki::Client::ServerPageException.'); eval { WWW::Mediawiki::Client::ReadOnlyFieldException->throw() }; isa_ok($@, 'WWW::Mediawiki::Client::ReadOnlyFieldException', 'Can throw a WWW::Mediawiki::Client::ReadOnlyFieldException.'); 1; __END__ # vim:syntax=perl: libwww-mediawiki-client-perl-0.31/t/files/0000711001161000116100000000000010451154645015377 5ustar libwww-mediawiki-client-perl-0.31/t/files/Main_Page.html0000600001161000116100000002066310442767660020123 0ustar Editing Main Page - Edit - DevWiki

Editing Main Page

From DevWiki


Summary:

Cancel | Editing help (opens in new window)
Please note that all contributions to DevWiki are considered to be released under the GNU Free Documentation License (see DevWiki:Copyrights for details). If you don't want your writing to be edited mercilessly and redistributed at will, then don't submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. DO NOT SUBMIT COPYRIGHTED WORK WITHOUT PERMISSION!
libwww-mediawiki-client-perl-0.31/t/files/Main_Page.wiki0000600001161000116100000000041110442767660020107 0ustar Wiki software successfully installed. Please see [http://meta.wikipedia.org/wiki/MediaWiki_i18n documentation on customizing the interface] and the [http://meta.wikipedia.org/wiki/MediaWiki_User%27s_Guide User's Guide] for usage and configuration help. test one libwww-mediawiki-client-perl-0.31/t/files/example.mediawiki0000600001161000116100000000036110444173372020717 0ustar $VAR1 = { 'language_code' => 'en', 'space_substitute' => '+', 'username' => undef, 'host' => 'localhost', 'password' => undef, 'watch' => 0, 'minor_edit' => 0, }; libwww-mediawiki-client-perl-0.31/t/files/local.wiki0000600001161000116100000002523210442767660017371 0ustar [[ro:Paris]]
[[Image:Paris-seine-center-200px.jpg|Paris/The Seine]]
''The Seine River, Paris''

'''Paris''' is the capital of [[France]] and - with 2 million people living in the center and some 10 million people in the suburbs (''la banlieue'') - one of the largest cities in [[Europe]]. The city is divided into 20 districts called ''arondissements''; these are numbered from 1 to 20 in a clockwise spiral from the center. ==Understand== ==Districts== *... *[[Paris/Montmartre]] *... ==Get in== Paris can be reached by car, bus, train, plane. ===By train=== The '''Thalys''' high-speed train, which runs to daily to/from the [[Netherlands]] and [[Switzerland]], is a bit expensive, but if you book more than a week in advance it can still have a reasonable price. The high-speed '''TGV''' train (''Train à Grande Vitesse'') runs several times a day to [[Nice]] and [[Avignon]] in the south, [[Geneva]], Switzerland and [[Dijon]] in the east, and connects with trains and ferries for the passage to [[England]] in the west. Intercity and local trains leave for all parts of [[Europe]], including overnight trains to [[San Sebastian]] in [[Spain]], [[Porto]] and [[Lisbon]] in [[Portugal]]. The Eurostar ( http://www.eurostar.com/ ) connects Paris with [[London]] and [[Brussels]] and many others. Travel time between Paris and [[London]] is approximately 3 hours. There are several stations serving Paris, so make sure you confirm where your train leaves from: * Gare Austerlitz * Gare de l'Est * Gare du Nord - to Belgium and the Netherlands * ===By bus=== *[[Eurolines]] *[[Gullivers Travel]] ===By plane=== * Charles de Gaulle * Orly For more information, including arrival/departure times, check the official [http://www.parisairports.com/ Paris Airports] site. ==Get around== Paris has an excellent metro system. For short visits, a ''carnet'' of ten (slightly discounted) tickets can be bought for 10 EUR at any station. If you're staying a bit longer it might be interesting to get a ''Carte Orange Hebdomadaire'' (1 week pass, 14.5 EUR for zone 1 and 2) or ''Mensuelle'' (1 month pass). For the Carte Orange you need one small photograph, for which there are cabins in most bigger metro stations. Note that an ''Hebdomadaire'' (''eb-DOH-ma-DAYR'': in [[French phrasebook|French]] you don't pronounce the H) starts on Mondays and a Mensuelle on the first of the month. The Carte Orange is also valid in the ''Noctambus'', the night bus, where tickets normally cost 2.5 EUR. Women travellers should probably avoid taking the Noctambus on their own. Fortunately taxis are relatively cheap, especially at night, when there are no traffic jams to be expected. [http://www.ratp.fr RATP] is the regional train system. ==See== ===Main Attractions=== * Eiffel Tower * Chateau de Versailles * '''Pere-Lachaise Cemetery''' (Cimetière du Père Lachaise). See the grave of Jim Morrison amongst many others. * '''Catacombes''' Used to store the exhumed bones from the overflowing Paris cemetery. * '''Arc de Triomphe''' The grave of the unknown soldier is under the arch. ===Churches=== * Notre Dame * Sacre Coeur ===Museums=== *[http://www.louvre.fr/ the Louvre (le Musée du Louvre)]: On par with London's British Museum and New York's Metropolitan Museum, the Louvre is a showcase of world cultures throughout history. Its exhibits come from such diverse origins as ancient Egypt, classical Greece and Rome, medieval Europe and Napoleonic France. Its most famous exhibit, of course, is Leonardo da Vinci's painting of the "'Mona Lisa (la Giaconda)'", generally to be found surrounded by hordes of camera-flashing tourists. *[http://www.musee-orsay.fr/ le Musée d’Orsay] *Centre Pompidou ==Do== * Disneyland Europe ==Learn== Paris is an excellent place to learn French. Paris also has many universities, where you can learn about anything. * Paris II * Paris III - Sorbonne * Paris VI * Paris VIII ==Work== ==Buy== ==Eat== For '''vegetarians''' dining in restaurants will require some improvisation. When mentioning that you're vegetarian you usually will be proposed something fishy, since there are hardly any restaurants with vegetarian plates on the menu. On Rue des Rosiers (4th arrondissement) it is possible to get delicious falafel in the many Jewish restaurants. Another falafel place is at Rue Oberkampf 112 (11th arrondissement). Also, in Rue Belleville, close to Place Frehel there is also a little falafel place. Usually take away falafel goes for 4 EUR or less. Another low budget option is to ask for a ''barquette frites'' in the omnipresent shoarma places. Also look North African restaurants which often serve vegetarian couscous. For '''seafood''' lovers, Paris is a great place to try "moules frites" (steamed mussels and French fries), oysters, sea snails, and other delicacies. '''Meat''' specalties include deer, boar, and other game (especially in the fall and winter hunting season), as well as French favorites such as lamb, veal, beef, and pork. *'''Padova''', near RER station Port Royal. Good and ''big'' Italian food in this family-style restaurant. http://perso.wanadoo.fr/padova ==Drink== '''Monaco''' is a mix of beer and lemonade with a bit of grenadine syrup added. '''Kir''' is a sweet apertiff of white wine or champagne (''kir royale'') and cassies (blackcurrent liqueur). ===Wheres=== '''Bars''' *Buddha Bar '''Clubs''' *Fleche d'Or (20th) *Bateaufar (13th) '''Events''' *Techno parade Information about (usually leftist) manifestations can be found at Paris' [http://paris.indymedia.org Indymedia site]. ==Sleep== Generally one should be aware that Paris hotels, almost without regard to category or price, observe high and low seasons. These differ slightly from one hotel to another, but usually the high season roughly corresponds to late spring and summer, and possibly a couple of weeks around the Christmas season. ====Budget==== There are still lots of bargains in Paris. If you have time it might be worthwhile to scour the city in search of a nice undiscovered two star. You should be aware that the quality of hotels varies widely, and is only vaguely connected with the star system, which only guarantees that certain services exist and does not exactly reflect quality. It's probably wise to ask to see a room if you are considering a night in an unknown two star, or maybe even three. Once you enter the four and five star level this is probably not necessary. Be aware that demand for rooms at a given hotel goes up when it is listed in a guide be it Wikitravel or one of the commercial guides. This means that you should probably book ahead for a room in any place you read about here, especially in the high season. If the place you call doesn't have a room they might know about a nearby place which does. It never hurts to ask. When with two it can be a much better deal to find a hotel room than to get 2 hostel beds. More privacy for less money. *'''3 Ducks Hostel''' 6, place Etienne Pernet (''metro:Commerce''). A fun hostel with a great atmosphere. Has a shared kitchen, a bar and an interior courtyard. http://www.3ducks.fr/ *'''Hotel Eldorado''', Rue des Dames 18, ''17th'' (''metro: Place de Clichy''), +33 1 45 22 35 21. The Eldorado, a former ''maison de rendez-vous'', was once home to the kept women of the 19th century bourgeois. Now a very cute ''no'' star hotel, its charm more than makes up for what it lacks in amenities (who needs a TV in Paris anyway?). The staff is super friendly, the decor is garage sale chic, and there’s a lovely courtyard that fills with neighbourhood hipsters on warm evenings. It also has a very good location & you can easily avoid the noise of Pigalle or Montmartre's high prices, but they’re within stumble distance if you decide to explore. For early risers breakfast (5 Eur., until 10 am) is served in the attached restaurant/bar. Some English spoken, especially for those who pet the cat sprawled across the reception desk. 23/39 Eur. - 49/79 Eur. (''singles/doubles'') *'''Hotel de Lille''', 2 rue du Montholon, (''metro: Poissonière''), +33 1 47 70 38 76 fax: +33 1 48 00 04 55. Hotel de Lille is a cheap, family-run fairly spartan yet charming hotel in the centre of Paris, near the Gare du Nord. Sometimes you may find that you can't book ahead. In that case after a few calls you may find that all of the cute, charming places recommended by this and other guides are full. You may still have the option of shopping around on foot as we've mentioned above, but if you'd rather sacrifice charm for convenience there is the chain hotel option. The '''Ibis''' chain in particular serves the budget-to-mid price niche. *'''Ibis Gare De Lyon Diderot''', 31 Bis Boulevard Diderot, ''12th'' (''metro: Gare de Lyon''), (+33)1/43 46 12 72. This particular branch of the Ibis chain is a bit more comfortable than most, especially worthwhile if you have just arrived at Gare de Lyon. The website has current price information, and links to their 650 sister hotels across Europe. Breakfast (10 Eur., until 10 am) is the pretty ordinary buffet faire. [[http://www.ibishotel.com/ibis/fichehotel/gb/ibi/3211/fiche_hotel.shtml Ibis Gare de Lyon Diderot]] ====Mid-range==== ====Splurge==== ==Stay safe== In general Paris is a safe city. There are some areas, like Barbès (18th), where it's better not to hang around alone at night, but they are easily recognizable by their raunchiness. Also some parts of the ''banlieue'' are better to avoid. The metro is relatively safe. [[WikiPedia:Paris]] libwww-mediawiki-client-perl-0.31/t/files/merged.wiki0000600001161000116100000002650310442767660017544 0ustar [[ro:Paris]]
[[Image:Paris-seine-center-200px.jpg|Paris/The Seine]]
''The Seine River, Paris''

'''Paris''' is the capital of [[France]] and - with 2 million people living in the center and some 10 million people in the suburbs (''la banlieue'') - one of the largest cities in [[Europe]]. The city is divided into 20 districts called ''arondissements''; these are numbered from 1 to 20 in a clockwise spiral from the center. ==Understand== ==Districts== *... *[[Paris/Montmartre]] *... ==Get in== Paris can be reached by car, bus, train, plane. ===By train=== The '''Thalys''' high-speed train, which runs to daily to/from the [[Netherlands]] and [[Switzerland]], is a bit expensive, but if you book more than a week in advance it can still have a reasonable price. The high-speed '''TGV''' train (''Train à Grande Vitesse'') runs several times a day to [[Nice]] and [[Avignon]] in the south, [[Geneva]], Switzerland and [[Dijon]] in the east, and connects with trains and ferries for the passage to [[England]] in the west. Intercity and local trains leave for all parts of [[Europe]], including overnight trains to [[San Sebastian]] in [[Spain]], [[Porto]] and [[Lisbon]] in [[Portugal]]. The Eurostar ( http://www.eurostar.com/ ) connects Paris with [[London]] and [[Brussels]] and many others. Travel time between Paris and [[London]] is approximately 3 hours. There are several stations serving Paris, so make sure you confirm where your train leaves from: * Gare Austerlitz * Gare de l'Est * Gare du Nord - to Belgium and the Netherlands * ===By bus=== *[[Eurolines]] *[[Gullivers Travel]] ===By plane=== * Charles de Gaulle * Orly For more information, including arrival/departure times, check the official [http://www.parisairports.com/ Paris Airports] site. ==Get around== Paris has an excellent metro system. For short visits, a ''carnet'' of ten (slightly discounted) tickets can be bought for 10 EUR at any station. If you're staying a bit longer it might be interesting to get a ''Carte Orange Hebdomadaire'' (1 week pass, 14.5 EUR for zone 1 and 2) or ''Mensuelle'' (1 month pass). For the Carte Orange you need one small photograph, for which there are cabins in most bigger metro stations. Note that an ''Hebdomadaire'' (''eb-DOH-ma-DAYR'': in [[French phrasebook|French]] you don't pronounce the H) starts on Mondays and a Mensuelle on the first of the month. The Carte Orange is also valid in the ''Noctambus'', the night bus, where tickets normally cost 2.5 EUR. Women travellers should probably avoid taking the Noctambus on their own. Fortunately taxis are relatively cheap, especially at night, when there are no traffic jams to be expected. [http://www.ratp.fr RATP] is the regional train system. ==See== ===Main Attractions=== * Eiffel Tower * Chateau de Versailles * '''Pere-Lachaise Cemetery''' (Cimetière du Père Lachaise). See the grave of Jim Morrison amongst many others. * '''Catacombes''' Used to store the exhumed bones from the overflowing Paris cemetery. * '''Arc de Triomphe''' The grave of the unknown soldier is under the arch. ===Churches=== * Notre Dame * Sacre Coeur ===Museums=== *[http://www.louvre.fr/ the Louvre (le Musée du Louvre)]: On par with London's British Museum and New York's Metropolitan Museum, the Louvre is a showcase of world cultures throughout history. Its exhibits come from such diverse origins as ancient Egypt, classical Greece and Rome, medieval Europe and Napoleonic France. Its most famous exhibit, of course, is Leonardo da Vinci's painting of the "'Mona Lisa (la Giaconda)'", generally to be found surrounded by hordes of camera-flashing tourists. *[http://www.musee-orsay.fr/ le Musée d’Orsay] *Centre Pompidou ==Do== * Disneyland Europe ==Learn== Paris is an excellent place to learn French. Paris also has many universities, where you can learn about anything. * Paris II * Paris III - Sorbonne * Paris VI * Paris VIII ==Work== ==Buy== ==Eat== For '''vegetarians''' dining in restaurants will require some improvisation. When mentioning that you're vegetarian you usually will be proposed something fishy, since there are hardly any restaurants with vegetarian plates on the menu. On Rue des Rosiers (4th arrondissement) it is possible to get delicious falafel in the many Jewish restaurants. Another falafel place is at Rue Oberkampf 112 (11th arrondissement). Also, in Rue Belleville, close to Place Frehel there is also a little falafel place. Usually take away falafel goes for 4 EUR or less. Another low budget option is to ask for a ''barquette frites'' in the omnipresent shoarma places. Also look North African restaurants which often serve vegetarian couscous. For '''seafood''' lovers, Paris is a great place to try "moules frites" (steamed mussels and French fries), oysters, sea snails, and other delicacies. '''Meat''' specalties include deer, boar, and other game (especially in the fall and winter hunting season), as well as French favorites such as lamb, veal, beef, and pork. *'''Padova''', near RER station Port Royal. Good and ''big'' Italian food in this family-style restaurant. http://perso.wanadoo.fr/padova ==Drink== '''Monaco''' is a mix of beer and lemonade with a bit of grenadine syrup added. '''Kir''' is a sweet apertiff of white wine or champagne (''kir royale'') and cassies (blackcurrent liqueur). '''Bars''' *Buddha Bar '''Clubs''' *Fleche d'Or (20th) *Bateaufar (13th) '''Events''' *Techno parade Information about (usually leftist) manifestations can be found at Paris' [http://paris.indymedia.org Indymedia site]. ==Sleep== Generally one should be aware that Paris hotels, almost without regard to category or price, observe high and low seasons. These differ slightly from one hotel to another, but usually the high season roughly corresponds to late spring and summer, and possibly a couple of weeks around the Christmas season. ====Budget==== There are still lots of bargains in Paris. If you have time it might be worthwhile to scour the city in search of a nice undiscovered two star. You should be aware that the quality of hotels varies widely, and is only vaguely connected with the star system, which only guarantees that certain services exist and does not exactly reflect quality. It's probably wise to ask to see a room if you are considering a night in an unknown two star, or maybe even three. Once you enter the four and five star level this is probably not necessary. ********************Start of conflict 1 Insert to Primary, Insert to Secondary ************************************************************ Be aware that being listed in a guide or website will sometimes make it a bit harder to get a room. That means that you will probably need to book ahead for anything you read about here, especially in the high season. However, if they don't have a room they sometimes know another place closeby that does have a an open room. **************************************************************************************************** Be aware that demand for rooms at a given hotel goes up when it is listed in a guide be it Wikitravel or one of the commercial guides. This means that you should probably book ahead for a room in any place you read about here, especially in the high season. If the place you call doesn't have a room they might know about a nearby place which does. It never hurts to ask.********************End of conflict 1******************************************************************************** When with two it can be a much better deal to find a hotel room than to get 2 hostel beds. More privacy for less money. *'''3 Ducks Hostel''' 6, place Etienne Pernet (''metro:Commerce''). A fun hostel with a great atmosphere. Has a shared kitchen, a bar and an interior courtyard. http://www.3ducks.fr/ *'''Hotel Eldorado''', Rue des Dames 18, ''17th'' (''metro: Place de Clichy''), +33 1 45 22 35 21. The Eldorado, a former ''maison de rendez-vous'', was once home to the kept women of the 19th century bourgeois. Now a very cute ''no'' star hotel, its charm more than makes up for what it lacks in amenities (who needs a TV in Paris anyway?). The staff is super friendly, the decor is garage sale chic, and there’s a lovely courtyard that fills with neighbourhood hipsters on warm evenings. It also has a very good location & you can easily avoid the noise of Pigalle or Montmartre's high prices, but they’re within stumble distance if you decide to explore. For early risers breakfast (5 Eur., until 10 am) is served in the attached restaurant/bar. Some English spoken, especially for those who pet the cat sprawled across the reception desk. 23/39 Eur. - 49/79 Eur. (''singles/doubles'') *'''Hotel de Lille''', 2 rue du Montholon, (''metro: Poissonière''), +33 1 47 70 38 76 fax: +33 1 48 00 04 55. Hotel de Lille is a cheap, family-run fairly spartan yet charming hotel in the centre of Paris, near the Gare du Nord. Sometimes you may find that you can't book ahead. In that case after a few calls you may find that all of the cute, charming places recommended by this and other guides are full. You may still have the option of shopping around on foot as we've mentioned above, but if you'd rather sacrifice charm for convenience there is the chain hotel option. The '''Ibis''' chain in particular serves the budget-to-mid price niche. *'''Ibis Gare De Lyon Diderot''', 31 Bis Boulevard Diderot, ''12th'' (''metro: Gare de Lyon''), (+33)1/43 46 12 72. This particular branch of the Ibis chain is a bit more comfortable than most, especially worthwhile if you have just arrived at Gare de Lyon. The website has current price information, and links to their 650 sister hotels across Europe. Breakfast (10 Eur., until 10 am) is the pretty ordinary buffet faire. [[http://www.ibishotel.com/ibis/fichehotel/gb/ibi/3211/fiche_hotel.shtml Ibis Gare de Lyon Diderot]] ====Mid-range==== ====Splurge==== ==Stay safe== In general Paris is a safe city. There are some areas, like Barbès (18th), where it's better not to hang around alone at night, but they are easily recognizable by their raunchiness. Also some parts of the ''banlieue'' are better to avoid. The metro is relatively safe. [[WikiPedia:Paris]] libwww-mediawiki-client-perl-0.31/t/files/paris.html0000600001161000116100000004120310442767660017412 0ustar Editing Paris

Editing Paris

From Wikitravel, the free travel guide.


Summary:

Cancel | Editing help

Please note that all contributions to Wikitravel are considered to be released under the Creative Commons Attribution-ShareAlike 1.0 license. (see Wikitravel:Copyleft for details). If you don't want your writing to be edited mercilessly and redistributed at will, then don't submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. DO NOT SUBMIT COPYRIGHTED WORK WITHOUT PERMISSION!

libwww-mediawiki-client-perl-0.31/t/files/paris.wiki0000600001161000116100000002514710442767660017422 0ustar [[ro:Paris]]
[[Image:Paris-seine-center-200px.jpg|Paris/The Seine]]
''The Seine River, Paris''

'''Paris''' is the capital of [[France]] and - with 2 million people living in the center and some 10 million people in the suburbs (''la banlieue'') - one of the largest cities in [[Europe]]. The city is divided into 20 districts called ''arondissements''; these are numbered from 1 to 20 in a clockwise spiral from the center. ==Understand== ==Districts== *... *[[Paris/Montmartre]] *... ==Get in== Paris can be reached by car, bus, train, plane. ===By train=== The '''Thalys''' high-speed train, which runs to daily to/from the [[Netherlands]] and [[Switzerland]], is a bit expensive, but if you book more than a week in advance it can still have a reasonable price. The high-speed '''TGV''' train (''Train à Grande Vitesse'') runs several times a day to [[Nice]] and [[Avignon]] in the south, [[Geneva]], Switzerland and [[Dijon]] in the east, and connects with trains and ferries for the passage to [[England]] in the west. Intercity and local trains leave for all parts of [[Europe]], including overnight trains to [[San Sebastian]] in [[Spain]], [[Porto]] and [[Lisbon]] in [[Portugal]]. The Eurostar ( http://www.eurostar.com/ ) connects Paris with [[London]] and [[Brussels]] and many others. Travel time between Paris and [[London]] is approximately 3 hours. There are several stations serving Paris, so make sure you confirm where your train leaves from: * Gare Austerlitz * Gare de l'Est * Gare du Nord - to Belgium and the Netherlands * ===By bus=== *[[Eurolines]] *[[Gullivers Travel]] ===By plane=== * Charles de Gaulle * Orly For more information, including arrival/departure times, check the official [http://www.parisairports.com/ Paris Airports] site. ==Get around== Paris has an excellent metro system. For short visits, a ''carnet'' of ten (slightly discounted) tickets can be bought for 10 EUR at any station. If you're staying a bit longer it might be interesting to get a ''Carte Orange Hebdomadaire'' (1 week pass, 14.5 EUR for zone 1 and 2) or ''Mensuelle'' (1 month pass). For the Carte Orange you need one small photograph, for which there are cabins in most bigger metro stations. Note that an ''Hebdomadaire'' (''eb-DOH-ma-DAYR'': in [[French phrasebook|French]] you don't pronounce the H) starts on Mondays and a Mensuelle on the first of the month. The Carte Orange is also valid in the ''Noctambus'', the night bus, where tickets normally cost 2.5 EUR. Women travellers should probably avoid taking the Noctambus on their own. Fortunately taxis are relatively cheap, especially at night, when there are no traffic jams to be expected. [http://www.ratp.fr RATP] is the regional train system. ==See== ===Main Attractions=== * Eiffel Tower * Chateau de Versailles * '''Pere-Lachaise Cemetery''' (Cimetière du Père Lachaise). See the grave of Jim Morrison amongst many others. * '''Catacombes''' Used to store the exhumed bones from the overflowing Paris cemetery. * '''Arc de Triomphe''' The grave of the unknown soldier is under the arch. ===Churches=== * Notre Dame * Sacre Coeur ===Museums=== *[http://www.louvre.fr/ the Louvre (le Musée du Louvre)]: On par with London's British Museum and New York's Metropolitan Museum, the Louvre is a showcase of world cultures throughout history. Its exhibits come from such diverse origins as ancient Egypt, classical Greece and Rome, medieval Europe and Napoleonic France. Its most famous exhibit, of course, is Leonardo da Vinci's painting of the "'Mona Lisa (la Giaconda)'", generally to be found surrounded by hordes of camera-flashing tourists. *[http://www.musee-orsay.fr/ le Musée d’Orsay] *Centre Pompidou ==Do== * Disneyland Europe ==Learn== Paris is an excellent place to learn French. Paris also has many universities, where you can learn about anything. * Paris II * Paris III - Sorbonne * Paris VI * Paris VIII ==Work== ==Buy== ==Eat== For '''vegetarians''' eating in restaurants will require some improvisation. When mentioning that you're vegetarian you usually will be proposed something fishy, since there are hardly any restaurants with vegetarian plates on the menu. In Rue des Rosiers (4th arrondissement) it is possible to get delicious falafel in the many Jewish restaurants. Another falafel place is at Rue Oberkampf 112 (11th arrondissement). Also, in Rue Belleville, close to Place Frehel there is also a little falafel place. Usually take away falafel goes for 4 EUR or less. Another low budget option is to ask for a ''barquette frites'' in the omnipresent shoarma places. Also look North African restaurants which often serve vegetarian couscous. For '''seafood''' lovers, Paris is a great place to try "moules frites" (steamed mussels and French fries), oysters, sea snails, and other delicacies. '''Meat''' specalties include deer, boar, and other game (especially in the fall and winter hunting season), as well as French favorites such as lamb, veal, beef, and pork. *'''Padova''', near RER station Port Royal. Good and ''big'' Italian food in this family-style restaurant. http://perso.wanadoo.fr/padova ==Drink== '''Monaco''' is a mix of beer and lemonade with a bit of grenadine syrup added. '''Kir''' is a sweet apertiff of white wine or champagne (''kir royale'') and cassies (blackcurrent liqueur). ===Wheres=== '''Bars''' *Buddha Bar '''Clubs''' *Fleche d'Or (20th) *Bateaufar (13th) '''Events''' *Techno parade Information about (usually leftist) manifestations can be found at Paris' [http://paris.indymedia.org Indymedia site]. ==Sleep== Generally one should be aware that Paris hotels, almost without regard to category or price, observe high and low seasons. These differ slightly from one hotel to another, but usually the high season roughly corresponds to late spring and summer, and possibly a couple of weeks around the Christmas season. ====Budget==== There are still lots of bargains in Paris. If you have time it might be worthwhile to scour the city in search of a nice undiscovered two star. You should be aware that the quality of hotels varies widely, and is only vaguely connected with the star system, which only guarantees that certain services exist and does not exactly reflect quality. It's probably wise to ask to see a room if you are considering a night in an unknown two star, or maybe even three. Once you enter the four and five star level this is probably not necessary. Be aware that being listed in a guide or website will eventually make it a bit harder to get a room. That means that you will probably need to book ahead for anything you read about here, especially in the high season. However, if they don't have a room they sometimes know another place closeby that does have a free one. When with two it can be a much better deal to find a hotel room than to get 2 hostel beds. More privacy for less money. *'''3 Ducks Hostel''' 6, place Etienne Pernet (''metro:Commerce''). A fun hostel with a great atmosphere. Has a shared kitchen, a bar and an interior courtyard. http://www.3ducks.fr/ *'''Hotel Eldorado''', Rue des Dames 18, ''17th'' (''metro: Place de Clichy''), +33 1 45 22 35 21. The Eldorado, a former ''maison de rendez-vous'', was once home to the kept women of the 19th century bourgeois. Now a very cute ''no'' star hotel, its charm more than makes up for what it lacks in amenities (who needs a TV in Paris anyway?). The staff is super friendly, the decor is garage sale chic, and there’s a lovely courtyard that fills with neighbourhood hipsters on warm evenings. It also has a very good location & you can easily avoid the noise of Pigalle or Montmartre's high prices, but they’re within stumble distance if you decide to explore. For early risers breakfast (5 Eur., until 10 am) is served in the attached restaurant/bar. Some English spoken, especially for those who pet the cat sprawled across the reception desk. 23/39 Eur. - 49/79 Eur. (''singles/doubles'') *'''Hotel de Lille''', 2 rue du Montholon, (''metro: Poissonière''), +33 1 47 70 38 76 fax: +33 1 48 00 04 55. Hotel de Lille is a cheap, family-run fairly spartan yet charming hotel in the centre of Paris, near the Gare du Nord. Sometimes you may find that you can't book ahead. In that case after a few calls you may find that all of the cute, charming places recommended by this and other guides are full. You may still have the option of shopping around on foot as we've mentioned above, but if you'd rather sacrifice charm for convenience there is the chain hotel option. The '''Ibis''' chain in particular serves the budget-to-mid price niche. *'''Ibis Gare De Lyon Diderot''', 31 Bis Boulevard Diderot, ''12th'' (''metro: Gare de Lyon''), (+33)1/43 46 12 72. This particular branch of the Ibis chain is a bit more comfortable than most, especially worthwhile if you have just arrived at Gare de Lyon. The website has current price information, and links to their 650 sister hotels across Europe. Breakfast (10 Eur., until 10 am) is the pretty ordinary buffet faire. [[http://www.ibishotel.com/ibis/fichehotel/gb/ibi/3211/fiche_hotel.shtml Ibis Gare de Lyon Diderot]] ====Mid-range==== ====Splurge==== ==Stay safe== In general Paris is a safe city. There are some areas, like Barbès (18th), where it's better not to hang around alone at night, but they are easily recognizable by their raunchiness. Also some parts of the ''banlieue'' are better to avoid. The metro is relatively safe. [[WikiPedia:Paris]] libwww-mediawiki-client-perl-0.31/t/files/reference.wiki0000600001161000116100000002514710442767660020242 0ustar [[ro:Paris]]
[[Image:Paris-seine-center-200px.jpg|Paris/The Seine]]
''The Seine River, Paris''

'''Paris''' is the capital of [[France]] and - with 2 million people living in the center and some 10 million people in the suburbs (''la banlieue'') - one of the largest cities in [[Europe]]. The city is divided into 20 districts called ''arondissements''; these are numbered from 1 to 20 in a clockwise spiral from the center. ==Understand== ==Districts== *... *[[Paris/Montmartre]] *... ==Get in== Paris can be reached by car, bus, train, plane. ===By train=== The '''Thalys''' high-speed train, which runs to daily to/from the [[Netherlands]] and [[Switzerland]], is a bit expensive, but if you book more than a week in advance it can still have a reasonable price. The high-speed '''TGV''' train (''Train à Grande Vitesse'') runs several times a day to [[Nice]] and [[Avignon]] in the south, [[Geneva]], Switzerland and [[Dijon]] in the east, and connects with trains and ferries for the passage to [[England]] in the west. Intercity and local trains leave for all parts of [[Europe]], including overnight trains to [[San Sebastian]] in [[Spain]], [[Porto]] and [[Lisbon]] in [[Portugal]]. The Eurostar ( http://www.eurostar.com/ ) connects Paris with [[London]] and [[Brussels]] and many others. Travel time between Paris and [[London]] is approximately 3 hours. There are several stations serving Paris, so make sure you confirm where your train leaves from: * Gare Austerlitz * Gare de l'Est * Gare du Nord - to Belgium and the Netherlands * ===By bus=== *[[Eurolines]] *[[Gullivers Travel]] ===By plane=== * Charles de Gaulle * Orly For more information, including arrival/departure times, check the official [http://www.parisairports.com/ Paris Airports] site. ==Get around== Paris has an excellent metro system. For short visits, a ''carnet'' of ten (slightly discounted) tickets can be bought for 10 EUR at any station. If you're staying a bit longer it might be interesting to get a ''Carte Orange Hebdomadaire'' (1 week pass, 14.5 EUR for zone 1 and 2) or ''Mensuelle'' (1 month pass). For the Carte Orange you need one small photograph, for which there are cabins in most bigger metro stations. Note that an ''Hebdomadaire'' (''eb-DOH-ma-DAYR'': in [[French phrasebook|French]] you don't pronounce the H) starts on Mondays and a Mensuelle on the first of the month. The Carte Orange is also valid in the ''Noctambus'', the night bus, where tickets normally cost 2.5 EUR. Women travellers should probably avoid taking the Noctambus on their own. Fortunately taxis are relatively cheap, especially at night, when there are no traffic jams to be expected. [http://www.ratp.fr RATP] is the regional train system. ==See== ===Main Attractions=== * Eiffel Tower * Chateau de Versailles * '''Pere-Lachaise Cemetery''' (Cimetière du Père Lachaise). See the grave of Jim Morrison amongst many others. * '''Catacombes''' Used to store the exhumed bones from the overflowing Paris cemetery. * '''Arc de Triomphe''' The grave of the unknown soldier is under the arch. ===Churches=== * Notre Dame * Sacre Coeur ===Museums=== *[http://www.louvre.fr/ the Louvre (le Musée du Louvre)]: On par with London's British Museum and New York's Metropolitan Museum, the Louvre is a showcase of world cultures throughout history. Its exhibits come from such diverse origins as ancient Egypt, classical Greece and Rome, medieval Europe and Napoleonic France. Its most famous exhibit, of course, is Leonardo da Vinci's painting of the "'Mona Lisa (la Giaconda)'", generally to be found surrounded by hordes of camera-flashing tourists. *[http://www.musee-orsay.fr/ le Musée d’Orsay] *Centre Pompidou ==Do== * Disneyland Europe ==Learn== Paris is an excellent place to learn French. Paris also has many universities, where you can learn about anything. * Paris II * Paris III - Sorbonne * Paris VI * Paris VIII ==Work== ==Buy== ==Eat== For '''vegetarians''' eating in restaurants will require some improvisation. When mentioning that you're vegetarian you usually will be proposed something fishy, since there are hardly any restaurants with vegetarian plates on the menu. In Rue des Rosiers (4th arrondissement) it is possible to get delicious falafel in the many Jewish restaurants. Another falafel place is at Rue Oberkampf 112 (11th arrondissement). Also, in Rue Belleville, close to Place Frehel there is also a little falafel place. Usually take away falafel goes for 4 EUR or less. Another low budget option is to ask for a ''barquette frites'' in the omnipresent shoarma places. Also look North African restaurants which often serve vegetarian couscous. For '''seafood''' lovers, Paris is a great place to try "moules frites" (steamed mussels and French fries), oysters, sea snails, and other delicacies. '''Meat''' specalties include deer, boar, and other game (especially in the fall and winter hunting season), as well as French favorites such as lamb, veal, beef, and pork. *'''Padova''', near RER station Port Royal. Good and ''big'' Italian food in this family-style restaurant. http://perso.wanadoo.fr/padova ==Drink== '''Monaco''' is a mix of beer and lemonade with a bit of grenadine syrup added. '''Kir''' is a sweet apertiff of white wine or champagne (''kir royale'') and cassies (blackcurrent liqueur). ===Wheres=== '''Bars''' *Buddha Bar '''Clubs''' *Fleche d'Or (20th) *Bateaufar (13th) '''Events''' *Techno parade Information about (usually leftist) manifestations can be found at Paris' [http://paris.indymedia.org Indymedia site]. ==Sleep== Generally one should be aware that Paris hotels, almost without regard to category or price, observe high and low seasons. These differ slightly from one hotel to another, but usually the high season roughly corresponds to late spring and summer, and possibly a couple of weeks around the Christmas season. ====Budget==== There are still lots of bargains in Paris. If you have time it might be worthwhile to scour the city in search of a nice undiscovered two star. You should be aware that the quality of hotels varies widely, and is only vaguely connected with the star system, which only guarantees that certain services exist and does not exactly reflect quality. It's probably wise to ask to see a room if you are considering a night in an unknown two star, or maybe even three. Once you enter the four and five star level this is probably not necessary. Be aware that being listed in a guide or website will eventually make it a bit harder to get a room. That means that you will probably need to book ahead for anything you read about here, especially in the high season. However, if they don't have a room they sometimes know another place closeby that does have a free one. When with two it can be a much better deal to find a hotel room than to get 2 hostel beds. More privacy for less money. *'''3 Ducks Hostel''' 6, place Etienne Pernet (''metro:Commerce''). A fun hostel with a great atmosphere. Has a shared kitchen, a bar and an interior courtyard. http://www.3ducks.fr/ *'''Hotel Eldorado''', Rue des Dames 18, ''17th'' (''metro: Place de Clichy''), +33 1 45 22 35 21. The Eldorado, a former ''maison de rendez-vous'', was once home to the kept women of the 19th century bourgeois. Now a very cute ''no'' star hotel, its charm more than makes up for what it lacks in amenities (who needs a TV in Paris anyway?). The staff is super friendly, the decor is garage sale chic, and there’s a lovely courtyard that fills with neighbourhood hipsters on warm evenings. It also has a very good location & you can easily avoid the noise of Pigalle or Montmartre's high prices, but they’re within stumble distance if you decide to explore. For early risers breakfast (5 Eur., until 10 am) is served in the attached restaurant/bar. Some English spoken, especially for those who pet the cat sprawled across the reception desk. 23/39 Eur. - 49/79 Eur. (''singles/doubles'') *'''Hotel de Lille''', 2 rue du Montholon, (''metro: Poissonière''), +33 1 47 70 38 76 fax: +33 1 48 00 04 55. Hotel de Lille is a cheap, family-run fairly spartan yet charming hotel in the centre of Paris, near the Gare du Nord. Sometimes you may find that you can't book ahead. In that case after a few calls you may find that all of the cute, charming places recommended by this and other guides are full. You may still have the option of shopping around on foot as we've mentioned above, but if you'd rather sacrifice charm for convenience there is the chain hotel option. The '''Ibis''' chain in particular serves the budget-to-mid price niche. *'''Ibis Gare De Lyon Diderot''', 31 Bis Boulevard Diderot, ''12th'' (''metro: Gare de Lyon''), (+33)1/43 46 12 72. This particular branch of the Ibis chain is a bit more comfortable than most, especially worthwhile if you have just arrived at Gare de Lyon. The website has current price information, and links to their 650 sister hotels across Europe. Breakfast (10 Eur., until 10 am) is the pretty ordinary buffet faire. [[http://www.ibishotel.com/ibis/fichehotel/gb/ibi/3211/fiche_hotel.shtml Ibis Gare de Lyon Diderot]] ====Mid-range==== ====Splurge==== ==Stay safe== In general Paris is a safe city. There are some areas, like Barbès (18th), where it's better not to hang around alone at night, but they are easily recognizable by their raunchiness. Also some parts of the ''banlieue'' are better to avoid. The metro is relatively safe. [[WikiPedia:Paris]] libwww-mediawiki-client-perl-0.31/t/files/server.wiki0000600001161000116100000002514010442767660017603 0ustar [[ro:Paris]]
[[Image:Paris-seine-center-200px.jpg|Paris/The Seine]]
''The Seine River, Paris''

'''Paris''' is the capital of [[France]] and - with 2 million people living in the center and some 10 million people in the suburbs (''la banlieue'') - one of the largest cities in [[Europe]]. The city is divided into 20 districts called ''arondissements''; these are numbered from 1 to 20 in a clockwise spiral from the center. ==Understand== ==Districts== *... *[[Paris/Montmartre]] *... ==Get in== Paris can be reached by car, bus, train, plane. ===By train=== The '''Thalys''' high-speed train, which runs to daily to/from the [[Netherlands]] and [[Switzerland]], is a bit expensive, but if you book more than a week in advance it can still have a reasonable price. The high-speed '''TGV''' train (''Train à Grande Vitesse'') runs several times a day to [[Nice]] and [[Avignon]] in the south, [[Geneva]], Switzerland and [[Dijon]] in the east, and connects with trains and ferries for the passage to [[England]] in the west. Intercity and local trains leave for all parts of [[Europe]], including overnight trains to [[San Sebastian]] in [[Spain]], [[Porto]] and [[Lisbon]] in [[Portugal]]. The Eurostar ( http://www.eurostar.com/ ) connects Paris with [[London]] and [[Brussels]] and many others. Travel time between Paris and [[London]] is approximately 3 hours. There are several stations serving Paris, so make sure you confirm where your train leaves from: * Gare Austerlitz * Gare de l'Est * Gare du Nord - to Belgium and the Netherlands * ===By bus=== *[[Eurolines]] *[[Gullivers Travel]] ===By plane=== * Charles de Gaulle * Orly For more information, including arrival/departure times, check the official [http://www.parisairports.com/ Paris Airports] site. ==Get around== Paris has an excellent metro system. For short visits, a ''carnet'' of ten (slightly discounted) tickets can be bought for 10 EUR at any station. If you're staying a bit longer it might be interesting to get a ''Carte Orange Hebdomadaire'' (1 week pass, 14.5 EUR for zone 1 and 2) or ''Mensuelle'' (1 month pass). For the Carte Orange you need one small photograph, for which there are cabins in most bigger metro stations. Note that an ''Hebdomadaire'' (''eb-DOH-ma-DAYR'': in [[French phrasebook|French]] you don't pronounce the H) starts on Mondays and a Mensuelle on the first of the month. The Carte Orange is also valid in the ''Noctambus'', the night bus, where tickets normally cost 2.5 EUR. Women travellers should probably avoid taking the Noctambus on their own. Fortunately taxis are relatively cheap, especially at night, when there are no traffic jams to be expected. [http://www.ratp.fr RATP] is the regional train system. ==See== ===Main Attractions=== * Eiffel Tower * Chateau de Versailles * '''Pere-Lachaise Cemetery''' (Cimetière du Père Lachaise). See the grave of Jim Morrison amongst many others. * '''Catacombes''' Used to store the exhumed bones from the overflowing Paris cemetery. * '''Arc de Triomphe''' The grave of the unknown soldier is under the arch. ===Churches=== * Notre Dame * Sacre Coeur ===Museums=== *[http://www.louvre.fr/ the Louvre (le Musée du Louvre)]: On par with London's British Museum and New York's Metropolitan Museum, the Louvre is a showcase of world cultures throughout history. Its exhibits come from such diverse origins as ancient Egypt, classical Greece and Rome, medieval Europe and Napoleonic France. Its most famous exhibit, of course, is Leonardo da Vinci's painting of the "'Mona Lisa (la Giaconda)'", generally to be found surrounded by hordes of camera-flashing tourists. *[http://www.musee-orsay.fr/ le Musée d’Orsay] *Centre Pompidou ==Do== * Disneyland Europe ==Learn== Paris is an excellent place to learn French. Paris also has many universities, where you can learn about anything. * Paris II * Paris III - Sorbonne * Paris VI * Paris VIII ==Work== ==Buy== ==Eat== For '''vegetarians''' eating in restaurants will require some improvisation. When mentioning that you're vegetarian you usually will be proposed something fishy, since there are hardly any restaurants with vegetarian plates on the menu. In Rue des Rosiers (4th arrondissement) it is possible to get delicious falafel in the many Jewish restaurants. Another falafel place is at Rue Oberkampf 112 (11th arrondissement). Also, in Rue Belleville, close to Place Frehel there is also a little falafel place. Usually take away falafel goes for 4 EUR or less. Another low budget option is to ask for a ''barquette frites'' in the omnipresent shoarma places. Also look North African restaurants which often serve vegetarian couscous. For '''seafood''' lovers, Paris is a great place to try "moules frites" (steamed mussels and French fries), oysters, sea snails, and other delicacies. '''Meat''' specalties include deer, boar, and other game (especially in the fall and winter hunting season), as well as French favorites such as lamb, veal, beef, and pork. *'''Padova''', near RER station Port Royal. Good and ''big'' Italian food in this family-style restaurant. http://perso.wanadoo.fr/padova ==Drink== '''Monaco''' is a mix of beer and lemonade with a bit of grenadine syrup added. '''Kir''' is a sweet apertiff of white wine or champagne (''kir royale'') and cassies (blackcurrent liqueur). '''Bars''' *Buddha Bar '''Clubs''' *Fleche d'Or (20th) *Bateaufar (13th) '''Events''' *Techno parade Information about (usually leftist) manifestations can be found at Paris' [http://paris.indymedia.org Indymedia site]. ==Sleep== Generally one should be aware that Paris hotels, almost without regard to category or price, observe high and low seasons. These differ slightly from one hotel to another, but usually the high season roughly corresponds to late spring and summer, and possibly a couple of weeks around the Christmas season. ====Budget==== There are still lots of bargains in Paris. If you have time it might be worthwhile to scour the city in search of a nice undiscovered two star. You should be aware that the quality of hotels varies widely, and is only vaguely connected with the star system, which only guarantees that certain services exist and does not exactly reflect quality. It's probably wise to ask to see a room if you are considering a night in an unknown two star, or maybe even three. Once you enter the four and five star level this is probably not necessary. Be aware that being listed in a guide or website will sometimes make it a bit harder to get a room. That means that you will probably need to book ahead for anything you read about here, especially in the high season. However, if they don't have a room they sometimes know another place closeby that does have a an open room. When with two it can be a much better deal to find a hotel room than to get 2 hostel beds. More privacy for less money. *'''3 Ducks Hostel''' 6, place Etienne Pernet (''metro:Commerce''). A fun hostel with a great atmosphere. Has a shared kitchen, a bar and an interior courtyard. http://www.3ducks.fr/ *'''Hotel Eldorado''', Rue des Dames 18, ''17th'' (''metro: Place de Clichy''), +33 1 45 22 35 21. The Eldorado, a former ''maison de rendez-vous'', was once home to the kept women of the 19th century bourgeois. Now a very cute ''no'' star hotel, its charm more than makes up for what it lacks in amenities (who needs a TV in Paris anyway?). The staff is super friendly, the decor is garage sale chic, and there’s a lovely courtyard that fills with neighbourhood hipsters on warm evenings. It also has a very good location & you can easily avoid the noise of Pigalle or Montmartre's high prices, but they’re within stumble distance if you decide to explore. For early risers breakfast (5 Eur., until 10 am) is served in the attached restaurant/bar. Some English spoken, especially for those who pet the cat sprawled across the reception desk. 23/39 Eur. - 49/79 Eur. (''singles/doubles'') *'''Hotel de Lille''', 2 rue du Montholon, (''metro: Poissonière''), +33 1 47 70 38 76 fax: +33 1 48 00 04 55. Hotel de Lille is a cheap, family-run fairly spartan yet charming hotel in the centre of Paris, near the Gare du Nord. Sometimes you may find that you can't book ahead. In that case after a few calls you may find that all of the cute, charming places recommended by this and other guides are full. You may still have the option of shopping around on foot as we've mentioned above, but if you'd rather sacrifice charm for convenience there is the chain hotel option. The '''Ibis''' chain in particular serves the budget-to-mid price niche. *'''Ibis Gare De Lyon Diderot''', 31 Bis Boulevard Diderot, ''12th'' (''metro: Gare de Lyon''), (+33)1/43 46 12 72. This particular branch of the Ibis chain is a bit more comfortable than most, especially worthwhile if you have just arrived at Gare de Lyon. The website has current price information, and links to their 650 sister hotels across Europe. Breakfast (10 Eur., until 10 am) is the pretty ordinary buffet faire. [[http://www.ibishotel.com/ibis/fichehotel/gb/ibi/3211/fiche_hotel.shtml Ibis Gare de Lyon Diderot]] ====Mid-range==== ====Splurge==== ==Stay safe== In general Paris is a safe city. There are some areas, like Barbès (18th), where it's better not to hang around alone at night, but they are easily recognizable by their raunchiness. Also some parts of the ''banlieue'' are better to avoid. The metro is relatively safe. [[WikiPedia:Paris]] libwww-mediawiki-client-perl-0.31/t/mvs.t0000711001161000116100000000024410442767660015301 0ustar #!/usr/bin/perl -w use strict; use Test::More tests=> 1; use Test::Differences; BEGIN { use_ok('WWW::Mediawiki::Client'); } 1; __END__ # vim:syntax=perl: libwww-mediawiki-client-perl-0.31/t/server.t0000711001161000116100000001761010447461235016001 0ustar #!/usr/bin/perl -w use strict; use Test::More; use Test::Differences; use WWW::Mediawiki::Client; use Data::Dumper; chdir "t/files"; if (-e WWW::Mediawiki::Client->CONFIG_FILE) { plan tests => 23; } else { plan skip_all => 'Must configure a local Mediawiki server ' . 'to run server tests'; } # To run these tests you should get a copy of Mediawiki and set it up under # Apache running locally. Then copy t/files/example.mediawiki to # t/files/.mediawiki and edit it with your host name, login and password. # Our test Wiki page my $WIKIDATA = q{==Test Page== This is a test page created by WWW::Mediawiki::Client, the Perl client library for Mediawiki servers. Should this page appear on a real live Mediawiki installation it is usually safe to delete. For more info on WWW::Mediawiki::Client see [http://www.wikitravel.org/User:Mark/WWW-Mediawiki-Client]. The Client library is available for download at CPAN.}; # load the test data undef $/; open(IN, WWW::Mediawiki::Client->CONFIG_FILE); my $Conf = ; close IN; $/= "\n"; # Make a test directory my $Testdir = '/tmp/mvsservertest.' . time; mkdir $Testdir or die "Could not make $Testdir. Check the permissions on /tmp."; my $Alttestdir = '/tmp/altmvsservertest.' . time; mkdir $Alttestdir or die "Could not make $Alttestdir. Check the permissions on /tmp."; my $Cleantestdir = '/tmp/cleanmvsservertest.' . time; mkdir $Cleantestdir or die "Could not make $Cleantestdir. Check the permissions on /tmp."; chdir $Testdir; # Copy the conf file open(OUT, '>' . WWW::Mediawiki::Client->CONFIG_FILE) or die "Cannot open conf file for writing"; print OUT $Conf; close OUT; # create a client and load the conf file my $mvs = WWW::Mediawiki::Client->new(); $mvs->load_state; my $host = $mvs->host; my $path = $mvs->wiki_path; my $username = $mvs->username; my $password = $mvs->password; # Make a User test dir my $Testuser = $mvs->username; my $Userdir = "User:$Testuser"; my $Testuserdir = "$Userdir/Test"; mkdir "$Testdir/$Userdir" or die "Cannot make directory $Userdir"; mkdir "$Testdir/$Testuserdir" or die "Cannot make directory $Testuserdir"; my $Testfile = "$Testuserdir/Test_page" . time . ".wiki"; open (OUT, ">$Testdir/$Testfile") or die "Cannot open $Testfile for writing."; print OUT $WIKIDATA; close OUT; # FUNCTION TESTS: # Test do_login for the correct cookie file ok(eval { $mvs->do_login }, 'Am able to login to the configured server.'); if ($@ && UNIVERSAL::isa($@, 'WWW::Mediawiki::Client::LoginException')) { diag("Error Message:\n" . $@->error); diag("\nServer Response:\n" . Dumper($@->res)); diag("\nCookies\n:" . $@->cookie_jar->as_string); }; ok(eval { $mvs->do_li }, '... and the alias works'); $mvs->host('www.example.com'); eval { $mvs->do_login }; isa_ok($@, 'WWW::Mediawiki::Client::LoginException', '... and login throws an exception if the host is not a Mediawiki host'); $mvs->host($host); ok(eval { $mvs->do_li }, '... and we can set it back again, and it works.'); $mvs->username(''); $mvs->password('foo'); eval { $mvs->do_login }; isa_ok($@, 'WWW::Mediawiki::Client::LoginException', '... and login throws an exception if the username and password are bad'); # Test with a file that does not exist, either here or on the server $mvs = WWW::Mediawiki::Client->new(); $mvs->load_state; eval { $mvs->do_login }; my $nosuchfile = 'apoaijselknaeroinqweproiuqwrehasdfnfuwreg.wiki'; is($mvs->do_update($nosuchfile)->{$nosuchfile}, WWW::Mediawiki::Client::STATUS_UNKNOWN, 'Update returns correct status for totally new file'); # Test do_update with new local file $mvs = WWW::Mediawiki::Client->new(); $mvs->load_state; eval { $mvs->do_login }; is($mvs->do_update($Testfile)->{$Testfile}, WWW::Mediawiki::Client::STATUS_LOCAL_ADDED, 'Update returns correct status for new local file'); # Test do_commit with same new local file eval { $mvs->do_commit($Testfile) }; isa_ok($@, 'WWW::Mediawiki::Client::CommitMessageException', 'Do we get an exception trying to commit without a message?'); $mvs->commit_message('testing commit with new page'); ok($mvs->do_commit($Testfile), '... and does it work after we supply one?'); # Test get_server_page to see if we get the same data back my $pagename = $mvs->filename_to_pagename($Testfile); eq_or_diff($mvs->get_server_page($pagename), $WIKIDATA, '... and did it really result in the right data going onto the page?'); # do_update with a new file and then delete it is($mvs->do_update($Testfile)->{$Testfile}, WWW::Mediawiki::Client::STATUS_UNCHANGED, '... and when we do update with the same file, the status should be unchanged'); unlink $Testfile; is($mvs->do_update($Testfile)->{$Testfile}, WWW::Mediawiki::Client::STATUS_SERVER_MODIFIED, '... then after deleting the file it should show up as server modified'); # Test do_update again, this time to see if the file is downloaded correctly is($mvs->do_update($Testfile)->{$Testfile}, WWW::Mediawiki::Client::STATUS_UNCHANGED, '... and since the last update got the server version another one should report unchanged.'); # Modify the file with some text which is *not* going to be interpolated open (OUT, ">>$Testfile"); print OUT qq{ ==Local change test== Testing the ability to detect local changes. }; close OUT; is($mvs->do_update($Testfile)->{$Testfile}, WWW::Mediawiki::Client::STATUS_LOCAL_MODIFIED, '... then after changing the file it should show up as locally modified'); # do_commit to save the modifications ok($mvs->do_commit($Testfile), '... and can we save our modifications?'); # Test do_update again, this time to see if the file is downloaded correctly is($mvs->do_update($Testfile)->{$Testfile}, WWW::Mediawiki::Client::STATUS_UNCHANGED, '... and since the commit put our version on the server do_update should report unchanged.'); chdir $Alttestdir; # Copy the conf file open(OUT, '>' . WWW::Mediawiki::Client->CONFIG_FILE) or die "Cannot open conf file for writing"; print OUT $Conf; close OUT; is($mvs->do_update($Testfile)->{$Testfile}, WWW::Mediawiki::Client::STATUS_SERVER_MODIFIED, 'Starting in a new directory the test page should be server modified.'); open (OUT, ">>$Testfile"); print OUT qq{ ==Server change test== Testing the ability to detect server changes. 2 3 5 }; close OUT; # do_commit to save the modifications $mvs->commit_message('modifications from altdir'); ok($mvs->do_commit($Testfile), '... and can we save our modifications?'); # Let's test conflicts chdir $Testdir; open (OUT, ">>$Testfile"); print OUT qq{ ==Server change test== Resting with ability to detect conflicting server changes. 5 3 2 }; close OUT; $mvs->commit_message('testing_conflicting_commit'); eval { $mvs->do_commit($Testfile) }; isa_ok($@, 'WWW::Mediawiki::Client::UpdateNeededException', '... in other dir, commit should refuse to work before update.'); is($mvs->do_update($Testfile)->{$Testfile}, WWW::Mediawiki::Client::STATUS_CONFLICT, '... and when we do the update there should be a conflict'); # See what happens if you try to commit a page in the Special namespace my $special_page = 'Special:Shouldnotbeapage.wiki'; open (OUT, ">$special_page"); print OUT q{ This page should not exist, and should cause an error if we run do_commit on it. }; close OUT; eval { $mvs->do_commit($special_page) }; isa_ok($@, 'WWW::Mediawiki::Client::ServerPageException', 'do_commit should refuse to update a Special page, throwing an exception'); # let's start with a clean directory now and try to login from scratch and # check some stuff out chdir $Cleantestdir; $mvs = WWW::Mediawiki::Client->new; $mvs->host($host); $mvs->wiki_path($path); $mvs->username($username); $mvs->password($password); ok($mvs->do_login, 'Can log in with a new client without conf file.'); ok(-e WWW::Mediawiki::Client->CONFIG_FILE, '... which results in a new conf file being written.'); 1; __END__ # vim:syntax=perl: libwww-mediawiki-client-perl-0.31/tags0000644000000000000000000012116110447225107016510 0ustar rootroot!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ !_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ !_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/ !_TAG_PROGRAM_NAME Exuberant Ctags // !_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/ !_TAG_PROGRAM_VERSION 5.5.4 // ABSPERL Makefile /^ABSPERL = $(PERL)$/;" m ABSPERLRUN Makefile /^ABSPERLRUN = $(ABSPERL)$/;" m ABSPERLRUNINST Makefile /^ABSPERLRUNINST = $(ABSPERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"$/;" m ACTION blib/lib/WWW/Mediawiki/Client.pm /^use constant ACTION => 'action';$/;" c ACTION lib/WWW/Mediawiki/Client.pm /^use constant ACTION => 'action';$/;" c AR Makefile /^AR = ar$/;" m AR_STATIC_ARGS Makefile /^AR_STATIC_ARGS = cr$/;" m AUTOSPLITFILE Makefile /^AUTOSPLITFILE = $(ABSPERLRUN) -e 'use AutoSplit; autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1)'$/;" m BASEEXT Makefile /^BASEEXT = Client$/;" m BOOTDEP Makefile /^BOOTDEP = $/;" m BOOTSTRAP Makefile /^BOOTSTRAP =$/;" m CC Makefile /^CC = cc$/;" m CCCDLFLAGS Makefile /^CCCDLFLAGS = -fPIC$/;" m CCDLFLAGS Makefile /^ MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=$/;" m CCDLFLAGS Makefile /^CCDLFLAGS = -Wl,-E$/;" m CHECKED blib/lib/WWW/Mediawiki/Client.pm /^use constant CHECKED => 1;$/;" c CHECKED lib/WWW/Mediawiki/Client.pm /^use constant CHECKED => 1;$/;" c CHMOD Makefile /^CHMOD = chmod$/;" m CI Makefile /^CI = ci -u$/;" m COMMENT_NAME blib/lib/WWW/Mediawiki/Client.pm /^use constant COMMENT_NAME => 'wpSummary';$/;" c COMMENT_NAME lib/WWW/Mediawiki/Client.pm /^use constant COMMENT_NAME => 'wpSummary';$/;" c COMPRESS Makefile /^COMPRESS = gzip --best$/;" m CONFIGDEP Makefile /^CONFIGDEP = $(PERL_ARCHLIB)$(DFSEP)Config.pm $(PERL_INC)$(DFSEP)config.h$/;" m CONFIG_FILE blib/lib/WWW/Mediawiki/Client.pm /^use constant CONFIG_FILE => '.mediawiki';$/;" c CONFIG_FILE lib/WWW/Mediawiki/Client.pm /^use constant CONFIG_FILE => '.mediawiki';$/;" c COOKIE_FILE blib/lib/WWW/Mediawiki/Client.pm /^use constant COOKIE_FILE => '.mediawiki_cookies.dat';$/;" c COOKIE_FILE lib/WWW/Mediawiki/Client.pm /^use constant COOKIE_FILE => '.mediawiki_cookies.dat';$/;" c CP Makefile /^CP = cp$/;" m C_FILES Makefile /^C_FILES = $/;" m DEFAULTS blib/lib/WWW/Mediawiki/Client.pm /^sub DEFAULTS { \\%DEFAULTS };$/;" s DEFAULTS lib/WWW/Mediawiki/Client.pm /^sub DEFAULTS { \\%DEFAULTS };$/;" s DEFINE_VERSION Makefile /^DEFINE_VERSION = -D$(VERSION_MACRO)=\\"$(VERSION)\\"$/;" m DESTDIR Makefile /^DESTDIR = $/;" m DESTINSTALLARCHLIB Makefile /^DESTINSTALLARCHLIB = $(DESTDIR)$(INSTALLARCHLIB)$/;" m DESTINSTALLBIN Makefile /^DESTINSTALLBIN = $(DESTDIR)$(INSTALLBIN)$/;" m DESTINSTALLMAN1DIR Makefile /^DESTINSTALLMAN1DIR = $(DESTDIR)$(INSTALLMAN1DIR)$/;" m DESTINSTALLMAN3DIR Makefile /^DESTINSTALLMAN3DIR = $(DESTDIR)$(INSTALLMAN3DIR)$/;" m DESTINSTALLPRIVLIB Makefile /^DESTINSTALLPRIVLIB = $(DESTDIR)$(INSTALLPRIVLIB)$/;" m DESTINSTALLSCRIPT Makefile /^DESTINSTALLSCRIPT = $(DESTDIR)$(INSTALLSCRIPT)$/;" m DESTINSTALLSITEARCH Makefile /^DESTINSTALLSITEARCH = $(DESTDIR)$(INSTALLSITEARCH)$/;" m DESTINSTALLSITEBIN Makefile /^DESTINSTALLSITEBIN = $(DESTDIR)$(INSTALLSITEBIN)$/;" m DESTINSTALLSITELIB Makefile /^DESTINSTALLSITELIB = $(DESTDIR)$(INSTALLSITELIB)$/;" m DESTINSTALLSITEMAN1DIR Makefile /^DESTINSTALLSITEMAN1DIR = $(DESTDIR)$(INSTALLSITEMAN1DIR)$/;" m DESTINSTALLSITEMAN3DIR Makefile /^DESTINSTALLSITEMAN3DIR = $(DESTDIR)$(INSTALLSITEMAN3DIR)$/;" m DESTINSTALLVENDORARCH Makefile /^DESTINSTALLVENDORARCH = $(DESTDIR)$(INSTALLVENDORARCH)$/;" m DESTINSTALLVENDORBIN Makefile /^DESTINSTALLVENDORBIN = $(DESTDIR)$(INSTALLVENDORBIN)$/;" m DESTINSTALLVENDORLIB Makefile /^DESTINSTALLVENDORLIB = $(DESTDIR)$(INSTALLVENDORLIB)$/;" m DESTINSTALLVENDORMAN1DIR Makefile /^DESTINSTALLVENDORMAN1DIR = $(DESTDIR)$(INSTALLVENDORMAN1DIR)$/;" m DESTINSTALLVENDORMAN3DIR Makefile /^DESTINSTALLVENDORMAN3DIR = $(DESTDIR)$(INSTALLVENDORMAN3DIR)$/;" m DEV_NULL Makefile /^DEV_NULL = > \/dev\/null 2>&1$/;" m DFSEP Makefile /^DFSEP = $(DIRFILESEP)$/;" m DIRFILESEP Makefile /^DIRFILESEP = \/$/;" m DISTNAME Makefile /^DISTNAME = WWW-Mediawiki-Client$/;" m DISTVNAME Makefile /^DISTVNAME = WWW-Mediawiki-Client-0.28$/;" m DIST_CP Makefile /^DIST_CP = best$/;" m DIST_DEFAULT Makefile /^DIST_DEFAULT = tardist$/;" m DLBASE Makefile /^DLBASE = $(BASEEXT)$/;" m DLEXT Makefile /^DLEXT = so$/;" m DLSRC Makefile /^DLSRC = dl_dlopen.xs$/;" m DOC_INSTALL Makefile /^DOC_INSTALL = $(ABSPERLRUN) "-MExtUtils::Command::MM" -e perllocal_install$/;" m ECHO Makefile /^ECHO = echo$/;" m ECHO_N Makefile /^ECHO_N = echo -n$/;" m EDIT blib/lib/WWW/Mediawiki/Client.pm /^use constant EDIT => 'edit';$/;" c EDIT lib/WWW/Mediawiki/Client.pm /^use constant EDIT => 'edit';$/;" c EDIT_MINOR_NAME blib/lib/WWW/Mediawiki/Client.pm /^use constant EDIT_MINOR_NAME => 'wpMinoredit';$/;" c EDIT_MINOR_NAME lib/WWW/Mediawiki/Client.pm /^use constant EDIT_MINOR_NAME => 'wpMinoredit';$/;" c EDIT_PREVIEW_NAME blib/lib/WWW/Mediawiki/Client.pm /^use constant EDIT_PREVIEW_NAME => 'wpPreview';$/;" c EDIT_PREVIEW_NAME lib/WWW/Mediawiki/Client.pm /^use constant EDIT_PREVIEW_NAME => 'wpPreview';$/;" c EDIT_PREVIEW_VALUE blib/lib/WWW/Mediawiki/Client.pm /^use constant EDIT_PREVIEW_VALUE => 'Show preview';$/;" c EDIT_PREVIEW_VALUE lib/WWW/Mediawiki/Client.pm /^use constant EDIT_PREVIEW_VALUE => 'Show preview';$/;" c EDIT_SUBMIT_NAME blib/lib/WWW/Mediawiki/Client.pm /^use constant EDIT_SUBMIT_NAME => 'wpSave';$/;" c EDIT_SUBMIT_NAME lib/WWW/Mediawiki/Client.pm /^use constant EDIT_SUBMIT_NAME => 'wpSave';$/;" c EDIT_SUBMIT_VALUE blib/lib/WWW/Mediawiki/Client.pm /^use constant EDIT_SUBMIT_VALUE => 'Save Page';$/;" c EDIT_SUBMIT_VALUE lib/WWW/Mediawiki/Client.pm /^use constant EDIT_SUBMIT_VALUE => 'Save Page';$/;" c EDIT_TIME_NAME blib/lib/WWW/Mediawiki/Client.pm /^use constant EDIT_TIME_NAME => 'wpEdittime';$/;" c EDIT_TIME_NAME lib/WWW/Mediawiki/Client.pm /^use constant EDIT_TIME_NAME => 'wpEdittime';$/;" c EDIT_TOKEN_NAME blib/lib/WWW/Mediawiki/Client.pm /^use constant EDIT_TOKEN_NAME => 'wpEditToken';$/;" c EDIT_TOKEN_NAME lib/WWW/Mediawiki/Client.pm /^use constant EDIT_TOKEN_NAME => 'wpEditToken';$/;" c EDIT_WATCH_NAME blib/lib/WWW/Mediawiki/Client.pm /^use constant EDIT_WATCH_NAME => 'wpWatchthis';$/;" c EDIT_WATCH_NAME lib/WWW/Mediawiki/Client.pm /^use constant EDIT_WATCH_NAME => 'wpWatchthis';$/;" c EQUALIZE_TIMESTAMP Makefile /^EQUALIZE_TIMESTAMP = $(ABSPERLRUN) "-MExtUtils::Command" -e eqtime$/;" m EXE_EXT Makefile /^EXE_EXT = $/;" m EXE_FILES Makefile /^EXE_FILES = bin\/mvs$/;" m EXPORT_LIST Makefile /^EXPORT_LIST = $/;" m FIRST_MAKEFILE Makefile /^FIRST_MAKEFILE = Makefile$/;" m FIXIN Makefile /^FIXIN = $(PERLRUN) "-MExtUtils::MY" -e "MY->fixin(shift)"$/;" m FULLEXT Makefile /^FULLEXT = WWW\/Mediawiki\/Client$/;" m FULLPERL Makefile /^FULLPERL = \/usr\/bin\/perl$/;" m FULLPERL Makefile /^FULLPERL = \/usr\/bin\/perl$/;" m FULLPERLRUN Makefile /^FULLPERLRUN = $(FULLPERL)$/;" m FULLPERLRUNINST Makefile /^FULLPERLRUNINST = $(FULLPERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"$/;" m FULL_AR Makefile /^FULL_AR = \/usr\/bin\/ar$/;" m Getopt bin/mvs /^ Getopt::Long::Configure($/;" l Getopt bin/mvs /^ Getopt::Long::Configure('bundling', 'pass_through');$/;" l Getopt bin/mvs /^ Getopt::Long::GetOptions($/;" l Getopt bin/mvs /^ Getopt::Long::GetOptions('<>' => sub {$/;" l Getopt blib/script/mvs /^ Getopt::Long::Configure($/;" l Getopt blib/script/mvs /^ Getopt::Long::Configure('bundling', 'pass_through');$/;" l Getopt blib/script/mvs /^ Getopt::Long::GetOptions($/;" l Getopt blib/script/mvs /^ Getopt::Long::GetOptions('<>' => sub {$/;" l HELP_MESSAGE bin/mvs /^sub HELP_MESSAGE {$/;" s HELP_MESSAGE blib/script/mvs /^sub HELP_MESSAGE {$/;" s HREF Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m H_FILES Makefile /^H_FILES = $/;" m INSTALLARCHLIB Makefile /^INSTALLARCHLIB = $(PERLPREFIX)\/lib\/perl\/5.8$/;" m INSTALLBIN Makefile /^INSTALLBIN = $(PERLPREFIX)\/bin$/;" m INSTALLDIRS Makefile /^INSTALLDIRS = site$/;" m INSTALLMAN1DIR Makefile /^INSTALLMAN1DIR = $(PERLPREFIX)\/share\/man\/man1$/;" m INSTALLMAN3DIR Makefile /^INSTALLMAN3DIR = $(PERLPREFIX)\/share\/man\/man3$/;" m INSTALLPRIVLIB Makefile /^INSTALLPRIVLIB = $(PERLPREFIX)\/share\/perl\/5.8$/;" m INSTALLSCRIPT Makefile /^INSTALLSCRIPT = $(PERLPREFIX)\/bin$/;" m INSTALLSITEARCH Makefile /^INSTALLSITEARCH = $(SITEPREFIX)\/lib\/perl\/5.8.8$/;" m INSTALLSITEBIN Makefile /^INSTALLSITEBIN = $(SITEPREFIX)\/bin$/;" m INSTALLSITELIB Makefile /^INSTALLSITELIB = $(SITEPREFIX)\/share\/perl\/5.8.8$/;" m INSTALLSITEMAN1DIR Makefile /^INSTALLSITEMAN1DIR = $(SITEPREFIX)\/man\/man1$/;" m INSTALLSITEMAN3DIR Makefile /^INSTALLSITEMAN3DIR = $(SITEPREFIX)\/man\/man3$/;" m INSTALLVENDORARCH Makefile /^INSTALLVENDORARCH = $(VENDORPREFIX)\/lib\/perl5$/;" m INSTALLVENDORBIN Makefile /^INSTALLVENDORBIN = $(VENDORPREFIX)\/bin$/;" m INSTALLVENDORLIB Makefile /^INSTALLVENDORLIB = $(VENDORPREFIX)\/share\/perl5$/;" m INSTALLVENDORMAN1DIR Makefile /^INSTALLVENDORMAN1DIR = $(VENDORPREFIX)\/share\/man\/man1$/;" m INSTALLVENDORMAN3DIR Makefile /^INSTALLVENDORMAN3DIR = $(VENDORPREFIX)\/share\/man\/man3$/;" m INST_ARCHAUTODIR Makefile /^INST_ARCHAUTODIR = $(INST_ARCHLIB)\/auto\/$(FULLEXT)$/;" m INST_ARCHLIB Makefile /^INST_ARCHLIB = blib\/arch$/;" m INST_ARCHLIBDIR Makefile /^INST_ARCHLIBDIR = $(INST_ARCHLIB)\/WWW\/Mediawiki$/;" m INST_AUTODIR Makefile /^INST_AUTODIR = $(INST_LIB)\/auto\/$(FULLEXT)$/;" m INST_BIN Makefile /^INST_BIN = blib\/bin$/;" m INST_BOOT Makefile /^INST_BOOT = $/;" m INST_DYNAMIC Makefile /^INST_DYNAMIC = $/;" m INST_LIB Makefile /^INST_LIB = blib\/lib$/;" m INST_LIBDIR Makefile /^INST_LIBDIR = $(INST_LIB)\/WWW\/Mediawiki$/;" m INST_MAN1DIR Makefile /^INST_MAN1DIR = blib\/man1$/;" m INST_MAN3DIR Makefile /^INST_MAN3DIR = blib\/man3$/;" m INST_SCRIPT Makefile /^INST_SCRIPT = blib\/script$/;" m INST_STATIC Makefile /^INST_STATIC = $/;" m IR Makefile /^ Makefile.PL DIR= \\$/;" m LANGUAGE_CODE blib/lib/WWW/Mediawiki/Client.pm /^use constant LANGUAGE_CODE => 'en';$/;" c LANGUAGE_CODE lib/WWW/Mediawiki/Client.pm /^use constant LANGUAGE_CODE => 'en';$/;" c LD Makefile /^LD = cc$/;" m LDDLFLAGS Makefile /^LDDLFLAGS = -shared -L\/usr\/local\/lib$/;" m LDFLAGS Makefile /^LDFLAGS = -L\/usr\/local\/lib$/;" m LDFROM Makefile /^LDFROM = $(OBJECT)$/;" m LIBC Makefile /^LIBC = \/lib\/libc-2.3.6.so$/;" m LIBPERL_A Makefile /^LIBPERL_A = libperl.a$/;" m LIBPERL_A Makefile /^PASTHRU = LIBPERL_A="$(LIBPERL_A)"\\$/;" m LIB_EXT Makefile /^LIB_EXT = .a$/;" m LINKTYPE Makefile /^ MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \\$/;" m LINKTYPE Makefile /^ LINKTYPE="$(LINKTYPE)"\\$/;" m LINKTYPE Makefile /^LINKTYPE = dynamic$/;" m LOGIN blib/lib/WWW/Mediawiki/Client.pm /^use constant LOGIN => 'submitlogin';$/;" c LOGIN lib/WWW/Mediawiki/Client.pm /^use constant LOGIN => 'submitlogin';$/;" c LOGIN_SUBMIT_NAME blib/lib/WWW/Mediawiki/Client.pm /^use constant LOGIN_SUBMIT_NAME => 'wpLoginattempt';$/;" c LOGIN_SUBMIT_NAME lib/WWW/Mediawiki/Client.pm /^use constant LOGIN_SUBMIT_NAME => 'wpLoginattempt';$/;" c LOGIN_SUBMIT_VALUE blib/lib/WWW/Mediawiki/Client.pm /^use constant LOGIN_SUBMIT_VALUE => 'Log In';$/;" c LOGIN_SUBMIT_VALUE lib/WWW/Mediawiki/Client.pm /^use constant LOGIN_SUBMIT_VALUE => 'Log In';$/;" c LOGIN_TITLE blib/lib/WWW/Mediawiki/Client.pm /^use constant LOGIN_TITLE => 'Special:Userlogin';$/;" c LOGIN_TITLE lib/WWW/Mediawiki/Client.pm /^use constant LOGIN_TITLE => 'Special:Userlogin';$/;" c MACROEND Makefile /^MACROEND = $/;" m MACROSTART Makefile /^MACROSTART = $/;" m MAKEAPERL Makefile /^ MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=$/;" m MAKEFILE Makefile /^ MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \\$/;" m MAKEFILE_OLD Makefile /^MAKEFILE_OLD = Makefile.old$/;" m MAKEMAKER Makefile /^MAKEMAKER = \/usr\/share\/perl\/5.8\/ExtUtils\/MakeMaker.pm$/;" m MAKE_APERL_FILE Makefile /^MAKE_APERL_FILE = Makefile.aperl$/;" m MAN1EXT Makefile /^MAN1EXT = 1p$/;" m MAN1PODS Makefile /^MAN1PODS = bin\/mvs$/;" m MAN3EXT Makefile /^MAN3EXT = 3pm$/;" m MAN3PODS Makefile /^MAN3PODS = lib\/WWW\/Mediawiki\/Client.pm \\$/;" m MAP_TARGET Makefile /^MAP_TARGET = perl$/;" m MINOR_DEFAULT blib/lib/WWW/Mediawiki/Client.pm /^use constant MINOR_DEFAULT => OPT_DEFAULT;$/;" c MINOR_DEFAULT lib/WWW/Mediawiki/Client.pm /^use constant MINOR_DEFAULT => OPT_DEFAULT;$/;" c MKPATH Makefile /^MKPATH = $(ABSPERLRUN) "-MExtUtils::Command" -e mkpath$/;" m MM_REVISION Makefile /^MM_REVISION = Revision: 4535 $/;" m MM_Unix_VERSION Makefile /^MM_Unix_VERSION = 1.50$/;" m MM_VERSION Makefile /^MM_VERSION = 6.30$/;" m MOD_INSTALL Makefile /^MOD_INSTALL = $(ABSPERLRUN) -MExtUtils::Install -e 'install({@ARGV}, '\\''$(VERBINST)'\\'', 0, '\\''$(UNINST)'\\'');'$/;" m MV Makefile /^MV = mv$/;" m Manifest Makefile /^ $(NOECHO) cd $(DISTVNAME) && $(ABSPERLRUN) -MExtUtils::Manifest=maniadd -e 'eval { maniadd({q{META.yml} => q{Module meta-data (added by MakeMaker)}}) } ' \\$/;" m Manifest Makefile /^ $(NOECHO) cd $(DISTVNAME) && $(ABSPERLRUN) -MExtUtils::Manifest=maniadd -e 'eval { maniadd({q{SIGNATURE} => q{Public-key signature (added by MakeMaker)}}) } ' \\$/;" m Manifest Makefile /^ $(PERLRUN) "-MExtUtils::Manifest=fullcheck" -e fullcheck$/;" m Manifest Makefile /^ $(PERLRUN) "-MExtUtils::Manifest=manicopy,maniread" \\$/;" m Manifest Makefile /^ $(PERLRUN) "-MExtUtils::Manifest=maniread" \\$/;" m Manifest Makefile /^ $(PERLRUN) "-MExtUtils::Manifest=mkmanifest" -e mkmanifest$/;" m Manifest Makefile /^ $(PERLRUN) "-MExtUtils::Manifest=skipcheck" -e skipcheck$/;" m NAME Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m NAME Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m NAME Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m NAME Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m NAME Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m NAME Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m NAME Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m NAME Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m NAME Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m NAME Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m NAME Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m NAME Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m NAME Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m NAME Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m NAME Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m NAME Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m NAME Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m NAME Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m NAME Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m NAME Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m NAME Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m NAME Makefile /^ $(NOECHO) $(ECHO) '' > $(DISTNAME).ppd$/;" m NAME Makefile /^NAME = WWW::Mediawiki::Client$/;" m NAME_SYM Makefile /^NAME_SYM = WWW_Mediawiki_Client$/;" m NOECHO Makefile /^NOECHO = @$/;" m NOOP Makefile /^NOOP = $(SHELL) -c true$/;" m NSTALLDIRS Makefile /^ $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site$/;" m OBJECT Makefile /^OBJECT = $/;" m OBJ_EXT Makefile /^OBJ_EXT = .o$/;" m OPTION_SETTINGS blib/lib/WWW/Mediawiki/Client.pm /^use constant OPTION_SETTINGS => ($/;" c OPTION_SETTINGS lib/WWW/Mediawiki/Client.pm /^use constant OPTION_SETTINGS => ($/;" c OPTION_STATES bin/mvs /^use constant OPTION_STATES => ($/;" c OPTION_STATES blib/script/mvs /^use constant OPTION_STATES => ($/;" c OPT_DEFAULT blib/lib/WWW/Mediawiki/Client.pm /^use constant OPT_DEFAULT => -1;$/;" c OPT_DEFAULT lib/WWW/Mediawiki/Client.pm /^use constant OPT_DEFAULT => -1;$/;" c OPT_KEEP blib/lib/WWW/Mediawiki/Client.pm /^use constant OPT_KEEP => -2; # Only for watch.$/;" c OPT_KEEP lib/WWW/Mediawiki/Client.pm /^use constant OPT_KEEP => -2; # Only for watch.$/;" c OPT_NO blib/lib/WWW/Mediawiki/Client.pm /^use constant OPT_NO => 0;$/;" c OPT_NO lib/WWW/Mediawiki/Client.pm /^use constant OPT_NO => 0;$/;" c OPT_YES blib/lib/WWW/Mediawiki/Client.pm /^use constant OPT_YES => 1;$/;" c OPT_YES lib/WWW/Mediawiki/Client.pm /^use constant OPT_YES => 1;$/;" c ORECURS Makefile /^ MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=$/;" m OSNAME Makefile /^OSNAME = linux$/;" m OSVERS Makefile /^OSVERS = 2.6.15.4$/;" m O_FILES Makefile /^O_FILES = $/;" m PARENT_NAME Makefile /^PARENT_NAME = WWW::Mediawiki$/;" m PASSWORD_NAME blib/lib/WWW/Mediawiki/Client.pm /^use constant PASSWORD_NAME => 'wpPassword';$/;" c PASSWORD_NAME lib/WWW/Mediawiki/Client.pm /^use constant PASSWORD_NAME => 'wpPassword';$/;" c PASTHRU Makefile /^PASTHRU = LIBPERL_A="$(LIBPERL_A)"\\$/;" m PERL Makefile /^PERL = \/usr\/bin\/perl$/;" m PERLMAINCC Makefile /^PERLMAINCC = $(CC)$/;" m PERLPREFIX Makefile /^PERLPREFIX = $(PREFIX)$/;" m PERLRUN Makefile /^PERLRUN = $(PERL)$/;" m PERLRUNINST Makefile /^PERLRUNINST = $(PERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"$/;" m PERL_ARCHIVE Makefile /^PERL_ARCHIVE = $/;" m PERL_ARCHIVE_AFTER Makefile /^PERL_ARCHIVE_AFTER = $/;" m PERL_ARCHLIB Makefile /^PERL_ARCHLIB = \/usr\/lib\/perl\/5.8$/;" m PERL_CORE Makefile /^PERL_CORE = 0$/;" m PERL_DL_NONLAZY Makefile /^ PERL_DL_NONLAZY=1 $(FULLPERLRUN) "-MExtUtils::Command::MM" "-e" "test_harness($(TEST_VERBOSE), '$(INST_LIB)', '$(INST_ARCHLIB)')" $(TEST_FILES)$/;" m PERL_DL_NONLAZY Makefile /^ PERL_DL_NONLAZY=1 $(FULLPERLRUN) $(TESTDB_SW) "-I$(INST_LIB)" "-I$(INST_ARCHLIB)" $(TEST_FILE)$/;" m PERL_INC Makefile /^PERL_INC = \/usr\/lib\/perl\/5.8\/CORE$/;" m PERL_LIB Makefile /^PERL_LIB = \/usr\/share\/perl\/5.8$/;" m PERL_MALLOC_DEF Makefile /^PERL_MALLOC_DEF = -DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc -Dfree=Perl_mfree -Drealloc=Perl_realloc -Dcalloc=Perl_calloc$/;" m PERM_RW Makefile /^PERM_RW = 644$/;" m PERM_RWX Makefile /^PERM_RWX = 755$/;" m PM_TO_BLIB Makefile /^PM_TO_BLIB = lib\/WWW\/Mediawiki\/Client\/Exceptions.pm \\$/;" m POD2MAN Makefile /^POD2MAN = $(POD2MAN_EXE)$/;" m POD2MAN_EXE Makefile /^POD2MAN_EXE = $(PERLRUN) "-MExtUtils::Command::MM" -e pod2man "--"$/;" m POSTOP Makefile /^POSTOP = $(NOECHO) $(NOOP)$/;" m PREFIX Makefile /^ PREFIX="$(PREFIX)"$/;" m PREFIX Makefile /^PREFIX = \/usr$/;" m PREOP Makefile /^PREOP = $(NOECHO) $(NOOP)$/;" m PROTOCOL blib/lib/WWW/Mediawiki/Client.pm /^use constant PROTOCOL => 'http';$/;" c PROTOCOL lib/WWW/Mediawiki/Client.pm /^use constant PROTOCOL => 'http';$/;" c RANLIB Makefile /^RANLIB = :$/;" m RCS_LABEL Makefile /^RCS_LABEL = rcs -Nv$(VERSION_SYM): -q$/;" m REMEMBER_NAME blib/lib/WWW/Mediawiki/Client.pm /^use constant REMEMBER_NAME => 'wpRemember';$/;" c REMEMBER_NAME lib/WWW/Mediawiki/Client.pm /^use constant REMEMBER_NAME => 'wpRemember';$/;" c RM_F Makefile /^RM_F = rm -f$/;" m RM_RF Makefile /^RM_RF = rm -rf$/;" m SAVED_ATTRIBUTES blib/lib/WWW/Mediawiki/Client.pm /^use constant SAVED_ATTRIBUTES => ($/;" c SAVED_ATTRIBUTES lib/WWW/Mediawiki/Client.pm /^use constant SAVED_ATTRIBUTES => ($/;" c SHAR Makefile /^SHAR = shar$/;" m SHELL Makefile /^SHELL = \/bin\/sh$/;" m SITEARCHEXP Makefile /^SITEARCHEXP = \/usr\/local\/lib\/perl\/5.8.8$/;" m SITELIBEXP Makefile /^SITELIBEXP = \/usr\/local\/share\/perl\/5.8.8$/;" m SITEPREFIX Makefile /^SITEPREFIX = $(PREFIX)\/local$/;" m SKIP t/client.t /^SKIP: {$/;" l SO Makefile /^SO = so$/;" m SPACE_SUBSTITUTE blib/lib/WWW/Mediawiki/Client.pm /^use constant SPACE_SUBSTITUTE => '_';$/;" c SPACE_SUBSTITUTE lib/WWW/Mediawiki/Client.pm /^use constant SPACE_SUBSTITUTE => '_';$/;" c SPECIAL_EXPORT blib/lib/WWW/Mediawiki/Client.pm /^use constant SPECIAL_EXPORT => 'Special:Export';$/;" c SPECIAL_EXPORT lib/WWW/Mediawiki/Client.pm /^use constant SPECIAL_EXPORT => 'Special:Export';$/;" c SPECIAL_VERSION blib/lib/WWW/Mediawiki/Client.pm /^use constant SPECIAL_VERSION => 'Special:Version';$/;" c SPECIAL_VERSION lib/WWW/Mediawiki/Client.pm /^use constant SPECIAL_VERSION => 'Special:Version';$/;" c STATUS_CONFLICT blib/lib/WWW/Mediawiki/Client.pm /^use constant STATUS_CONFLICT => 'C';$/;" c STATUS_CONFLICT lib/WWW/Mediawiki/Client.pm /^use constant STATUS_CONFLICT => 'C';$/;" c STATUS_LOCAL_ADDED blib/lib/WWW/Mediawiki/Client.pm /^use constant STATUS_LOCAL_ADDED => 'A';$/;" c STATUS_LOCAL_ADDED lib/WWW/Mediawiki/Client.pm /^use constant STATUS_LOCAL_ADDED => 'A';$/;" c STATUS_LOCAL_MODIFIED blib/lib/WWW/Mediawiki/Client.pm /^use constant STATUS_LOCAL_MODIFIED => 'M';$/;" c STATUS_LOCAL_MODIFIED lib/WWW/Mediawiki/Client.pm /^use constant STATUS_LOCAL_MODIFIED => 'M';$/;" c STATUS_SERVER_MODIFIED blib/lib/WWW/Mediawiki/Client.pm /^use constant STATUS_SERVER_MODIFIED => 'U';$/;" c STATUS_SERVER_MODIFIED lib/WWW/Mediawiki/Client.pm /^use constant STATUS_SERVER_MODIFIED => 'U';$/;" c STATUS_UNCHANGED blib/lib/WWW/Mediawiki/Client.pm /^use constant STATUS_UNCHANGED => '=';$/;" c STATUS_UNCHANGED lib/WWW/Mediawiki/Client.pm /^use constant STATUS_UNCHANGED => '=';$/;" c STATUS_UNKNOWN blib/lib/WWW/Mediawiki/Client.pm /^use constant STATUS_UNKNOWN => '?';$/;" c STATUS_UNKNOWN lib/WWW/Mediawiki/Client.pm /^use constant STATUS_UNKNOWN => '?';$/;" c SUBMIT blib/lib/WWW/Mediawiki/Client.pm /^use constant SUBMIT => 'submit';$/;" c SUBMIT lib/WWW/Mediawiki/Client.pm /^use constant SUBMIT => 'submit';$/;" c SUFFIX Makefile /^SUFFIX = .gz$/;" m TAR Makefile /^TAR = tar$/;" m TARFLAGS Makefile /^TARFLAGS = cvf$/;" m TESTDB_SW Makefile /^TESTDB_SW = -d$/;" m TEST_F Makefile /^TEST_F = test -f$/;" m TEST_FILE Makefile /^TEST_FILE = test.pl$/;" m TEST_FILES Makefile /^TEST_FILES = t\/*.t$/;" m TEST_TYPE Makefile /^TEST_TYPE=test_$(LINKTYPE)$/;" m TEST_VERBOSE Makefile /^TEST_VERBOSE=0$/;" m TEXTAREA_NAME blib/lib/WWW/Mediawiki/Client.pm /^use constant TEXTAREA_NAME => 'wpTextbox1';$/;" c TEXTAREA_NAME lib/WWW/Mediawiki/Client.pm /^use constant TEXTAREA_NAME => 'wpTextbox1';$/;" c TITLE blib/lib/WWW/Mediawiki/Client.pm /^use constant TITLE => 'title';$/;" c TITLE lib/WWW/Mediawiki/Client.pm /^use constant TITLE => 'title';$/;" c TOUCH Makefile /^TOUCH = touch$/;" m TO_INST_PM Makefile /^TO_INST_PM = lib\/WWW\/Mediawiki\/Client.pm \\$/;" m TO_UNIX Makefile /^TO_UNIX = $(NOECHO) $(NOOP)$/;" m UMASK_NULL Makefile /^UMASK_NULL = umask 0$/;" m UNCHECKED blib/lib/WWW/Mediawiki/Client.pm /^use constant UNCHECKED => 0;$/;" c UNCHECKED lib/WWW/Mediawiki/Client.pm /^use constant UNCHECKED => 0;$/;" c UNINST Makefile /^UNINST = 0$/;" m UNINSTALL Makefile /^UNINSTALL = $(ABSPERLRUN) "-MExtUtils::Command::MM" -e uninstall$/;" m USEMAKEFILE Makefile /^USEMAKEFILE = -f$/;" m USERNAME_NAME blib/lib/WWW/Mediawiki/Client.pm /^use constant USERNAME_NAME => 'wpName';$/;" c USERNAME_NAME lib/WWW/Mediawiki/Client.pm /^use constant USERNAME_NAME => 'wpName';$/;" c VENDORARCHEXP Makefile /^VENDORARCHEXP = \/usr\/lib\/perl5$/;" m VENDORLIBEXP Makefile /^VENDORLIBEXP = \/usr\/share\/perl5$/;" m VENDORPREFIX Makefile /^VENDORPREFIX = $(PREFIX)$/;" m VERBINST Makefile /^VERBINST = 0$/;" m VERSION Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m VERSION Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m VERSION Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m VERSION Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m VERSION Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m VERSION Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m VERSION Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m VERSION Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m VERSION Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m VERSION Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m VERSION Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m VERSION Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m VERSION Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m VERSION Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m VERSION Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m VERSION Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m VERSION Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m VERSION Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m VERSION Makefile /^ $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd$/;" m VERSION Makefile /^ $(NOECHO) $(ECHO) '' > $(DISTNAME).ppd$/;" m VERSION Makefile /^VERSION = 0.28$/;" m VERSION_FROM Makefile /^VERSION_FROM = lib\/WWW\/Mediawiki\/Client.pm$/;" m VERSION_MACRO Makefile /^VERSION_MACRO = VERSION$/;" m VERSION_SYM Makefile /^VERSION_SYM = 0_28$/;" m WARN_IF_OLD_PACKLIST Makefile /^WARN_IF_OLD_PACKLIST = $(ABSPERLRUN) "-MExtUtils::Command::MM" -e warn_if_old_packlist$/;" m WATCH_DEFAULT blib/lib/WWW/Mediawiki/Client.pm /^use constant WATCH_DEFAULT => OPT_DEFAULT;$/;" c WATCH_DEFAULT lib/WWW/Mediawiki/Client.pm /^use constant WATCH_DEFAULT => OPT_DEFAULT;$/;" c WIKI_PATH blib/lib/WWW/Mediawiki/Client.pm /^use constant WIKI_PATH => 'wiki\/index.php';$/;" c WIKI_PATH lib/WWW/Mediawiki/Client.pm /^use constant WIKI_PATH => 'wiki\/index.php';$/;" c WWW blib/lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::InvalidOptionException->throw($/;" l WWW blib/lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::URLConstructionException->throw($/;" l WWW blib/lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::CorruptedConfigFileException->throw($/;" l WWW blib/lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::FileAccessException->throw($/;" l WWW blib/lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::CommitException->throw($/;" l WWW blib/lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::InvalidOptionException->throw($/;" l WWW blib/lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::LoginException->throw($/;" l WWW blib/lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::ServerPageException->throw($/;" l WWW blib/lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::URLConstructionException->throw($/;" l WWW blib/lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::UpdateNeededException->throw($/;" l WWW blib/lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::AbsoluteFileNameException->throw($/;" l WWW blib/lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::AuthException->throw($/;" l WWW blib/lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::CommitException->throw($/;" l WWW blib/lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::CommitMessageException->throw($/;" l WWW blib/lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::ConflictsPresentException->throw($/;" l WWW blib/lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::FileAccessException->throw("No such file!") $/;" l WWW blib/lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::FileTypeException->throw($/;" l WWW blib/lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::ReadOnlyFieldException->throw($/;" l WWW blib/lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::ServerPageException->throw($/;" l WWW blib/lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::URLConstructionException->throw($/;" l WWW blib/lib/WWW/Mediawiki/Client/Exceptions.pm /^WWW::Mediawiki::Client::Exception->Trace(1);$/;" l WWW lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::InvalidOptionException->throw($/;" l WWW lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::URLConstructionException->throw($/;" l WWW lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::CorruptedConfigFileException->throw($/;" l WWW lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::FileAccessException->throw($/;" l WWW lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::CommitException->throw($/;" l WWW lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::InvalidOptionException->throw($/;" l WWW lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::LoginException->throw($/;" l WWW lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::ServerPageException->throw($/;" l WWW lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::URLConstructionException->throw($/;" l WWW lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::UpdateNeededException->throw($/;" l WWW lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::AbsoluteFileNameException->throw($/;" l WWW lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::AuthException->throw($/;" l WWW lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::CommitException->throw($/;" l WWW lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::CommitMessageException->throw($/;" l WWW lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::ConflictsPresentException->throw($/;" l WWW lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::FileAccessException->throw("No such file!") $/;" l WWW lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::FileTypeException->throw($/;" l WWW lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::ReadOnlyFieldException->throw($/;" l WWW lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::ServerPageException->throw($/;" l WWW lib/WWW/Mediawiki/Client.pm /^ WWW::Mediawiki::Client::URLConstructionException->throw($/;" l WWW lib/WWW/Mediawiki/Client/Exceptions.pm /^WWW::Mediawiki::Client::Exception->Trace(1);$/;" l WWW t/server.t /^ WWW::Mediawiki::Client::STATUS_UNKNOWN,$/;" l XS_DEFINE_VERSION Makefile /^XS_DEFINE_VERSION = -D$(XS_VERSION_MACRO)=\\"$(XS_VERSION)\\"$/;" m XS_FILES Makefile /^XS_FILES = $/;" m XS_VERSION Makefile /^XS_VERSION = 0.28$/;" m XS_VERSION_MACRO Makefile /^XS_VERSION_MACRO = XS_VERSION$/;" m ZIP Makefile /^ZIP = zip$/;" m ZIPFLAGS Makefile /^ZIPFLAGS = -r$/;" m _check_path blib/lib/WWW/Mediawiki/Client.pm /^sub _check_path {$/;" s _check_path lib/WWW/Mediawiki/Client.pm /^sub _check_path {$/;" s _conflicts_found_in blib/lib/WWW/Mediawiki/Client.pm /^sub _conflicts_found_in {$/;" s _conflicts_found_in lib/WWW/Mediawiki/Client.pm /^sub _conflicts_found_in {$/;" s _get_edit_checkbox blib/lib/WWW/Mediawiki/Client.pm /^sub _get_edit_checkbox {$/;" s _get_edit_checkbox lib/WWW/Mediawiki/Client.pm /^sub _get_edit_checkbox {$/;" s _get_edit_date blib/lib/WWW/Mediawiki/Client.pm /^sub _get_edit_date {$/;" s _get_edit_date lib/WWW/Mediawiki/Client.pm /^sub _get_edit_date {$/;" s _get_edit_is_watching blib/lib/WWW/Mediawiki/Client.pm /^sub _get_edit_is_watching {$/;" s _get_edit_is_watching lib/WWW/Mediawiki/Client.pm /^sub _get_edit_is_watching {$/;" s _get_edit_minor_default blib/lib/WWW/Mediawiki/Client.pm /^sub _get_edit_minor_default {$/;" s _get_edit_minor_default lib/WWW/Mediawiki/Client.pm /^sub _get_edit_minor_default {$/;" s _get_edit_token blib/lib/WWW/Mediawiki/Client.pm /^sub _get_edit_token {$/;" s _get_edit_token lib/WWW/Mediawiki/Client.pm /^sub _get_edit_token {$/;" s _get_edit_watch_default blib/lib/WWW/Mediawiki/Client.pm /^sub _get_edit_watch_default {$/;" s _get_edit_watch_default lib/WWW/Mediawiki/Client.pm /^sub _get_edit_watch_default {$/;" s _get_export_url blib/lib/WWW/Mediawiki/Client.pm /^sub _get_export_url {$/;" s _get_export_url lib/WWW/Mediawiki/Client.pm /^sub _get_export_url {$/;" s _get_exported_pages blib/lib/WWW/Mediawiki/Client.pm /^sub _get_exported_pages {$/;" s _get_exported_pages lib/WWW/Mediawiki/Client.pm /^sub _get_exported_pages {$/;" s _get_host_url blib/lib/WWW/Mediawiki/Client.pm /^sub _get_host_url {$/;" s _get_host_url lib/WWW/Mediawiki/Client.pm /^sub _get_host_url {$/;" s _get_page_headline blib/lib/WWW/Mediawiki/Client.pm /^sub _get_page_headline {$/;" s _get_page_headline lib/WWW/Mediawiki/Client.pm /^sub _get_page_headline {$/;" s _get_ref_filename blib/lib/WWW/Mediawiki/Client.pm /^sub _get_ref_filename {$/;" s _get_ref_filename lib/WWW/Mediawiki/Client.pm /^sub _get_ref_filename {$/;" s _get_reference_page blib/lib/WWW/Mediawiki/Client.pm /^sub _get_reference_page {$/;" s _get_reference_page lib/WWW/Mediawiki/Client.pm /^sub _get_reference_page {$/;" s _get_server_encoding blib/lib/WWW/Mediawiki/Client.pm /^sub _get_server_encoding {$/;" s _get_server_encoding lib/WWW/Mediawiki/Client.pm /^sub _get_server_encoding {$/;" s _get_update_status blib/lib/WWW/Mediawiki/Client.pm /^sub _get_update_status {$/;" s _get_update_status lib/WWW/Mediawiki/Client.pm /^sub _get_update_status {$/;" s _get_version_url blib/lib/WWW/Mediawiki/Client.pm /^sub _get_version_url {$/;" s _get_version_url lib/WWW/Mediawiki/Client.pm /^sub _get_version_url {$/;" s _get_wiki_text blib/lib/WWW/Mediawiki/Client.pm /^sub _get_wiki_text {$/;" s _get_wiki_text lib/WWW/Mediawiki/Client.pm /^sub _get_wiki_text {$/;" s _merge blib/lib/WWW/Mediawiki/Client.pm /^sub _merge {$/;" s _merge lib/WWW/Mediawiki/Client.pm /^sub _merge {$/;" s _option_check blib/lib/WWW/Mediawiki/Client.pm /^sub _option_check {$/;" s _option_check lib/WWW/Mediawiki/Client.pm /^sub _option_check {$/;" s _option_verify blib/lib/WWW/Mediawiki/Client.pm /^sub _option_verify {$/;" s _option_verify lib/WWW/Mediawiki/Client.pm /^sub _option_verify {$/;" s _ref_to_filename blib/lib/WWW/Mediawiki/Client.pm /^sub _ref_to_filename {$/;" s _ref_to_filename lib/WWW/Mediawiki/Client.pm /^sub _ref_to_filename {$/;" s _update_core blib/lib/WWW/Mediawiki/Client.pm /^sub _update_core {$/;" s _update_core lib/WWW/Mediawiki/Client.pm /^sub _update_core {$/;" s _upload_file blib/lib/WWW/Mediawiki/Client.pm /^sub _upload_file {$/;" s _upload_file lib/WWW/Mediawiki/Client.pm /^sub _upload_file {$/;" s commit_message blib/lib/WWW/Mediawiki/Client.pm /^sub commit_message {$/;" s commit_message lib/WWW/Mediawiki/Client.pm /^sub commit_message {$/;" s do_clean blib/lib/WWW/Mediawiki/Client.pm /^sub do_clean {$/;" s do_clean lib/WWW/Mediawiki/Client.pm /^sub do_clean {$/;" s do_com blib/lib/WWW/Mediawiki/Client.pm /^sub do_com {$/;" s do_com lib/WWW/Mediawiki/Client.pm /^sub do_com {$/;" s do_commit blib/lib/WWW/Mediawiki/Client.pm /^sub do_commit {$/;" s do_commit lib/WWW/Mediawiki/Client.pm /^sub do_commit {$/;" s do_li blib/lib/WWW/Mediawiki/Client.pm /^sub do_li {$/;" s do_li lib/WWW/Mediawiki/Client.pm /^sub do_li {$/;" s do_login blib/lib/WWW/Mediawiki/Client.pm /^sub do_login {$/;" s do_login lib/WWW/Mediawiki/Client.pm /^sub do_login {$/;" s do_preview blib/lib/WWW/Mediawiki/Client.pm /^sub do_preview {$/;" s do_preview lib/WWW/Mediawiki/Client.pm /^sub do_preview {$/;" s do_up blib/lib/WWW/Mediawiki/Client.pm /^sub do_up {$/;" s do_up lib/WWW/Mediawiki/Client.pm /^sub do_up {$/;" s do_update blib/lib/WWW/Mediawiki/Client.pm /^sub do_update {$/;" s do_update lib/WWW/Mediawiki/Client.pm /^sub do_update {$/;" s encoding blib/lib/WWW/Mediawiki/Client.pm /^sub encoding {$/;" s encoding lib/WWW/Mediawiki/Client.pm /^sub encoding {$/;" s escape_filenames blib/lib/WWW/Mediawiki/Client.pm /^sub escape_filenames {$/;" s escape_filenames lib/WWW/Mediawiki/Client.pm /^sub escape_filenames {$/;" s filename_to_pagename blib/lib/WWW/Mediawiki/Client.pm /^sub filename_to_pagename {$/;" s filename_to_pagename lib/WWW/Mediawiki/Client.pm /^sub filename_to_pagename {$/;" s filename_to_url blib/lib/WWW/Mediawiki/Client.pm /^sub filename_to_url {$/;" s filename_to_url lib/WWW/Mediawiki/Client.pm /^sub filename_to_url {$/;" s get_local_page blib/lib/WWW/Mediawiki/Client.pm /^sub get_local_page {$/;" s get_local_page lib/WWW/Mediawiki/Client.pm /^sub get_local_page {$/;" s get_server_page blib/lib/WWW/Mediawiki/Client.pm /^sub get_server_page {$/;" s get_server_page lib/WWW/Mediawiki/Client.pm /^sub get_server_page {$/;" s host blib/lib/WWW/Mediawiki/Client.pm /^sub host {$/;" s host lib/WWW/Mediawiki/Client.pm /^sub host {$/;" s language_code blib/lib/WWW/Mediawiki/Client.pm /^sub language_code {$/;" s language_code lib/WWW/Mediawiki/Client.pm /^sub language_code {$/;" s list_wiki_files blib/lib/WWW/Mediawiki/Client.pm /^sub list_wiki_files {$/;" s list_wiki_files lib/WWW/Mediawiki/Client.pm /^sub list_wiki_files {$/;" s load_state blib/lib/WWW/Mediawiki/Client.pm /^sub load_state {$/;" s load_state lib/WWW/Mediawiki/Client.pm /^sub load_state {$/;" s main bin/mvs /^sub main {$/;" s main blib/script/mvs /^sub main {$/;" s minor_edit blib/lib/WWW/Mediawiki/Client.pm /^sub minor_edit {$/;" s minor_edit lib/WWW/Mediawiki/Client.pm /^sub minor_edit {$/;" s multistate_map bin/mvs /^sub multistate_map {$/;" s multistate_map blib/script/mvs /^sub multistate_map {$/;" s multistate_option bin/mvs /^sub multistate_option {$/;" s multistate_option blib/script/mvs /^sub multistate_option {$/;" s multistate_text bin/mvs /^sub multistate_text {$/;" s multistate_text blib/script/mvs /^sub multistate_text {$/;" s new blib/lib/WWW/Mediawiki/Client.pm /^sub new {$/;" s new lib/WWW/Mediawiki/Client.pm /^sub new {$/;" s pagename_to_filename blib/lib/WWW/Mediawiki/Client.pm /^sub pagename_to_filename {$/;" s pagename_to_filename lib/WWW/Mediawiki/Client.pm /^sub pagename_to_filename {$/;" s pagename_to_url blib/lib/WWW/Mediawiki/Client.pm /^sub pagename_to_url {$/;" s pagename_to_url lib/WWW/Mediawiki/Client.pm /^sub pagename_to_url {$/;" s parse_command bin/mvs /^sub parse_command {$/;" s parse_command blib/script/mvs /^sub parse_command {$/;" s parse_options bin/mvs /^sub parse_options {$/;" s parse_options blib/script/mvs /^sub parse_options {$/;" s password blib/lib/WWW/Mediawiki/Client.pm /^sub password {$/;" s password lib/WWW/Mediawiki/Client.pm /^sub password {$/;" s print_defaults bin/mvs /^sub print_defaults {$/;" s print_defaults blib/script/mvs /^sub print_defaults {$/;" s protocol blib/lib/WWW/Mediawiki/Client.pm /^sub protocol {$/;" s protocol lib/WWW/Mediawiki/Client.pm /^sub protocol {$/;" s save_state blib/lib/WWW/Mediawiki/Client.pm /^sub save_state {$/;" s save_state lib/WWW/Mediawiki/Client.pm /^sub save_state {$/;" s site_url blib/lib/WWW/Mediawiki/Client.pm /^sub site_url {$/;" s site_url lib/WWW/Mediawiki/Client.pm /^sub site_url {$/;" s space_substitute blib/lib/WWW/Mediawiki/Client.pm /^sub space_substitute {$/;" s space_substitute lib/WWW/Mediawiki/Client.pm /^sub space_substitute {$/;" s status blib/lib/WWW/Mediawiki/Client.pm /^sub status {$/;" s status lib/WWW/Mediawiki/Client.pm /^sub status {$/;" s top t/files/Main_Page.html /^ <\/a>$/;" a url_to_filename blib/lib/WWW/Mediawiki/Client.pm /^sub url_to_filename {$/;" s url_to_filename lib/WWW/Mediawiki/Client.pm /^sub url_to_filename {$/;" s username blib/lib/WWW/Mediawiki/Client.pm /^sub username {$/;" s username lib/WWW/Mediawiki/Client.pm /^sub username {$/;" s version_message bin/mvs /^sub version_message {$/;" s version_message blib/script/mvs /^sub version_message {$/;" s watch blib/lib/WWW/Mediawiki/Client.pm /^sub watch {$/;" s watch lib/WWW/Mediawiki/Client.pm /^sub watch {$/;" s wiki_path blib/lib/WWW/Mediawiki/Client.pm /^sub wiki_path {$/;" s wiki_path lib/WWW/Mediawiki/Client.pm /^sub wiki_path {$/;" s