pax_global_header00006660000000000000000000000064123003326620014507gustar00rootroot0000000000000052 comment=dd7e2a2bbbbc3b56718acdb96723a1872adc741f dotclear-2.6.2+dfsg/000077500000000000000000000000001230033266200142325ustar00rootroot00000000000000dotclear-2.6.2+dfsg/CHANGELOG000066400000000000000000000473671230033266200154650ustar00rootroot00000000000000Dotclear 2.6.2 - 2014-01-20 =========================================================== * Security fix: Fixed potential code injection on password protected post/page. Thanks to Charlie Briggs * Bugfix: cope with numeric module (plugin/theme) id * Bugfix: Bad SQL syntax when using SQLite * Bugfix: BlogParentThemeURL template value is back * Various bug fixes Dotclear 2.6.1 - 2013-11-22 =========================================================== * Bugfix: trackbacks/pingbacks post URL * Bugfix: short/full list of tags (post edition) * Bugfix: Toolbar not drawn on new comment form (administration) * Various bug fixes * Some cosmetic adjustments Dotclear 2.6 - 2013-11-13 =========================================================== * Various bug fixes * Various cosmetic adjustments Dotclear 2.6-RC - 2013-10-18 =========================================================== * PHP 5.2 required * jQuery upgraded to 1.10.2 (including jQuery migrate plugin 1.2.1) * mySQLi support (now proposed by default rather than mySQL) * Administration revamped, relooked, redesigned, new icons, new ergonomic's behaviours * Administration is now responsive (easier to cope with it on small devices) * Administration menu re-organized * a11y (accessibility) everywhere, with and whithout Js * Success, notice and warning messages have been harmonized * daInstaller has been dispatched in core (in plugins and blog themes management) * Global help is now available, contextual help is available on every page * Media manager enhanced * Maintenance plugin revamped and enhanced (now includes export features) * Categories management enhanced * Plugins and themes management revamped * New “Plumetis” variation for Blowup theme * Jasmine is now used for unit testing of js components * A lot of bug fixes * A lot of cosmetics adjustments * A lot of enhancements Dotclear 2.5.3 - 2013-09-13 =========================================================== * Bugfix: l10n Clearbricks library * Bugfix: post's comments and trackbacks counters * Check public and cache directories (existence and permissions) * Avoid Categorie's identical URL as far as possible * Cope with alpha layers in PNG images for thumbnails generation * Add password strength indicators * Fix permission form (checkboxes management) * Better management of antispam filters * Minor enhancements * Various bug fixes * Various cosmetic adjustments Dotclear 2.5.2 - 2013-08-14 =========================================================== * Security fix: Fixed potential XSS * Bugfix: l10n Clearbricks library * now works * Dotclear update check may now be forced (ignoring cache) * Enforce integration of daInstaller plugin * Tags link button is now available on page editor * Default cache age is now 1 week instead of 2 hours * Quick entry dashboard module is not activated by default on new installation * New template {{tpl:BlogParentThemeURL}} (return URL of parent theme of blog's theme if any, URL of blog's theme otherwise) * Fix post comments number on comments deletion * Fix order of backup files * Minor enhancements * Various bug fixes * Various cosmetic adjustments Dotclear 2.5.1 - 2013-07-20 =========================================================== * Security fix: Replacement of swfupload.swf by a jQuery plugin * Security enhancement: Strenghened lists display * Thumbnails quality improved * Minor enhancements * Various bug fixes * Various cosmetic adjustments Dotclear 2.5.0 - 2013-03-12 =========================================================== * Security fix: XSS vulnerabilities in swfupload.swf (media enhanced uploader) * Ductile theme may now use webfont (from Google, Adobe and similar providers) * daInstaller plugin is now included in the official distribution * The media enhanced uploader may now be temporarily enabled or disabled * Add mass expand on posts and comments lists * Allow wildcard for IP address on comments filters * Add ability to delete non empty category (and move its content to another category) * Every types of entries may be used to inserted an entry link in current edited post * Add (none) option to image insertion title pattern * Smileys are not more converted in image in pre,code,kbd,script and math contents * Notes' title can be now enclosed in h4 (default), h3 or p HTML tag * Now display translated name and desc of plugins * Add publication date validation on post and page editing forms * Add description to widgets * Add syntax color option to theme editor plugin * Add delete button on media item page * Add/complement display modes (all pages, home page only, except on home page) for all widgets * {{tpl:Widgets}} without type attribute set displays now all widgets (from nav, extra and custom) * Add {{tpl:else}}, {{tpl:TagCount}}, , {{tpl:CategoryEntriesCount}} template tags * Add cat_only, no_tag and content_only attributes to {{tpl:EntryFirstImage}} tag * Add capitalize attribute to template filters' list * Enhance links lookup anti spam filter * Add hidden optional attribute for pages * Adaptative compression rate for thumbnails generation * Add timestamp on admin information messages * Update to jQuery 1.8.3 and jQuery-UI 1.9.2 (custom) * Add default favicon.ico * Add default attributes settings for image,mp3,flv insertion * Various bug fixes * Various cosmetic updates and contrast adjustments Dotclear 2.4.4 - 2012-08-13 =========================================================== * Bugfix: Programmed entries works again. * Compatibility fix: widgets are now fully php >=5.3 compliant * Security fix: potential CSRF in user management * has_tag now part of dotclear core, moved from tag plugin. * empty title fixed on rss reader widget Dotclear 2.4.3 - 2012-05-18 =========================================================== * Admin: My favorites menu can be hidden * Admin: Fix wordpress importer * Admin: about:config and user:pref tables are now more readable * Ductile theme: Blog logo can be changed * New lithuanian language (thanks to Paulius Černakauskas) * Various bug fixes Dotclear 2.4.2 - 2012-02-11 =========================================================== * Security fix release * 4 XSS vulnerabilities fixed, discovered by High-Tech Bridge Dotclear 2.4.1.2 - 2011-12-24 =========================================================== * Happy Christmas! * Security: fixed one SQL injection vulnerability in Clearbricks, thanks to Adjaya * New behaviour: publicGetURLFor * New behaviour: publicRegisterURL * New behaviour: templatePrepareParams * Changed the way to get artefacts URLs, through $core->url->getURLFor calls, instead of $core->url->getBase() * new/updated parameter sql_only in $core->blog->getPosts and $core->blog->getComments Dotclear 2.4.0 - 2011-11-13 =========================================================== * Admin: new iconset from Thomas Daveluy * Admin: Accessibility enhancements * Added a custom widget sidebar * Added a new theme (Ductile) * Added a new plugin (simpleMenu) * handling of postgres non default schemas (db_prefix = 'schema.prefix') * New iconset mechanism * New behaviour: coreBlogBeforeGetPosts * Security fix: Spam comments feed now checks for blog permission. Thanks to Romuald Brunet. * Various bug fixes Dotclear 2.3.1 - 2011-06-14 =========================================================== * Updated makefile for cleaner distrib. * Better localization handling for prefs and shortcuts. * Misc JS & CSS cleaning. * Import/Export preferences-related bugfix. * Administrative mail address is now configurable. * Security: one minor fix and changes for two potential problems. Thanks to Jeremie Boutoille Dotclear 2.3.0 - 2011-05-16 =========================================================== * Admin: Major backend redesign * Admin: Customizable Dashboard * Admin: New Favourites admin submenu * Admin: New user preferences backend * Admin: Accessibility enhancements * Admin: Inline help extended * Templates: Default theme templates moved to inc/public/default-templates * Clearbricks: External libraries relocated to inc/libs * Clearbricks: fixed utf-8 and mysql strict mode problems * Added a safe mode connection, disabling all plugins * Mysqli support (config.php may need to be updated manually) * Fixed dcLog bug with pgsql * Fixed comment/trackbacks counters reset. * Several other bug fixes Dotclear 2.2.3 - 2011-04-01 =========================================================== * Security fix in media manager. Thx to Raphaël * Bugfix : 2.2.2 was preventing manual thumbnail regeneration. * Database handling bugfixes Dotclear 2.2.2 - 2011-01-17 =========================================================== * Bugfix: 2.2.1 was blocking new installations * Autoupdate procedure should now be "bad ftp client configuration"-proof. * Several other small bugfixes Dotclear 2.2.1 - 2011-01-15 =========================================================== * ExternalMedia is not part of the core distribution anymore * New attribute to tpl:SysIf: blog_id * New behaviour: adminMediaItemForm * Several bugfixes * Several code optimizations * Several typos corrected * Security fix in Clearbricks. Thx to François Pierre-Doray for pointing it out. Dotclear 2.2 - 2010-07-01 =========================================================== * New installation wizard. * Several new behaviours: - adminCommentHeaders - adminCommentsActionsCombo - adminCommentsActions - adminCommentsActionsContent - adminBeforeCommentDelete - adminPostsActionsHeaders - adminUsersActionsCombo - coreBeforeCategoryCreate & coreAfterCategoryCreate - coreBeforeCategoryUpdate & coreAfterCategoryUpdate - coreBeforeLogCreate & coreAfterLogCreate - coreBeforePostCreate & coreAfterPostCreate - coreBeforePostUpdate & coreAfterPostUpdate - coreMediaConstruct - templateCustomSortByAlias - urlHandlerGetArgsDocument * New methods for several core classes. * Metadata integration to the core. * Error handlers can now be extended. * Templates: blocks can now be recursive. * Templates: Entries & Comments tags can now be sorted. * Templates: The template subsystem is quicker, linier, and ready to be extended. * Complete reworking of the settings system * Correct handling of postgresql non default schemas. * Admin: Autocompletion and further enhancing to tags handling. * Admin: Accessibility & ergonomic tweaks. * Admin: Administrator tag in users list. * Comment cookies are now specific to the blog rather than to the domain. * Password changes can now be mandatory. * jQuery updated to 1.4.2. * And way too many bugfixes and typos squashes to be listed. Dotclear 2.1.7 - 2010-05-25 =========================================================== * Auto-update procedure fix Dotclear 2.1.6 - 2009-10-01 =========================================================== * Install procedure fixes * Admin: Page managers can now create pages * Admin: several typos corrected. * Admin: Widgets now work in IE8. * Admin: Password protected posts can now be previewed. * Templates: tpl:Meta* are now tpl:Tags*. * Templates: now display all posts. * new behavior: adminPageHTMLHead * DB schema: new blog_id field in log table * Media manager: Pubic folder can now be set on a different host. * WordPress import fixes * Dailymotion insertion fix * Upgrade procedure: CRLF removed in files that were bugging the upgrade. * JQuery updated to 1.3 * IE7-js update * security: Full Path Disclosure protection. Thx to Karim Ayad for pointing it out. * and way too many bugfixes to be listed. Dotclear 2.1.5 - 2009-02-05 =========================================================== * Security release * Youtube insertion update Dotclear 2.1.4 - 2008-12-21 =========================================================== * Security flaw fix * WordPress import refining * XML-RPC improvements Dotclear 2.1.3 - 2008-11-19 =========================================================== * Admin: New upgrade procedure * Admin: Fixed video insertion bug * Template: New attributes * url on EntryIf * only_category on Blogroll * no_context on Pagination * Template: New tag * BlogID * Admin: escaped blog_id on authentication page Dotclear 2.1.1 - 2008-11-07 =========================================================== * Admin: Automatic Update bug fixes * Admin: Disable Automatic Update if no digests file * Admin: Javascript fixes in authentication page * Admin: Fixed errors with categories select boxes * Template: Added level attribute in tpl:Categories * Media: Added H.264/MPEG-4 AVC for mp4 files Dotclear 2.1 - 2008-11-01 =========================================================== * Subcategories * Admin: Automatic Update * Admin: Flash 10 support for uploader * Admin: mailto link in comment details * Admin: Embedded video size selection * Admin: Restrict session cookie path to admin * Media: H.264/MPEG-4 AVC (HD) support with m4v files * Inherited themes * WordPress XML-RPC methods support * True unicode URLs * Plugin: Widgets as template tags * Plugin: Filters in entries widgets and Blogroll * Plugin: Added vimeo.com in external media * Template: New tags * LoopPosition * CommentAuthorDomain * CommentAuthorMD5 * EntryFirstImage * EntryCategoryShortURL * CategoryIf * CategoryFirstChildren * CategoryParents * EntryCategoriesBreadcrum * MediaURL Dotclear 2.0.2 - 2008-09-05 =========================================================== * New installation procedure * Plugin: WordPress import fixes * Plugin: Plain text export as downloadable files * Plugin: Message about URLs in Dotclear 1.2 import * Public: Display a message if search returns no result * Admin: Fixed some CSS bugs * Admin: Batch select/unselect entries * Admin: In a media item, find entries containing it Dotclear 2.0.1 - 2008-08-16 =========================================================== * Plugin: Fixed a bug with Dotclear 1.2 URLs import. * Plugin: Fixed a l10n bug in Pages * Admin: Enhanced plugins resources loading and cache Dotclear 2.0 - 2008-08-01 =========================================================== * Public: Atom becomes the default feed format. RSS 2 is always available. * Admin: design enhancements and new Dotclear logo * Admin: entries preview in blog context * L10N: New language manager with zip files support * Plugin: Import/Export plugin version 2.0 with import from Dotclear 1.2 and WordPress * Plugin: Pages enhancements (preview, sorting) * Plugin: support for jamendo and deezer in External Media * JSMin on JavaScript files instead of JS packing * SQLite 3 only support (PDO based) * Many bug fixes and major performances improvements Dotclear 2.0 RC2 - 2008-06-21 =========================================================== * FairTrackback spam filter * Language pack infrastructure * Bug fix on comment search with author "0" * Javascript fixes * dcAuth::sessionExists and dcAuth::checkSession new methods * Right management in dcAuth::sudo * Media File sorting options in media manager * CandyUpload, new uploader tool based on SWFUpload * New search engine robots options * New image options * L10N: Japanese and Portugues (Brazil) language packs * Many bug fixes and enhancements Dotclear 2.0 RC1 - 2008-05-01 =========================================================== * New: Pages plugin * New: Theme editor plugin * Entries: Text and WYSIWYG enhancements * Entries: Markup validator * Entries: Insertion of links to other entries from toolbar * Entries: External media insertion (dailymotion, youtube, google video) * Tags: Same list for new and existing entries * Tags: Tags can be removed on all associated entries * Tags: Tags can be removed on a post selection * Admin: Ask password for user management tasks, theme upload and plugin upload * Admin: New contextual help viewer * Media manager: Recreate thumbnails option * Media manager: Custom medium thumbnail size (per blog) * Media manager: Zip files extract support * Media manager: Zip file download of directory * Media manager: File exclusion pattern option * Themes and plugins: Zip as new package format * Themes and plugins: Upload * Themes and plugins: Upgrade within administration interface * Themes and plugins: Deletion * Public: New default theme: Blowup (fully customizable) * Public: Changed the way commenter cookie is handled * Themes: Template files moved to tpl/ directory * L10N: Polish, Catalan and Spanish translations * Misc: jQuery upgraded to 1.2.3 * Misc: Crushed png files * Fixed many bugs Dotclear 2.0 beta 7 - 2007-07-12 =========================================================== * New way to display comments and trackbacks on entries in backend * Dashboard visual improvements * Default cache dir created by installation process * Option to limit posts and comments in feeds * Introduced UDBS for installation and upgrade * Changed handling of XML-RPC URLs * New option to force HTTPS redirect if wanted * Enforced cookies security (directory and ssl support) * Added Plugin auto-install and auto-upgrade support * Added trackbacks ttl and moderation preferences * Added an Internal search engine * FLV support in backend with Neolao player * Added nice messages if database is broken or Dotclear not installed * upgrade jQuery to 1.1.3 * Fixed many bugs * Fixed security issues in backend Dotclear 2.0 beta 6 - 2007-02-19 =========================================================== * New antispam plugin, with a set of filters (rbl, ipblacklist, spamwords, akismet) * New admin dashboard page * Fixed unwanted logout bug * Added settings to disable template caching and allow PHP code * Blog preferences panel bug fix * New XML-RPC Client and Server * Comment posting permissions bug fix Dotclear 2.0 beta 5.4 - 2007-01-19 =========================================================== * Minor change on spam display in comments.php * Command line upgrade script and fix in load_plugin_file.php * Make akismet configurable only by superadmin with DC_AKISMET_SUPER * SQL optimisations * New comments view in post Dotclear 2.0 beta 5.2 - 2007-01-11 =========================================================== * Fixed a bug with imageMeta::getMeta * Enhanced dynamic file uploader * Move clearbricks files to their own repository * Fixed a bug with auto_br in wikiSimpleComment * Support for language restriction in feeds * Default theme structure changes * Fixed a PHP 5.0 compatibility issue * Installation Wizard Dotclear 2.0 beta 4 - 2006-12-26 =========================================================== * Performances enhancements. * Administration UI enhancements. * More user-friendly Widgets (version 1.5). * Switch to jQuery . * Added jQuery in default theme. * Major changes in HTTP client and Feed Parser based on a generic socket handler. * PHP 5.2 compatibility. * Code documentation (all core and most of clearbricks). * Many bug fixes. Dotclear 2.0 beta 3 - 2006-11-05 =========================================================== * Disallow special wrappers for fopen like functions. * XML/RPC improvements. * Read IPTC and EXIF metadata in uploaded pictures. * MySQL 4.1 support only. * Metadata import from Dotclear 1.2.x. * Akismet plugin. * Pings plugin. * Added a priority setting for plugins. * Many bug fixes. Dotclear 2.0 beta 2 - 2006-08-09 =========================================================== * DC_PLUGIN_ROOT can handle more than one path. * OPML/XBEL import in blogroll plugin. * Fixed a security issue in html::absoluteURLs(). * Fixed issues with timezone on scheduled entries. * Multiple categories selection in tpl:Entries. * Improved dbLayer. * Changed category feed URL. * Feeds for tags (entries and comments). * Added attachments count on backend and frontend. * New settings code design. Can now handle wide system settings. * Memory usage improvements with autoloader. * Some code cleanup. * Feed parser improvements. * Themes can be configured if needed. * XMP support on JPEG files. * Media manager improvements. * Spamplemousse now uses DNSBL (and the guy who left the bug was fired). * Javascript editor and toolbar improvements. * RDS support (XML/RPC API discovery). * Added a theme with user stylesheet. * Plugins manager dotclear-2.6.2+dfsg/CREDITS000066400000000000000000000014071230033266200152540ustar00rootroot00000000000000This is a credits file of people that have contributed to the Dotclear project. Dotclear Team ------------- Thomas Bouron Anne Cavalier Noé Cendrier Benoit Clerc Grégory Corvisier Florent Cotton Jean-Christian Denis Philippe Hénaff Bruno Hondelatte Kévin Lepeltier Olivier Meunier Franck Paul Michel Pelletier Xavier Plantefève Nicolas Roudaire Jean-Michel Royer Anne Sophie Tranchet Alain Vagner Dotclear Translators -------------------- Benjamin Bank Alain Béarez Claire Cambier Luis Correia Andreas Diller Alain Fagot Sabrina Favier Charles Hebert Guillaume Jonquiere Dennis S. L. Jørgensen Miguel A. Muñoz Sebestyén Muráncsik Nnidŷu Polo Aina Chabert Ramon Adnan Shameem Enrique Matias Sanchez Jan Skrasek Takafumi Regina Timbó ... and all contributors. dotclear-2.6.2+dfsg/LICENSE000066400000000000000000000431031230033266200152400ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. dotclear-2.6.2+dfsg/README.md000066400000000000000000000056441230033266200155220ustar00rootroot00000000000000# README ## WHAT IS DOTCLEAR ? Dotclear is an open-source web publishing software. Take control over your blog! Dotclear project's purpose is to provide a user-friendly tool allowing anyone to publish on the web, regardless of their technical skills. ### Features: * Easy publication * Fully customizable theme * User-friendly administration * Flexible template system * Media management * Choose from several editing syntax (wiki, markdown, textile or directly in wysiwyg) * Flexible comment system * Built-in antispam * Localization * Presentation widgets * Themes and plugins * Pages * Tags and categories * Automated installation * Support for several database types * Multiblog * Multi-user with permissions * Standards compliant * Accessible * Importing / exporting * Naturally optimized for search engines * Syndication feeds * Complete trackback support * Full Unicode support * XML/RPC client support * Extensible * Performance and scalability * Twice free ## REQUIREMENTS In order to run Dotclear you need: * A web server (Apache, Cherokee, Nginx, lighttpd, etc.) * PHP 5.2 with the following modules: * mbstring * iconv * simplexml * mysql, mysqli, postgresql or sqlite * A database server (MySQL or PostgreSQL) or SQLite. ## INSTALLATION ### Automatic installation The easiest way to install the blog engine is automatic installation. Download the [one minute install file][1], upload it to your web space. Then open it in your favorite browser. You'll only have to follow the instructions on screen. See the [documentation][2] for more information. ### Standard installation. You need to download [Dotclear archive][3], extract it then upload your files to your web space using an FTP client. Then open your favorite browser and go to http://your.host.name/dotclear/admin/install/. A message alerts you that you haven't got a configuration file and offers to run the wizard. Click this link. ## DOCUMENTATION Still unsure if you want to move? A "[guided tour][4]" is what you need. Dotclear is fully documented: * If you have moved in already, the [User Manual][5] is there for you. * The managers will turn to the [Administration Guide][6]. * Decorators and craftsmen will surely enjoy reading the [Developer and designer resources][7]. Dotclear documentation uses a wiki. Feel free to contribute. CONTRIBUTING ------------ Dotclear is an open source project. If you'd like to contribute, please read the [CONTRIBUTING file](CONTRIBUTING.md). You can submit a pull request, or feel free to use any other way you'd prefer. [1]: http://download.dotclear.org/loader/dotclear-loader.php [2]: http://dotclear.org/documentation/2.0/admin/install [3]: http://dotclear.org/download [4]: http://dotclear.org/documentation/2.0/overview/tour [5]: http://dotclear.org/documentation/2.0/usage [6]: http://dotclear.org/documentation/2.0/admin [7]: http://dotclear.org/documentation/2.0/resources dotclear-2.6.2+dfsg/admin/000077500000000000000000000000001230033266200153225ustar00rootroot00000000000000dotclear-2.6.2+dfsg/admin/_charte.php000066400000000000000000001014401230033266200174400ustar00rootroot00000000000000 Bibliothèque de styles - Dotclear - 2.6

Typographie

Textes

La font-size de base est à 1.2rem (la valeur 1rem correspond à 10px). Si vous utilisez l'unité rem pensez à faire précéder la déclaration par son équivalent en pixels pour rester compatible avec Internet Explorer. L'interlignage courant est à 1.5.

La liste suivante est de class "nice". Elle est semblable aux listes ordinaires mais avec des puces carrées.

  • Les textes courants sont en Arial, Helvetica ou sans-serif.
  • Le code adopte la fonte Andale Mono, Courier New ou monospace.
  • Les liens ont des aspects différents au focus et au survol. Il faut conserver cette distinction, nécessaire à l'accessibilité et l'ergonomie.

Titre h3

Le titre de niveau h1 est réservé au titre du site-admin. Le titre de niveau h2 est réservé au breadcrumb/titre de la page courante. On utilise les titres de niveau h3 en premier niveau de titre à l'intérieur des pages, comme sur la page Import/Export.

Il ne faut pas choisir un niveau de titre en fonction de son aspect mais respecter une hiérarchie cohérente. On peut obtenir visuellement l'aspect d'un titre h3 en donnant à l'élément la class "as_h3".

Titre de niveau h4

On peut obtenir visuellement l'aspect d'un titre h4 en donnant à l'élément la class "as_h4".

Titre de niveau h5

Le titre de niveau h5 est assez peu employé mais son style est prévu. Dans une admin de base, on utilise les niveaux h5 pour certains éléments du sidebar du billet, mais un style particulier leur est alors appliqué pour ressembler aux autres items de ce sidebar.

Titres des encadrés

Les titres de boîte encadrées (div de class "fieldset", comme ici) se présentent comme ci-dessus.

On peut utiliser, quel que soit le niveau hx de cet intertitre la class "pretty-title" pour obtenir l'effet ci-dessus.

Autre variante

On dispose également d'une class "smart-title" pour obtenir une présentation comme celle du titre de ce paragraphe.

Layouts

Onglets

Les descriptions des constructions en multi-colonnes ci-dessous présentent un exemple de répartition en onglets.

Chacun de ces onglets doit être défini à l'aide d'une <div class="multi-part">. Ils seront alors automatiquement présentés sous forme d'onglets.

Multi-colonnage

Boîtes distribuées horizontalement

1 Toutes les boîtes de class "box" placées à l'intérieur d'une boîte de class "one-box" se distribuent horizontalement (imaginez que chaque boîte est un mot dans un paragraphe). Si les largeurs de ces boîtes ne sont pas spécifiquement définies dans la CSS, elle s'ajustent à leur contenu.

2 Voici une petite boîte.

3 Une autre petite boîte.

4 Par défaut les « lignes » de boîtes "box" sont justifiées au sein de la boîte "one-box" et l'espacement se répartit entre elles.

5 Si vous souhaitez un autre alignement des boîtes entre elles vous pouvez ajouter les class :

  • "txt-left",
  • "txt-right"
  • ou "txt-center"

à la class "one-box".

6 Le cadre placé ici autour de chaque boîte ne fait pas partie des styles par défaut.

Boîtes distribuées deux par deux

1 Les boîtes de class "two-boxes" ont une règle CSS display:inline-block;. Elles se rangent alternativement à gauche et à droite. Pour plus de clarté, les blocs sont ici numérotés avec leur ordre dans le flux.

2 On peut assortir une boîte des class "odd" (nothing left) et "even" pour que les marges se placent correctement.

3 Attention, il faut soit ne pas retourner à la ligne entre la fermeture d'une boîte "two-boxes" et l'ouverture de la suivante soit adopter la méthode de commentaire vide mise en place ici et expliquée chez Alsacréations (« Méthode 2 »).

4 On peut bien sûr imbriquer des boîtes de class "two-boxes" au sein d'une boîte "two-boxes" afin qu'elles…

4 bis… se distribuent horizontalement comme dans une boîte "one-box".

Boîtes distribuées trois par trois

Sur le même principe que les « two-boxes » on peut utiliser des boîtes de class "three-boxes" pour répartir les contenus sur trois colonnes de 30% chacune (le reste est occupé par les marges).

Comme pour les "two-boxes" il faut soit ne pas laisser d'espace ou de retour à la ligne entre les boîtes, soit adopter la méthode recommandée plus haut.

Dans les « two-boxes » comme dans les « three-boxes », on peut placer à l'intérieur plusieurs autres div de class="box" qui s'afficheront les unes à côté des autres ou l'une en dessous de l'autre selon la place dont elles disposent.

Deux colonnes flottantes de largeurs égales

La div englobante porte la class "two-cols", chacune de ses div porte la class "col". Sans autre précision les deux colonnes sont d'égale largeur.

Attention : ces colonnes sont construites avec des flottants, il faut donc penser à mettre une class clear à l'élément suivant ou ajouter la class "clearfix" à la div class="two-cols".

Deux colonnes flottantes de largeurs inégales

col70 La div englobante porte la class "two-cols". Pour obtenir des colonnes inégales, on dispose des classes "col70" et col30 à attribuer à l'une ou à l'autre de ses colonnes.

col30 Penser à mettre une class "clear" à l'élément suivant ou ajouter la class "clearfix" div class="two-cols".

Trois colonnes flottantes de largeurs égales

Deprecated. Ces règles sont conservées dans la 2.6 par souci de rétro-compatibilité mais il est recommandé d'utiliser désormais le colonnage three-boxes.

Colonne 1

La div englobante porte la class "three-cols", chacune de ses div porte la class "col". Les trois colonnes sont d'égale largeur.

Colonne 2

Voici une deuxième colonne. N'oubliez pas d'ajouter la class "clearfix" à la class "three-cols" ou un élément de class "clear" après cet élément.

Colonne 3

Voilà la troisième colonne.


Note : dans les exemples les valeurs et les numérotations sont placées dans un span class="step" (et ressortent donc dans un petit bloc à fond gris).

Interactions

Éléments de formulaire

p class="form-note".

span class="form-note"

La class="bold" est bien sûr à écrire en minuscules.

Les checkboxes et les boutons radio sont dans la balise <label>.

Légende de fieldset

Attention: Les fieldsets ne doivent être utilisés que pour isoler un groupe de champs au sein d'un formulaire.

Boutons

a.button.add Se place en haut à droite (dans un p.top-add)

a.button a.reset

a.button delete

Messages

Messages système

Il existe quatre types de messages système auxquels correspondent des classes CSS : .error, .message, .success, .warning-msg. Ils s'affichent en haut de page, sous le titre/breadcrumb.

Message simple. Le plus souvent horodaté dcPage::message

Message de succès. Le plus souvent horodaté dcPage::success

Message warning. Non horodaté dcPage::warning

Message d'erreur. Non horodaté dcPage::error

La classe .static-msg peut être utilisée directement pour affichage en haut de page :

Comme le message simple mais sans effets de transition.

Un type de message réservé à Dotclear peut s'afficher en haut de la page :

Messages contextuels

Paragraphe de message d'alerte class warn ou warning.

Paragraphe de message de class info.

Ces messages sont en display:inline-block. Le fond s'adapte à la longueur du message.

Navigation

Selecteur d'accès direct

Sur des pages longues et denses comme les pages about:config ou about:preferences, on peut utiliser un sélecteur pour faciliter l'accès direct aux sections.

Navigation contextuelle

Lien vers le blog

Pseudo-onglets

Les pseudo-onglets permettent d'ajouter des sous-pages qui sont des liens vers d'autres pages, par opposition aux onglets qui sont des sections internes à la page.

Les pseudo-onglets sont à positionner immédiatement après le breadcrumb (ici un hr simule le trait sous le breadcrumb).

Ces pseudo-onglets doivent être définis avec un <ul class="pseudo-tabs"> et des <li>.


Tableaux

Il existe deux mises en forme type de tableaux selon que l'on cherche à faire un tableau ordinaire ou un tableau dont on peut déplacer les lignes par glisser déposer (voir plus bas). Cependant certaines règles sont communes à tout les tableaux.

Règles communes

Largeur du tableau

Sauf pour des tableaux particuliers (absents dans l'admin mais qui pourraient être nécessaires à un plugin,les tableaux occupent toute la largeur de la page. Afin que les tableaux soient consultables sur un mobile en navigant horizontalement, on englobe le tableau dans une div class="table-outer", qui servira de « conteneur ».

Accessibilité

Les éléments caption, th, scope sont nécessaires à l'accessibilité. Ne les oubliez pas ! ». On peut utiliser la class="hidden" sur l'élément caption (qui accueille le titre du tableau) si vous ne souhaitez pas qu'il soit affiché sur la page.

Les classes

Des classes particulières peuvent être attribuées aux lignes :

  • line (systématique) : pour les traits horizontaux et le fond gris léger au survol ;
  • offline : pour un noir estompé (gris quoi).

Des classes particulières peuvent être appliquées aux cellules :

  • nowrap : pas de retour à la ligne dans la cellule, quelle que soit la largeur de la page ;
  • maximal : la cellule prendra toute la largeur restante disponible ;
  • count : le contenu de la cellule sera aligné à droite avec un petit retrait.

Tableau classique

Titre Date Catégorie Auteur Commentaires Rétroliens État
Mon cher Franck 06/08/2013 19:16 Les aventures du clafoutis kozlika4 0Publié Sélectionné
Dotclear 2.3.0 16/05/2011 22:29 Les aventures du clafoutis kozlika5 0Non publié Sélectionné
Causons opéra au Tamm Bara 24/11/2009 23:10 Les aventures du clafoutis kozlika 41 Publié
Souffler six bougies 14/08/2009 00:00Les aventures du clafoutis kozlika 42Publié
Dotclear et grenadine, troisième édition 15/06/2009 07:39 Les aventures du clafoutis kozlika 9 1 Publié
L'abc dotclear est né 19/03/2009 10:31Les aventures du clafoutis kozlika 10 Publié

Tableau avec ordonnancement

Les tableaux permettant l'ordonnancement doivent offrir la possibilité d'effectuer le classement grâce à des inputs placés en début de ligne pour que le classement soit possible même lorsque cette fonctionnalité est désactivée (via les préférences utilisateurs, voire une désactivation complète du javascript dans le navigateur).

Titre Date Auteur Commentaires Rétroliens État
Mentions légales 17/12/2008 07:35 franck 0 0 Publié
Page active et cachée 26/10/2012 11:08 admin 0 0 Publié Masqué
Page révisionnable 14/12/2012 13:26 admin 0 0 En attente
Programme 26/10/2020 11:23 admin 0 0 Programmé
Protégée 26/10/2012 11:23 admin 0 0 En attente Protégé

Icônes

Les icônes utilisées dans l'administration sont présentes en deux formats  64*64px pour les grandes (qui sont affichées sur le tableau de bord si la page correspondante est choisie en favori par l'utilisateur) et 16*16px pour les petits formats.

La plupart sont dérivées de la fonte d'icônes Elegant Font. Les autres sont des images vectorielles réalisées par la DC Team. Nous les avons nommées Traviata. La palette de couleurs utilisée est la suivante :

palette des couleurs utilisées pour les icônes

Bleu : #137bbb - Vert : #9ac123 - Rouge : #c44d58 - Bleu ciel : #a2cbe9 - Gris clair : #ececec - Gris moyen : #b2b2b2 - Gris foncé : #676e78.

dotclear-2.6.2+dfsg/admin/auth.php000066400000000000000000000313461230033266200170030ustar00rootroot00000000000000auth->allowPassChange() && isset($_POST['new_pwd']) && isset($_POST['new_pwd_c']) && isset($_POST['login_data']); $login_data = !empty($_POST['login_data']) ? html::escapeHTML($_POST['login_data']) : null; $recover = $core->auth->allowPassChange() && !empty($_REQUEST['recover']); $safe_mode = !empty($_REQUEST['safe_mode']); $akey = $core->auth->allowPassChange() && !empty($_GET['akey']) ? $_GET['akey'] : null; $user_id = $user_pwd = $user_key = $user_email = null; $err = $msg = null; # Auto upgrade if (empty($_GET) && empty($_POST)) { require dirname(__FILE__).'/../inc/dbschema/upgrade.php'; try { if (($changes = dotclearUpgrade($core)) !== false) { $msg = __('Dotclear has been upgraded.').''; } } catch (Exception $e) { $err = $e->getMessage(); } } # If we have POST login informations, go throug auth process if (!empty($_POST['user_id']) && !empty($_POST['user_pwd'])) { $user_id = !empty($_POST['user_id']) ? $_POST['user_id'] : null; $user_pwd = !empty($_POST['user_pwd']) ? $_POST['user_pwd'] : null; } # If we have COOKIE login informations, go throug auth process elseif (isset($_COOKIE['dc_admin']) && strlen($_COOKIE['dc_admin']) == 104) { # If we have a remember cookie, go through auth process with user_key $user_id = substr($_COOKIE['dc_admin'],40); $user_id = @unpack('a32',@pack('H*',$user_id)); if (is_array($user_id)) { $user_id = $user_id[1]; $user_key = substr($_COOKIE['dc_admin'],0,40); $user_pwd = null; } else { $user_id = null; } } # Recover password if ($recover && !empty($_POST['user_id']) && !empty($_POST['user_email'])) { $user_id = !empty($_POST['user_id']) ? $_POST['user_id'] : null; $user_email = !empty($_POST['user_email']) ? $_POST['user_email'] : ''; try { $recover_key = $core->auth->setRecoverKey($user_id,$user_email); $subject = mail::B64Header('DotClear '.__('Password reset')); $message = __('Someone has requested to reset the password for the following site and username.')."\n\n". $page_url."\n".__('Username:').' '.$user_id."\n\n". __('To reset your password visit the following address, otherwise just ignore this email and nothing will happen.')."\n". $page_url.'?akey='.$recover_key; $headers[] = 'From: '.(defined('DC_ADMIN_MAILFROM') && DC_ADMIN_MAILFROM ? DC_ADMIN_MAILFROM : 'dotclear@local'); $headers[] = 'Content-Type: text/plain; charset=UTF-8;'; mail::sendMail($user_email,$subject,$message,$headers); $msg = sprintf(__('The e-mail was sent successfully to %s.'),$user_email); } catch (Exception $e) { $err = $e->getMessage(); } } # Send new password elseif ($akey) { try { $recover_res = $core->auth->recoverUserPassword($akey); $subject = mb_encode_mimeheader('DotClear '.__('Your new password'),'UTF-8','B'); $message = __('Username:').' '.$recover_res['user_id']."\n". __('Password:').' '.$recover_res['new_pass']."\n\n". preg_replace('/\?(.*)$/','',$page_url); $headers[] = 'From: dotclear@'.$_SERVER['HTTP_HOST']; $headers[] = 'Content-Type: text/plain; charset=UTF-8;'; mail::sendMail($recover_res['user_email'],$subject,$message,$headers); $msg = __('Your new password is in your mailbox.'); } catch (Exception $e) { $err = $e->getMessage(); } } # Change password and retry to log elseif ($change_pwd) { try { $tmp_data = explode('/',$_POST['login_data']); if (count($tmp_data) != 3) { throw new Exception(); } $data = array( 'user_id'=>base64_decode($tmp_data[0]), 'cookie_admin'=>$tmp_data[1], 'user_remember'=>$tmp_data[2]=='1' ); if ($data['user_id'] === false) { throw new Exception(); } # Check login informations $check_user = false; if (isset($data['cookie_admin']) && strlen($data['cookie_admin']) == 104) { $user_id = substr($data['cookie_admin'],40); $user_id = @unpack('a32',@pack('H*',$user_id)); if (is_array($user_id)) { $user_id = $user_id[1]; $user_key = substr($data['cookie_admin'],0,40); $check_user = $core->auth->checkUser($user_id,null,$user_key) === true; } } if (!$core->auth->allowPassChange() || !$check_user) { $change_pwd = false; throw new Exception(); } if ($_POST['new_pwd'] != $_POST['new_pwd_c']) { throw new Exception(__("Passwords don't match")); } if ($core->auth->checkUser($user_id,$_POST['new_pwd']) === true) { throw new Exception(__("You didn't change your password.")); } $cur = $core->con->openCursor($core->prefix.'user'); $cur->user_change_pwd = 0; $cur->user_pwd = $_POST['new_pwd']; $core->updUser($core->auth->userID(),$cur); $core->session->start(); $_SESSION['sess_user_id'] = $user_id; $_SESSION['sess_browser_uid'] = http::browserUID(DC_MASTER_KEY); if ($data['user_remember']) { setcookie('dc_admin',$data['cookie_admin'],strtotime('+15 days'),'','',DC_ADMIN_SSL); } http::redirect('index.php'); } catch (Exception $e) { $err = $e->getMessage(); } } # Try to log elseif ($user_id !== null && ($user_pwd !== null || $user_key !== null)) { # We check the user $check_user = $core->auth->checkUser($user_id,$user_pwd,$user_key,false) === true; if ($check_user) { $check_perms = $core->auth->findUserBlog() !== false; } else { $check_perms = false; } $cookie_admin = http::browserUID(DC_MASTER_KEY.$user_id. crypt::hmac(DC_MASTER_KEY,$user_pwd)).bin2hex(pack('a32',$user_id)); if ($check_perms && $core->auth->mustChangePassword()) { $login_data = join('/',array( base64_encode($user_id), $cookie_admin, empty($_POST['user_remember'])?'0':'1' )); if (!$core->auth->allowPassChange()) { $err = __('You have to change your password before you can login.'); } else { $err = __('In order to login, you have to change your password now.'); $change_pwd = true; } } elseif ($check_perms && !empty($_POST['safe_mode']) && !$core->auth->isSuperAdmin()) { $err = __('Safe Mode can only be used for super administrators.'); } elseif ($check_perms) { $core->session->start(); $_SESSION['sess_user_id'] = $user_id; $_SESSION['sess_browser_uid'] = http::browserUID(DC_MASTER_KEY); if (!empty($_POST['blog'])) { $_SESSION['sess_blog_id'] = $_POST['blog']; } if (!empty($_POST['safe_mode']) && $core->auth->isSuperAdmin()) { $_SESSION['sess_safe_mode'] = true; } if (!empty($_POST['user_remember'])) { setcookie('dc_admin',$cookie_admin,strtotime('+15 days'),'','',DC_ADMIN_SSL); } http::redirect('index.php'); } else { if (isset($_COOKIE['dc_admin'])) { unset($_COOKIE['dc_admin']); setcookie('dc_admin',false,-600,'','',DC_ADMIN_SSL); } if ($check_user) { $err = __('Insufficient permissions'); } else { $err = __('Wrong username or password'); } } } if (isset($_GET['user'])) { $user_id = $_GET['user']; } header('Content-Type: text/html; charset=UTF-8'); ?> <?php echo html::escapeHTML(DC_VENDOR_NAME); ?> callBehavior('loginPageHTMLHead'); ?>

'.$err.''; } if ($msg) { echo '

'.$msg.'

'; } if ($akey) { echo '

'.__('Back to login screen').'

'; } elseif ($recover) { echo '

'.__('Request a new password').'

'. '

'. form::field(array('user_id','user_id'),20,32,html::escapeHTML($user_id)).'

'. '

'. form::field(array('user_email','user_email'),20,255,html::escapeHTML($user_email)).'

'. '

'. form::hidden(array('recover'),1).'

'. '
'. ''; } elseif ($change_pwd) { echo '

'.__('Change your password').'

'. '

'. form::password(array('new_pwd','new_pwd'),20,255).'

'. '

'. form::password(array('new_pwd_c','new_pwd_c'),20,255).'

'. '
'. '

'. form::hidden('login_data',$login_data).'

'; } else { if (is_callable(array($core->auth,'authForm'))) { echo $core->auth->authForm($user_id); } else { if ($safe_mode) { echo '
'; echo '

'.__('Safe mode login').'

'; echo '

'. __('This mode allows you to login without activating any of your plugins. This may be useful to solve compatibility problems').' 

'. '

'.__('Disable or delete any plugin suspected to cause trouble, then log out and log back in normally.'). '

'; } else { echo '
'; } echo '

'. form::field(array('user_id','user_id'),20,32,html::escapeHTML($user_id)).'

'. '

'. form::password(array('user_pwd','user_pwd'),20,255).'

'. '

'. form::checkbox(array('user_remember','user_remember'),1). '

'. '

'; if (!empty($_REQUEST['blog'])) { echo form::hidden('blog',html::escapeHTML($_REQUEST['blog'])); } if($safe_mode) { echo form::hidden('safe_mode',1). '
'; } else { echo '
'; } echo ''; echo '
'; if ($safe_mode) { echo '

'.__('Get back to normal authentication').'

'; } else { echo '

'.__('Connection issue?').'

'; if ($core->auth->allowPassChange()) { echo '

'.__('I forgot my password').'

'; } echo '

'.__('I want to log in in safe mode').'

'; } echo '
'; } } ?>
dotclear-2.6.2+dfsg/admin/blog.php000066400000000000000000000064401230033266200167620ustar00rootroot00000000000000con->openCursor($core->prefix.'blog'); $blog_id = $cur->blog_id = $_POST['blog_id']; $blog_url = $cur->blog_url = $_POST['blog_url']; $blog_name = $cur->blog_name = $_POST['blog_name']; $blog_desc = $cur->blog_desc = $_POST['blog_desc']; try { # --BEHAVIOR-- adminBeforeBlogCreate $core->callBehavior('adminBeforeBlogCreate',$cur,$blog_id); $core->addBlog($cur); # Default settings and override some $core->blogDefaults($cur->blog_id); $blog_settings = new dcSettings($core,$cur->blog_id); $blog_settings->addNamespace('system'); $blog_settings->system->put('lang',$core->auth->getInfo('user_lang')); $blog_settings->system->put('blog_timezone',$core->auth->getInfo('user_tz')); if (substr($blog_url,-1) == '?') { $blog_settings->system->put('url_scan','query_string'); } else { $blog_settings->system->put('url_scan','path_info'); } # --BEHAVIOR-- adminAfterBlogCreate $core->callBehavior('adminAfterBlogCreate',$cur,$blog_id,$blog_settings); dcPage::addSuccessNotice(sprintf(__('Blog "%s" successfully created'), html::escapeHTML($cur->blog_name))); http::redirect('blog.php?id='.$cur->blog_id); } catch (Exception $e) { $core->error->add($e->getMessage()); } } if (!empty($_REQUEST['id'])) { $edit_blog_mode = true; include dirname(__FILE__).'/blog_pref.php'; } else { dcPage::open(__('New blog'),dcPage::jsConfirmClose('blog-form'), dcPage::breadcrumb( array( __('System') => '', __('Blogs') => 'blogs.php', __('New blog') => '' )) ); echo '
'. '
'.$core->formNonce().'
'. '

'. form::field('blog_id',30,32,html::escapeHTML($blog_id)).'

'. '

'.__('At least 2 characters using letters, numbers or symbols.').'

'; if ($blog_id) { echo '

'.__('Please note that changing your blog ID may require changes in your public index.php file.').'

'; } echo '

'. form::field('blog_name',30,255,html::escapeHTML($blog_name)).'

'. '

'. form::field('blog_url',30,255,html::escapeHTML($blog_url)).'

'. '

'. form::textarea('blog_desc',60,5,html::escapeHTML($blog_desc)).'

'. '

'. '
'; dcPage::helpBlock('core_blog_new'); dcPage::close(); } dotclear-2.6.2+dfsg/admin/blog_del.php000066400000000000000000000041151230033266200176030ustar00rootroot00000000000000getBlog($_POST['blog_id']); } catch (Exception $e) { $core->error->add($e->getMessage()); } if ($rs->isEmpty()) { $core->error->add(__('No such blog ID')); } else { $blog_id = $rs->blog_id; $blog_name = $rs->blog_name; } } # Delete the blog if (!$core->error->flag() && $blog_id && !empty($_POST['del'])) { if (!$core->auth->checkPassword(crypt::hmac(DC_MASTER_KEY,$_POST['pwd']))) { $core->error->add(__('Password verification failed')); } else { try { $core->delBlog($blog_id); dcPage::addSuccessNotice(sprintf(__('Blog "%s" successfully deleted'), html::escapeHTML($blog_name))); http::redirect('blogs.php'); } catch (Exception $e) { $core->error->add($e->getMessage()); } } } dcPage::open(__('Delete a blog'),'', dcPage::breadcrumb( array( __('System') => '', __('Blogs') => 'blogs.php', __('Delete a blog') => '' )) ); if (!$core->error->flag()) { echo '

'.__('Warning').'

'. '

'.sprintf(__('You are about to delete the blog %s. Every entry, comment and category will be deleted.'), ''.$blog_id.' ('.$blog_name.')').'

'. '

'.__('Please give your password to confirm the blog deletion.').'

'; echo '
'. '
'.$core->formNonce().'
'. '

'. form::password('pwd',20,255).'

'. '

'. form::hidden('blog_id',$blog_id).'

'. '
'; } dcPage::close(); dotclear-2.6.2+dfsg/admin/blog_pref.php000066400000000000000000000627051230033266200200040ustar00rootroot00000000000000blog->id; $blog_status = $core->blog->status; $blog_name = $core->blog->name; $blog_desc = $core->blog->desc; $blog_settings = $core->blog->settings; $blog_url = $core->blog->url; $action = 'blog_pref.php'; $redir = 'blog_pref.php'; } else { dcPage::checkSuper(); try { if (empty($_REQUEST['id'])) { throw new Exception(__('No given blog id.')); } $rs = $core->getBlog($_REQUEST['id']); if (!$rs) { throw new Exception(__('No such blog.')); } $blog_id = $rs->blog_id; $blog_status = $rs->blog_status; $blog_name = $rs->blog_name; $blog_desc = $rs->blog_desc; $blog_settings = new dcSettings($core,$blog_id); $blog_url = $rs->blog_url ; } catch (Exception $e) { $core->error->add($e->getMessage()); } $action = 'blog.php'; $redir = 'blog.php?id=%s'; } # Language codes $lang_combo = dcAdminCombos::getAdminLangsCombo(); # Status combo $status_combo = dcAdminCombos::getBlogStatusescombo(); # Date format combo $now = time(); $date_formats = unserialize($blog_settings->system->date_formats); $time_formats = unserialize($blog_settings->system->time_formats); $date_formats_combo = array('' => ''); foreach ($date_formats as $format) { $date_formats_combo[dt::str($format, $now)] = $format; } $time_formats_combo = array('' => ''); foreach ($time_formats as $format) { $time_formats_combo[dt::str($format, $now)] = $format; } # URL scan modes $url_scan_combo = array( 'PATH_INFO' => 'path_info', 'QUERY_STRING' => 'query_string' ); # Post URL combo $post_url_combo = array( __('year/month/day/title') => '{y}/{m}/{d}/{t}', __('year/month/title') => '{y}/{m}/{t}', __('year/title') => '{y}/{t}', __('title') => '{t}', __('post id/title') => '{id}/{t}', __('post id') => '{id}' ); if (!in_array($blog_settings->system->post_url_format,$post_url_combo)) { $post_url_combo[html::escapeHTML($blog_settings->system->post_url_format)] = html::escapeHTML($blog_settings->system->post_url_format); } # Note title tag combo $note_title_tag_combo = array( __('H4') => 0, __('H3') => 1, __('P') => 2 ); # Image title combo $img_title_combo = array( __('(none)') => '', __('Title') => 'Title ;; separator(, )', __('Title, Date') => 'Title ;; Date(%b %Y) ;; separator(, )', __('Title, Country, Date') => 'Title ;; Country ;; Date(%b %Y) ;; separator(, )', __('Title, City, Country, Date') => 'Title ;; City ;; Country ;; Date(%b %Y) ;; separator(, )', ); if (!in_array($blog_settings->system->media_img_title_pattern,$img_title_combo)) { $img_title_combo[html::escapeHTML($blog_settings->system->media_img_title_pattern)] = html::escapeHTML($blog_settings->system->media_img_title_pattern); } # Image default size combo $img_default_size_combo = array(); try { $media = new dcMedia($core); $img_default_size_combo[__('original')] = 'o'; foreach ($media->thumb_sizes as $code => $size) { $img_default_size_combo[__($size[2])] = $code; } } catch (Exception $e) { $core->error->add($e->getMessage()); } # Image default alignment combo $img_default_alignment_combo = array( __('None') => 'none', __('Left') => 'left', __('Right') => 'right', __('Center') => 'center' ); # Robots policy options $robots_policy_options = array( 'INDEX,FOLLOW' => __("I would like search engines and archivers to index and archive my blog's content."), 'INDEX,FOLLOW,NOARCHIVE' => __("I would like search engines and archivers to index but not archive my blog's content."), 'NOINDEX,NOFOLLOW,NOARCHIVE' => __("I would like to prevent search engines and archivers from indexing or archiving my blog's content."), ); # Update a blog if ($blog_id && !empty($_POST) && $core->auth->check('admin',$blog_id)) { $cur = $core->con->openCursor($core->prefix.'blog'); if ($core->auth->isSuperAdmin()) { $cur->blog_id = $_POST['blog_id']; $cur->blog_url = preg_replace('/\?+$/','?',$_POST['blog_url']); if (in_array($_POST['blog_status'],$status_combo)) { $cur->blog_status = (integer) $_POST['blog_status']; } } $cur->blog_name = $_POST['blog_name']; $cur->blog_desc = $_POST['blog_desc']; $media_img_t_size = abs((integer) $_POST['media_img_t_size']); if ($media_img_t_size < 0) { $media_img_t_size = 100; } $media_img_s_size = abs((integer) $_POST['media_img_s_size']); if ($media_img_s_size < 0) { $media_img_s_size = 240; } $media_img_m_size = abs((integer) $_POST['media_img_m_size']); if ($media_img_m_size < 0) { $media_img_m_size = 448; } $nb_post_per_page = abs((integer) $_POST['nb_post_per_page']); if ($nb_post_per_page <= 1) { $nb_post_per_page = 1; } $nb_post_per_feed = abs((integer) $_POST['nb_post_per_feed']); if ($nb_post_per_feed <= 1) { $nb_post_per_feed = 1; } $nb_comment_per_feed = abs((integer) $_POST['nb_comment_per_feed']); if ($nb_comment_per_feed <= 1) { $nb_comment_per_feed = 1; } try { if ($cur->blog_id != null && $cur->blog_id != $blog_id) { $rs = $core->getBlog($cur->blog_id); if ($rs) { throw new Exception(__('This blog ID is already used.')); } } # --BEHAVIOR-- adminBeforeBlogUpdate $core->callBehavior('adminBeforeBlogUpdate',$cur,$blog_id); if (!preg_match('/^[a-z]{2}(-[a-z]{2})?$/',$_POST['lang'])) { throw new Exception(__('Invalid language code')); } $core->updBlog($blog_id,$cur); # --BEHAVIOR-- adminAfterBlogUpdate $core->callBehavior('adminAfterBlogUpdate',$cur,$blog_id); if ($cur->blog_id != null && $cur->blog_id != $blog_id) { if ($blog_id == $core->blog->id) { $core->setBlog($cur->blog_id); $_SESSION['sess_blog_id'] = $cur->blog_id; $blog_settings = $core->blog->settings; } else { $blog_settings = new dcSettings($core,$cur->blog_id); } $blog_id = $cur->blog_id; } $blog_settings->addNameSpace('system'); $blog_settings->system->put('editor',$_POST['editor']); $blog_settings->system->put('copyright_notice',$_POST['copyright_notice']); $blog_settings->system->put('post_url_format',$_POST['post_url_format']); $blog_settings->system->put('lang',$_POST['lang']); $blog_settings->system->put('blog_timezone',$_POST['blog_timezone']); $blog_settings->system->put('date_format',$_POST['date_format']); $blog_settings->system->put('time_format',$_POST['time_format']); $blog_settings->system->put('comments_ttl',abs((integer) $_POST['comments_ttl'])); $blog_settings->system->put('trackbacks_ttl',abs((integer) $_POST['trackbacks_ttl'])); $blog_settings->system->put('allow_comments',!empty($_POST['allow_comments'])); $blog_settings->system->put('allow_trackbacks',!empty($_POST['allow_trackbacks'])); $blog_settings->system->put('comments_pub',empty($_POST['comments_pub'])); $blog_settings->system->put('trackbacks_pub',empty($_POST['trackbacks_pub'])); $blog_settings->system->put('comments_nofollow',!empty($_POST['comments_nofollow'])); $blog_settings->system->put('wiki_comments',!empty($_POST['wiki_comments'])); $blog_settings->system->put('enable_xmlrpc',!empty($_POST['enable_xmlrpc'])); $blog_settings->system->put('note_title_tag',$_POST['note_title_tag']); $blog_settings->system->put('nb_post_per_page',$nb_post_per_page); $blog_settings->system->put('use_smilies',!empty($_POST['use_smilies'])); $blog_settings->system->put('inc_subcats',!empty($_POST['inc_subcats'])); $blog_settings->system->put('media_img_t_size',$media_img_t_size); $blog_settings->system->put('media_img_s_size',$media_img_s_size); $blog_settings->system->put('media_img_m_size',$media_img_m_size); $blog_settings->system->put('media_img_title_pattern',$_POST['media_img_title_pattern']); $blog_settings->system->put('media_img_use_dto_first',!empty($_POST['media_img_use_dto_first'])); $blog_settings->system->put('media_img_default_size',$_POST['media_img_default_size']); $blog_settings->system->put('media_img_default_alignment',$_POST['media_img_default_alignment']); $blog_settings->system->put('media_img_default_link',!empty($_POST['media_img_default_link'])); $blog_settings->system->put('nb_post_per_feed',$nb_post_per_feed); $blog_settings->system->put('nb_comment_per_feed',$nb_comment_per_feed); $blog_settings->system->put('short_feed_items',!empty($_POST['short_feed_items'])); if (isset($_POST['robots_policy'])) { $blog_settings->system->put('robots_policy',$_POST['robots_policy']); } # --BEHAVIOR-- adminBeforeBlogSettingsUpdate $core->callBehavior('adminBeforeBlogSettingsUpdate',$blog_settings); if ($core->auth->isSuperAdmin() && in_array($_POST['url_scan'],$url_scan_combo)) { $blog_settings->system->put('url_scan',$_POST['url_scan']); } dcPage::addSuccessNotice(__('Blog has been successfully updated.')); http::redirect(sprintf($redir,$blog_id)); } catch (Exception $e) { $core->error->add($e->getMessage()); } } if ($standalone) { $breadcrumb = dcPage::breadcrumb( array( html::escapeHTML($blog_name) => '', __('Blog settings') => '' ) ); } else { $breadcrumb = dcPage::breadcrumb( array( __('System') => '', __('Blogs') => 'blogs.php', __('Blog settings').' : '.html::escapeHTML($blog_name) => '' )); } dcPage::open(__('Blog settings'), '". dcPage::jsConfirmClose('blog-form'). dcPage::jsLoad('js/_blog_pref.js'). # --BEHAVIOR-- adminBlogPreferencesHeaders $core->callBehavior('adminBlogPreferencesHeaders'). dcPage::jsPageTabs(), $breadcrumb ); if ($blog_id) { if (!empty($_GET['add'])) { dcPage::success(__('Blog has been successfully created.')); } if (!empty($_GET['upd'])) { dcPage::success(__('Blog has been successfully updated.')); } echo '
'. '

'.__('Parameters').'

'. '
'; echo '

'.__('Blog details').'

'. $core->formNonce(); if ($core->auth->isSuperAdmin()) { echo '

'. form::field('blog_id',30,32,html::escapeHTML($blog_id)).'

'. '

'.__('At least 2 characters using letters, numbers or symbols.').'

'. '

'.__('Please note that changing your blog ID may require changes in your public index.php file.').'

'; } echo '

'. form::field('blog_name',30,255,html::escapeHTML($blog_name)).'

'; if ($core->auth->isSuperAdmin()) { echo '

'. form::field('blog_url',50,255,html::escapeHTML($blog_url)).'

'. '

'. form::combo('url_scan',$url_scan_combo,$blog_settings->system->url_scan).'

'; try { # Test URL of blog by testing it's ATOM feed $file = $blog_url.$core->url->getURLFor('feed','atom'); $path = ''; $status = '404'; $content = ''; $client = netHttp::initClient($file,$path); if ($client !== false) { $client->setTimeout(4); $client->setUserAgent($_SERVER['HTTP_USER_AGENT']); $client->get($path); $status = $client->getStatus(); $content = $client->getContent(); } if ($status != '200') { // Might be 404 (URL not found), 670 (blog not online), ... echo '

'. sprintf(__('The URL of blog or the URL scan method might not be well set (%s return a %s status).'), $file,$status). '

'; } else { if (substr($content,0,6) != ''. sprintf(__('The URL of blog or the URL scan method might not be well set (%s does not return an ATOM feed).'), $file). '

'; } } } catch (Exception $e) { $core->error->add($e->getMessage()); } echo '

'. form::combo('blog_status',$status_combo,$blog_status).'

'; } echo '

'. form::textarea('blog_desc',60,5,html::escapeHTML($blog_desc)).'

'. '
'; echo '

'.__('Blog configuration').'

'. '
'. '
'. '

'. form::field('editor',30,255,html::escapeHTML($blog_settings->system->editor)). '

'. '

'. form::combo('lang',$lang_combo,$blog_settings->system->lang,'l10n'). '

'. '

'. form::combo('blog_timezone',dt::getZones(true,true),html::escapeHTML($blog_settings->system->blog_timezone)). '

'. '

'. form::field('copyright_notice',30,255,html::escapeHTML($blog_settings->system->copyright_notice)). '

'. '
'. '
'. '

'. form::combo('post_url_format',$post_url_combo,html::escapeHTML($blog_settings->system->post_url_format)). '

'. '

'. form::combo('note_title_tag',$note_title_tag_combo,$blog_settings->system->note_title_tag). '

'. '

'. form::checkbox('enable_xmlrpc','1',$blog_settings->system->enable_xmlrpc). __('Enable XML/RPC interface').'

'; echo '

'.__('XML/RPC interface allows you to edit your blog with an external client.').'

'; if ($blog_settings->system->enable_xmlrpc) { echo '

'.__('XML/RPC interface is active. You should set the following parameters on your XML/RPC client:').'

'. '
    '. '
  • '.__('Server URL:').' '. sprintf(DC_XMLRPC_URL,$core->blog->url,$core->blog->id). '
  • '. '
  • '.__('Blogging system:').' Movable Type
  • '. '
  • '.__('User name:').' '.$core->auth->userID().'
  • '. '
  • '.__('Password:').' <'.__('your password').'>
  • '. '
  • '.__('Blog ID:').' 1
  • '. '
'; } echo '
'. '
'. '
'. //Opera sucks '
'; echo '

'.__('Comments and trackbacks').'

'. '
'. '
'. '

'. '

'. '

'. '

'.__('No limit: leave blank.').'

'. '

'. '
'. '
'. '

'. '

'. '

'. '

'.__('No limit: leave blank.').'

'. '

'. '
'. '
'. //Opera sucks '
'. '
'. //Opera sucks '
'; echo '

'.__('Blog presentation').'

'. '
'. '
'. '

'. form::field('date_format',30,255,html::escapeHTML($blog_settings->system->date_format)). form::combo('date_format_select',$date_formats_combo,'','','',false,'title="'.__('Pattern of date').'"'). '

'. '

'.__('Sample:').' '.dt::str(html::escapeHTML($blog_settings->system->date_format)).'

'. '

'. form::field('time_format',30,255,html::escapeHTML($blog_settings->system->time_format)). form::combo('time_format_select',$time_formats_combo,'','','',false,'title="'.__('Pattern of time').'"'). '

'. '

'.__('Sample:').' '.dt::str(html::escapeHTML($blog_settings->system->time_format)).'

'. '

'. '
'. '
'. '

'. '

'. '

'. '

'. '

'. '
'. '
'. '
'. //Opera sucks '
'; echo '

'.__('Media and images').'

'. '

'. __('Please note that if you change current settings bellow, they will now apply to all new images in the media manager.'). ' '.__('Be carefull if you share it with other blogs in your installation.').'

'. '
'. '
'. '
'.__('Generated image sizes (in pixels)').'
'. '

'. form::field('media_img_t_size',3,3,$blog_settings->system->media_img_t_size).'

'. '

'. form::field('media_img_s_size',3,3,$blog_settings->system->media_img_s_size).'

'. '

'. form::field('media_img_m_size',3,3,$blog_settings->system->media_img_m_size).'

'. '
'. '
'. '
'.__('Default image insertion attributes').'
'. '

'. form::combo('media_img_title_pattern',$img_title_combo,html::escapeHTML($blog_settings->system->media_img_title_pattern)).' '. '

'. '

'.__('It is retrieved from the picture\'s metadata.').'

'. '

'. form::combo('media_img_default_size',$img_default_size_combo, (html::escapeHTML($blog_settings->system->media_img_default_size) != '' ? html::escapeHTML($blog_settings->system->media_img_default_size) : 'm')). '

'. '

'. form::combo('media_img_default_alignment',$img_default_alignment_combo,html::escapeHTML($blog_settings->system->media_img_default_alignment)). '

'. '

'. '
'. '
'. '
'. //Opera sucks '
'; echo '

'.__('Search engines robots policy').'

'; $i = 0; foreach ($robots_policy_options as $k => $v) { echo '

'; $i++; } echo '
'; # --BEHAVIOR-- adminBlogPreferencesForm $core->callBehavior('adminBlogPreferencesForm',$core,$blog_settings); echo '

'. (!$standalone ? form::hidden('id',$blog_id) : ''). '

'. '
'; if ($core->auth->isSuperAdmin() && $blog_id != $core->blog->id) { echo '
'. '

'. form::hidden(array('blog_id'),$blog_id). $core->formNonce().'

'. '
'; } else { if ($blog_id == $core->blog->id) { echo '

'.__('The current blog cannot be deleted.').'

'; } else { echo '

'.__('Only superadmin can delete a blog.').'

'; } } echo '
'; # # Users on the blog (with permissions) $blog_users = $core->getBlogPermissions($blog_id,$core->auth->isSuperAdmin()); $perm_types = $core->auth->getPermissionsTypes(); echo '
'. '

'.__('Users on this blog').'

'; if (empty($blog_users)) { echo '

'.__('No users').'

'; } else { if ($core->auth->isSuperAdmin()) { $user_url_p = '%1$s'; } else { $user_url_p = '%1$s'; } # Sort users list on user_id key ksort($blog_users); $post_type = $core->getPostTypes(); $current_blog_id = $core->blog->id; if ($blog_id != $core->blog->id) { $core->setBlog($blog_id); } foreach ($blog_users as $k => $v) { if (count($v['p']) > 0) { echo '
'. '

'.sprintf($user_url_p,html::escapeHTML($k)). ' ('.html::escapeHTML(dcUtils::getUserCN( $k, $v['name'], $v['firstname'], $v['displayname'] )).')

'; if ($core->auth->isSuperAdmin()) { echo '

'.__('Email:').' '. ($v['email'] != '' ? ''.$v['email'].'' : __('(none)')). '

'; } echo '
'.__('Publications on this blog:').'
'. '
    '; foreach ($post_type as $type => $pt_info) { $params = array( 'post_type' => $type, 'user_id' => $k ); echo '
  • '.sprintf(__('%1$s: %2$s'),__($pt_info['label']),$core->blog->getPosts($params,true)->f(0)).'
  • '; } echo '
'; echo '
'.__('Permissions:').'
'. '
    '; if ($v['super']) { echo '
  • '.__('Super administrator').'
    '. ''.__('All rights on all blogs.').'
  • '; } else { foreach ($v['p'] as $p => $V) { if (isset($perm_types[$p])) { echo '
  • '.__($perm_types[$p]); } else { echo '
  • '.sprintf(__('[%s] (unreferenced permission)'),$p); } if($p == 'admin') { echo '
    '.__('All rights on this blog.').''; } echo '
  • '; } } echo '
'; if (!$v['super'] && $core->auth->isSuperAdmin()) { echo '
'. '

'. form::hidden(array('redir'),'blog_pref.php?id='.$k). form::hidden(array('action'),'perms'). form::hidden(array('users[]'),$k). form::hidden(array('blogs[]'),$blog_id). $core->formNonce(). '

'. '
'; } echo '
'; } } if ($current_blog_id != $core->blog->id) { $core->setBlog($current_blog_id); } } echo '
'; } dcPage::helpBlock('core_blog_pref'); dcPage::close(); dotclear-2.6.2+dfsg/admin/blog_theme.php000066400000000000000000000141641230033266200201460ustar00rootroot00000000000000themes = new dcThemes($core); $core->themes->loadModules($core->blog->themes_path, null); # -- Page helper -- $list = new adminThemesList( $core->themes, $core->blog->themes_path, $core->blog->settings->system->store_theme_url ); adminThemesList::$distributed_modules = explode(',', DC_DISTRIB_THEMES); # -- Theme screenshot -- if (!empty($_GET['shot']) && $list->modules->moduleExists($_GET['shot'])) { $f= path::real(empty($_GET['src']) ? $core->blog->themes_path.'/'.$_GET['shot'].'/screenshot.jpg' : $core->blog->themes_path.'/'.$_GET['shot'].'/'.path::clean($_GET['src']) ); if (!file_exists($f)) { $f = dirname(__FILE__).'/images/noscreenshot.png'; } http::cache(array_merge(array($f), get_included_files())); header('Content-Type: '.files::getMimeType($f)); header('Content-Length: '.filesize($f)); readfile($f); exit; } # -- Display module configuration page -- if ($list->setConfiguration($core->blog->settings->system->theme)) { # Get content before page headers include $list->includeConfiguration(); # Gather content $list->getConfiguration(); # Display page dcPage::open(__('Blog appearance'), dcPage::jsPageTabs(). dcPage::jsColorPicker(). # --BEHAVIOR-- themesToolsHeaders $core->callBehavior('themesToolsHeaders', $core, true), dcPage::breadcrumb( array( html::escapeHTML($core->blog->name) => '', __('Blog appearance') => $list->getURL('',false), ''.__('Theme configuration').'' => '' )) ); # Display previously gathered content $list->displayConfiguration(); dcPage::helpBlock('core_blog_theme_conf'); dcPage::close(); # Stop reading code here return; } # -- Execute actions -- try { $list->doActions(); } catch (Exception $e) { $core->error->add($e->getMessage()); } # -- Page header -- dcPage::open(__('Themes management'), dcPage::jsLoad('js/_blog_theme.js'). dcPage::jsPageTabs(). dcPage::jsColorPicker(). # --BEHAVIOR-- themesToolsHeaders $core->callBehavior('themesToolsHeaders', $core, false), dcPage::breadcrumb( array( html::escapeHTML($core->blog->name) => '', ''.__('Blog appearance').'' => '' )) ); # -- Display modules lists -- if ($core->auth->isSuperAdmin() && $list->isWritablePath()) { # Updated modules from repo $modules = $list->store->get(true); if (!empty($modules)) { echo '
'. '

'.html::escapeHTML(__('Update themes')).'

'. '

'.sprintf( __('There is one theme to update available from repository.', 'There are %s themes to update available from repository.', count($modules)), count($modules) ).'

'; $list ->setList('theme-update') ->setTab('themes') ->setModules($modules) ->displayModules( /*cols */ array('checkbox', 'name', 'sshot', 'desc', 'author', 'version', 'current_version', 'parent'), /* actions */ array('update', 'delete') ); echo '

'.sprintf( __("Visit %s repository, the resources center for Dotclear."), 'Dotaddict' ). '

'. '
'; } } # Activated modules $modules = $list->modules->getModules(); if (!empty($modules)) { echo '
'. '

'.__('Installed themes').'

'. '

'.__('You can configure and manage installed themes from this list.').'

'; $list ->setList('theme-activate') ->setTab('themes') ->setModules($modules) ->displayModules( /* cols */ array('sshot', 'distrib', 'name', 'config', 'desc', 'author', 'version', 'parent'), /* actions */ array('select', 'behavior', 'deactivate', 'delete') ); echo '
'; } # Deactivated modules $modules = $list->modules->getDisabledModules(); if (!empty($modules)) { echo '
'. '

'.__('Deactivated themes').'

'. '

'.__('Deactivated themes are installed but not usable. You can activate them from here.').'

'; $list ->setList('theme-deactivate') ->setTab('themes') ->setModules($modules) ->displayModules( /* cols */ array('name', 'distrib'), /* actions */ array('activate', 'delete') ); echo '
'; } if ($core->auth->isSuperAdmin() && $list->isWritablePath()) { # New modules from repo $search = $list->getSearch(); $modules = $search ? $list->store->search($search) : $list->store->get(); if (!empty($search) || !empty($modules)) { echo '
'. '

'.__('Add themes from repository').'

'; // '

'.__('Search and install themes directly from repository.').'

'; $list ->setList('theme-new') ->setTab('new') ->setModules($modules) ->displaySearch() ->displayIndex() ->displayModules( /* cols */ array('expander', 'sshot', 'name', 'score', 'config', 'desc', 'author', 'version', 'parent', 'details', 'support'), /* actions */ array('install'), /* nav limit */ true ); echo '

'.sprintf( __("Visit %s repository, the resources center for Dotclear."), 'Dotaddict' ). '

'. '
'; } # Add a new plugin echo '
'. '

'.__('Add themes from a package').'

'. '

'.__('You can install themes by uploading or downloading zip files.').'

'; $list->displayManualForm(); echo '
'; } # --BEHAVIOR-- themesToolsTabs $core->callBehavior('themesToolsTabs', $core); dcPage::helpBlock('core_blog_theme'); dcPage::close(); dotclear-2.6.2+dfsg/admin/blogs.php000066400000000000000000000135051230033266200171450ustar00rootroot00000000000000 'blog_upddt', __('Blog name') => 'UPPER(blog_name)', __('Blog ID') => 'B.blog_id' ); $order_combo = array( __('Descending') => 'desc', __('Ascending') => 'asc' ); $q = !empty($_GET['q']) ? $_GET['q'] : ''; $sortby = !empty($_GET['sortby']) ? $_GET['sortby'] : 'blog_upddt'; $order = !empty($_GET['order']) ? $_GET['order'] : 'desc'; $show_filters = false; $page = !empty($_GET['page']) ? max(1,(integer) $_GET['page']) : 1; $nb_per_page = 30; if (!empty($_GET['nb']) && (integer) $_GET['nb'] > 0) { if ($nb_per_page != $_GET['nb']) { $show_filters = true; } $nb_per_page = (integer) $_GET['nb']; } # - Search filter if ($q) { $params['q'] = $q; $show_filters = true; } # - Sortby and order filter if ($sortby !== '' && in_array($sortby,$sortby_combo)) { if ($order !== '' && in_array($order,$order_combo)) { $params['order'] = $sortby.' '.$order; } if ($sortby != 'blog_upddt' || $order != 'desc') { $show_filters = true; } } $params['limit'] = array((($page-1)*$nb_per_page),$nb_per_page); try { $counter = $core->getBlogs($params,1); $rs = $core->getBlogs($params); $nb_blog = $counter->f(0); } catch (Exception $e) { $core->error->add($e->getMessage()); } /* DISPLAY -------------------------------------------------------- */ $form_filter_title = __('Show filters and display options'); $starting_script = dcPage::jsLoad('js/filter-controls.js'); $starting_script .= '"; dcPage::open(__('List of blogs'),$starting_script, dcPage::breadcrumb( array( __('System') => '', __('List of blogs') => '' )) ); if (!empty($_GET['del'])) { dcPage::success(__('Blog has been successfully deleted.')); } if (!$core->error->flag()) { if ($core->auth->isSuperAdmin()) { echo '

'.__('Create a new blog').'

'; } echo '
'. ''. '
'. '
'. '

'.__('Filters').'

'. '

'. form::field('q',20,255,html::escapeHTML($q)).'

'. '
'. '
'. '

'.__('Display options').'

'. '

'. form::combo('sortby',$sortby_combo,html::escapeHTML($sortby)).'

'. '

'. form::combo('order',$order_combo,html::escapeHTML($order)).'

'. '

'.__('Show').'

'. '
'. '
'. '

'. '

'. //Opera sucks '
'; # Show blogs if ($nb_blog == 0) { if( $show_filters ) { echo '

'.__('No blog matches the filter').'

'; } else { echo '

'.__('No blog').'

'; } } else { $pager = new dcPager($page,$nb_blog,$nb_per_page,10); echo $pager->getLinks(); echo '
'. ''; if( $show_filters ) { echo ''; } else { echo ''; } echo ''. ''. ''. ''. ''. ''. ''; while ($rs->fetch()) { echo blogLine($rs); } echo '
'.sprintf(__('%d blog matches the filter.','%d blogs match the filter.', $nb_blog)).'
'.__('Blog id').''.__('Blog name').''.__('Entries (all types)').''.__('Last update').''.__('Status').'
'; echo $pager->getLinks(); } } dcPage::helpBlock('core_blogs'); dcPage::close(); function blogLine($rs) { global $core; $blog_id = html::escapeHTML($rs->blog_id); $edit_link = ''; if ($GLOBALS['core']->auth->isSuperAdmin()) { $edit_link = ''. ''.__('Edit blog settings').' '.$blog_id.' '; } else { $edit_link = $blog_id; } $img_status = $rs->blog_status == 1 ? 'check-on' : 'check-off'; $txt_status = $GLOBALS['core']->getBlogStatus($rs->blog_status); $img_status = sprintf('%2$s',$img_status,$txt_status); $offset = dt::getTimeOffset($core->auth->getInfo('user_tz')); $blog_upddt = dt::str(__('%Y-%m-%d %H:%M'),strtotime($rs->blog_upddt) + $offset); return ''. ''.$edit_link.''. ''. html::escapeHTML($rs->blog_name).''. ''.$core->countBlogPosts($rs->blog_id).''. ''.$blog_upddt.''. ''.$img_status.''. ''; } dotclear-2.6.2+dfsg/admin/categories.php000066400000000000000000000150221230033266200201600ustar00rootroot00000000000000blog->getCategory((integer) $cat_id); if ($c->isEmpty()) { dcPage::addErrorNotice(__('This category does not exist.')); http::redirect('categories.php'); } $name = $c->cat_title; unset($c); try { # Delete category $core->blog->delCategory($cat_id); dcPage::addSuccessNotice(sprintf(__('The category "%s" has been successfully deleted.'),html::escapeHTML($name))); http::redirect('categories.php'); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # move post into a category if (!empty($_POST['mov']) && !empty($_POST['mov_cat'])) { try { # Check if category where to move posts exists $keys = array_keys($_POST['mov']); $cat_id = (int) $keys[0]; $mov_cat = (int) $_POST['mov_cat'][$cat_id]; $mov_cat = $mov_cat ? $mov_cat : null; if ($mov_cat !== null) { $c = $core->blog->getCategory($mov_cat); if ($c->isEmpty()) { throw new Exception(__('Category where to move posts does not exist')); } $name = $c->cat_title; unset($c); } # Move posts if ($mov_cat != $cat_id) { $core->blog->changePostsCategory($cat_id,$mov_cat); } dcPage::addSuccessNotice(sprintf(__('The entries have been successfully moved to category "%s"'), html::escapeHTML($name))); http::redirect('categories.php'); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Update order if (!empty($_POST['save_order']) && !empty($_POST['categories_order'])) { $categories = json_decode($_POST['categories_order']); foreach ($categories as $category) { if (!empty($category->item_id)) { $core->blog->updCategoryPosition($category->item_id, $category->left, $category->right); } } dcPage::addSuccessNotice(__('Categories have been successfully reordered.')); http::redirect('categories.php'); } # Reset order if (!empty($_POST['reset'])) { try { $core->blog->resetCategoriesOrder(); dcPage::addSuccessNotice(__('Categories order has been successfully reset.')); http::redirect('categories.php'); } catch (Exception $e) { $core->error->add($e->getMessage()); } } /* Display -------------------------------------------------------- */ $rs = $core->blog->getCategories(array('post_type'=>'post')); $starting_script = ""; $core->auth->user_prefs->addWorkspace('accessibility'); if (!$core->auth->user_prefs->accessibility->nodragdrop && $core->auth->check('categories',$core->blog->id) && $rs->count()>1) { $starting_script .= dcPage::jsLoad('js/jquery/jquery-ui.custom.js'); $starting_script .= dcPage::jsLoad('js/jquery/jquery.mjs.nestedSortable.js'); } $starting_script .= dcPage::jsLoad('js/_categories.js'); dcPage::open(__('Categories'),$starting_script, dcPage::breadcrumb( array( html::escapeHTML($core->blog->name) => '', __('Categories') => '' )) ); if (!empty($_GET['del'])) { dcPage::success(__('The category has been successfully removed.')); } if (!empty($_GET['reord'])) { dcPage::success(__('Categories have been successfully reordered.')); } if (!empty($_GET['move'])) { dcPage::success(__('Entries have been successfully moved to the category you choose.')); } $categories_combo = dcAdminCombos::getCategoriesCombo($rs); echo '

'.__('New category').'

'; echo '
'; if ($rs->isEmpty()) { echo '

'.__('No category so far.').'

'; } else { echo '
'. '
'; $ref_level = $level = $rs->level-1; while ($rs->fetch()) { $attr = 'id="cat_'.$rs->cat_id.'" class="cat-line clearfix"'; if ($rs->level > $level) { echo str_repeat('
  • ',$rs->level - $level); } elseif ($rs->level < $level) { echo str_repeat('
',-($rs->level - $level)); } if ($rs->level <= $level) { echo '
  • '; } echo '

    '. '

    ('. sprintf(($rs->nb_post > 1 ? __('%d entries') : __('%d entry') ),$rs->nb_post).''. ', '.__('total:').' '.$rs->nb_total.')

    '. '

    '.__('URL:').' '.html::escapeHTML($rs->cat_url).'

    '; echo '

    '; if ($rs->nb_total>0) { // remove current category echo ' '. form::combo(array('mov_cat['.$rs->cat_id.']', 'mov_cat_'.$rs->cat_id),array_filter($categories_combo, create_function('$cat', 'return $cat->value!=$GLOBALS[\'rs\']->cat_id;')),'',''). ' '; $attr_disabled = ' disabled="disabled"'; $input_class = 'disabled '; } else { $attr_disabled = ''; $input_class = ''; } echo ' '. '

    '; $level = $rs->level; } if ($ref_level - $level < 0) { echo str_repeat('
  • ',-($ref_level - $level)); } echo '
    '; echo '
    '; if ($core->auth->check('categories',$core->blog->id) && $rs->count()>1) { if (!$core->auth->user_prefs->accessibility->nodragdrop) { echo '

    '.__('To rearrange categories order, move items by drag and drop, then click on “Save categories order” button.').'

    '; } echo '

    '. ''. ''. ' '; } else { echo '

    '; } echo ''. $core->formNonce().'

    '. '
    '; } echo '
    '; dcPage::helpBlock('core_categories'); dcPage::close(); dotclear-2.6.2+dfsg/admin/category.php000066400000000000000000000162761230033266200176640ustar00rootroot00000000000000blog->getCategory($_REQUEST['id']); } catch (Exception $e) { $core->error->add($e->getMessage()); } if (!$core->error->flag() && !$rs->isEmpty()) { $cat_id = (integer) $rs->cat_id; $cat_title = $rs->cat_title; $cat_url = $rs->cat_url; $cat_desc = $rs->cat_desc; } unset($rs); # Getting hierarchy information $parents = $core->blog->getCategoryParents($cat_id); $rs = $core->blog->getCategoryParent($cat_id); $cat_parent = $rs->isEmpty() ? 0 : (integer) $rs->cat_id; unset($rs); # Allowed parents list $children = $core->blog->getCategories(array('post_type'=>'post','start'=>$cat_id)); $allowed_parents = array(__('Top level')=>0); $p = array(); while ($children->fetch()) { $p[$children->cat_id] = 1; } $rs = $core->blog->getCategories(array('post_type'=>'post')); while ($rs->fetch()) { if (!isset($p[$rs->cat_id])) { $allowed_parents[] = new formSelectOption( str_repeat('  ',$rs->level-1).($rs->level-1 == 0 ? '' : '• ').html::escapeHTML($rs->cat_title), $rs->cat_id ); } } unset($rs); # Allowed siblings list $siblings = array(); $rs = $core->blog->getCategoryFirstChildren($cat_parent); while ($rs->fetch()) { if ($rs->cat_id != $cat_id) { $siblings[html::escapeHTML($rs->cat_title)] = $rs->cat_id; } } unset($rs); } # Changing parent if ($cat_id && isset($_POST['cat_parent'])) { $new_parent = (integer) $_POST['cat_parent']; if ($cat_parent != $new_parent) { try { $core->blog->setCategoryParent($cat_id,$new_parent); dcPage::addSuccessNotice(__('The category has been successfully moved')); http::redirect('categories.php'); } catch (Exception $e) { $core->error->add($e->getMessage()); } } } # Changing sibling if ($cat_id && isset($_POST['cat_sibling'])) { try { $core->blog->setCategoryPosition($cat_id,(integer) $_POST['cat_sibling'],$_POST['cat_move']); dcPage::addSuccessNotice(__('The category has been successfully moved')); http::redirect('categories.php'); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Create or update a category if (isset($_POST['cat_title'])) { $cur = $core->con->openCursor($core->prefix.'category'); $cur->cat_title = $cat_title = $_POST['cat_title']; if (isset($_POST['cat_desc'])) { $cur->cat_desc = $cat_desc = $_POST['cat_desc']; } if (isset($_POST['cat_url'])) { $cur->cat_url = $cat_url = $_POST['cat_url']; } else { $cur->cat_url = $cat_url; } try { # Update category if ($cat_id) { # --BEHAVIOR-- adminBeforeCategoryUpdate $core->callBehavior('adminBeforeCategoryUpdate',$cur,$cat_id); $core->blog->updCategory($_POST['id'],$cur); # --BEHAVIOR-- adminAfterCategoryUpdate $core->callBehavior('adminAfterCategoryUpdate',$cur,$cat_id); dcPage::addSuccessNotice(__('The category has been successfully updated.')); http::redirect('category.php?id='.$_POST['id']); } # Create category else { # --BEHAVIOR-- adminBeforeCategoryCreate $core->callBehavior('adminBeforeCategoryCreate',$cur); $id = $core->blog->addCategory($cur,(integer) $_POST['new_cat_parent']); # --BEHAVIOR-- adminAfterCategoryCreate $core->callBehavior('adminAfterCategoryCreate',$cur,$id); dcPage::addSuccessNotice(sprintf(__('The category "%s" has been successfully created.'), html::escapeHTML($cur->cat_title))); http::redirect('categories.php'); } } catch (Exception $e) { $core->error->add($e->getMessage()); } } $title = $cat_id ? html::escapeHTML($cat_title) : __('New category'); $elements = array( html::escapeHTML($core->blog->name) => '', __('Categories') => 'categories.php' ); if ($cat_id) { while($parents->fetch()) { $elements[html::escapeHTML($parents->cat_title)] = 'category.php?id='.$parents->cat_id; } } $elements[$title] = ''; dcPage::open($title, dcPage::jsConfirmClose('category-form'). dcPage::jsToolBar(). dcPage::jsLoad('js/_category.js'), dcPage::breadcrumb($elements) ); if (!empty($_GET['upd'])) { dcPage::success(__('Category has been successfully updated.')); } echo '
    '. '

    '.__('Category information').'

    '. '

    '. form::field('cat_title',40,255,html::escapeHTML($cat_title)). '

    '; if (!$cat_id) { $rs = $core->blog->getCategories(array('post_type'=>'post')); echo '

    '; unset($rs); } echo '
    '. '

    ' .form::field('cat_url',40,255,html::escapeHTML($cat_url)). '

    '. '

    '. __('Warning: If you set the URL manually, it may conflict with another category.').'

    '. '
    '. '

    '. form::textarea('cat_desc',50,8,html::escapeHTML($cat_desc)). '

    '. '

    '. ($cat_id ? form::hidden('id',$cat_id) : ''). $core->formNonce(). '

    '. '
    '; if ($cat_id) { echo '

    '.__('Move this category').'

    '. '
    '. '
    '. '
    '. '

    '.__('Category parent').'

    '. '

    '. form::combo('cat_parent',$allowed_parents,$cat_parent).'

    '. '

    '. form::hidden(array('id'),$cat_id).$core->formNonce().'

    '. '
    '. '
    '; if (count($siblings) > 0) { echo '
    '. '
    '. '

    '.__('Category sibling').'

    '. '

    '. form::combo('cat_move',array(__('before')=>'before',__('after')=>'after'),'','','',false,'title="'.__('position: ').'"').' '. form::combo('cat_sibling',$siblings).'

    '. '

    '. form::hidden(array('id'),$cat_id).$core->formNonce().'

    '. '
    '. '
    '; } echo '
    '; } dcPage::helpBlock('core_category'); dcPage::close(); dotclear-2.6.2+dfsg/admin/comment.php000066400000000000000000000164501230033266200175030ustar00rootroot00000000000000blog->getPosts(array('post_id' => $_POST['post_id'], 'post_type' => '')); if ($rs->isEmpty()) { throw new Exception(__('Entry does not exist.')); } $cur = $core->con->openCursor($core->prefix.'comment'); $cur->comment_author = $_POST['comment_author']; $cur->comment_email = html::clean($_POST['comment_email']); $cur->comment_site = html::clean($_POST['comment_site']); $cur->comment_content = $core->HTMLfilter($_POST['comment_content']); $cur->post_id = (integer) $_POST['post_id']; # --BEHAVIOR-- adminBeforeCommentCreate $core->callBehavior('adminBeforeCommentCreate',$cur); $comment_id = $core->blog->addComment($cur); # --BEHAVIOR-- adminAfterCommentCreate $core->callBehavior('adminAfterCommentCreate',$cur,$comment_id); dcPage::addSuccessNotice(__('Comment has been successfully created.')); http::redirect($core->getPostAdminURL($rs->post_type,$rs->post_id,false).'&co=1'); } catch (Exception $e) { $core->error->add($e->getMessage()); } } if (!empty($_REQUEST['id'])) { $params['comment_id'] = $_REQUEST['id']; try { $rs = $core->blog->getComments($params); if (!$rs->isEmpty()) { $comment_id = $rs->comment_id; $post_id = $rs->post_id; $post_type = $rs->post_type; $post_title = $rs->post_title; $comment_dt = $rs->comment_dt; $comment_author = $rs->comment_author; $comment_email = $rs->comment_email; $comment_site = $rs->comment_site; $comment_content = $rs->comment_content; $comment_ip = $rs->comment_ip; $comment_status = $rs->comment_status; $comment_trackback = (boolean) $rs->comment_trackback; $comment_spam_status = $rs->comment_spam_status; } } catch (Exception $e) { $core->error->add($e->getMessage()); } } if (!$comment_id && !$core->error->flag()) { $core->error->add(__('No comment')); } if (!$core->error->flag() && isset($rs)) { $can_edit = $can_delete = $can_publish = $core->auth->check('contentadmin',$core->blog->id); if (!$core->auth->check('contentadmin',$core->blog->id) && $core->auth->userID() == $rs->user_id) { $can_edit = true; if ($core->auth->check('delete',$core->blog->id)) { $can_delete = true; } if ($core->auth->check('publish',$core->blog->id)) { $can_publish = true; } } # update comment if (!empty($_POST['update']) && $can_edit) { $cur = $core->con->openCursor($core->prefix.'comment'); $cur->comment_author = $_POST['comment_author']; $cur->comment_email = html::clean($_POST['comment_email']); $cur->comment_site = html::clean($_POST['comment_site']); $cur->comment_content = $core->HTMLfilter($_POST['comment_content']); if (isset($_POST['comment_status'])) { $cur->comment_status = (integer) $_POST['comment_status']; } try { # --BEHAVIOR-- adminBeforeCommentUpdate $core->callBehavior('adminBeforeCommentUpdate',$cur,$comment_id); $core->blog->updComment($comment_id,$cur); # --BEHAVIOR-- adminAfterCommentUpdate $core->callBehavior('adminAfterCommentUpdate',$cur,$comment_id); dcPage::addSuccessNotice(__('Comment has been successfully updated.')); http::redirect('comment.php?id='.$comment_id); } catch (Exception $e) { $core->error->add($e->getMessage()); } } if (!empty($_POST['delete']) && $can_delete) { try { # --BEHAVIOR-- adminBeforeCommentDelete $core->callBehavior('adminBeforeCommentDelete',$comment_id); $core->blog->delComment($comment_id); dcPage::addSuccessNotice(__('Comment has been successfully deleted.')); http::redirect($core->getPostAdminURL($rs->post_type,$rs->post_id).'&co=1',false); } catch (Exception $e) { $core->error->add($e->getMessage()); } } if (!$can_edit) { $core->error->add(__("You can't edit this comment.")); } } /* DISPLAY -------------------------------------------------------- */ if ($comment_id) { $breadcrumb = dcPage::breadcrumb( array( html::escapeHTML($core->blog->name) => '', html::escapeHTML($post_title) => $core->getPostAdminURL($post_type,$post_id).'&co=1#c'.$comment_id, __('Edit comment') => '' )); } else { $breadcrumb = dcPage::breadcrumb( array( html::escapeHTML($core->blog->name) => '', html::escapeHTML($post_title) => $core->getPostAdminURL($post_type,$post_id), __('Edit comment') => '' )); } dcPage::open(__('Edit comment'), dcPage::jsConfirmClose('comment-form'). dcPage::jsToolBar(). dcPage::jsLoad('js/_comment.js'). # --BEHAVIOR-- adminCommentHeaders $core->callBehavior('adminCommentHeaders'), $breadcrumb ); if ($comment_id) { if (!empty($_GET['upd'])) { dcPage::success(__('Comment has been successfully updated.')); } $comment_mailto = ''; if ($comment_email) { $comment_mailto = 'getPostURL())) .'">'.__('Send an e-mail').''; } echo '
    '. '
    '. '

    '.__('Information collected').'

    '. '

    '.__('IP address:').' '. ''.$comment_ip.'

    '. '

    '.__('Date:').' '. dt::dt2str(__('%Y-%m-%d %H:%M'),$comment_dt).'

    '. '
    '. '

    '.__('Comment submitted').'

    '. '

    '. form::field('comment_author',30,255,html::escapeHTML($comment_author)). '

    '. '

    '. form::field('comment_email',30,255,html::escapeHTML($comment_email)). ''.$comment_mailto.''. '

    '. '

    '. form::field('comment_site',30,255,html::escapeHTML($comment_site)). '

    '. '

    '. form::combo('comment_status',$status_combo,$comment_status,'','',!$can_publish). '

    '. # --BEHAVIOR-- adminAfterCommentDesc $core->callBehavior('adminAfterCommentDesc', $rs). '

    '. form::textarea('comment_content',50,10,html::escapeHTML($comment_content)). '

    '. '

    '.form::hidden('id',$comment_id). $core->formNonce(). ' '; if ($can_delete) { echo ''; } echo '

    '. '
    '; } dcPage::helpBlock('core_comments'); dcPage::close(); dotclear-2.6.2+dfsg/admin/comments.php000066400000000000000000000175621230033266200176730ustar00rootroot00000000000000blog->delJunkComments(); $_SESSION['comments_del_spam'] = true; http::redirect('comments.php'); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Creating filter combo boxes # Filter form we'll put in html_block $status_combo = array_merge( array('-' => ''), dcAdminCombos::getCommentStatusescombo() ); $type_combo = array( '-' => '', __('Comment') => 'co', __('Trackback') => 'tb' ); $sortby_combo = array( __('Date') => 'comment_dt', __('Entry title') => 'post_title', __('Author') => 'comment_author', __('Status') => 'comment_status' ); $order_combo = array( __('Descending') => 'desc', __('Ascending') => 'asc' ); /* Get comments -------------------------------------------------------- */ $author = isset($_GET['author']) ? $_GET['author'] : ''; $status = isset($_GET['status']) ? $_GET['status'] : ''; $type = !empty($_GET['type']) ? $_GET['type'] : ''; $sortby = !empty($_GET['sortby']) ? $_GET['sortby'] : 'comment_dt'; $order = !empty($_GET['order']) ? $_GET['order'] : 'desc'; $ip = !empty($_GET['ip']) ? $_GET['ip'] : ''; $with_spam = $author || $status || $type || $sortby != 'comment_dt' || $order != 'desc' || $ip; $show_filters = false; $page = !empty($_GET['page']) ? max(1,(integer) $_GET['page']) : 1; $nb_per_page = 30; if (!empty($_GET['nb']) && (integer) $_GET['nb'] > 0) { if ($nb_per_page != $_GET['nb']) { $show_filters = true; } $nb_per_page = (integer) $_GET['nb']; } $params['limit'] = array((($page-1)*$nb_per_page),$nb_per_page); $params['no_content'] = true; # Author filter if ($author !== '') { $params['q_author'] = $author; $show_filters = true; } else { $author=''; } # - Type filter if ($type == 'tb' || $type == 'co') { $params['comment_trackback'] = ($type == 'tb'); $show_filters = true; } else { $type=''; } # - Status filter if ($status !== '' && in_array($status,$status_combo)) { $params['comment_status'] = $status; $show_filters = true; } elseif (!$with_spam) { $params['comment_status_not'] = -2; $status=''; } else { $status=''; } # - IP filter if ($ip) { $params['comment_ip'] = $ip; $show_filters = true; } # Sortby and order filter if ($sortby !== '' && in_array($sortby,$sortby_combo)) { if ($order !== '' && in_array($order,$order_combo)) { $params['order'] = $sortby.' '.$order; } else { $order = 'desc'; } if ($sortby != 'comment_dt' || $order != 'desc') { $show_filters = true; } } else { $sortby = 'comment_dt'; $order = 'desc'; } # Actions combo box $combo_action = array(); $default = ''; if ($core->auth->check('delete,contentadmin',$core->blog->id) && $status == -2) { $default = 'delete'; } $comments_actions_page = new dcCommentsActionsPage($core,'comments.php'); if ($comments_actions_page->process()) { return; } /* Get comments -------------------------------------------------------- */ try { $comments = $core->blog->getComments($params); $counter = $core->blog->getComments($params,true); $comment_list = new adminCommentList($core,$comments,$counter->f(0)); } catch (Exception $e) { $core->error->add($e->getMessage()); } /* DISPLAY -------------------------------------------------------- */ $form_filter_title = __('Show filters and display options'); $starting_script = dcPage::jsLoad('js/_comments.js'); $starting_script .= dcPage::jsLoad('js/filter-controls.js'); $starting_script .= '"; dcPage::open(__('Comments and trackbacks'),$starting_script, dcPage::breadcrumb( array( html::escapeHTML($core->blog->name) => '', __('Comments and trackbacks') => '' )) ); if (!empty($_GET['upd'])) { dcPage::success(__('Selected comments have been successfully updated.')); } elseif (!empty($_GET['del'])) { dcPage::success(__('Selected comments have been successfully deleted.')); } if (!$core->error->flag()) { if (isset($_SESSION['comments_del_spam'])) { dcPage::message(__('Spam comments have been successfully deleted.')); unset($_SESSION['comments_del_spam']); } $spam_count = $core->blog->getComments(array('comment_status'=>-2),true)->f(0); if ($spam_count > 0) { echo '
    '; if (!$with_spam || ($status != -2)) { if ($spam_count == 1) { echo '

    '.sprintf(__('You have one spam comment.'),''.$spam_count.'').' '. ''.__('Show it.').'.

    '; } elseif ($spam_count > 1) { echo '

    '.sprintf(__('You have %s spam comments.'),''.$spam_count.'').' '. ''.__('Show them.').'.

    '; } } echo '

    '. $core->formNonce(). '

    '; # --BEHAVIOR-- adminCommentsSpamForm $core->callBehavior('adminCommentsSpamForm',$core); echo '
    '; } echo '
    '. ''. '
    '. '
    '. '

    '.__('Filters').'

    '. '

    '. form::combo('type',$type_combo,$type).'

    '. '

    '. form::combo('status',$status_combo,$status).'

    '. '
    '. '
    '. '

    '. form::field('author',20,255,html::escapeHTML($author)).'

    '. '

    '. form::field('ip',20,39,html::escapeHTML($ip)).'

    '. '
    '. '
    '. '

    '.__('Display options').'

    '. '

    '. form::combo('sortby',$sortby_combo,$sortby).'

    '. '

    '. form::combo('order',$order_combo,$order).'

    '. '

    Afficher

    '. '
    '. '
    '. '

    '. '

    '. //Opera sucks '
    '; # Show comments $comment_list->display($page,$nb_per_page, '
    '. '%s'. '
    '. '

    '. '

    '. form::combo('action',$comments_actions_page->getCombo(),$default,'','','','title="'.__('Actions').'"'). $core->formNonce(). '

    '. form::hidden(array('type'),$type). form::hidden(array('sortby'),$sortby). form::hidden(array('order'),$order). form::hidden(array('author'),preg_replace('/%/','%%',$author)). form::hidden(array('status'),$status). form::hidden(array('ip'),preg_replace('/%/','%%',$ip)). form::hidden(array('page'),$page). form::hidden(array('nb'),$nb_per_page). '
    '. '
    ', $show_filters ); } dcPage::helpBlock('core_comments'); dcPage::close(); dotclear-2.6.2+dfsg/admin/comments_actions.php000066400000000000000000000016661230033266200214110ustar00rootroot00000000000000setEnableRedirSelection(false); $comments_actions_page->process(); dotclear-2.6.2+dfsg/admin/help.php000066400000000000000000000041201230033266200167600ustar00rootroot00000000000000 '', 'title' => ''); $args = func_get_args(); if (empty($args)) { return $ret; }; global $__resources; if (empty($__resources['help'])) { return $ret; } $content = ''; $title = ''; foreach ($args as $v) { if (is_object($v) && isset($v->content)) { $content .= $v->content; continue; } if (!isset($__resources['help'][$v])) { continue; } $f = $__resources['help'][$v]; if (!file_exists($f) || !is_readable($f)) { continue; } $fc = file_get_contents($f); if (preg_match('|]*?>(.*?)|ms',$fc,$matches)) { $content .= $matches[1]; if (preg_match('|]*?>(.*?)|ms',$fc,$matches)) { $title = $matches[1]; } } else { $content .= $fc; } } if (trim($content) == '') { return $ret; } $ret['content'] = $content; if ($title != '') { $ret['title'] = $title; } return $ret; } $help_page = !empty($_GET['page']) ? html::escapeHTML($_GET['page']) : 'index'; $content_array = helpPage($help_page); if (($content_array['content'] == '') || ($help_page == 'index')) { $content_array = helpPage('index'); } if ($content_array['title'] != '') { $breadcrumb = dcPage::breadcrumb( array( __('Global help') => 'help.php', $content_array['title'] => '' )); } else { $breadcrumb = dcPage::breadcrumb( array( __('Global help') => '' )); } /* DISPLAY -------------------------------------------------------- */ dcPage::open(__('Global help'), dcPage::jsPageTabs('first-step'), $breadcrumb ); echo $content_array['content']; // Prevents global help link display $GLOBALS['__resources']['ctxhelp'] = true; dcPage::close(); dotclear-2.6.2+dfsg/admin/images/000077500000000000000000000000001230033266200165675ustar00rootroot00000000000000dotclear-2.6.2+dfsg/admin/images/admin.png000066400000000000000000000005661230033266200203740ustar00rootroot00000000000000PNG  IHDR atEXtSoftwareAdobe ImageReadyqe<IDATxbHo*h ځD#G)nd39_3Ȧ1tDY?1YQ0QEWaaRH%8 04  "-% 0 I BIENDB`dotclear-2.6.2+dfsg/admin/images/check-off.png000066400000000000000000000002611230033266200211210ustar00rootroot00000000000000PNG  IHDR Vu\tEXtSoftwareAdobe ImageReadyqe<SIDATxb<A8?jH,h&8)457/?UTq=Hv5r+.1 8@U'14 vIENDB`dotclear-2.6.2+dfsg/admin/images/check-on.png000066400000000000000000000003741230033266200207700ustar00rootroot00000000000000PNG  IHDR Vu\tEXtSoftwareAdobe ImageReadyqe<IDATxbuP=q A@ aMK8owAG: ?RԐȰ/8 fn{Ns'1 2\f˵6hx:X)ocu*@VL $$`,[,dIENDB`dotclear-2.6.2+dfsg/admin/images/check-wrn.png000066400000000000000000000002131230033266200211520ustar00rootroot00000000000000PNG  IHDR Vu\tEXtSoftwareAdobe ImageReadyqe<-IDATxb<A8?jHFR@r RlIENDB`dotclear-2.6.2+dfsg/admin/images/collapser-hide.png000066400000000000000000000004731230033266200221740ustar00rootroot00000000000000PNG  IHDR )v_5tEXtSoftwareAdobe ImageReadyqe<IDATxܒ!0EMMSA h@ 0}$dN[1mܝw~*22P&( 꺮PDu]S}YgbfsU"m {OMTuМdhh /h&4,4s8S4s;۔YEWƈ<߷z q y~8$` MUU))`i)V`|gp[IENDB`dotclear-2.6.2+dfsg/admin/images/collapser-show.png000066400000000000000000000005121230033266200222350ustar00rootroot00000000000000PNG  IHDR )v_5tEXtSoftwareAdobe ImageReadyqe<IDATxܒ!0EM D 2 `԰IgY dH_WYy{gC۶5M#vZ% 8(a(,SJڶP*MSZuG$I pC\b&!l 281+ u}EB0XUQb6lW hƬ!~療܉)ZXp9Lщ:1#Rp[`p0e94IENDB`dotclear-2.6.2+dfsg/admin/images/comments.png000066400000000000000000000005311230033266200211210ustar00rootroot00000000000000PNG  IHDR/\tEXtSoftwareAdobe ImageReadyqe<IDATxb`lWD+@? 8sR X^j0 h$ >r!uL @]`>QPf2 yf UL@? )$ PQ""hH$2AGO,H{$ai"4Q:@DpPR`#hJ(BC% W,,P\ jë 5b Ck*g Pxb0(MA)IENDB`dotclear-2.6.2+dfsg/admin/images/date-picker.png000066400000000000000000000030301230033266200214610ustar00rootroot00000000000000PNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp #IDATxڴVAkQݍKDA$Z!UP??')Hу=FH^*f7mu]5&77o̮`YCwN!}BZNpMQACe#l2o `سȮ!/o)Wl2pu w`0g܅#Jwf&)ho; 9'|h̄7+}F2iUFpVn@CFُe?`"|T,auH{eŽ!ݺ8M4jp,uÂ>N{8&&eQq/A2~cDy@n>:JxoZ,j$I\ AlzNRvSf`ay@tDJ;=kBQ̶k܉!jwsv`Z3Ͼk@rxz [RX+hIENDB`dotclear-2.6.2+dfsg/admin/images/disabled_down.png000066400000000000000000000003651230033266200220770ustar00rootroot00000000000000PNG  IHDRH-tEXtSoftwareAdobe ImageReadyqe<IDATxb` 0 lڴHGv;,DRq?B e? x,@6(T T#.lEAtW$E*P4BpGPh(]#;  z)SPIENDB`dotclear-2.6.2+dfsg/admin/images/disabled_up.png000066400000000000000000000003551230033266200215530ustar00rootroot00000000000000PNG  IHDRH-tEXtSoftwareAdobe ImageReadyqe<IDATxb`6شi|%τCSc(0bd# }bG?? 855 @5) ?rz,bh[r^P5N<eMq!T ̿XCh P=@0H60,f#yr`IENDB`dotclear-2.6.2+dfsg/admin/images/dotclear_pw.png000066400000000000000000000012321230033266200215760ustar00rootroot00000000000000PNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe<ƫСO;! m}ѧ9󾠳Yʉ\oo ߵJ9trQsg\Crj,%Ϭ k+y00M-EVXA 6@nO0Kxl51邎~IhxQb8Xr%ۦЮ*"?fF=* R *{N/1fHh}^$'b"89d#'UV= {ZeW= 8izjr=\ 1Qh'б* 3)TɻX't_OnlTfG;l;N1NNW -QIENDB`dotclear-2.6.2+dfsg/admin/images/down.png000066400000000000000000000004021230033266200202400ustar00rootroot00000000000000PNG  IHDRH-tEXtSoftwareAdobe ImageReadyqe<IDATxb` 0 U8hŽ3'u@`"FkdKH)@ M]!_Iz<  b=y䆉 v.l6#:NC&G\rMN@?@|@ft}K$''5 : &/<IENDB`dotclear-2.6.2+dfsg/admin/images/edit-mini.png000066400000000000000000000004141230033266200211530ustar00rootroot00000000000000PNG  IHDR Vu\tEXtSoftwareAdobe ImageReadyqe<IDATxbd 0RAl&@< ջcQ(@M.tPH/d,DI1Hf AHÇUՖ )6S<75w^ipH`! *R,Ј)6a& O@< 2WmDIENDB`dotclear-2.6.2+dfsg/admin/images/expand.png000066400000000000000000000025021230033266200205530ustar00rootroot00000000000000PNG  IHDR OsBITO3PLTE÷~}wL_{tRNS@f pHYs  ~tEXtSoftwareAdobe Fireworks CS3FtEXtCreation Time01/08/04zs"tEXtXML:com.adobe.xmp Adobe Fireworks CS3 2007-07-26T13:49:57Z 2008-07-19T01:36:51Z image/png $2IDATcaf@~N$/ G@ #ǎaCp"@l)4IENDB`dotclear-2.6.2+dfsg/admin/images/favicon.ico000066400000000000000000001002741230033266200207140ustar00rootroot00000000000000@@ (@6  (^@ ( P(@ $$Ɵp#Ý!™############################################!™#ƞ$Ɵp$ "Û"Ɵ&Ϧ%ͤ$ǟ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ǟ%ͤ&Ϧ"Ɵ"Û !&#Ɯ&ҧ$ǟ##################################################$ǟ&ҧ#Ɯ!&"%"Ĝ&Ц###################################""""###############&Ц"Ĝ"%.Т !&Ц################################"!############&Ц!.Т "&Ҩ###############################!4Ƣ^ѵjջ>ɧ ###########&Ҩ"#™$ǟ##############################Xвkջ!##########$ǟ#™$™q&ϥ#############################">ɧOή!#########&ϥ$™q!%Τ############################"fԹ| ########%Τ!!™$ǟ############################nּ"#######$ǟ##$ƞ##########################$]ѵq׾#######$ƞ##$ƞ##########################3šNͮ#H̫>ȧ######$ƞ##$ƞ#########################"dӸ "##" oּ"#####$ƞ##$ƞ#########################G˪Qί!########!mּOί#####$ƞ##$ƞ#########################x###########"#####$ƞ##$ƞ########################)Ý ############3Ƣ,Þ####$ƞ##$ƞ########################Tϱnּ$#############Vϱ####$ƞ##$ƞ########################6ƣ##############\Ѵ####$ƞ##$ƞ########################!##############2ơ"###$ƞ##$ƞ#######################""############## #"###$ƞ##$ƞ#######################!"##############"!###$ƞ##$ƞ#######################!"###############!###$ƞ##$ƞ#######################"!###############!###$ƞ##$ƞ########################7ƣ###############!###$ƞ##$ƞ########################unּ$##############!###$ƞ##$ƞ########################Dʩ ##############!###$ƞ##$ƞ########################!y############ !###$ƞ##$ƞ#########################iպUϱ ########!$2š!###$ƞ##$ƞ######################### r׾ #" Pίx!###$ƞ##$ƞ##########################I̫hԹ4Ƣ $:ȥn׽v!###$ƞ##$ƞ###########################r׾uؿ!###$ƞ##$ƞ#"›"›########################!uؿ!###$ƞ##$ƞ"š'" Ĝ########################!lֻ{!###$ƞ##$ƞƜA^v(ǝ########################"AʨLͭ !###$ƞ##$ƞ"š#Mi~q7Ȟ"›######"#"###############WϲhԺ%›!###$ƞ##$ƞ#"›Ȟ:i}pL ĜŜ"ÝšƣŢšššŢƣŢÞ!›###########!/ĠTϱr׾}nּPί0Š#!###$ƞ##$ƞ###Ǟ)\xav+Ɯ.G{]ipY{OzP{OuTdbOt6!œƣğ"##########""###!###$ƞ##$ƞ#### ĜƝGets_!{vvvvvvvy6j]9šĠ#######################!###$ƞ##$ƞ#####"šʣk`h?pIy |{{{{{{zywv}E;Ǥ œ#####################!###$ƞ##$ƞ######ƣTpxu;qXv8{|{{{{{{{{zu}faÞĠ####################!###$ƞ##$ƞ######Þ4zy$rOrPy(|{{{{{{{{{yv?-Ţ###################!###$ƞ##$ƞ######"›Þ:w||v6qWtC{|{{{{{{{{{v*=ƣ##################!###$ƞ##$ƞ#######ƣj^v{{|ztDqVv8{|{{{{{{{{w~HzǤ#################!###$ƞ##$ƞ#######Ġ=|z{{{|y&rKrSw2||{{{{{{{w}H{Ƥ################!###$ƞ##$ƞ#######"›Ý:w{{{{||x-rOrQw/||{{{{{{w=Ţ$##############!###$ƞ##$ƞ########ƣZlv{{{{{{||w/rQrNy'|{{{{{{w*-ğ##############!###$ƞ##$ƞ########(+x{{{{{{{|{v5qVtC{|{{{{{u@Ğ œ#############!###$ƞ##$ƞ#########ƣbdv{{{{{{{{{|{tBqUw0|{{{{{vdcƤ#############!###$ƞ##$ƞ######### &/w{{{{{{{{{{|y(rPtE{|{{{y~7Ġ############",Ğ1š1š1š1š-ğ#####$ƞ##$ƞ##########ƣIyyy{{{{{{{{{{|{u?qQy&|{{{vFš"#################$ƞ##$ƞ##########"ƣqXu{{{{{{{{{{{{|x,rRw2|{{zzD}š#######################$ƞ##$ƞ########### œÝHuz{{{{{{{{{{{|zsJv;|{{vCŠ"######################$ƞ##$ƞ############Þ œJvw{{{{{{{{{{{{|tBu>|{z|;Ġ######################$ƞ##$ƞ#############ÞÞUo3xvxz{{{{{{{{{|u;tA{{vm[Ƥ######################$ƞ#!™$ǟ##############!›ƣ"MvJ,|xwvxy{{{{{|v5v8{x5"œ!›#####################$ǟ#!%Τ################!œŢŢ(:Psi^K5 xvxz{{|w4w3z}9ğ#####################%Τ!$™q&ϥ################### ğŢƤƣ#2Rr{O,yvy{|v5x(xUoŢ#####################&ϥ$™q#™$ǟ#######################!œÞƣţ&Kx~L$vwzv3vl[ƣ####################$ǟ#™"&Ҩ########################### œŢƣ.`f3yvq{OǤ####################&Ҩ".Т !&Ц#############################ÞƤ"NvɦaҶtؿ$ƞ###ǟ Ĝ###########[ѳtؿ$ƞ#!-7Ɲ"›##""›"####!oֽ\Ѵtؿ$ƞ#"%ŝDE#šȣƣÞÝĠƤƣ ##"0ŠxZгhԹtؿ$ƞ###ǞƝ7IZnB75;|NTp'Ƥ"›#$iպtؿ$ƞ##$ƞ#ɢF~m+q)wxwuv&]hŢÞ$###""##iպtؿ$ƞ##$ƞ# +!v(u=y)|{{xuE#Ġ$######iպtؿ$ƞ##$ƞ##ƣFv {v5v:y$|{{t 5&ğ######iպtؿ$ƞ##$ƞ##ƣOuv{|z"v8v7z |{t ;Þ #####kֻv$ƞ##$ƞ##!œ Ý1w{{|y%u;w0{{t sVǤ#####dԸoֽ$ƞ##$ƞ###ƣMvvz{{{{w.v9zzyBŢ####"(œ1š1š(Ü"$ƞ##$ƞ####ƣsUs y{{{|z!v8y$v =š"####!!#$ƞ##$ƞ####!œĠl[}uuwy{{w3y#z>Ġ#########$ƞ#!$Ƞ#####!›Ƥ0^h~L8%xu xx-tnZǤ#########$Ƞ!#&Ө#######ÞƤƤğ*E}sV)voAš"########&Ө#!š&$Ĝ%ˢ#########" ÝŢǥ$Rq5<Ý"#######%ˢ$Ĝ!š&!L#ȟ&Ө$Ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ!Ǡ˨ ȡ8$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$Ƞ&Ө#ȟ!L("Ǟ"ŝ#############!ĝ#######"ŝ"Ǟ((0 ##ǟ"ƞ########## !##"ƞ#ǟ#$$ę##Ĝ&ԩ$ǟ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ$ƞ%ƞě$ƞ2ʤ/ɣĚ—#ŝ%ǟ&ԩ$ĝ$ę#"'ԩ########$2šlֻ#&ԩ"!$ǟ#######$@ɨ!$ǟ!#$ƞ#######"Kͬ'œ.ğy$ƞ##$ƞ#######r׾"#!Ŝ##$ƞ#######|$##,ĞLͭÙ##$ƞ######!Xв###"cӸ—##$ƞ######"hԹ###"eӸ—##$ƞ####### ##dӸ—##$ƞ#######F˪F˪MͭdӸ—##"ȟ!Û#######dӸ—#!8.ƝĠƣƤŢÞ#"o׽cӷdӸ—#"*A5?Wm[jMv1ƣĠ#'œTϱhԺVϱ.ŠdӸ—##"ȟǢ]nq*uw w}E3Ƥ#dӸ—##$ƞŢE|wv3x-{zu ~Kxǥ####"dӸ—##$ƞ!œ!œ,xy(v4x*{xyLwƤ$##"fӹ—##$ƞ#ǥdbt |{x+w4z#x}6Š##"_Ҷ—##$ƞ# #.u{|{w1x+u =š"##"-ğ1š'œ#ƞ##$ƞ#$š8(t vxzx(w+xG{š###!$ƞ#!$ǟ##$š)cdC0}v uq}MƤ######$ǟ!"'ԩ###$ÝƤƣ!œ3Yl;u3Ý"›#####'ԩ"%Ý"#ŝ&ԩ$ǟ$ƞ$ƞ$ƞ$ƞ$ƞ"ǟɣ̨ʦDfg%Ɲ#ǟ$ƞ$ƞ$ƞ$ǟ&ԩ$Ĝ%Ý"##ǟ"ƞ########"ŠƠ#####"ƞ#ǟ#$dotclear-2.6.2+dfsg/admin/images/favicon96-login.png000066400000000000000000000052051230033266200222110ustar00rootroot00000000000000PNG  IHDR``w8tEXtSoftwareAdobe ImageReadyqe< 'IDATx]]lU *[+B- ݠP+8kwV+eMo#v:"@tcOAׁɲ2fW/? 6 S䇕$ⁿٴBW9;Zjˊ .&/`2%!t?|5_z]Q*?e [HK4-~ U;y ]=EcF@;zbBO=×ٱ*"!w" ٳ;[`L0ȯfHMx{3fš'{;c E8[u6&@aȂ}Y* \Ϙ` m Y^tofwPgDp df{jRl87v/~]<[ @w[b_FU-mгnїL%BՃ8?2K\U8fҏϞjv-yWnR GoϚe?q٩Sz>=[u_;Hvh&U¹'xU, %ƩOw]p1^HU6f9*i}W@4T-cQq>V5t)xx~T"+.WQjJ!8G $dPi;U>[n`JDUrN$ rTPI9X{x![dtJB  ֦gl6laU6GZtU9c0:.$Fw[ uChL(@MH#!i96ìx ր-ޏŭWhn,HH@؂*]'kfQ ]=WPb`ʦBNYJ/M65 @V5g '2S.c+ٴxt@F-=RF-<g `(1* )%bj| 땪*-C'd\ J%Y;k?Ғ,|HHG7йa"-V*{/! | bSCD Ժ$moU`Yl q@!OzG:2qi-XlJf_Hbj+})ALmI7SI,s\Ŧ"BmdqIVL(T5Er@b*'N% &ʋ*ێMƉ&Wx-Lq" y$#[TѭMxφ3WڞbJΎl5ֱ"mNHPff4a]e%۪! GĆ׃A 9,Q&rSCga wer4tK9'`.TjsD({luw9Z_n$͕K,˸W5KZSqQWXbr zMpENOwCAg5U'^ `w:~K`L{w ۡe%w,@W(ݘlnCg/نirKsC(HeH>VZcJ@, n4؃jh7Ԯ=kK-v Zf^2j:Bڑ֬v_t MIENDB`dotclear-2.6.2+dfsg/admin/images/favicon96-logout.png000066400000000000000000000045661230033266200224230ustar00rootroot00000000000000PNG  IHDR``w8tEXtSoftwareAdobe ImageReadyqe< IDATx][LW> "rB X1&^VkF[ؗƤ'#&mjB'j Im1V"Tʵ@Enjwq9{f̟LVaw7D DmÎgQ<*:}Qpp8sE?=NУ5|_dŔC8 = H^! UƛR#r]I ை|[I3yʉT V̭NvM_< +E4[w)+da+S$Yu܊x EZMv¦=o:QΉ[~ f ? c|ſ2ff5TGkʎ:!A3{< f];'KSؓ}4a1$)-j?#n'/n`+h(EB _DW Qd=[u\iJ| '"+%A<#,^KdaxjZޓ-jc @ktL+XNW "K!b\åSz})([9G+V*=%WhXnԁ̷ꂛx,)GK4SM) ޣ jYçOL%q6 F ;e+B dw6R:z@fP`d,J]}wFl%2m#)`1KjBYANŅ/gVd@n^ߑW+qXV;ͤ,EY#Æ  !?YK*B Hj#Oä{h2iB^j{M=O^ԗFo$#/Ne:c; W YFMg81H'IJL=6jxK7'z3:,Jzgw; k[$gt<|S}t>\,Uv_C3==JDkn#jIkH,R?_ Б/!rI3)I8RŠLgNnIߓז\"?$ך7K6R (NLgYz?i"MiRJdf\Q6//YbWB Y/U'l2G }8ovN)k/3G@3Bmg7{tcbue<#d6[p|%DYڀ!*`+z=+̈ `2.v:Y_C!wA~Qu!iؿ.Y9E? G&b%EnLS.mwfQ,MI'?Z M~6ӉipVcdS>@̒@O2$9tcXyf%aS y%#oTSߜ^WwR U?|*܏n|| ̏^dg1l7kZ!0vN^ J<\T6HN]u]\ǴjjӾ;^) @@x3TE|{`̗i P4z<5P##"g@.i PgóZkgTX!4{o}w*yHrKڢX+ 8%n@_$;/VG<(ob]n1k<sA+@ٺ ,f&D#uu{Smd>u;ۀ$ U$Ӈm6>9 vu2R ƉNzPEf. ~.t#*r$Nv%0;SbjE;8Qhax7D g}ktQAA?0+!U{yIENDB`dotclear-2.6.2+dfsg/admin/images/hidden.png000066400000000000000000000002621230033266200205300ustar00rootroot00000000000000PNG  IHDR Vu\tEXtSoftwareAdobe ImageReadyqe<TIDATxb9s{D*eb HOO?UTq=Hv5r+.1 8@u'} !?KIENDB`dotclear-2.6.2+dfsg/admin/images/hide.png000066400000000000000000000003551230033266200202110ustar00rootroot00000000000000PNG  IHDR ,tEXtSoftwareAdobe ImageReadyqe<IDATxbd@J?xܩ4q?+? &C00@ P5 HCMD6=f:,hփ4y2Y#!ʍ < OBtd & CO#. a.\#IENDB`dotclear-2.6.2+dfsg/admin/images/junk.png000066400000000000000000000005411230033266200202440ustar00rootroot00000000000000PNG  IHDR Vu\tEXtSoftwareAdobe ImageReadyqe<IDATxb`LM069ft55m !!!_~}| UT33CEDD<~uw704K5{|}秏_ĘryxxНɁ5X[۬V`@r 5p  ///H XÓǏ ~ x \  QbȨ zePP̀$`* 5}#M泱>|8 t\@KO IENDB`dotclear-2.6.2+dfsg/admin/images/locker.png000066400000000000000000000004071230033266200205550ustar00rootroot00000000000000PNG  IHDRH-tEXtSoftwareAdobe ImageReadyqe<IDATxbd@G}# T>+@D' cD  @ͅ0&$M@E bC jP5A^,({01F󡁡 hYXa09&  EF 4.&Xph>zd~` |0/@/IENDB`dotclear-2.6.2+dfsg/admin/images/logout.png000066400000000000000000000016231230033266200206100ustar00rootroot00000000000000PNG  IHDR(-StEXtSoftwareAdobe ImageReadyqe<PLTE    >:     #'?: ' ,"%%%( MK76%(gMNԟ67 ,)߮Ӗ!67"'#"%ںUR;8&$<<()jjӘ^^/#ϋਦ(=:BA͉66de2%&%$$ '$$3&>9ӌ%&!"&($$׭FD"rEE`]*.qrܙ`Z$$%&%&%%$$"'YQ9677/+س)) &($'''ݖ@;fgxzի$$mRQsUIDATx bQsm k[m۶m۶Olq`"h7woOfa%ZsHE7 6Ð,j8H5a,BKZE@_zw 'K0n#`:X|Wل'X4AXF Ntxp|whBt(zaJ~* ;3=xY%Um׵I qpozdcjt-4jJvo-.OjUDBauhlAzE\n>} 0@tPIENDB`dotclear-2.6.2+dfsg/admin/images/media/000077500000000000000000000000001230033266200176465ustar00rootroot00000000000000dotclear-2.6.2+dfsg/admin/images/media/audio.png000066400000000000000000000012421230033266200214540ustar00rootroot00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<DIDATxbdE_~ V`ƙo`:~=LАi%l@]$DlPxW(|&!F=0 @; _=@.&ʠ18=5c8sc8  ._gAMB ǽ{?^cic/WC}HB(Ǐ#܊ J ex 7Ё  a k>`UDOBb )q` L ez;~zB5Gi ܟh`QP}i;Mp=jpPlnOArȁjMp=jA`=rT?r quĉ@?54AB㏨bmP0!hZfuPQ7u2<@L0!o`fJ1fA89qb,Քbdfu1i`bpE-(ɉvP6?_yb͠V%ͨ0 ; xi^J-8i$X>G=0b~14|D4ˁM= 聳iӜ;=*@-sƲtjbLC %$:AaRJ]PU1ZU-$Wi5Ӎ+Ee4iѢrޛ̽.y}ws=4G/Wωqqd +#T糦mOL%=o' 7&w._#~:A[L &0ܒa 6*{^ړ[{)՜K_TNӯ?\?`=?s܇;:=V}n,۴}^I3nYdI0JW,zD <7(4Si Hߦk c4P:-Ԉx% ޗ:Tote1G&V$.>c6+82fnخ߭̉H ]P'd8HOTc*PͬJxT.ګJǐCxIU1R!gJfUT?C'2!,^$u-x1\UA;Yz8{\)O<laybGU'JIUpѝ8m-r c7rpn&' ]\y?sUmEJ@zqDNsX?ZfukqW pwpNbI P eE SXsG R̔0IENDB`dotclear-2.6.2+dfsg/admin/images/media/folder-up.png000066400000000000000000000007061230033266200222540ustar00rootroot00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<hIDATxbu7āo[0 BD .ST{[FD'+ (3 5-,{@O직Xm[)1لZQ*{=0F=0Qz`d{T{F^ \(1=C9Ch&F=0N cę?:>H'T`MBDztp&!"|'41@y`80Z p 8ТNLk"Fs^~Ͱ{rl=Dzz x*n8[l6Dz`"U@\>@U>;9IENDB`dotclear-2.6.2+dfsg/admin/images/media/folder.png000066400000000000000000000004401230033266200216250ustar00rootroot00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<IDATxڱ 0a1@f"1^SP"IA # ,ѓ'Yɱ/E|)g#XU^sj5̽_Pyp30޶ Z-uK@<sQd#ofzd1E@?@Eg#"$IENDB`dotclear-2.6.2+dfsg/admin/images/media/html.png000066400000000000000000000021441230033266200213210ustar00rootroot00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<IDATxOHQǟT&Zi!m:h ÎydzgSRA[>gwgc7{%ʦ']/#hPѠ%{޹pu++M\GF53m5-ا{KE:^Uq{=Nڣ`W_Ta_pj=]bgTcчu)0sre݋'be&]cs0">zI:_]kTCW!kprY\q1}[?kG;l@`\H.X@S~}wI.׫KM­D"t;%84>\E#y`eвA+uB.>0<*YlJc%=s@m$@b&;<¯5 j޹W&q+0c<";:h!uv[jnVn>sjㆠd2hnm',d@S:Vɺmɔ߱l&ޜzJӛL7k#<s^AFo4y]Fߥ:^yǯ[ZAnM3&S}f5+h37q lT@l V@Cl@|Lp*3!{59jyMw 3/ `&8ZP^2OEg Ӽn \Oy mf J p+@ƽ ٬^4Eg]PhҀq颤SKF7X? QNZJmҝYb$=LtshlMV9iD=4Ap qͼ I+`z!@}aޮ,&~.CSf׃-]9YniC=#۠"W`f;ܕҞE 6"l%F@ſtFډZ>:z<IENDB`dotclear-2.6.2+dfsg/admin/images/media/image.png000066400000000000000000000011341230033266200214350ustar00rootroot00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<IDATxbaE_~ V`ƙo`:~=LАi%l@]$DlPxW(|&!F=0Qz`zZv_00q1H3r &?@Q @!xn Ï?vt &VqNVQz݉3 ?_&-m XIl)jAg0ps1hT3MI^{G`i]KB0ǃɯT53<۴Haj8l ;ܟ,%`Lr<&kfG&9p!kD R{6%kIB:%4$RKN#8=_bD1%\Z{F[/ɡNr @iq/M2֜ P}u2hlVdc@vR hF=0Z.G>1Pb F0Qyءp<yp{ db1rk CekOIENDB`dotclear-2.6.2+dfsg/admin/images/media/presentation.png000066400000000000000000000014611230033266200230710ustar00rootroot00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<IDATx?hQ 2E4f1$v*D̐b' CMI !S;zI4ywwbr6qۤk\j/%i _?ڶea`Ͳt}cx;4-bEX]YapqAp(LIZ̄04hm`e?.4r/D!0?yjR< .7贌]? fzWkho91ӢHTAC_^+z~fw :YhB|o4ɳms5:\·wU#p`5r_I'ݷ*Wlq.(Rk%uLBq>7#|V&:[5d2Zs_!(3yVSw9UU>4TIl&#UпmlHiB4%%ϠH4ƉV}=yxDi?!<)nm Nd"1=B ¹?)1~Cozlp32Coބ@H]-xܖBEzJ%m5dŤ_h$ QƩ0{ oG TyQC96d9/+"YOj-qzIENDB`dotclear-2.6.2+dfsg/admin/images/media/spreadsheet.png000066400000000000000000000014321230033266200226630ustar00rootroot00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<IDATxZK[Q> BKSSp!f+I*`PHTvI,BK' q(ء`Tny}y&]r<9߹wιIHXbA 9XUœIO<8TĉhD̊wqi!0z@7?-nĨI8XY)6lQlh;RSwM HF_dW΃р|biS*Si%kPoQgU*f@(&   t`lT^^isŪ:x+B^/IZ,kXcQͷ x[]qoO&3WTX88Gށ><, pI"{⒮k.(P=U+BN(k{/L?GU&z0J,F;|~N·^%<8μLj*WgD(DTlÂ"VPp_5<"'Nvߪr\)p ?*<%^]Wp5}L8ʂH hS nln4L!Dbރ6&ѱ]+q&. AHԡN2U粶2.q5ޗ\J}zPA|!17_*+矑h+'/*F@a;is I@y!EW;nip8ZE(,}k5jy͐a4|DqL%5YM&v:LNΉ]uX^^:Vyv!4#ܟ"!hWj@8 <=>lm%+!D0 8- mHz.LGo~ծԀp O$~^52>y9t Z/V >`4 {M \X 7 X4*\v;7!Ht7'@>Dv% 5 ,*ҏèNBa$N_=dYvfl„l_.:OqM(;I@4V^&W/+C[_0IENDB`dotclear-2.6.2+dfsg/admin/images/menu/000077500000000000000000000000001230033266200175335ustar00rootroot00000000000000dotclear-2.6.2+dfsg/admin/images/menu/blog-pref-b.png000066400000000000000000000015431230033266200223400ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<IDATx[o@~qLpB UmP݊hDd-TH00@3T,!uCdc] vvK$.ﻻw= ʍʝ[X\XbnmF$nQ Qa1y'hh-. @< ųFq$L]Ty&}]=h+$ӔSomҁ|,(9,r"ʊ (sCIO .VVZRxtdue["lWN )0@}0000=?N"ܞִB !QE:HИhKW^6GzE=Rg^-R!<|ɍJ!9ɌՋ#>|y2p`k>* f2F0nuU4=A-<JXm:Ke HDE`@E+3o A1Gc +q;6B Y=Ny8-&@X6=SeOUe H<} _>dG΢Sz/ tI˷|8Sq3URD0Ya,y`ZNb=3Z3y G!׳Xy!l#DQìlU޻@ 0\!=Xaq C006EB^IENDB`dotclear-2.6.2+dfsg/admin/images/menu/blog-pref.png000066400000000000000000000005621230033266200221210ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxbd U(/9D30B%/,$h 'Fa,@<147fpfȯq d#'~ \[zɡ2 9"ے4vll/$rUJv( AaLzV{w`COgk8੕e?-XNVnVGGGGGGCtEqv xQ"g}>ObI^:; X9Y~-؁Pu< ^=W,-ɉ,rBBZ] o$DZ }aIa<$Օ"NTh5*qD<3 z=guW'{ RЫ<@MF\ :O[YP!'ICA*CZkX`t)$D"5m_A<$4=}5'+^N"e:xMȤcI'` 8i8~/ϹztltRTz]i 2P0>ivu7PɼӜi>AQSwNg| ԻJZ/|64}ĂKŨd<OdgM_D܋p]]b:N~0(5Y7%Ij [GO:H<,x& -ֽ&n r\^P:œ<8/+zx'hDw[Zޕ@ɫ۟Ǩh}HHڥJƱ>FȔ12:,2HDi23muwMo@AMmp^Hb3֦t|~MZ|!D//aNIENDB`dotclear-2.6.2+dfsg/admin/images/menu/blogs.png000066400000000000000000000003301230033266200213430ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<zIDATxbLϫxlo%{{23'u,@,do3(@H7RYL  `!Wc]F 81f @zPn <&+sZ` ,"ts.IENDB`dotclear-2.6.2+dfsg/admin/images/menu/categories-b.png000066400000000000000000000013201230033266200226010ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<rIDATxOHTQOOqhhqd0sB\ ZDYi3 A.iFj-4 j!)%frL%_4asʬM3c{-λߏs/{Dɏi]< hs(;xD{e` lla}VqYQ_{(>AkOry#W/᭍0r|͟]Aq 7 Qo w%%i+s]+6:0՝+sTr\)ja5{#B?;o[Γ7(@EspvwG LIOli`w* Y`G꩙4CG\9\ G~yn?(z.o30(qcbz= pwe1 pzCE#ӏ{ >%{e <AI^,{01PF hn!K?f 0!c//B>U:IENDB`dotclear-2.6.2+dfsg/admin/images/menu/comments-b.png000066400000000000000000000023761230033266200223150ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<IDATx[n0p X^y8S t3f[')O`gb Ip<ˆSA1pϖgf2T&*D9EKrD6M`wZPȠI̔-F#"G>۠KanJZY| Wp(Ev׺(WTa X0 )#ܨvnAJD@ӦmW^*+= +RP{0B'詬 uUl85kcC4tI̠KG:++^A1&.GX@#b,eݔ<~hr]֪ !KF?.3lSz\DnϮE "AwҞܤZ6O"t:Ȑ=suFN8wi4C_i)I`S96ȟ@3%EŒMW=~hh(q/ 7ARdHQ?$;4{ (?W!W/ua;Yy.%]~?iqM ``_"|MEܟ+€5{})h[qk:HC<<7(c&MNpG(P GHX'tɱ?U Kv RCIENDB`dotclear-2.6.2+dfsg/admin/images/menu/comments.png000066400000000000000000000006211230033266200220650ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<3IDATxڤS;PM0;Y:KΉ݀EtV6l@p 39zSl)i-S&50 (ഺKɅ݆7x~)T(xLV|ShXC_ߖAJ8j$#eAgI+g6j). &'Nht3wSl )_Z) 7Ǻª14Eʼ1ʧx6bdY'2u+-UyӴ\.gNgw&IENDB`dotclear-2.6.2+dfsg/admin/images/menu/edit-b.png000066400000000000000000000013411230033266200214040ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<IDATx웽n0o. t[7'2u@V (OcJڡ }!/7h;ql> };_PC L%ﯙGT|T~hO96U |tO $ؖϟ&؟&1%SqcJ\ ,S*Vy@fk!S#*wa>~|zάB'(3ıaz<-7׷9c=I^#*#(/AD$+(/ .?ҙ`A#7:mf0(`l<!HA HA`@`eSN`;V$6C`UMd+Vd6B`UOhbR 2V-L C+MԨ&w"ᩆ59D:KBhv2$Z"H@PZ @kG^vUnp h >>}s ,_0Zunt)8'.ʂ`cxK^Z򫊎M ~G t@Yjb&0QWP~7;? <p22,TB3K;\7s. N'IENDB`dotclear-2.6.2+dfsg/admin/images/menu/edit.png000066400000000000000000000004741230033266200211730ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb<ql^@"`jaʾbՖb#ڼ`|b75w& WX~F jy$I!lZ *p OL0 H!LhNaH?Q@ K cw& cZ)A ,Bh46@z(m">, R:l:@ [gG3IENDB`dotclear-2.6.2+dfsg/admin/images/menu/entries-b.png000066400000000000000000000007371230033266200221400ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<IDATx웱j1s!kG:&mB7':889  Hzh.D!&| ^^ꑩ6~(W-].wO&E'W޳'ȇY2^%rxlgg_FT0y^i&iz5.T ǻ`#G6GVB-`|_g-Pj>ߞ{GJ@ീv~=H-|>,|>,(r&-{i]D@񂧕[Wq͆|\tmΪ03s"Ym" <_xgQG+2} 0`WIENDB`dotclear-2.6.2+dfsg/admin/images/menu/entries.png000066400000000000000000000003331230033266200217110ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<}IDATxbd@yqI h'R3\- 6(-t## P/hylT#.`bPlw xX0|ދ݀ąA^Ũpx E ҽ3IENDB`dotclear-2.6.2+dfsg/admin/images/menu/help-b.png000066400000000000000000000050201230033266200214050ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe< IDATx[OLWBma%j@4U.B1=' i4mRb7\ڦ&/6P aid?vX v@~{avv@/~o|# MFr|-*񶶶pnt@uu5VUUJKK}yyϳCF $7=.wujuuu rwO"\R^C{= 3?W+t = w t[kwX՛2L\!W.nlldeee!6{.mݵUibZÜKKKl||3`Dsxw/x@4|C6u[]vKwFqwY˥3y"F"7X=a^d)"2 \o$0~ll@ۚm:]9{g?tc&+__>W褹G+2`%aR¨:TnA'FcLX㈸9FU-.0[^Y,Ey>?Rf#Ͳ0yN;IW.Dǽ7lv`ɒ}/jH؀dlW** #&v(dl|THܫElk&@m(8.%f]0_*n,v[0Zq=f0 FvUZ]XF$fv(\#n$rn|(ًnhU%[Qt`"StkQb+B,`vtP$qJSʧQ2b~ƦUTzTXy؁B"Xʣ'ʿ98HTnEF;l8݇K URsn<ܻkk,]5$8q@+(W͍"iOTKb xrMA~>48RW޲#}y\z(DJc^ݔc !0jGރ\Sk;&:ޒXp ;8y1;Hss3d<s) 6]zC"ܡ#pbC&[5%yNruoך3͊TÙS|']XH? #1bc[3O?/ecR&p֭4hDZb MNN4ވF7-XnH~`6um6ފWf\@UЗP+D7ٹ7)izmȶij9#,Nj`Ƽxqr!\r"dE9\i_6勓9$):kGWg-tl`ʔ݊%IENDB`dotclear-2.6.2+dfsg/admin/images/menu/help.png000066400000000000000000000012131230033266200211660ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<-IDATxbd*|<]^=93lپI2"sz'r0/»gP Y0}p4AL0{2Sb}@b?~(Ԁęa6`0|a%*o) dVVYi!qo~6eoM{pd(@b0yËW`6o|8wlq f85߀o0/ ̻m9{ϑȚa#?䕵n<'B2=^蛬4r'!A1& ;?ld\SC 9wln.?~~dbpPII܄A` ?N_J|AΊa`IPܛh= 8Y@(yRLÿM LOݿ"ÿ3\0s'PtdX&BR~`{MtYO | )"' & RXcbB7`͍M >(qeg,1]IENDB`dotclear-2.6.2+dfsg/admin/images/menu/langs-b.png000066400000000000000000000013751230033266200215720ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<IDATx욽R@'hNF38<$!K"ߙ sSztRQ'-^OI=Tm2_"@WxP!8av4m*n"ֵxyh`.ƃ>+^MNx}>2`4cR+ C.f oqiJĶˢ7TMe$jӥ1]`g%N9kOiT6 c?) ;Q{=8We"\yu-tP(7dY[2a 8#uāAl劶땖]1DO)fӒE gxAƇX?;U~\Zd{̴.X޳0Q߷Uj ;,2/ h٥kXz2Jd &xTXK+!WHqDƑ|z81cx pTt-?"-:ZOJā`4Cz:&_wq.s Ng{S NIENDB`dotclear-2.6.2+dfsg/admin/images/menu/langs.png000066400000000000000000000004301230033266200213420ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb<!  $FP`Z@:>ąiw?: #Dj^ X@$WAG& 44׉@,Ċ`\ Rn Jp >@ ؜5|@@5$^?IENDB`dotclear-2.6.2+dfsg/admin/images/menu/media-b.png000066400000000000000000000012411230033266200215350ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<CIDATxN@ H|z78#x/xG`ƾ ouHa&Ԛ |CiiCݿ KWR-A BL^`N* nvVB氪P7`uϫu%ڬA⏰ۈ1ؗ5% @V%.BL''v .[A2@ʴV9(pT}yCM=?4YU Kv9о[#t>Y8:DlJ^OT[  cC`b{VB&T fBZ #uA;s0|sr}(B`(y)lQ `?XPշ ʮVVw+!81TCV> >XOLG鮵^t1U%^fL OBՉTl%Z `;:bST0` Iu->7u>ZgX[&BU> MP-Sϋ 0prswp=X _0# & IENDB`dotclear-2.6.2+dfsg/admin/images/menu/media.png000066400000000000000000000004421230033266200213200ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxbA4m 4?QSx7 `yljXX5d!А hDl`0P\0렲rrD ]A6Psr | C  Vh' P9r1b^#| '9cM@@&u0 + BvY!IENDB`dotclear-2.6.2+dfsg/admin/images/menu/plugins-b-update.png000066400000000000000000000037321230033266200234260ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<|IDATxOvvlBB Z.6mm7Mj_S_?jҴLSIM+-Цk!ІKIIHsg9ƎhGNwbD["x59Gݮ$jWtfya<: N8B)x;<:C+|\h#ׇ Z ":'7 ekpXn-8ZޡoËN( V"2{N$^ȱO=z"op Z5Bi,(JPKVE5Gc wh|lE2w΂HAfwc?CT}m\X4qR"&Q\Vҥ 9}6~9t_V?腽,k5[Li3p4S1eGy: 1]T2셯Lgk Fr"%_$Im?١*ݬE/_3{6)?Ϣʭ+@$UP;kH\jj>%/O0 ~|FWȡGTDa7CE9#ktx.{-JfS`^J].N׺VV+KTau^J3e E9UuîW 5<f_h'$E0^XI͐jZn%\ Sq>i#cj~c(<"[;Aq"d {a98րuk@oQ`kTWXW+7 ^4rR_=6]G2'BQE܁\2^7ୀwF׮9>\WP})G-c7\{[gyZa4166s,~ "4/xK<S> J4>޸)B#YFsd#=GB'hWTdS"< diK ?^J=  j;WW GXq ^]K=?l /蹿3E "p(EZx><sL \, 㹕m@6Uo#2%@P F#|X3Ocq bVK#U$ rQKpˇJa֒Ԫs?{^H`4bPO*mN6~?;AAA)B"r'D ׃']*2[^TaVEv ಎH@_y@9Tt3 yjo0(-ZE^od!!Vh-a/yMXessXm8My|- )v;.x 0РLxnfSj;EWMC349۬]d sbmMo ?}? PK\jDAĚp /8AHJxvŸ0HoԠBܰ2&~)O!Yc2ԩTK oH+QL1 +LC` i]\IENDB`dotclear-2.6.2+dfsg/admin/images/menu/plugins-b.png000066400000000000000000000030111230033266200221340ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<IDATxԚ]hUl66, ~Q4*(͆Z!>H.B B[`4}"TA>/ڴXRp7Z(E.5RŏڵSMC=;q;3{2Ivsι]|]{Pe$:z7[G,G ^Z$@0Nlz S|gCs{@ F`-sy2 ҵ,a{ZՉjj5f'i?Ӆ/hSJWNr|!8XMVTɟ4d<`m-p'H__7lNh׻?=U$|:@\;ӰˋՃd=-luan xQX_l⹓KyJS&Q!E"$?:;V~ȑ:a`x.Iq] a1'b(Lh{*͔`'B>ȐtB^E1^~XCER(i҄OZU2;Vy> MP,at_3%$ xm6O2t"Q ߇XtΎiśv?&+EYl?_5odz4Iz 5'?ooR][bDiXuFOT}𖒹j@2D|PEEx-h#{k h\~nG{"y7 EAq/R1<n{5^2E`7xjݬpyD ;M1 GK£E%oin'fpaaIK&4v J'\6j~# KFSU>ypHa妜Uזb-_u&Y#@e9@hc uS'K1p0Zk)<0+c]b)M L!2ONS>s-qy9adžM[epK\}v!H7k+_ޏm0(/UZ&@K x3oEXmn*#<>k6D^J@|,SmXk.(d ! E~S9KLeeh?2_phEo^k^6m,A*a۔lO#[IENDB`dotclear-2.6.2+dfsg/admin/images/menu/plugins.png000066400000000000000000000011031230033266200217150ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxbd*~ 0sR#c: K[ l ƫy9d $5 @܏@  /F3k H8? ĉ `B '  O2\:DK@&<3=yJ/n1eTa񧗡Hcp.TdC.ΰ|=_ qߌ, \hL |t8i=?C2ö>5bah6`2@ xk4/gdٯX> iw a WO/<"P)p5 bd!s0x+2؀.3$R nnzш ~~ļ)`q.m AC5_f&h55^@փn( 0[ǻ?6IENDB`dotclear-2.6.2+dfsg/admin/images/menu/search-b.png000066400000000000000000000016341230033266200217310ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<>IDATxZm0% T@:wX$:s N܃5:@P~(Tˆl1|~blƌ31W~|-&- WhB7@| ;h+[Wh>B-+fDDx F{^q 8sOJgh"fH|-, ʖ>k=2;$/E2N1A{~ . Ľb%_P ?@|i ”Zj<"i$IS IM Izk϶ rAոAflVCmlp)c.[i'ɵhPΊGC;`<Ǡ\'0@Ŧ!B.LR.@QPt]m46 5ӆ[bɵ$A@tvBȓ"]7\.. Sn\>3}!CLx9W }u?C+fnnlŔ}brRJ FbzLy:w{ D$)LX[zֵ> -KTX0 x":S*Qo7&X#K"bpT[uZx4ȧ>/-Sp . 2^0)t&v,tX ȷ:k՚7(^t:%  KgxB#-fSU\:0a \(0`,Gp@LDbG7y=zh|P,@mȂ%zb!h\m9h#6и& 0Q9 EVGiIENDB`dotclear-2.6.2+dfsg/admin/images/menu/themes.png000066400000000000000000000003261230033266200215270ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<xIDATxbuPy=C&HL8cQ fFL a` (qR! w%V F]m./Ha P Hl,jFĀ 8`6Y+bIENDB`dotclear-2.6.2+dfsg/admin/images/menu/update.png000066400000000000000000000007761230033266200215350ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxbyL"o@,yg 6 .şz$*"Y6u8 ix1.-L `E?2D >d/] PGr^}S#h^~U_xz*fq[f|wĘ~?d~׀h~xe$U|׀?\&搗LL`"[*-~ T{C0YN~0L׫laIENDB`dotclear-2.6.2+dfsg/admin/images/menu/user-pref-b.png000066400000000000000000000026651230033266200224010ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<WIDATx[_hSWZ]MF-lc]o>!@aZEF!"m}kƄm. C%MSmۓ5O=&w=Iι9/7>$kVlal! ~nP|nl) lHD .9IY|/^ަIp2;VxnOi;Cq&Ѐ#v?,`]!F^ -BNK%M@kb'@ǽ" D$׼bEĎ `' Gܬ|AwIl/|۱Hj#(Axh{Bd8X4&`*h)`0ccv‹?$XՃc=Cj@ؑ2K >$,R@xh<߫78F$TP2CۭҲn5W0qge`[o@pU-/ ط1_W-5|LJP}4! q vvCV|sϗOFFaq}8ڝP,BD4 uJfDDx%E_ld@I.xǽ// 1Yci׻Fs}"o* iytO,Hj e \O=jiejL4*/' `. Ԭbgܮ3X@kWF'~wdK(fPFکdp'Ty9 ԅqey~%)\T֢+%H&j:&@;,-XGG[&Yo)}:!!5F)]-8,/ 9Dj^h}IP}e.FCa5ozpnEp)T( ڔ8Sw^6HC]|LG603=C$XKIpi nMf;~2 -g!?>&к>G/(\=j} }qMӬ$V43cI|tIk@ Hm& ^n؀EL@T8b}E=nymsE? #n*M~///HR;Bi.`|zG#1G&pGaq'jNY rnO0͐Xkdg.qQ;'9(&/oIENDB`dotclear-2.6.2+dfsg/admin/images/menu/user-pref.png000066400000000000000000000006731230033266200221570ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<]IDATxbd@N4RX*4!T`D,F! `B` \@!@7n#Q '?F "]xpHC]; 6|`obx*"omrZ/ ױi`|MQN/~@ nŋJ5' k믿3QTb`Dq%,[XT~ W7ƂA  EYVUB@_bs;BkXO)]) L< LmS~(UWQ.$DO|@"A]`!=N3 anp%ƥW=xx<  DZN5g/^z?K\ k==ѵ @>Ƨ*_9@tW ,z/h\o"zFǨ幜 #Q8}k ZZmDr.`o7kz $.4Ƣ-ڭ`#cІMaW͛J 6 hZ'7%:e|ڇ qd Z0ӀpCL4e 9U|GhGʼ΢J#4㚛hЂLl+l+ >4>tN3MWY-0GZ&bc#,#D 8 TQ{J]EA׵ΨiZ ɝ_u3!-_f381i d:yCB v9>4QM[냉>kХP%3xPcxalm$Ӄv.`"m `T>u9g$aʬcU^BFw앮P,k?i GnkقIENDB`dotclear-2.6.2+dfsg/admin/images/menu/users.png000066400000000000000000000006021230033266200214000ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<$IDATxbd@j=  |z`Bb43@APA4H >(ld̯bd @{I(5b,0`]mASs Adobe Fireworks CS3 2007-07-26T13:49:57Z 2008-07-19T01:36:51Z image/png $2IDATcaf@~N$/ G@ #ǎaCp"@l)4IENDB`dotclear-2.6.2+dfsg/admin/images/menu_on.png000066400000000000000000000020661230033266200207410ustar00rootroot00000000000000PNG  IHDR ,tEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp #IDATxb?Èg= W028] ,\8@j@MNQ:`$cQ'(4eTNt2LȒ20LG+(狦Qt|F6?<`Ӗ3@ |frX5$k03PU5>IENDB`dotclear-2.6.2+dfsg/admin/images/minus-theme.png000066400000000000000000000006201230033266200215260ustar00rootroot00000000000000PNG  IHDR6 )NtEXtSoftwareAdobe ImageReadyqe<2IDATxV 0N:# " 0w0M/k4t]wզ2H%u Wk z#D*`! spތ"-jT4qB@1S멨bjXM!1b` ),tssKgL[<`!p&S-h"T7rtlR(:*%S7:FcpIkMǾ sMSR-yXc[nn177ɉ| CcyJ`z-{dIENDB`dotclear-2.6.2+dfsg/admin/images/module.png000066400000000000000000000006531230033266200205660ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<MIDATxbd U$@a椎@8. 7mr."cġi="i.>Hɋ >1 BflYYYTTU޾} &"²K؃ `A(**20pr3)&@1}p1q 5uu S#kz)d| l%`1 QwF#!Z`Cx,|\bK1& Ǐ00 Y\bG_?p'<f 4Rƅ@ MdM>$krknIENDB`dotclear-2.6.2+dfsg/admin/images/noscreenshot.png000066400000000000000000001525131230033266200220160ustar00rootroot00000000000000PNG  IHDR#dsBIT|d pHYs  ~tEXtSoftwareAdobe Fireworks CS5q6prVWx1H[QO.ꥤPdAhjhhdPRCkMPaCqCG)R2u:8hR djz}%/K ?y;?N rdʭv M]W 3g>|3^?ߢ|q9 54P_~ԛ_m-F&W@p,S=87/)ەg_Wq=5\[G~-:k3-w|מ?UQ}g>|3o9>_0g>V-u0Xs"vMiŨM4IvMi4}֟Gi+ 1%chLÂMs` t]}Z4/MG6eABzI6 A)+$K^XD::IzlOI=E|W ^>|0{)Oy{}K5+nVQ`ZG{:;B@aC6Ҋ݇Xk4yy5֛?`S4}}B/Qٽ{&95GK9&7S3J+W[|i>9Ԙ7U> as6t *frاVΞ*2z")ȱ?a̔ /),վKt}O^.ɏՌEGPOŒ z3vX}Tk"IohWL1DEZټ}n_fon򽅢qE|?sqaqE!?QPUşQVw s[~^fIzhG'1 Qgs~6ǖ,vy}W^ERPl9/> HؚȒGxxnh\@نI4nUUѯ˞}>v&/{Gcm5EcCZް:uXfūÖ7k_Lk۳qUsءߤ܍]ߌ eKv\LPs 53Ԟ+ʎ [oJG:v隻cT4Z؀ʃذh'MumlJE`M{}ک`E6v|\Lmmv#v>Vc+u:5(tKH b09 &oGaavFc G6A2hTʠQ4j-.05 A=eP|*&gT3S".𞖑B&CdC<>l+!oz J9~HU:ZCҜg\sa0z609MP N 2)euȰ ќ(_M|`kY s\B|`Xt"i G_9>_ V^_W3bi 4UjnyN"[xb /cW6X~Uzd j $K1~1cwdûMc}m. UF3<1iq3#f=JK#o MkږnKQbXN­5ǗsМ7n1!\˳#Yz1( ӷ,ɴ1(5+]ngOIJ3 ]1dp$篂y0~q`VbsÇGOd®#Yk|4&$#ma[aV3㗁'a6N qӌGI3ͰGtyr0񅔔P j+">G}FԲ38ɸ W/M&XYVTOpXlucZV$:ˤmJ>}p^wTD *שIS=T`\RA/ Q<d0u5k%ĵd8"uawuI;@ q tv58՝q]vF'g ɰʡV~3c`Ĥ[#8~ X5gt 3ʒ0VM}EOQTJp^TTҐi/*?ژI( q=k1Bh/g 1M ҸS`.¬ δկuy5Э/~/ѤE7P *w(~9@pJ2qdY&(qfUn=nߨymot>NAX!؅WIV2⸵n3I ]$4 Y1|f )SEj42PȼYG8.x}E0x< yz-6zD,14D{9FI)II`̖ Mf@ WR{b3x4A; X*c)v6yLV[b^9}xl8-e6kNd{zزߡ?ݖλPO6ƥ`=p{oo4 }(T DȆC%4z"E M$·'ڈOlӊ (²'>at4ǢL!yj%Al“d$W+)2BH7H$>a:2K\Mf J*LYjlWf(1|DҠ\/ٹQ[-j`LT+3UE{sFXn- pHU+SVocʆ"Ov ]@B#so)6+_eliy"lew,ÈbrѬ^,f~$Ÿ?lO-v~C <\{CsdzzAl,MgјI icLk(+ 55dWka=?1VyjWb0] =/GwÁ1Q$OFR4ءe>Q?+Y.x$}qX8IjIҍ5Qܰ-U۞"q#-~H9Vh?PlȦO,bD!R|^)&X )[@~!A DEiJ]1Lf){L&[$] ؤi}EVJdCF&{|NOl?M^LjU B뒹V{iOZ Z Bk0C!ӄńVcBB+ '\h{|m")nә{i^Hr6( Ee~* )ĞÞ%ٟݐnX#+ZEFӄń6bBBޝN4NoGNS cB7kH(-;B{nRc,[ZvK2BЯ>>KmͤGg,D#on6Nγb69N=ZӠ ݙĮ[uUr#q@w S|*q7U7pR_5Qk ךXck+B•U?XTDiS;9F6W_X[>u5A3(V9f':V=a%g=X}NFi]}Q v2vusz,^%T+=oZk>P ZfMիfEm k%_[qO#o8pQWs +v@*YI6*}M=7{e;7xGT*t|VK.{̭]2wܹ-b%O/K.yZ}*s׀.f/,_c^e^%S緦ׁK__^e^%O'Gu2G钧tW2z0wW2w-'Gu2G钧enA-T'3Mhr,WWL |pv.˚HfYy}KcJ 7I)-2XK-889;[ hWm)r??m6JZ߶G .}5cȡ_zV!LU*M*c6i9ڤԷK4C=;t܇9quEղYru%WEs5j1kO!iP[.BtNu#^'ݳwޙ uI}F/l|<\5 a0}P>yǝ]oۣ+3vx׸&@߷}(o ;7t#170=R=P hV`=H;<[|hƑ :eigYi0Y1\UFI?BΦ}!u< Y ye*fdʬLh\vlIop z,Ԫ>Bo7wyd MBrIUag6(h)p>4:%٠qZGO)FF/ò2>JOg#2nZ֏eiWJj}UnֿU[b$IGv 4,W{B#z9@ao,;'1h_m;W !!_C[ ua[*ٺqQ璟K~.y]I8Q |_X;_EwŃ@R#"x$fHYoO~͊tnYl+~D 0snM\Xh\Ϻ*~P[3}$=`a>>]_;}4k Msf9Am?&iKt;|{cgb\™?,HC1/jCBijh"[bt{IgsSV#Mj+yY5EH$h>{:;4pYuGu_nЙRiQ֟ e." <M?'u }[:\̷)O3 %wD=sAs&1NGf2iâ,DeA]PGp"mzƹ`}'GcQ.BgߠЄ _;$ͼP_~,)(ӌHUN ZQVhtlIGj,Y&j,g@dHUԂ N9s.M;ߔ+F)ԁGq]Հ4uBy2tgЎ\F< is+eGeg`58σ‘tՏkz6(c1#A1n~s =SYX]SC[5>kuQԉ |UyܑLE.ɫ54\W+b!ٺX]46X!O/i #ran5n}*I"-v1迡Yz <5q#%?jJS#wڙַiJ9S`.EkD1Z^#^OV}3Guio\(eG~䥼aّ݇ [QB8{:J٫5YΛ[/\xYXok8Lpdac^qqǒK68eLfgYc>&/?<*]`+U`ծ tcqG}DxԆL O)GyP 礵 k I}H3U$ CRT=$uߣ}3O_.|Oy2x[ٚOX{\GT0n.>SQ1|D=Ik4V(ɠ9K~Oҍv/#JGFdk]3weҶİ]7UJr[+4VZd-g5eH1arS-e0bϺW.YC@0K84"#?]GtC6mW~C j,CE ٷd!hp oۿ7ofؿIk#{3}Z?yibMu2Us,TGc~ڤk.;`Yn.\2FOШ_ƯOMo6 Mp蟵sYn>cK wֻX'o@Bv;ѻMۢ†ӌ`'U'tq>Vt!ظb7N=ƛ۷;cbbE& 4#9kӾgGt⬵K'o y7?ʄ +TX*mxҠr︉w;t;WXaCIqJ4u.mmүݸ{c5tٗ!8_&3xrt wtܢsNuYt^mrxDvX>u]T4DRh4467hر'& k\2*c`2t:ґM{5DCRfIaOujChKdʯēKj3/CWU3]hpvҦP.i5֧=ZKQm¿׆P|!iZfw X<0r"?'gTԡ|J-~@~y/tbo/&V.ۃ^L^{7EuVau$uYG:۳qUS<}c)"@htc:mМR?푿B :huaܥ9leCC1"5vԠ:4GƆG;D8 h_hѣnq6ʤFFo ĉ iT5{ZmLmaLd{". f!|_Nd،RQcq6jָ5d8 Sc<~t%:Ϳd9p% '&4u+ M')i3_M#+nج BC [ޏO0@܎y=Ù|e4-hN~!E 0~r`.l?sf#aG[yg}KPzyG֠@M45e m(=EE}E>G%'g1wcq,ki=bY !^tR>KH b09 &oGaaRe&kTʠQ4*FeШ!h84 {F $NmDC PL|D{ZF:CHg !!d2< >Thf)KT@ju>Hse(sυ`P { 7|ʤ!ò2(Gs|5Ve0/@z4cib4_s}1}1m,:Uߋg4o ᣯPqNZku!La $DTTei9Yn>Xы7(]pJ`Ee_^G99ʠfi BdC/-7=c$]YWb}m. UF3<1iq3#f=JK#o Mk65*$ܪn~]3y|G}FԲ38ɸ W/M&XYVt +(\&ǴAIu 0='I۔qK )7]&4ō$)*0}D Nuė(2bf5Z2 ኺٰ;8}T_ ӆS uvfE:i8 .;TC#|3dXP+Oʙ1qNbҭle'Af7̡!#"hSz_pQS4Ua2\4b xk?ژI( q=k!>)BtLS49.C0+A3q1@]r tk_zK46xM '=E>#VVϚí*)5 !3f˂$g Ucmk\:l:a%{b^%ZS6G&e&vId4dϻK c+OC=#.K d vF {k#25gq!BGh4LJLJ,c4i 76MRT+Ǔ12ŗIP#H1cz–̉Xkci)Yv'+Dأǭ+}ĖeV"hw͡lK9&*${6fi@ZeQB5 ӇJ0C'M#Mi1N5D<Uǁ9;H NOO ٦PeO}65hzEB,K88؄' IVRd.~H9Vh?PlȦO,bD!R|^Rl۵uط >yg|=/Jz2֝DōҺ-dvz+օR Y $'K =W#S{ޜ/&V9|͸W͊&5=\KA#-GpدV,T8Ay.jd u4`RIՔC52Z${Ro)if醮nd6HWi%[qF%=&Q&X۟c\yݺ^#,7!%^p#)|E*Ve_| [tzl cўUA x}_cx{n|E(nw^S]3?X1ZO/ޗpOO襉o/Cn#[L+Lϵq(ME(R7n.6͐G5z_CsNV8JbRC:=e>~C?Lsݦa 8^ | œc:hH qG\n?zC}nVۣa.(d|+$[?6imf<׉+)kyżN|yN/;u;|EM!"WMѿQM7%SLp6K.dt蒣V%G7|HWŞWtӋJ%ORv hŒ5p 4 %sWKXNȟ!ېPdiCn>a}%\׾7{ww 7Q 奅d BeDSd>bdW;\c ĈcfA oWd_&0S`rm\]06 Aأ5.ɪo}68ui(P<V1 Dh3Ih# }~SKqO=WEcލdMP&  /y{t6ʐm+= *P`k[?J~zT'_)W[<ZVoaL$! w1(̺X$\qu_<"4dw>.Ġ~X,f_i3| m-x{#օm0g>g[kٛgG-K~.u&xG-;}]c|]-Kп⑤~ g&=5+&mee9'\Ϲ5[s=cs=r@mbw}G:BCP;#286Eϙg4?rG\о-Ƌ \8;ŸϝZOe)cCwM9~mQ֭GJ{P'.Fd.V%b!sG2E}$>^.p_ysdRcu؈Jc?;/fώ,ʅa\c$bh䛢f5n)`״Ǎ4rmڪ))^tLo %hgZSXF9*(RNd|ƿYhy~CyY~?yBXaչg8q飔Mn?eGv*lc8G]< _ޞӒ*cfvԤ#fvDk;onQ3=6S?QB=|2\'\ '!@Tit+4/\I}@S]-K7ڽ(EmuͬߕfHۖÎwdTStVۗ!(+,O~W7Nh7`TA*UʩRnXiurk!DŽ=uOa`Ϸ=_ [dc~,)L҈|wBٴUs*_s 5 )E4xgߒ hSZ?l|N4;ލG}lBâۡtwawq*Av1ܾm+:6Iia{Ms_~$}F -"T?Y=;tp$g]:y NL̻19W&TxXJmǚPDul\K{Mܯۡ MSڧ k6vikk~Ɲv/I˾ 2iēcs?&˒$j#X ]&9rڣ] =JKAs3.uC)O:Aĝ˜ k%IC18jR:$7;{x毸}:<7i+KgiZu-b]YjuTﵡ>u}`cZ⻪VYq@~]h>{yxn}2IRQ>1h̾Ư)]eB=r~ K&=I'mV6mkBSx]N0ܣ'# ! cenÃsfd+6O`=j'T&с+~*5:/=H 3H [IYm|#qo0 /ǘ [c,~FsUm<7v'UXtD{TiC`~+mkBT{xJ@rgDGTTǒH6+!a-(K&uOUYK,--04ʊH4BY__/OOO]1iZ ~nnVy~~z،wu-333ezzLMM211Q+///]1I꾸XvvvA999)}||t=l$ݪ\]]۪ooo]_twwW^__߫~=U{ [fM^Za#տk߭&Uس`xߺok]12?`ZqօOO|~~v=|FԦydπg@pssQ=ψԿ~v=|FԶ!6?跶'~kSȾqkϺ5k/>#hϼo_w@ȵ~K2,9ϝ^~~羓k er7g`]]3z⏈ 2_#ƯF$qZmkBTxJ*Q*}hdHZ()hXι崞ř{fv/lbZr|~p "b0c<<>>~sm+vuՑνYu8uN?WP>1JsWiV_uKEϸ/rˆ_gKW]ױEYcl,[TYHT}xL#}A GV7^}>iҞ-i;}LJX&TP3T#ߨgJl e'=?͘ona|7>?ǐU%;/mN/IfQփz{G}?v✽3X~j{zTAO^ʰ>?sy|G)Ppvv~Missj׭a:99I!irr24<<688X}FFFHSSSivv6---'KK 4bm||-?O_Gh}p||nnnZXwӢoĸœr^__K_+_Qr^ſ3T9gKV:ck #b AQZ1WVVm{u?cegNKVG+Cs2Jƿ]__Uq9P:K:NGΛ}gy5g-;knn.ϧj=NcMFϋٿg1Շ9ݯf8gڻ猟~Ћsn`@}p~K? 憜sjzu Yҗ@ 75DH=ځa\g~ځz_ 9|Ԡ 59P{Pϸk hۅ:\'to95}EOOO՞mg?ZvL\kU!n ϵܿ=x7׽{%8&׾_>l>$׽Oo.yٛ:Wc`LÃ{ r\c~ϽVR7y{hԖo,^s8Gw/θ}ewj奔Z\u}Ş/r99]g.W3~g"xh1{}vlP?C7s'?_ԙべumkBTxx흍) q ĉ8D^>׻gI@XjjgiЃ`0 `0 ?ϟ|:seQ3|ӧO|:2|.};7eGFO6_Qv]T]^ˮg{>pjzkuo{yye?{-x/ D:3D&򈼹e^Hyi#/OGzϪ߯_~ :sMe#M3Y#=2 QЙ[\s=E8}E>GȩT ڲTg-}VfoSVwzV}./>~!?U1<#}=F[ ~QڋBN..+푹^edLo+[\-k dW(}6q$#?z6Bөi?L7!3O_Q}Пuo[=tkȋM!'}/Ƈdr2_Cﲨ: `0 :8o=+8-4}۞cĥXdq{bUq©ήm!ƶg*ΪU\z[GA=^+ru{LV U?)V>ғ)x|Yҁgi\yi^cUo*= !TY?rfgWsʽVn*VX#=Fϫ+[F~yH\L~[O҇h5ݵTow|Sfӟ+);F;:x )/OS yUo2e)Ve3'wgGg=J^`0  ľu kU,Ksؑ5nY,bXw{ w&3QהNQev ]ƷgcH˞i{A3I8hwduwUIWq8I>+@pQşGcZ\ƪUߝ]/:3d;ɫ:gB9R|GW~w2;fzt|+i5nΟgZY|<1NyŬ|E7k?z/k><=Α}N΅>uWydʬdz `0 *\?W8GY:Dgcg< 2+'W6qn؟{ru"wU쏘~c#T?+y{Q,,^qF/Xv8.֩g3}ȸOP ~n%hUG4(_sn|W}Tg&x^c,Fѭ+ <#+}/Uw8BRh_|33!mr\7U9m({ѝpvew[xG]߱?g;,nҽow8]וb?OV=Z_#ve?vN_WrYLo;1g9pV^G~>[_vNOS3 `0Q[ veO\k^8֔v<Zbz\Opbn$~}oz3ј mK vU]^iNWA#x딫jt q :E= z%օq)CcYEqyRG-+u (K\hP'*^ء^q=m=y|Kvūe\rȊ4={W1;=ݷxp;o@>ȘT\Ԏ+C=*ɫ|GJOCW]x1.ﵠ9_Eб Vq)v(ʑ}[GwǺ{-oSdו_˞׃2;iT&w*w:g׭SOsj%Z[~_˯d֮+w]7 `0]kIu+eL]ւoA^;=GR?v쯱;<y o$N1紈=:ߥPVu< <&3KyC/4r)i=*/|Ύ^]QNН1qGw>ù{ ?Kv:A}E:_n+{u=rq͓̳]>>d}+|L01`0 leg:׺񶊝`W,3O?]\9P~[kOWiGc~)-<w.3q}'vuw$Vnv(r52S;Wk_Kϔ8B/hEՠ'9w?K;x:x<|@cϽVyc@ۖSw8Bq]=2lBe6V}eR( VeZT4ade2ޒ+nYBTqSߔ<[&=f[|szP)G}{Zׅ3n7jpWwftEw[ǽ;`l? `0 `0 `{~i`oLy>uoi\qK|}7Svu9G쯿c¾#>,jow{ՆݲL=mW2u_8دjo?kD߱mw>#}E:OۡO;y`$j?tU mkBT~x흍8 FSHI!)$FRHnw HYx3ꇤsaaaaxIǏ'U{o_ھgW9 o'GW {>~Jlo߾)*/N\ϱov[iZ_ձaJΝ/:6O- 92b?Tlk%?_21B sY5>:>c=1Ow y^- ڶ,XzusM#גU]>H_yYv!ۉ_mi Rus]Xm_g)YY)m]y,m z1aaaxEߓGקo/Y\k6xjgH|yu.\aæM&wk#ϐ$?]Mo\Ⱦ,/ڥQ@~6s?)}, l gX #vQg Bٙ^uのuhm?}{].~}v_J;xogJY]޳@.)oqC?}>@Xߘ'-(W? źvƔOʙRv[K?[A}?-wmՑ}g\=c}M ggg DŽ-B^k_g?F? v0||؎=ǧHPgs/hؑI t~{n^}ZyD5XWvO)"c0vY Z|~_%/,p\ɹyΰZ/;/xs_9?Pܯ5ݻ\[y|č8gʱL{? 0 0 _k3>z_\S |<)b|7aaaxn.ta?l^Cvkؽ#~e)3<3^kdlc&jK+o"e<.ʞ`^(3zu l+6v<ï k7]/lc[`On}򚄫 G뎱zt^v2)?;Wmr5ocIz?Ozx{&!ez."ѯ 1Gg{+ҏlw<=}GݽFƨ^)zIpG K֜{{e G12ۭqiumf>.}~a? 0 0 [u+7Svq֭y΅ ?ނ}XwŶv?ߩDZۓ-q/?߳=<~#>Fk"qzrQo 9r,nY[;o:)@-`ק-7({߯S@µK9֠ɸ>:n3 _[_*mtcmC>qSL=<6;ǫsaaa{xˌ\ފpx?0׋#5zяc]x^l򼠕(f:~٣^lin59W~\;?vn6erUbS~v^U O7O(|;+SG4|?f*?rW~2oNٟS9~daևmH6mX[J~s.ym4ٶO|Bd/b5ɿyU? 0 0 0 0 0 0 0.P~*1@G\⟿KrKXs2(ߥ纎J8'>X@▼QQbqwx b)_K|v 1M6kee-2Ǜ59?K^E~9ϱQﱮYF8N?~;:=J<-tĒyNAgC \NXKs)'^Kg\~2}6}Գ)n]Or^j~"{p29w6/.z-v:+M{WJYZ굢`% Ҥl9ힶկ#OUz+U?;sd~vND7*.Y+v:ye;8}~|+ÑޅN9}{Bƞ#txխsXɿkSV/uJ=o G<ջL'L:D]6jfgLz/+ؽ[{rCMYq~[{yy czA;w9zszWHVax3 ףmkBTExˊb1@ŁD(*(>$M=Pg-ۛILP.KjZclM?6ǖo6nTRKqf--C^G";Ǡyx>`P(|it: 8GZ.hDz˙G~gY1F/wn+_ql6s#{)ǕzxkL&cZVt:31veXg-ݏGBL%""""""""""?2>U*—*mkBTx}+(H,"H$"#X$,QԈZs>U{ ..T}6ڳ-F`p]k߅~b  О$wݓٱ|sCoA+q3lOx@(0a+? T,_7s\Ϙ^Bl1)C+k(FyN"8dPC_9>O0&l4Im+nwGrŰ)/tihf ѸX>E)<,6s45zb?J\<OM%O#(76:= ӋYAƒH Ls6MXBcX&ǘJte. 3.je(??Lj=%wZizFTx$kP8Em jAOހ>~؆B9 ֤8UKCvjbL Cy ;mj P. DkwUE€3ܨ8xUJs\ɟ+;}sFQ(KIXݛƨ 1 +KdX];Jģcx$D׷X`i @l̏rnm$^9΄zBGϞQ=nfkDe; <a>,⢞jk0B[p($Ǡp4 nq`XƓ vϵ.xHnorJ5Hu뇗 f a[Z:>36[g RL؍?( &w.7C#~B{] UW 71jk~ecGrD.=K@WDZM0倐0\xvqNZ ># BE )&yA}t?B Ym(WIpɱ |2+\2 )l8tl@Z.Be񅋍RSƃm>dIl'N adĢG3%#)?$s _5=YBR#-k"qGP-e"f%֩-ϓ378M9ϊ,_*n;HEBƱcl~ ˝[/sagIE2,z1t:kLș壋G){7ond{@rP>kwk׽ #kXfyEAB9uM4P=_lgW؇N#_nGpp ,ZUu6ȓVӰ0EK7*|]{75F\ԶzQz! uH>upT٣o3P)[^6` -d&*=%fY<^ط`_6|h3ء>2 Pq7ώ ,NsjF=B` 큳CiU)R鐏@LҮǧmb<2FHRqùFXi䎲OmGA}:*u f:@ʫRH.66jcGOpO- 6HKJU:Jǃv,3DZEƮqq7p?ȌK%ȧ$;?Qr6pP7`a^=R_)m>D3#£ _' Iɭu͋C-Rne㯄ssL<ȭ/R)|Lt_1Lk=rr 4/gEr~PnB[\g[{gYvRW' {Fem1{ wL;7&$xc0 n&u@5sCCձm8Heft x{q(aтa?Q%l4ςxmWI׆GC1kQ3iJh,KRO`ʲ4)%b6B8\pe;u)ko)#WSncRx{[sXv195_0Kՙ7>Tp5ٴl3S"؝LX睫[5m Q="u}pϘ*xbՉ#iM+@Z! Ϯ~jYݬ$?5mtu] %@݅:4h8ۃtu3; ΑO1A/r R*5i&j#Y2:$Z(ad@>'z L뇶6Z8|`6"X1_z' F-я?X^ A:?1;h/KVB' vOnFS ƤQ{=kh7MwXQp\v͓O/. N3HKRlK"q^Wh1wt h@3e6N|I;y?8t[[! $,ήLe"z%IކAkRl!3u8ځy?_W)AbCO!rza5Sn֗#<43y6"R߃CQ&>[# BHǽ{vekOTlq(UH͵h ݔ8,@tՂL{p/*L"d_y k,4 G̖bD>,.ok"D;|7[.DCA#ilϟI֬Dq]+eE _-- ڰc^Lq1~CCC9gNH8BkhJ#Z-`VoMa 9r$պZ-hkh ?C$ ^tď9d(8P݅]ڶw[wl;dn׆oKd Hބ(DInI M_(5)6H/Y1 QRk,nXHʉ?>df&6^EJmt{CCc`0ʅv5x<\9Yc}106"״!֏9dl:' 1H"z'7QqɌ#KR./CVgQȬ\ `?d1yuM6Ƶ8ZX]8^pwQE &1frRKi$GݜЕh3'{;;~FK37ku<pdʎ+C RMzƏ7)nҀ lEGyl:̑IoBS%|ЕsTulebA}Aʹ10A{KʘӺtjdLI=r PRg_LbR Şl?␔)![Fo wi&k^CV(t@pW2{hxHGRn͉eCbxԉ6GQd27\ثdS=\Ff*0ۣOP5(rZߙxQZ>~GAeN-jY7Ҿn;n?ӹ"Px}/NW:݊&׾:x" ꭥу;R펔 c䛅љElmG§a= h¨BG_uYnZ쫭FYs U"zM&:Gnu.DX5Xn;}ԫ%XO?~2&Frjj8 yA*W I9/ub)Zl: s 85J>~iI3Yԕ;:#hELם[ROd^GA˩f~Y!En0~/A Km>^WYq"<цF*c:xw|͞w%ehRgd9̕v3v Dgh>>?3hYDkgC(ʹƒԕSԜ| 2Q94(?OGQ34 fccPopTYaW(>@tX4`LGٞpɄaŰl\[9c26U M6f,'C4i?W~psϠ?kAKrŵk@I|>^xs?\`,D̒5W^w DMXf_8<%|8_왉pP1Wlm߃f?4:́_Ԕv M;k:p_sj؎qw]$F}y ,b'N=o0, ~M YR46+!}@~ujctCP.Y(x׎z?70WXFܣo3z0c8RGg0 TU򄽻w"/4֏CQ`[{Ocn]+{{ N!33+5]qpj' r9FDȬ)~: 9Gmx2-?sraG"yvUpa;Ră A\& ?#n 0eed~oq嶭!!DzP^H)>oȑ.ļԶ=Hy7S-M ?8ycߧq|#5"2Б lm#UeΤVbM͘jAc7Z ]> 4gb s 2WRsKg6 's8qzTT[R[w)I95xWj #!nN+zPڔ KgTE,?{^RDݥ=Ru^zîc&D'i74SJߔ&HUG[crͦ<׿~4}څh;lpAZ%XZ;tQ?yk1+Ƴu6[ Dc4Ɯ*dB#!}e>samhG3c^8u9󼵕⸈߂UyB;f "Yi=D =4&|C3g]~WgjhSIXU"1A5Fr4{AljwTt6</N \Rta| i>T.Wo>>xϯY{緷m,J{gg}v~)]s!?wXGFl!7U|Cnfﳅ:.@mq%臔Ru?.:aBֺE#Gg'yXDuSWNJD)21ѵVagWPqȒ s?¶@g")s\T{f3go^w:^"{d#!φt},nyWFKv„X4|VB~,˘_&fjp/WԍwaO H 3I`u1ͤ+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_Wݚw)2#iTXtXML:com.adobe.xmp Adobe Fireworks CS5 11.0.0.484 Macintosh 2013-08-18T07:46:12Z 2013-08-18T07:46:39Z image/png  IDATxkOHۇ؉s,.fWK4O/9ݖO@\]3c9]E`!0f 3 `0C`!0f 3 `0C`!0f 3 `0C`!0f 3 `0C`!0f 3 `0C`!0f 3 `0C`!0f 3 `0C`!0f 3 `0C`!0f 3L*Ri( y,˔繊PY$9y<ϓ}_A(Z-q8UxLC,Kf3eYI{ʲsN܏LVV(DZ(R$hZ>MkH?Vy$m>r?:*H$QSQetp`m<ǷBtsNwwwZVL&JDPHVǍit(IʲLL&xh~ Qi`|5`Փ ^d0h06Sg#0x0 uxxXK`k=f]䕾??sJ5$^Y. ^(Z9 j"0x,k[?S<rH]7ym<[5ꪖ&eY*"u:oi6zZݍ@`lLv]Ñ 0x n)end (45ym쪽`n-~KeY[\sX~Y{V.//ZAʲǏ!o*BYi\j<ZALkCFQ=zFї/_ZyIXܚS7bZ,Z.*bsB^wqeOKT׺GEU $ѧO85cf&MSci<ϕ뵊x6Ky~SǦ? E`&2F#96!}UF9eY^g5i S}}I~U>v4kW]t:\\z:;;c1c)BQDGGG-j ~]ekXv4n;%I^09 ]^^*MSyjQc:<<ԯh[!0 ^5t}},䜓y\%]- @nWggg JHIDATxb)a,@pdDF&l AbLĘU!"d)DANB#4ѭ IENDB`dotclear-2.6.2+dfsg/admin/images/outgoing.png000066400000000000000000000017231230033266200211330ustar00rootroot00000000000000PNG  IHDR 2ϽtEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ꡖGIDATxb ` Yo߾Gsqq12aS@c"D !DH&ڍ, 6˗ Ͻ3ѲIENDB`dotclear-2.6.2+dfsg/admin/images/page_help.png000066400000000000000000000016671230033266200212330ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<4IDAT8_Leǿppp aga Jd0\=zy^x6ִ,eѶ-Z RMj۳{jmH_#v|!'O2RTYFQFKL3RRӴƋo*$G.JBf:PxwTJ$B0^{=:\~IwNݓmQB@lۆ7862CZr{_LvC ^æϹifnPYYpOY9=޼Uޚ1l7v}eHw"kj0RS)giiSuDZG5/$oyБRtB)Ujh bZ_!`Mh:.(;.i&S, C uovܒKW6ܹ\}aMNj_|BZ| k{擤m5 D8&sJqdN:N?~ár+W?1^c ׋ꕖF**ilSkZJ&F˹-*~(HzzktΜT۲'03${]U]^WXZ) IENDB`dotclear-2.6.2+dfsg/admin/images/pagination/000077500000000000000000000000001230033266200207205ustar00rootroot00000000000000dotclear-2.6.2+dfsg/admin/images/pagination/first.png000066400000000000000000000004101230033266200225500ustar00rootroot00000000000000PNG  IHDR v 9tEXtSoftwareAdobe ImageReadyqe<IDATxb`hM0<2HC@,ĕ˗/iP6 > @͎꙰8`>~\ x=M]&"rzx]q Ta Џ]+ttu@A{Tsj ,EdIENDB`dotclear-2.6.2+dfsg/admin/images/pagination/last.png000066400000000000000000000003661230033266200223760ustar00rootroot00000000000000PNG  IHDR v 9tEXtSoftwareAdobe ImageReadyqe<IDATxb`h LR\G ƕ˗75j~  *4z&,* P1  h@  '] H,Xl7@|X@@  v>b&,耤X51@`w'PB\IENDB`dotclear-2.6.2+dfsg/admin/images/pagination/next.png000066400000000000000000000003351230033266200224050ustar00rootroot00000000000000PNG  IHDR v 9tEXtSoftwareAdobe ImageReadyqe<IDATxb`hM0<22H͇r W._>$R@ < \qI\r僎O @ @:`8?@Ãh6p#?IENDB`dotclear-2.6.2+dfsg/admin/images/pagination/no-first.png000066400000000000000000000003711230033266200231700ustar00rootroot00000000000000PNG  IHDR v 9tEXtSoftwareAdobe ImageReadyqe<IDATxb`hMpӦM @5b '-iP6 > @͎꙰8`>~\ x=M]&"rzx]q Ta O @@Cjp0v'GIENDB`dotclear-2.6.2+dfsg/admin/images/pagination/no-last.png000066400000000000000000000003661230033266200230100ustar00rootroot00000000000000PNG  IHDR v 9tEXtSoftwareAdobe ImageReadyqe<IDATxb`hٴiS: >755j~  *4z&,* P1  h@  '] H,Xl7@|X@@  v>b&,耤X51@`'Pg"9IENDB`dotclear-2.6.2+dfsg/admin/images/pagination/no-next.png000066400000000000000000000003161230033266200230160ustar00rootroot00000000000000PNG  IHDR v 9tEXtSoftwareAdobe ImageReadyqe<pIDATxb`hMpӦM @j>[7$R@ < \CP\Hr  u@9PA|@64-#YIENDB`dotclear-2.6.2+dfsg/admin/images/pagination/no-previous.png000066400000000000000000000003201230033266200237070ustar00rootroot00000000000000PNG  IHDR v 9tEXtSoftwareAdobe ImageReadyqe<rIDATxb`hOrӦM@M[@@ @< fGl8`>T1=H9@@dUPW`\, Ҽu @0O+IENDB`dotclear-2.6.2+dfsg/admin/images/pagination/previous.png000066400000000000000000000003361230033266200233040ustar00rootroot00000000000000PNG  IHDR v 9tEXtSoftwareAdobe ImageReadyqe<IDATxb`hO2<2HC+/_@@ @< fGl8`>T1=H9@@dUPW`\, +W>2=X~@`#IENDB`dotclear-2.6.2+dfsg/admin/images/palette-traviata.png000066400000000000000000000136711230033266200225540ustar00rootroot00000000000000GIF89an{@@@```PPPppp000ᦫ NzŹ1"XbqwZ?owLմvl󠥫ڐ?cm1z屶˵ׅhʗ]{܄ޛ󪮳gnx鲲{MX#!{,n{{{{ {v^9`  @18(_}Ey$P` .*P,HHR b O AMARSS@vD2PMt"X Y  ''~3~MWɣ󡀽+:0skh W>%p51͂ ,[A{LSzryU ۗ ־H!@B WUvOvK`2`&.-v@ݵE)GS gX PPEshd^Cܔq ,`fnidmDU(@I`qĀVUS^A*F7XBK%z"^yL XLd܇EXG SxGHAPBg(`VR7_y $6H'枡@TOLe瘗a&H)Txafl4HBvɩ v rz1ʠL]ZґZxIjbG8bE`Fw$}J՞ €zd RR@rVXigi~|5o!3(JHBWPHy(TH*!vbҙ@Y)9@+fGT<Wzv*w糥#r;ͼGwFhF4$ҭ? 5v]Dá9pQ Іo/$dC4h։} (Ϥ͔vnc8?yJ(. ߊHe誢pʡU!_uW6߯U0@DpF&@@0^=r:䃀gg8U :RDl>Sh@'۪xRY T XPwt"X$7g*H><ԍwݓLua.feo{w3ʲ^Ed$l1J&cۃ2^-3Ѱ(JcOȜ6rj5"X"t$tQB.VAGIITz: ]@HW= X4yւVFS s긚S1dAL>(>ڛZVa͉ @=BC ##j($!F  %={_x~Zfܢ?Ox Y^@,-RُN9RzĪg:b=EZ0\ȩފ Ϝ#B0:jJ", i0@F8 aKj/"e}i6.H*MYpmҁSV75^-Qvīuœ)w|.]%"X$)*F23azdxMb*xbtD0@^ʜY.O]ԡX.YM]:P\s/пD焔ɲa4Z պv\bI3CƂVQ SMryA:ЍtKZͮvz xKMz|Kͯ~LN;'L [ΰ7{ 1|[+@(HA01x0  ȱqi`]<LB<`C*@*Ap0.{Y:p;h> ~(mPAL:>7dM!|aʘ:PF;юAe< Q7i (P;Ԩ>u @'+CqfMZӺA hт נb=30BMj S( zpH{ۍ.C |NPb8`&Hm4P.l~Z [, p/ gf;|J1?[^B00 (P_T!N9ЀP ̈́ [wo'L`ת؁ Nta tf{@  0Nuk ABup x TNvu C fvz A xNw (waˠNxf`؀xk@Nyp@yuۀx@Nzz zïN{`CcHvwl n[pەO)p (GwnAx.{jO~`_@ᲐׯlL\˂Ͽ;PrY4 nrPw7' }otWh&E >~Xg7p 7FC =*h9`fH 8j10}VD %0txw "ty 0u$xx u+up (0v2xz v9v` $0w@xt0 FGPR VW`b fgpr vw@~2~87~ 4`؈9(6@px1ȉ5 0~2 wx؊4 76 ЀX5p ;8m 8P0؏p xr : P玡b 7Hcc׏hd'(we@ǐfM@`yJيK $9O`*I, hx{ A9G xX|MُG 9Ƀ`XyW ~@pd piy`qnي!pqs9'rx)Ps}&sY#00?0 h٘ЖYB0 rp@ ` 9@ !و'ʼn`@y&ɉ#)H + uX /P$ v멒h 0 wixlП:J op ڏO n ʐNM%:S K/ڏc I@9zs NУ Bf zи`LZp XV `X~xj:* tڈ ޘإ0~z 8 zz@*`zz OБz #y_hzi /o(Pz8%pXl z m: (n $Ppjg ȦJq +h@*{ |9ỏX c P \`(! d`pp*Й姨4~ G`> :詙H ڴP+H`W{Y [˵絛a|c ekчk}m o 'tK{v xз~x ;Wpy{ ۸z{{|t U7Pu e׺v [uwKt 0ċqƋ ț!мΫr[ ;3Wps[Zн {g Spg|e Uч@}i [ߧLt [LG` Lu \籙Lv#{ %mМ\w,kE0}p(\x C`2\y HpÝ7å@AzFwɺ KLxκ PxӺ ULyغ ZyZ ^Lz czz֪ktTWsuzd׫{vtKf֌ xp\ zPl kt š|f 'tV¤h 1ʎ`îi ;<˨ĸ\kY lD *s hN ̍6|eX jͦ6@ ڼCA*w` Kx`] U:Ӣ ZvPӛM+1 |6 ; @ lE J O?B D-G I}L NQ SU WmZ \_.c- 3+g- 8{k- =o- Bs- Gkw L{\ `|۞< P `p G0;0|_p FPp pK@WP a= e i m- q} u y l } ͹  m  h ]Lj }H 8 ظ ( Ex- Mȹ1 U5 ]h9 e= mA uXE GI KNM OQ SU W>Y [] _޴a c~e gάi km onq su wy {^} % w ^7 p*x7 (4y#G $p=z` RШ>* ]p=  Qǭ -d Ӎ +i؍ 00nݍ /psy ,x }i .09} V^ R`ݧ^ Xݭ^ ]޳^ YP޹^ Q޿(. ^> % o?׻   ?Bpػ* ($@ػ88m $00Ap٫0pGp WPqWq #prgr' 05sws3 E`kpvpRp>~`0X`EO`]PLŀYS/ PQZ@^a϶P;pbkp G0v**cc08cfܟ9 F0BVp d\̀dhK Geid{D:jW.ց;dotclear-2.6.2+dfsg/admin/images/picker.png000066400000000000000000000004731230033266200205560ustar00rootroot00000000000000PNG  IHDR tEXtSoftwareAdobe ImageReadyqe<IDATxbdjTD, HQT3a1 Y `B3M"X>2p=@SEpn < OWZZXAS0V@VFHy vb߶"+3$AcM PH?@: )dZ@p)O  @QK;WIENDB`dotclear-2.6.2+dfsg/admin/images/plus-theme.png000066400000000000000000000006271230033266200213650ustar00rootroot00000000000000PNG  IHDR6 )NtEXtSoftwareAdobe ImageReadyqe<9IDATxV @Joy+ķ,Jp,r ޮ$#2;nu4# [6@dӪr>I!"m'r!|C~¥dH6Q‡;HAKlHM\-LŔCj**351x` EKBR)\1ScbkE|)4[rt̕3Q(:*%C׎nBᒞW*̭26UN2J$$jSc?alIl~,rj\ߠ[&' 1+G{kj6IENDB`dotclear-2.6.2+dfsg/admin/images/plus.png000066400000000000000000000003631230033266200202620ustar00rootroot00000000000000PNG  IHDRH-tEXtSoftwareAdobe ImageReadyqe<IDATxb-8DM Ppi*sRc\p@& [# i$a(`c1s瞡j`VЈ,v{LA!Kl{.LctllGf 1D`(,;8sIENDB`dotclear-2.6.2+dfsg/admin/images/scheduled.png000066400000000000000000000004501230033266200212340ustar00rootroot00000000000000PNG  IHDR Vu\tEXtSoftwareAdobe ImageReadyqe<IDATxbdr U `765w>q ~ *xU,5;5]`|,x7Ⱦhy$@ bH #TM=H1T&C,`5L8 ]@bd &Ѐgj@4CtMyT`4$lh~h"x?TM#Gj0R7fIENDB`dotclear-2.6.2+dfsg/admin/images/selected.png000066400000000000000000000004031230033266200210620ustar00rootroot00000000000000PNG  IHDR Vu\tEXtSoftwareAdobe ImageReadyqe<IDATxb`bA v7K0M scs#P0@1 |` ,b,.@|/ݸR_Cc#C6>dDs|)h746P_.0}ŕ6 Ƀ1u8_/M]1Pч/5J]8Zm"6|{dcS.΄6 ȃ,A48 ?Ɂ b @0>@WmbNwIENDB`dotclear-2.6.2+dfsg/admin/images/trackbacks.png000066400000000000000000000004621230033266200214070ustar00rootroot00000000000000PNG  IHDR/\tEXtSoftwareAdobe ImageReadyqe<IDATxb`HϫRxI DT[b a!BQ~!0x`aА ]&#5Gcz5@s%A@1]sXkh#,;6:DBRlPa(@ ޏ*# pE@"Gre (fH $qj`!g09,}IENDB`dotclear-2.6.2+dfsg/admin/images/trash.png000066400000000000000000000002501230033266200204130ustar00rootroot00000000000000PNG  IHDRH-tEXtSoftwareAdobe ImageReadyqe<JIDATxbd@D3`N1"l ȶl(HS14*1.>Ł34?: !&>IENDB`dotclear-2.6.2+dfsg/admin/images/up.png000066400000000000000000000003771230033266200177300ustar00rootroot00000000000000PNG  IHDRH-tEXtSoftwareAdobe ImageReadyqe<IDATxb`6Hϫ¸qhJR @l`bn#0bd# }bǙ:.$դf 6j`BS&|~Sp5@m#yN?Bڏ& L&k$,(IENDB`dotclear-2.6.2+dfsg/admin/index.php000066400000000000000000000311331230033266200171430ustar00rootroot00000000000000setUserDefaultBlog($core->auth->userID(),$core->blog->id); http::redirect('index.php'); } catch (Exception $e) { $core->error->add($e->getMessage()); } } dcPage::check('usage,contentadmin'); # Logout if (!empty($_GET['logout'])) { $core->session->destroy(); if (isset($_COOKIE['dc_admin'])) { unset($_COOKIE['dc_admin']); setcookie('dc_admin',false,-600,'','',DC_ADMIN_SSL); } http::redirect('auth.php'); exit; } # Plugin install $plugins_install = $core->plugins->installModules(); # Check dashboard module prefs $ws = $core->auth->user_prefs->addWorkspace('dashboard'); if (!$core->auth->user_prefs->dashboard->prefExists('doclinks')) { if (!$core->auth->user_prefs->dashboard->prefExists('doclinks',true)) { $core->auth->user_prefs->dashboard->put('doclinks',true,'boolean','',null,true); } $core->auth->user_prefs->dashboard->put('doclinks',true,'boolean'); } if (!$core->auth->user_prefs->dashboard->prefExists('dcnews')) { if (!$core->auth->user_prefs->dashboard->prefExists('dcnews',true)) { $core->auth->user_prefs->dashboard->put('dcnews',true,'boolean','',null,true); } $core->auth->user_prefs->dashboard->put('dcnews',true,'boolean'); } if (!$core->auth->user_prefs->dashboard->prefExists('quickentry')) { if (!$core->auth->user_prefs->dashboard->prefExists('quickentry',true)) { $core->auth->user_prefs->dashboard->put('quickentry',false,'boolean','',null,true); } $core->auth->user_prefs->dashboard->put('quickentry',false,'boolean'); } // Handle folded/unfolded sections in admin from user preferences $ws = $core->auth->user_prefs->addWorkspace('toggles'); if (!$core->auth->user_prefs->toggles->prefExists('unfolded_sections')) { $core->auth->user_prefs->toggles->put('unfolded_sections','','string','Folded sections in admin',null,true); } # Dashboard icons $__dashboard_icons = new ArrayObject(); $favs = $core->favs->getUserFavorites(); $core->favs->appendDashboardIcons($__dashboard_icons); # Check plugins and themes update from repository function dc_check_store_update($mod, $url, $img, $icon) { $repo = new dcStore($mod, $url); $upd = $repo->get(true); if (!empty($upd)) { $icon[0] .= '
    '.sprintf(__('An update is available', '%s updates are available.', count($upd)),count($upd)); $icon[1] .= '#update'; $icon[2] = 'images/menu/'.$img.'-b-update.png'; } } if (isset($__dashboard_icons['plugins'])) { dc_check_store_update($core->plugins, $core->blog->settings->system->store_plugin_url, 'plugins', $__dashboard_icons['plugins']); } if (isset($__dashboard_icons['blog_theme'])) { $themes = new dcThemes($core); $themes->loadModules($core->blog->themes_path, null); dc_check_store_update($themes, $core->blog->settings->system->store_theme_url, 'blog-theme', $__dashboard_icons['blog_theme']); } # Latest news for dashboard $__dashboard_items = new ArrayObject(array(new ArrayObject(),new ArrayObject())); $dashboardItem = 0; if ($core->auth->user_prefs->dashboard->dcnews) { try { if (empty($__resources['rss_news'])) { throw new Exception(); } $feed_reader = new feedReader; $feed_reader->setCacheDir(DC_TPL_CACHE); $feed_reader->setTimeout(2); $feed_reader->setUserAgent('Dotclear - http://www.dotclear.org/'); $feed = $feed_reader->parse($__resources['rss_news']); if ($feed) { $latest_news = '

    '.__('Dotclear news').'

    '; $i = 1; foreach ($feed->items as $item) { $dt = isset($item->link) ? ''. $item->title.' ' : $item->title; if ($i < 3) { $latest_news .= '
    '.$dt.'
    '. '

    '.dt::dt2str(__('%d %B %Y:'),$item->pubdate,'Europe/Paris').' '. ''.text::cutString(html::clean($item->content),120).'...

    '; } else { $latest_news .= '
    '.$dt.'
    '. '
    '.dt::dt2str(__('%d %B %Y:'),$item->pubdate,'Europe/Paris').'
    '; } $i++; if ($i > 2) { break; } } $latest_news .= '
    '; $__dashboard_items[$dashboardItem][] = $latest_news; $dashboardItem++; } } catch (Exception $e) {} } # Documentation links if ($core->auth->user_prefs->dashboard->doclinks) { if (!empty($__resources['doc'])) { $doc_links = '

    '.__('Documentation and support').'

      '; foreach ($__resources['doc'] as $k => $v) { $doc_links .= '
    • '.$k. '
    • '; } $doc_links .= '
    '; $__dashboard_items[$dashboardItem][] = $doc_links; $dashboardItem++; } } $core->callBehavior('adminDashboardItems', $core, $__dashboard_items); # Dashboard content $dashboardContents = ''; $__dashboard_contents = new ArrayObject(array(new ArrayObject,new ArrayObject)); $core->callBehavior('adminDashboardContents', $core, $__dashboard_contents); /* DISPLAY -------------------------------------------------------- */ dcPage::open(__('Dashboard'), dcPage::jsToolBar(). dcPage::jsLoad('js/_index.js'). # --BEHAVIOR-- adminDashboardHeaders $core->callBehavior('adminDashboardHeaders'), dcPage::breadcrumb( array( __('Dashboard').' : '.html::escapeHTML($core->blog->name) => '' ), array('home_link' =>false) ) ); # Dotclear updates notifications if ($core->auth->isSuperAdmin() && is_readable(DC_DIGESTS)) { $updater = new dcUpdate(DC_UPDATE_URL,'dotclear',DC_UPDATE_VERSION,DC_TPL_CACHE.'/versions'); $new_v = $updater->check(DC_VERSION); $version_info = $new_v ? $updater->getInfoURL() : ''; if ($updater->getNotify() && $new_v) { echo '

    '.sprintf(__('Dotclear %s is available!'),$new_v).'

    '. '

    '.sprintf(__('Upgrade now'),$new_v).' '. ''.__('Remind me later').''. ($version_info ? '

    '. '

    '.__('Information about this version').'' : '').'

    '. '
    '; } } if ($core->auth->getInfo('user_default_blog') != $core->blog->id && $core->auth->getBlogCount() > 1) { echo '

    '.__('Make this blog my default blog').'

    '; } if ($core->blog->status == 0) { echo '

    '.__('This blog is offline').'.

    '; } elseif ($core->blog->status == -1) { echo '

    '.__('This blog is removed').'.

    '; } if (!defined('DC_ADMIN_URL') || !DC_ADMIN_URL) { echo '

    '. sprintf(__('%s is not defined, you should edit your configuration file.'),'DC_ADMIN_URL'). ' '.__('See documentation for more information.'). '

    '; } if (!defined('DC_ADMIN_MAILFROM') || !DC_ADMIN_MAILFROM) { echo '

    '. sprintf(__('%s is not defined, you should edit your configuration file.'),'DC_ADMIN_MAILFROM'). ' '.__('See documentation for more information.'). '

    '; } $err = array(); # Check cache directory if ( $core->auth->isSuperAdmin() ) { if (!is_dir(DC_TPL_CACHE) || !is_writable(DC_TPL_CACHE)) { $err[] = '

    '.__("The cache directory does not exist or is not writable. You must create this directory with sufficient rights and affect this location to \"DC_TPL_CACHE\" in inc/config.php file.").'

    '; } } else { if (!is_dir(DC_TPL_CACHE) || !is_writable(DC_TPL_CACHE)) { $err[] = '

    '.__("The cache directory does not exist or is not writable. You should contact your administrator.").'

    '; } } # Check public directory if ( $core->auth->isSuperAdmin() ) { if (!is_dir($core->blog->public_path) || !is_writable($core->blog->public_path)) { $err[] = '

    '.__("There is no writable directory /public/ at the location set in about:config \"public_path\". You must create this directory with sufficient rights (or change this setting).").'

    '; } } else { if (!is_dir($core->blog->public_path) || !is_writable($core->blog->public_path)) { $err[] = '

    '.__("There is no writable root directory for the media manager. You should contact your administrator.").'

    '; } } # Error list if (count($err) > 0) { echo '

    '.__('Error:').'

    '. '
    • '.implode("
    • ",$err).'
    '; } # Plugins install messages if (!empty($plugins_install['success'])) { echo '
    '.__('Following plugins have been installed:').'
      '; foreach ($plugins_install['success'] as $k => $v) { echo '
    • '.$k.'
    • '; } echo '
    '; } if (!empty($plugins_install['failure'])) { echo '
    '.__('Following plugins have not been installed:').'
      '; foreach ($plugins_install['failure'] as $k => $v) { echo '
    • '.$k.' ('.$v.')
    • '; } echo '
    '; } # Errors modules notifications if ($core->auth->isSuperAdmin()) { $list = $core->plugins->getErrors(); if (!empty($list)) { echo '

    '.__('Errors have occured with following plugins:').'

    '. '
    • '.implode("
    • \n
    • ", $list).'
    '; } } # Dashboard columns (processed first, as we need to know the result before displaying the icons.) $dashboardItems = ''; foreach ($__dashboard_items as $i) { if ($i->count() > 0) { $dashboardItems .= ''; foreach ($i as $v) { $dashboardItems .= $v; } $dashboardItems .= ''; } } # Dashboard elements echo '
    '; # Dashboard icons echo '
    '; foreach ($__dashboard_icons as $i) { echo '

    '. '
    '.$i[0].'

    '; } echo '
    '; if ($core->auth->user_prefs->dashboard->quickentry) { if ($core->auth->check('usage,contentadmin',$core->blog->id)) { # Getting categories $categories_combo = dcAdminCombos::getCategoriesCombo( $core->blog->getCategories(array('post_type'=>'post')) ); echo '
    '. '

    '.__('Quick entry').'

    '. '
    '. '

    '.__('New entry').'

    '. '

    '. form::field('post_title',20,255,'','maximal'). '

    '. '

    '. form::textarea('post_content',50,10). '

    '. '

    '. form::combo('cat_id',$categories_combo).'

    '. ($core->auth->check('categories', $core->blog->id) ? '
    '. '

    '.__('Add a new category').'

    '. '

    '. form::field('new_cat_title',30,255,'','').'

    '. '

    '. form::combo('new_cat_parent',$categories_combo,'',''). '

    '. '

    '.__('This category will be created when you will save your post.').'

    '. '
    ' : ''). '

    '. ($core->auth->check('publish',$core->blog->id) ? '' : ''). $core->formNonce(). form::hidden('post_status',-2). form::hidden('post_format',$core->auth->getOption('post_format')). form::hidden('post_excerpt',''). form::hidden('post_lang',$core->auth->getInfo('user_lang')). form::hidden('post_notes',''). '

    '. '
    '. '
    '; } } foreach ($__dashboard_contents as $i) { if ($i->count() > 0) { $dashboardContents .= ''; foreach ($i as $v) { $dashboardContents .= $v; } $dashboardContents .= ''; } } if ($dashboardContents != '' || $dashboardItems != '') { echo '
    '. '
    '.$dashboardItems.$dashboardContents.'
    '. '
    '; } echo '
    '; #end dashboard-main dcPage::helpBlock('core_dashboard'); dcPage::close(); dotclear-2.6.2+dfsg/admin/install/000077500000000000000000000000001230033266200167705ustar00rootroot00000000000000dotclear-2.6.2+dfsg/admin/install/check.php000066400000000000000000000041531230033266200205610ustar00rootroot00000000000000driver() == 'mysql' || $con->driver() == 'mysqli') { if (version_compare($con->version(),'4.1','<')) { $err[] = sprintf(__('MySQL version is %s (4.1 or earlier needed).'),$con->version()); } else { $rs = $con->select('SHOW ENGINES'); $innodb = false; while ($rs->fetch()) { if (strtolower($rs->f(0)) == 'innodb' && strtolower($rs->f(1)) != 'disabled' && strtolower($rs->f(1)) != 'no') { $innodb = true; break; } } if (!$innodb) { $err[] = __('MySQL InnoDB engine is not available.'); } } } elseif ($con->driver() == 'pgsql') { if (version_compare($con->version(),'8.0','<')) { $err[] = sprintf(__('PostgreSQL version is %s (8.0 or earlier needed).'),$con->version()); } } return count($err) == 0; } dotclear-2.6.2+dfsg/admin/install/index.php000066400000000000000000000346541230033266200206240ustar00rootroot00000000000000'.__('Please set a master key (DC_MASTER_KEY) in configuration file.').'

    '; } # Check if dotclear is already installed $schema = dbSchema::init($core->con); if (in_array($core->prefix.'post',$schema->getTables())) { $can_install = false; $err = '

    '.__('Dotclear is already installed.').'

    '; } # Check system capabilites if (!dcSystemCheck($core->con,$_e)) { $can_install = false; $err = '

    '.__('Dotclear cannot be installed.').'

    • '.implode('
    • ',$_e).'
    '; } # Get information and perform install $u_email = $u_firstname = $u_name = $u_login = $u_pwd = ''; $mail_sent = false; if ($can_install && !empty($_POST)) { $u_email = !empty($_POST['u_email']) ? $_POST['u_email'] : null; $u_firstname = !empty($_POST['u_firstname']) ? $_POST['u_firstname'] : null; $u_name = !empty($_POST['u_name']) ? $_POST['u_name'] : null; $u_login = !empty($_POST['u_login']) ? $_POST['u_login'] : null; $u_pwd = !empty($_POST['u_pwd']) ? $_POST['u_pwd'] : null; $u_pwd2 = !empty($_POST['u_pwd2']) ? $_POST['u_pwd2'] : null; try { # Check user information if (empty($u_login)) { throw new Exception(__('No user ID given')); } if (!preg_match('/^[A-Za-z0-9@._-]{2,}$/',$u_login)) { throw new Exception(__('User ID must contain at least 2 characters using letters, numbers or symbols.')); } if ($u_email && !text::isEmail($u_email)) { throw new Exception(__('Invalid email address')); } if (empty($u_pwd)) { throw new Exception(__('No password given')); } if ($u_pwd != $u_pwd2) { throw new Exception(__("Passwords don't match")); } if (strlen($u_pwd) < 6) { throw new Exception(__('Password must contain at least 6 characters.')); } # Try to guess timezone $default_tz = 'Europe/London'; if (!empty($_POST['u_date']) && function_exists('timezone_open')) { if (preg_match('/\((.+)\)$/',$_POST['u_date'],$_tz)) { $_tz = $_tz[1]; $_tz = @timezone_open($_tz); if ($_tz instanceof DateTimeZone) { $_tz = @timezone_name_get($_tz); if ($_tz) { $default_tz = $_tz; } } unset($_tz); } } # Create schema $_s = new dbStruct($core->con,$core->prefix); require dirname(__FILE__).'/../../inc/dbschema/db-schema.php'; $si = new dbStruct($core->con,$core->prefix); $changes = $si->synchronize($_s); # Create user $cur = $core->con->openCursor($core->prefix.'user'); $cur->user_id = $u_login; $cur->user_super = 1; $cur->user_pwd = crypt::hmac(DC_MASTER_KEY,$u_pwd); $cur->user_name = (string) $u_name; $cur->user_firstname = (string) $u_firstname; $cur->user_email = (string) $u_email; $cur->user_lang = $dlang; $cur->user_tz = $default_tz; $cur->user_creadt = date('Y-m-d H:i:s'); $cur->user_upddt = date('Y-m-d H:i:s'); $cur->user_options = serialize($core->userDefaults()); $cur->insert(); $core->auth->checkUser($u_login); $admin_url = preg_replace('%install/index.php$%','',$_SERVER['REQUEST_URI']); $root_url = preg_replace('%/admin/install/index.php$%','',$_SERVER['REQUEST_URI']); # Create blog $cur = $core->con->openCursor($core->prefix.'blog'); $cur->blog_id = 'default'; $cur->blog_url = http::getHost().$root_url.'/index.php?'; $cur->blog_name = __('My first blog'); $core->addBlog($cur); $core->blogDefaults($cur->blog_id); $blog_settings = new dcSettings($core,'default'); $blog_settings->addNamespace('system'); $blog_settings->system->put('blog_timezone',$default_tz); $blog_settings->system->put('lang',$dlang); $blog_settings->system->put('public_url',$root_url.'/public'); $blog_settings->system->put('themes_url',$root_url.'/themes'); # date and time formats $formatDate = __('%A, %B %e %Y'); $date_formats = array('%Y-%m-%d','%m/%d/%Y','%d/%m/%Y','%Y/%m/%d','%d.%m.%Y','%b %e %Y','%e %b %Y','%Y %b %e', '%a, %Y-%m-%d','%a, %m/%d/%Y','%a, %d/%m/%Y','%a, %Y/%m/%d','%B %e, %Y','%e %B, %Y','%Y, %B %e','%e. %B %Y', '%A, %B %e, %Y','%A, %e %B, %Y','%A, %Y, %B %e','%A, %Y, %B %e','%A, %e. %B %Y'); $time_formats = array('%H:%M','%I:%M','%l:%M','%Hh%M','%Ih%M','%lh%M'); if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') { $formatDate = preg_replace('#(?system->put('date_format',$formatDate); $blog_settings->system->put('date_formats',serialize($date_formats),'string','Date formats examples',true,true); $blog_settings->system->put('time_formats',serialize($time_formats),'string','Time formats examples',true,true); # Add repository URL for themes and plugins $blog_settings->system->put('store_plugin_url','http://update.dotaddict.org/dc2/plugins.xml','string','Plugins XML feed location',true,true); $blog_settings->system->put('store_theme_url','http://update.dotaddict.org/dc2/themes.xml','string','Themes XML feed location',true,true); # Add Dotclear version $cur = $core->con->openCursor($core->prefix.'version'); $cur->module = 'core'; $cur->version = (string) DC_VERSION; $cur->insert(); # Create first post $core->setBlog('default'); $cur = $core->con->openCursor($core->prefix.'post'); $cur->user_id = $u_login; $cur->post_format = 'xhtml'; $cur->post_lang = $dlang; $cur->post_title = __('Welcome to Dotclear!'); $cur->post_content = '

    '.__('This is your first entry. When you\'re ready '. 'to blog, log in to edit or delete it.').'

    '; $cur->post_content_xhtml = $cur->post_content; $cur->post_status = 1; $cur->post_open_comment = 1; $cur->post_open_tb = 0; $post_id = $core->blog->addPost($cur); # Add a comment to it $cur = $core->con->openCursor($core->prefix.'comment'); $cur->post_id = $post_id; $cur->comment_tz = $default_tz; $cur->comment_author = __('Dotclear Team'); $cur->comment_email = 'contact@dotclear.net'; $cur->comment_site = 'http://www.dotclear.org/'; $cur->comment_content = __("

    This is a comment.

    \n

    To delete it, log in and ". "view your blog's comments. Then you might remove or edit it.

    "); $core->blog->addComment($cur); # Plugins initialization define('DC_CONTEXT_ADMIN',true); $core->plugins->loadModules(DC_PLUGINS_ROOT); $plugins_install = $core->plugins->installModules(); # Add dashboard module options $core->auth->user_prefs->addWorkspace('dashboard'); $core->auth->user_prefs->dashboard->put('doclinks',true,'boolean','',null,true); $core->auth->user_prefs->dashboard->put('dcnews',true,'boolean','',null,true); $core->auth->user_prefs->dashboard->put('quickentry',true,'boolean','',null,true); # Add accessibility options $core->auth->user_prefs->addWorkspace('accessibility'); $core->auth->user_prefs->accessibility->put('nodragdrop',false,'boolean','',null,true); # Add user interface options $core->auth->user_prefs->addWorkspace('interface'); $core->auth->user_prefs->interface->put('enhanceduploader',true,'boolean','',null,true); # Add default favorites $core->favs = new dcFavorites($core); $init_favs = array('posts','new_post','newpage','comments','categories','media','blog_theme','widgets','simpleMenu','prefs','help'); $core->favs->setFavoriteIDs($init_favs,true); $step = 1; } catch (Exception $e) { $err = $e->getMessage(); } } if (!isset($step)) { $step = 0; } header('Content-Type: text/html; charset=UTF-8'); ?> <?php echo __('Dotclear Install'); ?>
    '.__('Dotclear installation').''. '
    '; if (!is_writable(DC_TPL_CACHE)) { echo '

    '.sprintf(__('Cache directory %s is not writable.'),DC_TPL_CACHE).'

    '; } if ($can_install && !empty($err)) { echo '

    '.__('Errors:').'

    '.$err.'
    '; } if (!empty($_GET['wiz'])) { echo '

    '.__('Configuration file has been successfully created.').'

    '; } if ($can_install && $step == 0) { echo '

    '.__('User information').'

    '. '

    '.__('Please provide the following information needed to create the first user.').'

    '. '
    '. '
    '.__('User information').''. '

    '. form::field('u_firstname',30,255,html::escapeHTML($u_firstname)).'

    '. '

    '. form::field('u_name',30,255,html::escapeHTML($u_name)).'

    '. '

    '. form::field('u_email',30,255,html::escapeHTML($u_email)).'

    '. '
    '. '
    '.__('Username and password').''. '

    '. '
    '. '

    '. ''. form::password('u_pwd',30,255,'','','',false,' data-indicator="pwindicator" '). '

    '. '
    '. '
    '. '

    '. '
    '. '
    '. '

    '. '
    '. '

    '. '
    '; } elseif ($can_install && $step == 1) { # Plugins install messages $plugins_install_result = ''; if (!empty($plugins_install['success'])) { $plugins_install_result .= '
    '.__('Following plugins have been installed:').'
      '; foreach ($plugins_install['success'] as $k => $v) { $plugins_install_result .= '
    • '.$k.'
    • '; } $plugins_install_result .= '
    '; } if (!empty($plugins_install['failure'])) { $plugins_install_result .= '
    '.__('Following plugins have not been installed:').'
      '; foreach ($plugins_install['failure'] as $k => $v) { $plugins_install_result .= '
    • '.$k.' ('.$v.')
    • '; } $plugins_install_result .= '
    '; } echo '

    '.__('All done!').'

    '. $plugins_install_result. '

    '.__('Dotclear has been successfully installed. Here is some useful information you should keep.').'

    '. '

    '.__('Your account').'

    '. '
      '. '
    • '.__('Username:').' '.html::escapeHTML($u_login).'
    • '. '
    • '.__('Password:').' '.html::escapeHTML($u_pwd).'
    • '. '
    '. '

    '.__('Your blog').'

    '. '
      '. '
    • '.__('Blog address:').' '.html::escapeHTML(http::getHost().$root_url).'/index.php?
    • '. '
    • '.__('Administration interface:').' '.html::escapeHTML(http::getHost().$admin_url).'
    • '. '
    '. '
    '. '

    '. form::hidden(array('user_id'),html::escapeHTML($u_login)). form::hidden(array('user_pwd'),html::escapeHTML($u_pwd)). '

    '. '
    '; } elseif (!$can_install) { echo '

    '.__('Installation can not be completed').'

    '. '

    '.__('Errors:').'

    '.$err.'
    '. '

    '.__('For the said reasons, Dotclear can not be installed. '. 'Please refer to '. 'the documentation to learn how to correct the problem.').'

    '; } ?>
    dotclear-2.6.2+dfsg/admin/install/wizard.php000066400000000000000000000165561230033266200210160ustar00rootroot00000000000000'.sprintf(__('Path %s is not writable.'),path::real(dirname(DC_RC_PATH))).'

    '. '

    '.__('Dotclear installation wizard could not create configuration file for you. '. 'You must change folder right or create the config.php '. 'file manually, please refer to '. ''. 'the documentation to learn how to do this.').'

    '; } $DBDRIVER = !empty($_POST['DBDRIVER']) ? $_POST['DBDRIVER'] : (function_exists('mysqli_connect') ? 'mysqli' : 'mysql'); $DBHOST = !empty($_POST['DBHOST']) ? $_POST['DBHOST'] : ''; $DBNAME = !empty($_POST['DBNAME']) ? $_POST['DBNAME'] : ''; $DBUSER = !empty($_POST['DBUSER']) ? $_POST['DBUSER'] : ''; $DBPASSWORD = !empty($_POST['DBPASSWORD']) ? $_POST['DBPASSWORD'] : ''; $DBPREFIX = !empty($_POST['DBPREFIX']) ? $_POST['DBPREFIX'] : 'dc_'; if (!empty($_POST)) { try { # Tries to connect to database try { $con = dbLayer::init($DBDRIVER,$DBHOST,$DBNAME,$DBUSER,$DBPASSWORD); } catch (Exception $e) { throw new Exception('

    ' . __($e->getMessage()) . '

    '); } # Checks system capabilites require dirname(__FILE__).'/check.php'; if (!dcSystemCheck($con,$_e)) { $can_install = false; throw new Exception('

    '.__('Dotclear cannot be installed.').'

    • '.implode('
    • ',$_e).'
    '); } # Check if dotclear is already installed $schema = dbSchema::init($con); if (in_array($DBPREFIX.'version',$schema->getTables())) { throw new Exception(__('Dotclear is already installed.')); } # Does config.php.in exist? $config_in = dirname(__FILE__).'/../../inc/config.php.in'; if (!is_file($config_in)) { throw new Exception(sprintf(__('File %s does not exist.'),$config_in)); } # Can we write config.php if (!is_writable(dirname(DC_RC_PATH))) { throw new Exception(sprintf(__('Cannot write %s file.'),DC_RC_PATH)); } # Creates config.php file $full_conf = file_get_contents($config_in); writeConfigValue('DC_DBDRIVER',$DBDRIVER,$full_conf); writeConfigValue('DC_DBHOST',$DBHOST,$full_conf); writeConfigValue('DC_DBUSER',$DBUSER,$full_conf); writeConfigValue('DC_DBPASSWORD',$DBPASSWORD,$full_conf); writeConfigValue('DC_DBNAME',$DBNAME,$full_conf); writeConfigValue('DC_DBPREFIX',$DBPREFIX,$full_conf); $admin_url = preg_replace('%install/wizard.php$%','',$_SERVER['REQUEST_URI']); writeConfigValue('DC_ADMIN_URL',http::getHost().$admin_url,$full_conf); writeConfigValue('DC_ADMIN_MAILFROM','dotclear@'.$_SERVER['HTTP_HOST'],$full_conf); writeConfigValue('DC_MASTER_KEY',md5(uniqid()),$full_conf); $fp = @fopen(DC_RC_PATH,'wb'); if ($fp === false) { throw new Exception(sprintf(__('Cannot write %s file.'),DC_RC_PATH)); } fwrite($fp,$full_conf); fclose($fp); chmod(DC_RC_PATH, 0666); $con->close(); http::redirect('index.php?wiz=1'); } catch (Exception $e) { $err = $e->getMessage(); } } function writeConfigValue($name,$val,&$str) { $val = str_replace("'","\'",$val); $str = preg_replace('/(\''.$name.'\')(.*?)$/ms','$1,\''.$val.'\');',$str); } header('Content-Type: text/html; charset=UTF-8'); ?> <?php echo __('Dotclear installation wizard'); ?>
    '.__('Dotclear installation wizard').''. '
    '; if (!empty($err)) { echo '

    '.__('Errors:').'

    '.$err.'
    '; } else { echo '

    '.__('Welcome').'

    '. '

    '.__('To complete your Dotclear installation and start writing on your blog, '. 'we just need to know how to access your database and who you are. '. 'Just fill this two steps wizard with this information and we will be done.').'

    '. '

    '.__('Attention:').' '. __('this wizard may not function on every host. If it does not work for you, '. 'please refer to '. 'the documentation to learn how to create the config.php '. 'file manually.').'

    '; } echo '

    '.__('System information').'

    '. '

    '.__('Please provide the following information needed to create your configuration file.').'

    '. '
    '. '

    '. form::combo('DBDRIVER',array(__('MySQL (deprecated)')=>'mysql',__('MySQLi')=>'mysqli',__('PostgreSQL')=>'pgsql'),$DBDRIVER).'

    '. '

    '. form::field('DBHOST',30,255,html::escapeHTML($DBHOST)).'

    '. '

    '. form::field('DBNAME',30,255,html::escapeHTML($DBNAME)).'

    '. '

    '. form::field('DBUSER',30,255,html::escapeHTML($DBUSER)).'

    '. '

    '. form::password('DBPASSWORD',30,255).'

    '. '

    '. form::field('DBPREFIX',30,255,html::escapeHTML($DBPREFIX)).'

    '. '

    '. '
    '; ?>
    dotclear-2.6.2+dfsg/admin/js/000077500000000000000000000000001230033266200157365ustar00rootroot00000000000000dotclear-2.6.2+dfsg/admin/js/_blog_pref.js000066400000000000000000000017121230033266200203730ustar00rootroot00000000000000function checkQueryString() { var blogUrl = $('#blog_url')[0].value; var urlScan = $('#url_scan')[0].value; errorMsg = ''; if (/.*[^\/]$/.exec(blogUrl) && urlScan=='path_info') { errorMsg = dotclear.msg.warning_path_info; } else if (/.*[^\?]$/.exec(blogUrl) && urlScan=='query_string') { errorMsg = dotclear.msg.warning_query_string; } $("p#urlwarning").remove(); if (errorMsg != '') { $("#blog_url").parents('p').after('

    '+errorMsg+'

    '); } } $(function() { if( $('#blog_url').length > 0 ) { checkQueryString(); $('#blog_url').focusout(checkQueryString); $('body').on('change','#url_scan',checkQueryString); } $('#date_format_select,#time_format_select').change(function() { if ($(this).prop('value') == '') { return; } $('#'+$(this).attr('id').replace('_select','')).prop('value', $(this).prop('value')); $(this).parent().next('.chosen').html($(this).find(':selected').prop('label')); }); }); dotclear-2.6.2+dfsg/admin/js/_blog_theme.js000066400000000000000000000041451230033266200205440ustar00rootroot00000000000000$(function() { // expend theme info $('.module-sshot').not('.current-theme .module-sshot').each(function(){ var bar = $('
    ').addClass('bloc-toggler'); $(this).after( $(bar).toggleWithLegend($(this).parent().children('.toggle-bloc'),{ img_on_src: dotclear.img_plus_theme_src, img_on_alt: dotclear.img_plus_theme_alt, img_off_src: dotclear.img_minus_theme_src, img_off_alt: dotclear.img_minus_theme_alt, legend_click: true })); $(this).children('img').click(function(){ $(this).parent().parent().children('.bloc-toggler').click(); }); }); // dirty short search blocker $('div.modules-search form input[type=submit]').click(function(){ var mlen = $('input[name=m_search]',$(this).parent()).val(); if (mlen.length > 2){return true;}else{return false;} }); // checkboxes selection $('.checkboxes-helpers').each(function() { dotclear.checkboxesHelpers(this); }); // actions tests $('.modules-form-actions').each(function(){ var rxActionType = /^[^\[]+/; var rxActionValue = /([^\[]+)\]$/; var checkboxes = $(this).find('input[type=checkbox]'); // check if submit is a global action or one line action $("input[type=submit]",this).click(function() { var keyword = $(this).attr('name'); var maction = keyword.match(rxActionType); var action = maction[0]; var mvalues = keyword.match(rxActionValue); // action on multiple modules if (!mvalues) { var checked = false; // check if there is checkboxes in form if(checkboxes.length > 0) { // check if there is at least one checkbox checked $(checkboxes).each(function() { if (this.checked) { checked = true; } }); if (!checked) { //alert(dotclear.msg.no_selection); return false; } } // confirm delete if (action == 'delete') { return window.confirm(dotclear.msg.confirm_delete_themes); } // action on one module }else { var module = mvalues[1]; // confirm delete if (action == 'delete') { return window.confirm(dotclear.msg.confirm_delete_theme.replace('%s',module)); } } return true; }); }); }); dotclear-2.6.2+dfsg/admin/js/_categories.js000066400000000000000000000014471230033266200205660ustar00rootroot00000000000000$(function() { if ($.fn['nestedSortable']!==undefined) { $('#categories ul li').css('cursor','move'); $('#save-set-order').prop('disabled',true).addClass('disabled'); $('#categories ul').nestedSortable({ listType: 'ul', items: 'li', placeholder: 'placeholder', update: function() { $('#categories_order').attr('value',JSON.stringify($('#categories ul').nestedSortable('toArray'))); $('#save-set-order').prop('disabled',false).removeClass('disabled'); } }); } $('input[name^="delete"]').click(function() { return window.confirm(dotclear.msg.confirm_delete_category.replace('%s',$(this).parents('li').first().find('.cat-title label a').text())); }); $('input[name="reset"]').click(function() { return window.confirm(dotclear.msg.confirm_reorder_categories); }); }); dotclear-2.6.2+dfsg/admin/js/_category.js000066400000000000000000000002171230033266200202500ustar00rootroot00000000000000$(function() { dotclear.hideLockable(); var tbCategory = new jsToolBar(document.getElementById('cat_desc')); tbCategory.draw('xhtml'); }); dotclear-2.6.2+dfsg/admin/js/_comment.js000066400000000000000000000004451230033266200201000ustar00rootroot00000000000000$(function() { if (!document.getElementById) { return; } var tbComment = new jsToolBar(document.getElementById('comment_content')); tbComment.draw('xhtml'); $('#comment-form input[name="delete"]').click(function() { return window.confirm(dotclear.msg.confirm_delete_comment); }); }); dotclear-2.6.2+dfsg/admin/js/_comments.js000066400000000000000000000043711230033266200202650ustar00rootroot00000000000000dotclear.viewCommentContent = function(line,action) { var action = action || 'toggle'; var commentId = $(line).attr('id').substr(1); var tr = document.getElementById('ce'+commentId); if ( !tr && ( action == 'toggle' || action == 'open' ) ) { tr = document.createElement('tr'); tr.id = 'ce'+commentId; var td = document.createElement('td'); td.colSpan = 6; td.className = 'expand'; tr.appendChild(td); // Get comment content $.get('services.php',{f:'getCommentById',id: commentId},function(data) { var rsp = $(data).children('rsp')[0]; if (rsp.attributes[0].value == 'ok') { var comment = $(rsp).find('comment_display_content').text(); if (comment) { $(td).append(comment); var comment_email = $(rsp).find('comment_email').text(); var comment_site = $(rsp).find('comment_site').text(); var comment_ip = $(rsp).find('comment_ip').text(); var comment_spam_disp = $(rsp).find('comment_spam_disp').text(); $(td).append('

    ' + dotclear.msg.website + ' ' + comment_site + '
    ' + '' + dotclear.msg.email + ' ' + comment_email + '
    ' + '' + dotclear.msg.ip_address + ' ' + comment_ip + '' + '
    ' + comment_spam_disp + '

    '); } } else { alert($(rsp).find('message').text()); } }); $(line).toggleClass('expand'); line.parentNode.insertBefore(tr,line.nextSibling); } else if (tr && tr.style.display == 'none' && ( action == 'toggle' || action == 'open' ) ) { $(tr).css('display', 'table-row'); $(line).addClass('expand'); } else if (tr && tr.style.display != 'none' && ( action == 'toggle' || action == 'close' ) ) { $(tr).css('display', 'none'); $(line).removeClass('expand'); } }; $(function() { $.expandContent({ line:$('#form-comments tr:not(.line)'), lines:$('#form-comments tr.line'), callback:dotclear.viewCommentContent }); $('.checkboxes-helpers').each(function() { dotclear.checkboxesHelpers(this); }); $('#form-comments td input[type=checkbox]').enableShiftClick(); dotclear.commentsActionsHelper(); $('form input[type=submit][name=delete_all_spam]').click(function(){ return window.confirm(dotclear.msg.confirm_spam_delete); }); }); dotclear-2.6.2+dfsg/admin/js/_index.js000066400000000000000000000045701230033266200175500ustar00rootroot00000000000000$(function() { var f = $('#quick-entry'); if (f.length > 0) { var contentTb = new jsToolBar($('#post_content',f)[0]); contentTb.switchMode($('#post_format',f).val()); $('input[name=save]',f).click(function() { quickPost(f,-2); return false; }); if ($('input[name=save-publish]',f).length > 0) { var btn = $(''); $('input[name=save-publish]',f).remove(); $('input[name=save]',f).after(btn).after(' '); btn.click(function() { quickPost(f,1); return false; }); } function quickPost(f,status) { if (contentTb.getMode() == 'wysiwyg') { contentTb.syncContents('iframe'); } var params = { f: 'quickPost', xd_check: dotclear.nonce, post_title: $('#post_title',f).val(), post_content: $('#post_content',f).val(), cat_id: $('#cat_id',f).val(), post_status: status, post_format: $('#post_format',f).val(), post_lang: $('#post_lang',f).val(), new_cat_title: $('#new_cat_title',f).val(), new_cat_parent: $('#new_cat_parent',f).val() } $('p.qinfo',f).remove(); $.post('services.php',params,function(data) { if ($('rsp[status=failed]',data).length > 0) { var msg = '

    ' + dotclear.msg.error + ' ' + $('rsp',data).text() + '

    '; } else { var msg = '

    ' + dotclear.msg.entry_created + ' - ' + dotclear.msg.edit_entry + ''; if ($('rsp>post',data).attr('post_status') == 1) { msg += ' - ' + dotclear.msg.view_entry + ''; } msg += '

    '; $('#post_title',f).val(''); $('#post_content',f).val(''); if (contentTb.getMode() == 'wysiwyg') { contentTb.syncContents('textarea'); } $('#cat_id',f).val('0'); $('#new_cat_title',f).val(''); $('#new_cat_parent',f).val('0'); } $('fieldset',f).prepend(msg); }); } $('#new_cat').toggleWithLegend($('#new_cat').parent().children().not('#new_cat'), { // no cookie on new category as we don't use this every day legend_click: true }); } // allow to hide quick entry div, and remember choice $('#quick h3').toggleWithLegend($('#quick').children().not('h3'),{ legend_click: true, user_pref: 'dcx_quick_entry' }); }); dotclear-2.6.2+dfsg/admin/js/_langs.js000066400000000000000000000003671230033266200175450ustar00rootroot00000000000000$(function() { $('table.plugins form input[type=submit][name=delete]').click(function() { var l_name = $(this).parents('tr.line').find('td:first').text(); return window.confirm(dotclear.msg.confirm_delete_lang.replace('%s',l_name)); }); }); dotclear-2.6.2+dfsg/admin/js/_media.js000066400000000000000000000137411230033266200175200ustar00rootroot00000000000000(function($) { $.fn.enhancedUploader = function() { return this.each(function() { var me = $(this); function enableButton(button) { button.prop('disabled',false).removeClass('disabled'); } function disableButton(button) { button.prop('disabled',true).addClass('disabled'); } function displayMessageInQueue(n) { var msg = ''; if (n==1) { msg = dotclear.jsUpload.msg.file_in_queue; } else if (n>1) { msg = dotclear.jsUpload.msg.files_in_queue; msg = msg.replace(/%d/,n); } else { msg = dotclear.jsUpload.msg.no_file_in_queue; } $('.queue-message',me).html(msg); } $('.button.choose_files').click(function(e) { // Use the native click() of the file input. $('#upfile').click(); e.preventDefault(); }); $('.button.cancel', '#fileupload .fileupload-buttonbar').click(function(e) { $('.button.cancel','#fileupload .fileupload-buttonbar').hide(); disableButton($('.button.start','#fileupload .fileupload-buttonbar')); displayMessageInQueue(0); }); $(me).on('click','.cancel',function(e) { if ($('.fileupload-ctrl .files .template-upload', me).length==0) { $('.button.cancel','#fileupload .fileupload-buttonbar').hide(); disableButton($('.button.start','#fileupload .fileupload-buttonbar')); } displayMessageInQueue($('.files .template-upload',me).length); }); $('.button.clean', me).click(function(e) { $('.fileupload-ctrl .files .template-download', me).slideUp(500, function() { $(this).remove(); }); $(this).hide(); e.preventDefault(); }); $(me).fileupload({ url: $(me).attr('action'), autoUpload: false, sequentialUploads: true, uploadTemplateId: null, downloadTemplateId: null, uploadTemplate: template_upload, downloadTemplate: template_download }).bind('fileuploadadd', function(e, data) { $('.button.cancel','#fileupload .fileupload-buttonbar').show(); enableButton($('.button.start','#fileupload .fileupload-buttonbar')); }).bind('fileuploadadded', function(e, data) { displayMessageInQueue($('.files .template-upload',me).length); }).bind('fileuploaddone', function(e, data) { if (data.result.files[0].html !==undefined) { $('.media-list .files-group').append(data.result.files[0].html); $('#form-medias .hide').removeClass('hide'); } $('.button.clean',me).show(); }).bind('fileuploadalways', function(e, data) { displayMessageInQueue($('.files .template-upload',me).length); if ($('.fileupload-ctrl .files .template-upload',me).length==0) { $('.button.cancel','#fileupload .fileupload-buttonbar').hide(); disableButton($('.button.start','#fileupload .fileupload-buttonbar')); } }); var $container = $(me).parent(); var $msg,label; if ($container.hasClass('enhanced_uploader')) { $msg = dotclear.msg.enhanced_uploader_disable; label = dotclear.jsUpload.msg.choose_files; $(me).fileupload({disabled:false}); displayMessageInQueue(0); disableButton($('.button.start','#fileupload .fileupload-buttonbar')); } else { $msg = dotclear.msg.enhanced_uploader_activate; label = dotclear.jsUpload.msg.choose_file; } $('

    ' + $msg + '

    ').click(function(e) { if ($container.hasClass('enhanced_uploader')) { $msg = dotclear.msg.enhanced_uploader_activate; label = dotclear.jsUpload.msg.choose_file; $('#upfile').attr('multiple', false); enableButton($('.button.start','#fileupload .fileupload-buttonbar')); // when a user has clicked enhanced_uploader, and has added files // We must remove files in table $('.files .upload-file', me).remove(); $('.button.cancel,.button.clean','#fileupload .fileupload-buttonbar').hide(); $(me).fileupload({disabled:true}); $('.queue-message',me).html('').hide(); } else { $msg = dotclear.msg.enhanced_uploader_disable; label = dotclear.jsUpload.msg.choose_files; $('#upfile').attr('multiple', true); var startButton = $('.button.start','#fileupload .fileupload-buttonbar'); disableButton(startButton); startButton.show(); $(me).fileupload({disabled:false}); $('.queue-message',me).show(); displayMessageInQueue(0); } $(this).find('a').text($msg); $('.add-label', me).text(label); $container.toggleClass('enhanced_uploader'); e.preventDefault(); }).appendTo(me); }); }; })(jQuery); $(function() { $('#fileupload').enhancedUploader(); $('.checkboxes-helpers').each(function() { dotclear.checkboxesHelpers(this); }); $('#form-medias').submit(function() { var count_checked = $('input[name="medias[]"]:checked', $(this)).length; if (count_checked==0) { return false; } return window.confirm(dotclear.msg.confirm_delete_medias.replace('%d',count_checked)); }); // attach media $('#form-medias').on('click', '.media-item .attach-media', function(e) { var parts = $(this).prop('href').split('?'); var str_params = parts[1].split('&'); var postData = {}; for (var n=0;n
    '; } # Empty remove form (for javascript actions) echo ''; if ($core_media_writable || $core_media_archivable) { echo ''; } if (!$popup) { echo '

    '.sprintf(__('Current settings for medias and images are defined in %s'), ''.__('Blog parameters').'').'

    '; } call_user_func($close_f); /* ----------------------------------------------------- */ function mediaItemLine($f,$i) { global $core, $page_url, $popup, $post_id; $fname = $f->basename; $class = 'media-item media-col-'.($i%2); if ($f->d) { $link = html::escapeURL($page_url).'&d='.html::sanitizeURL($f->relname); if ($f->parent) { $fname = '..'; $class .= ' media-folder-up'; } else { $class .= ' media-folder'; } } else { $link = 'media_item.php?id='.$f->media_id.'&popup='.$popup.'&post_id='.$post_id; } $maxchars = 36; if (strlen($fname) > $maxchars) { $fname = substr($fname, 0, $maxchars-4).'...'.($f->d ? '' : files::getExtension($fname)); } $res = '

    '. ''.$fname.'

    '; $lst = ''; if (!$f->d) { $lst .= '
  • '.$f->media_title.'
  • '. '
  • '. $f->media_dtstr.' - '. files::size($f->size).' - '. ''.__('open').''. '
  • '; } $act = ''; if ($post_id && !$f->d) { $act .= ''. ''.__('Attach this file to entry').''. ''; } if ($popup && !$f->d) { $act .= ''.__('Insert this file into entry').' '; } if ($f->del) { if (!$popup && !$f->d) { $act .= form::checkbox(array('medias[]', 'media_'.rawurlencode($f->basename)),rawurlencode($f->basename)); } else { $act .= ''. ''.__('Delete').''; } } $lst .= ($act != '' ? '
  •  '.$act.'
  • ' : ''); if ($f->type == 'audio/mpeg3') { $lst .= '
  • '.dcMedia::mp3player($f->file_url,'index.php?pf=player_mp3.swf').'
  • '; } $res .= ($lst != '' ? '
      '.$lst.'
    ' : ''); $res .= '
    '; return $res; } dotclear-2.6.2+dfsg/admin/media_item.php000066400000000000000000000521601230033266200201340ustar00rootroot00000000000000blog->getPosts(array('post_id'=>$post_id)); if ($post->isEmpty()) { $post_id = null; } $post_title = $post->post_title; unset($post); } $file = null; $popup = (integer) !empty($_GET['popup']); $page_url = 'media_item.php?popup='.$popup.'&post_id='.$post_id; $media_page_url = 'media.php?popup='.$popup.'&post_id='.$post_id; $id = !empty($_REQUEST['id']) ? (integer) $_REQUEST['id'] : ''; if ($popup) { $open_f = array('dcPage','openPopup'); $close_f = array('dcPage','closePopup'); } else { $open_f = array('dcPage','open'); $close_f = create_function('',"dcPage::helpBlock('core_media'); dcPage::close();"); } $core_media_writable = false; try { $core->media = new dcMedia($core); if ($id) { $file = $core->media->getFile($id); } if ($file === null) { throw new Exception(__('Not a valid file')); } $core->media->chdir(dirname($file->relname)); $core_media_writable = $core->media->writable(); # Prepare directories combo box $dirs_combo = array(); foreach ($core->media->getDBDirs() as $v) { $dirs_combo['/'.$v] = $v; } # Add parent and direct childs directories if any $core->media->getFSDir(); foreach ($core->media->dir['dirs'] as $k => $v) { $dirs_combo['/'.$v->relname] = $v->relname; } ksort($dirs_combo); } catch (Exception $e) { $core->error->add($e->getMessage()); } # Upload a new file if ($file && !empty($_FILES['upfile']) && $file->editable && $core_media_writable) { try { files::uploadStatus($_FILES['upfile']); $core->media->uploadFile($_FILES['upfile']['tmp_name'],$file->basename,null,false,true); dcPage::addSuccessNotice(__('File has been successfully updated.')); http::redirect($page_url.'&id='.$id); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Update file if ($file && !empty($_POST['media_file']) && $file->editable && $core_media_writable) { $newFile = clone $file; $newFile->basename = $_POST['media_file']; if ($_POST['media_path']) { $newFile->dir = $_POST['media_path']; $newFile->relname = $_POST['media_path'].'/'.$newFile->basename; } else { $newFile->dir = ''; $newFile->relname = $newFile->basename; } $newFile->media_title = $_POST['media_title']; $newFile->media_dt = strtotime($_POST['media_dt']); $newFile->media_dtstr = $_POST['media_dt']; $newFile->media_priv = !empty($_POST['media_private']); try { $core->media->updateFile($file,$newFile); dcPage::addSuccessNotice(__('File has been successfully updated.')); http::redirect($page_url.'&id='.$id.'&tab=media-details-tab'); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Update thumbnails if (!empty($_POST['thumbs']) && $file->media_type == 'image' && $file->editable && $core_media_writable) { try { $foo = null; $core->media->mediaFireRecreateEvent($file); dcPage::addSuccessNotice(__('Thumbnails have been successfully updated.')); http::redirect($page_url.'&id='.$id.'&tab=media-details-tab'); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Unzip file if (!empty($_POST['unzip']) && $file->type == 'application/zip' && $file->editable && $core_media_writable) { try { $unzip_dir = $core->media->inflateZipFile($file,$_POST['inflate_mode'] == 'new'); dcPage::addSuccessNotice(__('Zip file has been successfully extracted.')); http::redirect($media_page_url.'&d='.$unzip_dir); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Save media insertion settings for the blog if (!empty($_POST['save_blog_prefs'])) { if (!empty($_POST['pref_src'])) { foreach (array_reverse($file->media_thumb) as $s => $v) { if ($v == $_POST['pref_src']) { $core->blog->settings->system->put('media_img_default_size',$s); break; } } } if (!empty($_POST['pref_alignment'])) { $core->blog->settings->system->put('media_img_default_alignment',$_POST['pref_alignment']); } if (!empty($_POST['pref_insertion'])) { $core->blog->settings->system->put('media_img_default_link',($_POST['pref_insertion'] == 'link')); } dcPage::addSuccessNotice(__('Default media insertion settings have been successfully updated.')); http::redirect($page_url.'&id='.$id); } # Function to get image title based on meta function dcGetImageTitle($file,$pattern,$dto_first=false) { $res = array(); $pattern = preg_split('/\s*;;\s*/',$pattern); $sep = ', '; foreach ($pattern as $v) { if ($v == 'Title') { if ($file->media_title != '') { $res[] = $file->media_title; } } elseif ($file->media_meta->{$v}) { if ((string) $file->media_meta->{$v} != '') { $res[] = (string) $file->media_meta->{$v}; } } elseif (preg_match('/^Date\((.+?)\)$/u',$v,$m)) { if ($dto_first && ($file->media_meta->DateTimeOriginal != 0)) { $res[] = dt::dt2str($m[1],(string) $file->media_meta->DateTimeOriginal); } else { $res[] = dt::str($m[1],$file->media_dt); } } elseif (preg_match('/^DateTimeOriginal\((.+?)\)$/u',$v,$m) && $file->media_meta->DateTimeOriginal) { $res[] = dt::dt2str($m[1],(string) $file->media_meta->DateTimeOriginal); } elseif (preg_match('/^separator\((.*?)\)$/u',$v,$m)) { $sep = $m[1]; } } return implode($sep,$res); } /* DISPLAY Main page -------------------------------------------------------- */ $starting_scripts = '". dcPage::jsLoad('js/_media_item.js'); if ($popup) { $starting_scripts .= dcPage::jsLoad('js/jsToolBar/popup_media.js'); } call_user_func($open_f,__('Media manager'), $starting_scripts. dcPage::jsDatePicker(). ($popup ? dcPage::jsPageTabs($tab) : ''), dcPage::breadcrumb( array( html::escapeHTML($core->blog->name) => '', __('Media manager') => html::escapeURL($media_page_url).'&d=', $core->media->breadCrumb(html::escapeURL($media_page_url).'&d=%s').''.$file->basename.'' => '' ), array( 'home_link' => !$popup, 'hl' => false ) ) ); if ($popup) { // Display notices echo dcPage::notices(); } if ($file === null) { call_user_func($close_f); exit; } if (!empty($_GET['fupd']) || !empty($_GET['fupl'])) { dcPage::success(__('File has been successfully updated.')); } if (!empty($_GET['thumbupd'])) { dcPage::success(__('Thumbnails have been successfully updated.')); } if (!empty($_GET['blogprefupd'])) { dcPage::success(__('Default media insertion settings have been successfully updated.')); } # Insertion popup if ($popup) { $media_desc = $file->media_title; echo '
    '. '

    '.__('Insert media item').'

    '. '
    '; $media_img_default_size = $core->blog->settings->system->media_img_default_size; if ($media_img_default_size == '') { $media_img_default_size = 'm'; } $media_img_default_alignment = $core->blog->settings->system->media_img_default_alignment; if ($media_img_default_alignment == '') { $media_img_default_alignment = 'none'; } $media_img_default_link = (boolean)$core->blog->settings->system->media_img_default_link; if ($file->media_type == 'image') { $media_type = 'image'; $media_desc = dcGetImageTitle($file, $core->blog->settings->system->media_img_title_pattern, $core->blog->settings->system->media_img_use_dto_first); if ($media_desc == $file->basename) { $media_desc = ''; } echo '

    '.__('Image size:').'

    '; $s_checked = false; echo '

    '; foreach (array_reverse($file->media_thumb) as $s => $v) { $s_checked = ($s == $media_img_default_size); echo '
    '; } $s_checked = (!isset($file->media_thumb[$media_img_default_size])); echo '
    '; echo '

    '; echo '
    '. '

    '.__('Image alignment').'

    '; $i_align = array( 'none' => array(__('None'),($media_img_default_alignment == 'none' ? 1 : 0)), 'left' => array(__('Left'),($media_img_default_alignment == 'left' ? 1 : 0)), 'right' => array(__('Right'),($media_img_default_alignment == 'right' ? 1 : 0)), 'center' => array(__('Center'),($media_img_default_alignment == 'center' ? 1 : 0)) ); echo '

    '; foreach ($i_align as $k => $v) { echo '
    '; } echo '

    '; echo '
    '; echo '
    '. '

    '.__('Image insertion').'

    '. '

    '. '
    '. ''. '

    '. '
    '; } elseif ($file->type == 'audio/mpeg3') { $media_type = 'mp3'; echo '
    '. '

    '.__('MP3 disposition').'

    '; dcPage::message(__("Please note that you cannot insert mp3 files with visual editor."),false); $i_align = array( 'none' => array(__('None'),($media_img_default_alignment == 'none' ? 1 : 0)), 'left' => array(__('Left'),($media_img_default_alignment == 'left' ? 1 : 0)), 'right' => array(__('Right'),($media_img_default_alignment == 'right' ? 1 : 0)), 'center' => array(__('Center'),($media_img_default_alignment == 'center' ? 1 : 0)) ); echo '

    '; foreach ($i_align as $k => $v) { echo '
    '; } $public_player_style = unserialize($core->blog->settings->themes->mp3player_style); $public_player = dcMedia::mp3player($file->file_url,$core->blog->getQmarkURL().'pf=player_mp3.swf',$public_player_style); echo form::hidden('public_player',html::escapeHTML($public_player)); echo '

    '; echo '
    '; } elseif ($file->type == 'video/x-flv' || $file->type == 'video/mp4' || $file->type == 'video/x-m4v') { $media_type = 'flv'; dcPage::message(__("Please note that you cannot insert video files with visual editor."),false); echo '
    '. '

    '.__('Video size').'

    '. '

    '. form::field('video_w',3,4,400).' '. ' '. form::field('video_h',3,4,300). '

    '. '
    '; echo '
    '. '

    '.__('Video disposition').'

    '; $i_align = array( 'none' => array(__('None'),($media_img_default_alignment == 'none' ? 1 : 0)), 'left' => array(__('Left'),($media_img_default_alignment == 'left' ? 1 : 0)), 'right' => array(__('Right'),($media_img_default_alignment == 'right' ? 1 : 0)), 'center' => array(__('Center'),($media_img_default_alignment == 'center' ? 1 : 0)) ); echo '

    '; foreach ($i_align as $k => $v) { echo '
    '; } $public_player_style = unserialize($core->blog->settings->themes->flvplayer_style); $public_player = dcMedia::flvplayer($file->file_url,$core->blog->getQmarkURL().'pf=player_flv.swf',$public_player_style); echo form::hidden('public_player',html::escapeHTML($public_player)); echo '

    '; echo '
    '; } else { $media_type = 'default'; echo '

    '.__('Media item will be inserted as a link.').'

    '; } echo '

    '. ''.__('Insert').' '. ''.__('Cancel').''. form::hidden(array('type'),html::escapeHTML($media_type)). form::hidden(array('title'),html::escapeHTML($file->media_title)). form::hidden(array('description'),html::escapeHTML($media_desc)). form::hidden(array('url'),$file->file_url). '

    '; echo '
    '; if ($media_type != 'default') { echo '
    '. '
    '. '

    '.__('Make current settings as default').' '. ''. form::hidden(array('pref_src'),''). form::hidden(array('pref_alignment'),''). form::hidden(array('pref_insertion'),''). form::hidden(array('id'),$id). $core->formNonce().'

    '. '
    '.'
    '; } echo '
    '; } if ($popup) { echo '
    '; } else { echo '

    '.__('Media details').'

    '; } echo '

    '; echo '
    '. '
    '; if ($file->media_image) { $thumb_size = !empty($_GET['size']) ? $_GET['size'] : 's'; if (!isset($core->media->thumb_sizes[$thumb_size]) && $thumb_size != 'o') { $thumb_size = 's'; } if (isset($file->media_thumb[$thumb_size])) { echo '

    '; } elseif ($thumb_size == 'o') { $S = getimagesize($file->file); $class = ($S[1] > 500) ? ' class="overheight"' : ''; unset($S); echo '

    '; } echo '

    '.__('Available sizes:').' '; foreach (array_reverse($file->media_thumb) as $s => $v) { $strong_link = ($s == $thumb_size) ? '%s' : '%s'; printf($strong_link,''.$core->media->thumb_sizes[$s][2].' | '); } echo ''.__('original').''; echo '

    '; } if ($file->type == 'audio/mpeg3') { echo dcMedia::mp3player($file->file_url,'index.php?pf=player_mp3.swf'); } if ($file->type == 'video/x-flv' || $file->type == 'video/mp4' || $file->type == 'video/x-m4v') { echo dcMedia::flvplayer($file->file_url,'index.php?pf=player_flv.swf'); } echo '

    '.__('Media details').'

    '. '
      '. '
    • '.__('File owner:').' '.$file->media_user.'
    • '. '
    • '.__('File type:').' '.$file->type.'
    • '. '
    • '.__('File size:').' '.files::size($file->size).'
    • '. '
    • '.__('File URL:').' '.$file->file_url.'
    • '. '
    '; if (empty($_GET['find_posts'])) { echo '

    '. __('Show entries containing this media').'

    '; } else { echo '

    '.__('Entries containing this media').'

    '; $params = array( 'post_type' => '', 'from' => 'LEFT OUTER JOIN '.$core->prefix.'post_media PM ON P.post_id = PM.post_id ', 'sql' => 'AND ('. 'PM.media_id = '.(integer) $id.' '. "OR post_content_xhtml LIKE '%".$core->con->escape($file->relname)."%' ". "OR post_excerpt_xhtml LIKE '%".$core->con->escape($file->relname)."%' " ); if ($file->media_image) { # We look for thumbnails too if (preg_match('#^http(s)?://#',$core->blog->settings->system->public_url)) { $media_root = $core->blog->settings->system->public_url; } else { $media_root = $core->blog->host.path::clean($core->blog->settings->system->public_url).'/'; } foreach ($file->media_thumb as $v) { $v = preg_replace('/^'.preg_quote($media_root,'/').'/','',$v); $params['sql'] .= "OR post_content_xhtml LIKE '%".$core->con->escape($v)."%' "; $params['sql'] .= "OR post_excerpt_xhtml LIKE '%".$core->con->escape($v)."%' "; } } $params['sql'] .= ') '; $rs = $core->blog->getPosts($params); if ($rs->isEmpty()) { echo '

    '.__('No entry seems contain this media.').'

    '; } else { echo '
      '; while ($rs->fetch()) { $img = '%1$s'; switch ($rs->post_status) { case 1: $img_status = sprintf($img,__('published'),'check-on.png'); break; case 0: $img_status = sprintf($img,__('unpublished'),'check-off.png'); break; case -1: $img_status = sprintf($img,__('scheduled'),'scheduled.png'); break; case -2: $img_status = sprintf($img,__('pending'),'check-wrn.png'); break; } echo '
    • '.$img_status.' '.''. $rs->post_title.''. ($rs->post_type != 'post' ? ' ('.html::escapeHTML($rs->post_type).')' : ''). ' - '.dt::dt2str(__('%Y-%m-%d %H:%M'),$rs->post_dt).'
    • '; } echo '
    '; } } if ($file->type == 'image/jpeg') { echo '

    '.__('Image details').'

    '; $details = ''; if (count($file->media_meta) > 0) { foreach ($file->media_meta as $k => $v) { if ((string) $v) { $details .= '
  • '.$k.': '.html::escapeHTML($v).'
  • '; } } } if ($details) { echo '
      '.$details.'
    '; } else { echo '

    '.__('No detail').'

    '; } } echo '
    '; echo '

    '.__('Updates and modifications').'

    '; if ($file->editable && $core_media_writable) { if ($file->media_type == 'image') { echo '
    '. '

    '.__('Update thumbnails').'

    '. '

    '.__('This will create or update thumbnails for this image.').'

    '. '

    '. form::hidden(array('id'),$id). $core->formNonce().'

    '. '
    '; } if ($file->type == 'application/zip') { $inflate_combo = array( __('Extract in a new directory') => 'new', __('Extract in current directory') => 'current' ); echo '
    '. '

    '.__('Extract archive').'

    '. '
      '. '
    • '.__('Extract in a new directory').' : '. __('This will extract archive in a new directory that should not exist yet.').'
    • '. '
    • '.__('Extract in current directory').' : '. __('This will extract archive in current directory and will overwrite existing files or directory.').'
    • '. '
    '. '

    '. form::combo('inflate_mode',$inflate_combo,'new'). ''. form::hidden(array('id'),$id). $core->formNonce().'

    '. '
    '; } echo '
    '. '

    '.__('Change media properties').'

    '. '

    '. form::field('media_file',30,255,html::escapeHTML($file->basename)).'

    '. '

    '. form::field('media_title',30,255,html::escapeHTML($file->media_title)).'

    '. '

    '. form::field('media_dt',16,16,html::escapeHTML($file->media_dtstr)).'

    '. '

    '. '

    '. form::combo('media_path',$dirs_combo,dirname($file->relname)).'

    '. '

    '. form::hidden(array('id'),$id). $core->formNonce().'

    '. '
    '; echo '
    '. '

    '.__('Change file').'

    '. '
    '.form::hidden(array('MAX_FILE_SIZE'),DC_MAX_UPLOAD_SIZE).'
    '. '

    '. '

    '. form::hidden(array('id'),$id). $core->formNonce().'

    '. '
    '; if ($file->del) { echo '
    '. '

    '. form::hidden('remove',rawurlencode($file->basename)). form::hidden('rmyes',1). $core->formNonce().'

    '. '
    '; } # --BEHAVIOR-- adminMediaItemForm $core->callBehavior('adminMediaItemForm',$file); } echo '
    '; if ($popup) { echo '
    '; } call_user_func($close_f); dotclear-2.6.2+dfsg/admin/plugin.php000066400000000000000000000041311230033266200173300ustar00rootroot00000000000000plugins->moduleExists($p)) { $p_file = $core->plugins->moduleRoot($p).'/index.php'; } if (file_exists($p_file)) { # Loading plugin $p_info = $core->plugins->getModules($p); $p_url = 'plugin.php?p='.$p; $p_title = 'no content - plugin'; $p_head = ''; $p_content = '

    '.__('No content found on this plugin.').'

    '; ob_start(); include $p_file; $res = ob_get_contents(); ob_end_clean(); if (preg_match('|(.*?)(.*?)|ms',$m[1],$mt)) { $p_title = $mt[1]; } if (preg_match_all('|(.*?)|ms',$m[1],$ms)) { foreach ($ms[1] as $v) { $p_head .= $v."\n"; } } if (preg_match_all('|(.*?)|ms',$m[1],$ms)) { foreach ($ms[1] as $v) { $p_head .= $v."\n"; } } if (preg_match_all('|()|ms',$m[1],$ms)) { foreach ($ms[1] as $v) { $p_head .= $v."\n"; } } } if (preg_match('|(.+)|ms',$res,$m)) { $p_content = $m[1]; } call_user_func($open_f,$p_title,$p_head); echo $p_content; call_user_func($close_f); } else { call_user_func($open_f,__('Plugin not found'),'', dcPage::breadcrumb( array( __('System') => '', __('Plugin not found') => '' )) ); echo '

    '.__('The plugin you reached does not exist or does not have an admin page.').'

    '; call_user_func($close_f); } dotclear-2.6.2+dfsg/admin/plugins.php000066400000000000000000000142411230033266200175160ustar00rootroot00000000000000plugins, DC_PLUGINS_ROOT, $core->blog->settings->system->store_plugin_url ); adminModulesList::$allow_multi_install = (boolean) DC_ALLOW_MULTI_MODULES; adminModulesList::$distributed_modules = explode(',', DC_DISTRIB_PLUGINS); # -- Display module configuration page -- if ($list->setConfiguration()) { # Get content before page headers include $list->includeConfiguration(); # Gather content $list->getConfiguration(); # Display page dcPage::open(__('Plugins management'), # --BEHAVIOR-- pluginsToolsHeaders $core->callBehavior('pluginsToolsHeaders', $core, true), dcPage::breadcrumb( array( html::escapeHTML($core->blog->name) => '', __('Plugins management') => $list->getURL('',false), ''.__('Plugin configuration').'' => '' )) ); # Display previously gathered content $list->displayConfiguration(); dcPage::helpBlock('core_plugins_conf'); dcPage::close(); # Stop reading code here return; } # -- Execute actions -- try { $list->doActions(); } catch (Exception $e) { $core->error->add($e->getMessage()); } # -- Plugin install -- $plugins_install = null; if (!$core->error->flag()) { $plugins_install = $core->plugins->installModules(); } # -- Page header -- dcPage::open(__('Plugins management'), dcPage::jsLoad('js/_plugins.js'). dcPage::jsPageTabs(). # --BEHAVIOR-- pluginsToolsHeaders $core->callBehavior('pluginsToolsHeaders', $core, false), dcPage::breadcrumb( array( __('System') => '', __('Plugins management') => '' )) ); # -- Plugins install messages -- if (!empty($plugins_install['success'])) { echo '
    '.__('Following plugins have been installed:').'
      '; foreach ($plugins_install['success'] as $k => $v) { echo '
    • '.$k.'
    • '; } echo '
    '; } if (!empty($plugins_install['failure'])) { echo '
    '.__('Following plugins have not been installed:').'
      '; foreach ($plugins_install['failure'] as $k => $v) { echo '
    • '.$k.' ('.$v.')
    • '; } echo '
    '; } # -- Display modules lists -- if ($core->auth->isSuperAdmin() && $list->isWritablePath()) { # Updated modules from repo $modules = $list->store->get(true); if (!empty($modules)) { echo '
    '. '

    '.html::escapeHTML(__('Update plugins')).'

    '. '

    '.sprintf( __('There is one plugin to update available from repository.', 'There are %s plugins to update available from repository.', count($modules)), count($modules) ).'

    '; $list ->setList('plugin-update') ->setTab('update') ->setModules($modules) ->displayModules( /*cols */ array('checkbox', 'icon', 'name', 'version', 'current_version', 'desc'), /* actions */ array('update') ); echo '

    '.sprintf( __("Visit %s repository, the resources center for Dotclear."), 'Dotaddict' ). '

    '. '
    '; } } echo '
    '; # Activated modules $modules = $list->modules->getModules(); if (!empty($modules)) { echo '

    '.($core->auth->isSuperAdmin() ?__('Activated plugins') : __('Installed plugins')).'

    '. '

    '.__('You can configure and manage installed plugins from this list.').'

    '; $list ->setList('plugin-activate') ->setTab('plugins') ->setModules($modules) ->displayModules( /* cols */ array('expander', 'icon', 'name', 'version', 'desc', 'distrib'), /* actions */ array('deactivate', 'delete', 'behavior') ); } # Deactivated modules if ($core->auth->isSuperAdmin()) { $modules = $list->modules->getDisabledModules(); if (!empty($modules)) { echo '

    '.__('Deactivated plugins').'

    '. '

    '.__('Deactivated plugins are installed but not usable. You can activate them from here.').'

    '; $list ->setList('plugin-deactivate') ->setTab('plugins') ->setModules($modules) ->displayModules( /* cols */ array('icon', 'name', 'distrib'), /* actions */ array('activate', 'delete') ); } } echo '
    '; if ($core->auth->isSuperAdmin() && $list->isWritablePath()) { # New modules from repo $search = $list->getSearch(); $modules = $search ? $list->store->search($search) : $list->store->get(); if (!empty($search) || !empty($modules)) { echo '
    '. '

    '.__('Add plugins from repository').'

    '; // '

    '.__('Search and install plugins directly from repository.').'

    '; $list ->setList('plugin-new') ->setTab('new') ->setModules($modules) ->displaySearch() ->displayIndex() ->displayModules( /* cols */ array('expander', 'name', 'score', 'version', 'desc'), /* actions */ array('install'), /* nav limit */ true ); echo '

    '.sprintf( __("Visit %s repository, the resources center for Dotclear."), 'Dotaddict' ). '

    '. '
    '; } # Add a new plugin echo '
    '. '

    '.__('Add plugins from a package').'

    '. '

    '.__('You can install plugins by uploading or downloading zip files.').'

    '; $list->displayManualForm(); echo '
    '; } # --BEHAVIOR-- pluginsToolsTabs $core->callBehavior('pluginsToolsTabs', $core); # -- Notice for super admin -- if ($core->auth->isSuperAdmin() && !$list->isWritablePath()) { echo '

    '.__('Some functions are disabled, please give write access to your plugins directory to enable them.').'

    '; } dcPage::helpBlock('core_plugins'); dcPage::close(); dotclear-2.6.2+dfsg/admin/popup_link.php000066400000000000000000000033061230033266200202150ustar00rootroot00000000000000'.__('Add a link').''; # Languages combo $rs = $core->blog->getLangs(array('order'=>'asc')); $lang_combo = dcAdminCombos::getLangsCombo($rs,true); echo ''. '

    '.__('Cancel').' - '. ''.__('Insert').'

    '."\n". ''."\n"; dcPage::closePopup(); dotclear-2.6.2+dfsg/admin/popup_posts.php000066400000000000000000000045571230033266200204410ustar00rootroot00000000000000getPostTypes(); foreach ($post_types as $k => $v) { $type_combo[__($k)] = (string) $k; } $type = !empty($_POST['type']) ? $_POST['type'] : null; if (!$type && $q) { // Cope with search form $type = !empty($_GET['type']) ? $_GET['type'] : null; } if (!in_array($type, $type_combo)) { $type = null; } $params = array(); $params['limit'] = array((($page-1)*$nb_per_page),$nb_per_page); $params['no_content'] = true; $params['order'] = 'post_dt DESC'; if ($q) { $params['search'] = $q; } if ($type) { $params['post_type'] = $type; } dcPage::openPopup(__('Add a link to an entry'), dcPage::jsLoad('js/_posts_list.js'). dcPage::jsLoad('js/jsToolBar/popup_posts.js')); echo '

    '.__('Add a link to an entry').'

    '; echo '
    '. '

    '.form::combo('type',$type_combo,$type).''. $core->formNonce().'

    '. ''. '
    '; echo '
    '. '

    '.form::field('q',30,255,html::escapeHTML($q)). ' '. form::hidden('type',html::escapeHTML($type)). '

    '; try { $posts = $core->blog->getPosts($params); $counter = $core->blog->getPosts($params,true); $post_list = new adminPostMiniList($core,$posts,$counter->f(0)); } catch (Exception $e) { $core->error->add($e->getMessage()); } echo '
    '; # I know it's not a form but we just need the ID $post_list->display($page,$nb_per_page); echo '
    '; echo '

    '.__('cancel').'

    '; dcPage::closePopup(); dotclear-2.6.2+dfsg/admin/post.php000066400000000000000000000650341230033266200170300ustar00rootroot00000000000000auth->getOption('post_format'); $post_password = ''; $post_url = ''; $post_lang = $core->auth->getInfo('user_lang'); $post_title = ''; $post_excerpt = ''; $post_excerpt_xhtml = ''; $post_content = ''; $post_content_xhtml = ''; $post_notes = ''; $post_status = $core->auth->getInfo('user_post_status'); $post_selected = false; $post_open_comment = $core->blog->settings->system->allow_comments; $post_open_tb = $core->blog->settings->system->allow_trackbacks; $page_title = __('New entry'); $can_view_page = true; $can_edit_post = $core->auth->check('usage,contentadmin',$core->blog->id); $can_publish = $core->auth->check('publish,contentadmin',$core->blog->id); $can_delete = false; $post_headlink = ''; $post_link = '%s'; $next_link = $prev_link = $next_headlink = $prev_headlink = null; # If user can't publish if (!$can_publish) { $post_status = -2; } # Getting categories $categories_combo = dcAdminCombos::getCategoriesCombo( $core->blog->getCategories(array('post_type'=>'post')) ); $status_combo = dcAdminCombos::getPostStatusesCombo(); $img_status_pattern = '%1$s'; # Formaters combo $formaters_combo = dcAdminCombos::getFormatersCombo(); # Languages combo $rs = $core->blog->getLangs(array('order'=>'asc')); $lang_combo = dcAdminCombos::getLangsCombo($rs,true); # Validation flag $bad_dt = false; # Trackbacks $TB = new dcTrackback($core); $tb_urls = $tb_excerpt = ''; # Get entry informations if (!empty($_REQUEST['id'])) { $page_title = __('Edit entry'); $params['post_id'] = $_REQUEST['id']; $post = $core->blog->getPosts($params); if ($post->isEmpty()) { $core->error->add(__('This entry does not exist.')); $can_view_page = false; } else { $post_id = $post->post_id; $cat_id = $post->cat_id; $post_dt = date('Y-m-d H:i',strtotime($post->post_dt)); $post_format = $post->post_format; $post_password = $post->post_password; $post_url = $post->post_url; $post_lang = $post->post_lang; $post_title = $post->post_title; $post_excerpt = $post->post_excerpt; $post_excerpt_xhtml = $post->post_excerpt_xhtml; $post_content = $post->post_content; $post_content_xhtml = $post->post_content_xhtml; $post_notes = $post->post_notes; $post_status = $post->post_status; $post_selected = (boolean) $post->post_selected; $post_open_comment = (boolean) $post->post_open_comment; $post_open_tb = (boolean) $post->post_open_tb; $can_edit_post = $post->isEditable(); $can_delete= $post->isDeletable(); $next_rs = $core->blog->getNextPost($post,1); $prev_rs = $core->blog->getNextPost($post,-1); if ($next_rs !== null) { $next_link = sprintf($post_link,$next_rs->post_id, html::escapeHTML($next_rs->post_title),__('Next entry').' »'); $next_headlink = sprintf($post_headlink,'next', html::escapeHTML($next_rs->post_title),$next_rs->post_id); } if ($prev_rs !== null) { $prev_link = sprintf($post_link,$prev_rs->post_id, html::escapeHTML($prev_rs->post_title),'« '.__('Previous entry')); $prev_headlink = sprintf($post_headlink,'previous', html::escapeHTML($prev_rs->post_title),$prev_rs->post_id); } try { $core->media = new dcMedia($core); } catch (Exception $e) { $core->error->add($e->getMessage()); } # Sanitize trackbacks excerpt $tb_excerpt = empty($_POST['tb_excerpt']) ? $post_excerpt_xhtml.' '.$post_content_xhtml : $_POST['tb_excerpt']; $tb_excerpt = html::decodeEntities(html::clean($tb_excerpt)); $tb_excerpt = text::cutString(html::escapeHTML($tb_excerpt), 255); $tb_excerpt = preg_replace('/\s+/ms', ' ', $tb_excerpt); } } if (isset($_REQUEST['section']) && $_REQUEST['section']=='trackbacks') { $anchor = 'trackbacks'; } else { $anchor = 'comments'; } $comments_actions_page = new dcCommentsActionsPage($core,'post.php',array('id' => $post_id, '_ANCHOR'=>$anchor,'section' => $anchor)); if ($comments_actions_page->process()) { return; } # Ping blogs if (!empty($_POST['ping'])) { if (!empty($_POST['tb_urls']) && $post_id && $post_status == 1 && $can_edit_post) { $tb_urls = $_POST['tb_urls']; $tb_urls = str_replace("\r", '', $tb_urls); $tb_post_title = html::escapeHTML(trim(html::clean($post_title))); $tb_post_url = $post->getURL(); foreach (explode("\n", $tb_urls) as $tb_url) { try { $TB->ping($tb_url, $post_id, $tb_post_title, $tb_excerpt, $tb_post_url); } catch (Exception $e) { $core->error->add($e->getMessage()); } } if (!$core->error->flag()) { dcPage::addSuccessNotice(__('All pings sent.')); http::redirect('post.php?id='.$post_id.'&tb=1'); } } } # Format excerpt and content elseif (!empty($_POST) && $can_edit_post) { $post_format = $_POST['post_format']; $post_excerpt = $_POST['post_excerpt']; $post_content = $_POST['post_content']; $post_title = $_POST['post_title']; $cat_id = (integer) $_POST['cat_id']; if (isset($_POST['post_status'])) { $post_status = (integer) $_POST['post_status']; } if (empty($_POST['post_dt'])) { $post_dt = ''; } else { try { $post_dt = strtotime($_POST['post_dt']); if ($post_dt == false || $post_dt == -1) { $bad_dt = true; throw new Exception(__('Invalid publication date')); } $post_dt = date('Y-m-d H:i',$post_dt); } catch (Exception $e) { $core->error->add($e->getMessage()); } } $post_open_comment = !empty($_POST['post_open_comment']); $post_open_tb = !empty($_POST['post_open_tb']); $post_selected = !empty($_POST['post_selected']); $post_lang = $_POST['post_lang']; $post_password = !empty($_POST['post_password']) ? $_POST['post_password'] : null; $post_notes = $_POST['post_notes']; if (isset($_POST['post_url'])) { $post_url = $_POST['post_url']; } $core->blog->setPostContent( $post_id,$post_format,$post_lang, $post_excerpt,$post_excerpt_xhtml,$post_content,$post_content_xhtml ); } # Delete post if (!empty($_POST['delete']) && $can_delete) { try { # --BEHAVIOR-- adminBeforePostDelete $core->callBehavior('adminBeforePostDelete',$post_id); $core->blog->delPost($post_id); http::redirect('posts.php'); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Create or update post if (!empty($_POST) && !empty($_POST['save']) && $can_edit_post && !$bad_dt) { # Create category if (!empty($_POST['new_cat_title']) && $core->auth->check('categories', $core->blog->id)) { $cur_cat = $core->con->openCursor($core->prefix.'category'); $cur_cat->cat_title = $_POST['new_cat_title']; $cur_cat->cat_url = ''; $parent_cat = !empty($_POST['new_cat_parent']) ? $_POST['new_cat_parent'] : ''; # --BEHAVIOR-- adminBeforeCategoryCreate $core->callBehavior('adminBeforeCategoryCreate', $cur_cat); $cat_id = $core->blog->addCategory($cur_cat, (integer) $parent_cat); # --BEHAVIOR-- adminAfterCategoryCreate $core->callBehavior('adminAfterCategoryCreate', $cur_cat, $cat_id); } $cur = $core->con->openCursor($core->prefix.'post'); $cur->post_title = $post_title; $cur->cat_id = ($cat_id ? $cat_id : null); $cur->post_dt = $post_dt ? date('Y-m-d H:i:00',strtotime($post_dt)) : ''; $cur->post_format = $post_format; $cur->post_password = $post_password; $cur->post_lang = $post_lang; $cur->post_title = $post_title; $cur->post_excerpt = $post_excerpt; $cur->post_excerpt_xhtml = $post_excerpt_xhtml; $cur->post_content = $post_content; $cur->post_content_xhtml = $post_content_xhtml; $cur->post_notes = $post_notes; $cur->post_status = $post_status; $cur->post_selected = (integer) $post_selected; $cur->post_open_comment = (integer) $post_open_comment; $cur->post_open_tb = (integer) $post_open_tb; if (isset($_POST['post_url'])) { $cur->post_url = $post_url; } # Update post if ($post_id) { try { # --BEHAVIOR-- adminBeforePostUpdate $core->callBehavior('adminBeforePostUpdate',$cur,$post_id); $core->blog->updPost($post_id,$cur); # --BEHAVIOR-- adminAfterPostUpdate $core->callBehavior('adminAfterPostUpdate',$cur,$post_id); dcPage::addSuccessNotice (sprintf(__('The post "%s" has been successfully updated'),html::escapeHTML($cur->post_title))); http::redirect('post.php?id='.$post_id); } catch (Exception $e) { $core->error->add($e->getMessage()); } } else { $cur->user_id = $core->auth->userID(); try { # --BEHAVIOR-- adminBeforePostCreate $core->callBehavior('adminBeforePostCreate',$cur); $return_id = $core->blog->addPost($cur); # --BEHAVIOR-- adminAfterPostCreate $core->callBehavior('adminAfterPostCreate',$cur,$return_id); dcPage::addSuccessNotice(__('Entry has been successfully created.')); http::redirect('post.php?id='.$return_id); } catch (Exception $e) { $core->error->add($e->getMessage()); } } } # Getting categories $categories_combo = dcAdminCombos::getCategoriesCombo( $core->blog->getCategories(array('post_type'=>'post')) ); /* DISPLAY -------------------------------------------------------- */ $default_tab = 'edit-entry'; if (!$can_edit_post) { $default_tab = ''; } if (!empty($_GET['co'])) { $default_tab = 'comments'; } elseif (!empty($_GET['tb'])) { $default_tab = 'trackbacks'; } if ($post_id) { switch ($post_status) { case 1: $img_status = sprintf($img_status_pattern,__('Published'),'check-on.png'); break; case 0: $img_status = sprintf($img_status_pattern,__('Unpublished'),'check-off.png'); break; case -1: $img_status = sprintf($img_status_pattern,__('Scheduled'),'scheduled.png'); break; case -2: $img_status = sprintf($img_status_pattern,__('Pending'),'check-wrn.png'); break; default: $img_status = ''; } $edit_entry_str = __('“%s”'); $page_title_edit = sprintf($edit_entry_str, html::escapeHTML($post_title)).' '.$img_status; } else { $img_status = ''; } dcPage::open($page_title.' - '.__('Entries'), dcPage::jsDatePicker(). dcPage::jsToolBar(). dcPage::jsModal(). dcPage::jsMetaEditor(). dcPage::jsLoad('js/_post.js'). dcPage::jsConfirmClose('entry-form','comment-form'). # --BEHAVIOR-- adminPostHeaders $core->callBehavior('adminPostHeaders'). dcPage::jsPageTabs($default_tab). $next_headlink."\n".$prev_headlink, dcPage::breadcrumb( array( html::escapeHTML($core->blog->name) => '', __('Entries') => 'posts.php', ($post_id ? $page_title_edit : $page_title) => '' )) ); if (!empty($_GET['upd'])) { dcPage::success(__('Entry has been successfully updated.')); } elseif (!empty($_GET['crea'])) { dcPage::success(__('Entry has been successfully created.')); } elseif (!empty($_GET['attached'])) { dcPage::success(__('File has been successfully attached.')); } elseif (!empty($_GET['rmattach'])) { dcPage::success(__('Attachment has been successfully removed.')); } if (!empty($_GET['creaco'])) { dcPage::success(__('Comment has been successfully created.')); } if (!empty($_GET['tbsent'])) { dcPage::success(__('All pings sent.')); } # XHTML conversion if (!empty($_GET['xconv'])) { $post_excerpt = $post_excerpt_xhtml; $post_content = $post_content_xhtml; $post_format = 'xhtml'; dcPage::message(__('Don\'t forget to validate your XHTML conversion by saving your post.')); } if ($post_id && $post->post_status == 1) { echo '

    '.__('Go to this entry on the site').'

    '; } if ($post_id) { echo ''; } # Exit if we cannot view page if (!$can_view_page) { dcPage::helpBlock('core_post'); dcPage::close(); exit; } /* Post form if we can edit post -------------------------------------------------------- */ if ($can_edit_post) { $sidebar_items = new ArrayObject(array( 'status-box' => array( 'title' => __('Status'), 'items' => array( 'post_status' => '

    '. form::combo('post_status',$status_combo,$post_status,'maximal','',!$can_publish). '

    ', 'post_dt' => '

    '. form::field('post_dt',16,16,$post_dt,($bad_dt ? 'invalid' : '')). '

    ', 'post_lang' => '

    '. form::combo('post_lang',$lang_combo,$post_lang). '

    ', 'post_format' => '
    '. '
    '. '

    '.form::combo('post_format',$formaters_combo,$post_format,'maximal'). '

    '. '

    '. ''. __('Convert to XHTML').'

    ')), 'metas-box' => array( 'title' => __('Filing'), 'items' => array( 'post_selected' => '

    ', 'cat_id' => '
    '. '
    '.__('Category').'
    '. '

    '. form::combo('cat_id',$categories_combo,$cat_id,'maximal'). '

    '. ($core->auth->check('categories', $core->blog->id) ? '
    '. '
    '.__('Add a new category').'
    '. '

    '. '

    '. '
    ' : ''). '
    ')), 'options-box' => array( 'title' => __('Options'), 'items' => array( 'post_open_comment_tb' => '
    '. '
    '.__('Comments and trackbacks list').'
    '. '

    '. ($core->blog->settings->system->allow_comments ? (isContributionAllowed($post_id,strtotime($post_dt),true) ? '' : '

    '. __('Warning: Comments are not more accepted for this entry.').'

    ') : '

    '. __('Comments are not accepted on this blog so far.').'

    '). '

    '. ($core->blog->settings->system->allow_trackbacks ? (isContributionAllowed($post_id,strtotime($post_dt),false) ? '' : '

    '. __('Warning: Trackbacks are not more accepted for this entry.').'

    ') : '

    '.__('Trackbacks are not accepted on this blog so far.').'

    '). '
    ', 'post_password' => '

    '. form::field('post_password',10,32,html::escapeHTML($post_password),'maximal'). '

    ', 'post_url' => '
    '. '

    '. form::field('post_url',10,255,html::escapeHTML($post_url),'maximal'). '

    '. '

    '. __('Warning: If you set the URL manually, it may conflict with another entry.'). '

    ' )))); $main_items = new ArrayObject(array( "post_title" => '

    '. ''. form::field('post_title',20,255,html::escapeHTML($post_title),'maximal'). '

    ', "post_excerpt" => '

    '. form::textarea('post_excerpt',50,5,html::escapeHTML($post_excerpt)). '

    ', "post_content" => '

    '. form::textarea('post_content',50,$core->auth->getOption('edit_size'),html::escapeHTML($post_content)). '

    ', "post_notes" => '

    '. form::textarea('post_notes',50,5,html::escapeHTML($post_notes)). '

    ' ) ); # --BEHAVIOR-- adminPostFormItems $core->callBehavior('adminPostFormItems',$main_items,$sidebar_items, isset($post) ? $post : null); echo '
    '; echo '
    '; echo '
    '; echo '
    '; echo '

    '.__('Edit post').'

    '; foreach ($main_items as $id => $item) { echo $item; } # --BEHAVIOR-- adminPostForm (may be deprecated) $core->callBehavior('adminPostForm',isset($post) ? $post : null); echo '

    '. ($post_id ? form::hidden('id',$post_id) : ''). ' '; if ($post_id) { $preview_url = $core->blog->url.$core->url->getURLFor('preview',$core->auth->userID().'/'. http::browserUID(DC_MASTER_KEY.$core->auth->userID().$core->auth->getInfo('user_pwd')). '/'.$post->post_url); echo ''.__('Preview').' (p)'.' '; } else { echo ''.__('Cancel').' (c)'; } echo ($can_delete ? '' : ''). $core->formNonce(). '

    '; echo '
    '; // End #entry-content echo '
    '; // End #entry-wrapper echo '
    '; foreach ($sidebar_items as $id => $c) { echo '
    '. '

    '.$c['title'].'

    '; foreach ($c['items'] as $e_name=>$e_content) { echo $e_content; } echo '
    '; } # --BEHAVIOR-- adminPostFormSidebar (may be deprecated) $core->callBehavior('adminPostFormSidebar',isset($post) ? $post : null); echo '
    '; // End #entry-sidebar echo '
    '; # --BEHAVIOR-- adminPostForm $core->callBehavior('adminPostAfterForm',isset($post) ? $post : null); echo '
    '; } if ($post_id) { /* Comments -------------------------------------------------------- */ $params = array('post_id' => $post_id, 'order' => 'comment_dt ASC'); $comments = $core->blog->getComments(array_merge($params,array('comment_trackback'=>0))); echo '
    '; $combo_action = $comments_actions_page->getCombo(); $has_action = !empty($combo_action) && !$comments->isEmpty(); echo '

    '.__('Add a comment').'

    '; if ($has_action) { echo '
    '; } echo '

    '.__('Comments').'

    '; if (!$comments->isEmpty()) { showComments($comments,$has_action); } else { echo '

    '.__('No comment').'

    '; } if ($has_action) { echo '
    '. '

    '. '

    '. form::combo('action',$combo_action). form::hidden(array('section'),'comments'). form::hidden(array('id'),$post_id). $core->formNonce(). '

    '. '
    '. '
    '; } /* Add a comment -------------------------------------------------------- */ echo '
    '. '

    '.__('Add a comment').'

    '. '
    '. '
    '. '

    '. form::field('comment_author',30,255,html::escapeHTML($core->auth->getInfo('user_cn'))). '

    '. '

    '. form::field('comment_email',30,255,html::escapeHTML($core->auth->getInfo('user_email'))). '

    '. '

    '. form::field('comment_site',30,255,html::escapeHTML($core->auth->getInfo('user_url'))). '

    '. '

    '. form::textarea('comment_content',50,8,html::escapeHTML('')). '

    '. '

    '. form::hidden('post_id',$post_id). $core->formNonce(). '

    '. '
    '. #constrained '
    '. '
    '. #add comment '
    '; #comments } if ($post_id && $post_status == 1) { /* Trackbacks -------------------------------------------------------- */ $params = array('post_id' => $post_id, 'order' => 'comment_dt ASC'); $trackbacks = $core->blog->getComments(array_merge($params, array('comment_trackback' => 1))); # Actions combo box $combo_action = $comments_actions_page->getCombo(); $has_action = !empty($combo_action) && !$trackbacks->isEmpty(); if (!empty($_GET['tb_auto'])) { $tb_urls = implode("\n", $TB->discover($post_excerpt_xhtml.' '.$post_content_xhtml)); } # Display tab echo '
    '; # tracbacks actions if ($has_action) { echo '
    '; } echo '

    '.__('Trackbacks received').'

    '; if (!$trackbacks->isEmpty()) { showComments($trackbacks, $has_action, true); } else { echo '

    '.__('No trackback').'

    '; } if ($has_action) { echo '
    '. '

    '. '

    '. form::combo('action', $combo_action). form::hidden('id',$post_id). form::hidden(array('section'),'trackbacks'). $core->formNonce(). '

    '. '
    '. '
    '; } /* Add trackbacks -------------------------------------------------------- */ if ($can_edit_post && $post->post_status) { echo '
    '; echo '

    '.__('Ping blogs').'

    '. '
    '. '

    '. form::textarea('tb_urls', 60, 5, $tb_urls). '

    '. '

    '. form::textarea('tb_excerpt', 60, 5, $tb_excerpt).'

    '. '

    '. $core->formNonce(). ''. (empty($_GET['tb_auto']) ? '  '.__('Auto discover ping URLs').'' : ''). '

    '. '
    '; $pings = $TB->getPostPings($post_id); if (!$pings->isEmpty()) { echo '

    '.__('Previously sent pings').'

    '; echo '
      '; while ($pings->fetch()) { echo '
    • '.dt::dt2str(__('%Y-%m-%d %H:%M'), $pings->ping_dt).' - '. $pings->ping_url.'
    • '; } echo '
    '; } echo '
    '; } echo '
    '; #trackbacks } # Controls comments or trakbacks capabilities function isContributionAllowed($id,$dt,$com=true) { global $core; if (!$id) { return true; } if ($com) { if (($core->blog->settings->system->comments_ttl == 0) || (time() - $core->blog->settings->system->comments_ttl*86400 < $dt)) { return true; } } else { if (($core->blog->settings->system->trackbacks_ttl == 0) || (time() - $core->blog->settings->system->trackbacks_ttl*86400 < $dt)) { return true; } } return false; } # Show comments or trackbacks function showComments($rs,$has_action,$tb=false) { echo '
    '. ''. ''. ''. ''. ''. ''. ''; $comments = array(); if (isset($_REQUEST['comments'])) { foreach ($_REQUEST['comments'] as $v) { $comments[(integer)$v]=true; } } while($rs->fetch()) { $comment_url = 'comment.php?id='.$rs->comment_id; $img = '%1$s'; switch ($rs->comment_status) { case 1: $img_status = sprintf($img,__('Published'),'check-on.png'); break; case 0: $img_status = sprintf($img,__('Unpublished'),'check-off.png'); break; case -1: $img_status = sprintf($img,__('Pending'),'check-wrn.png'); break; case -2: $img_status = sprintf($img,__('Junk'),'junk.png'); break; } echo ''. ''. ''. ''. ''. ''. ''. ''; } echo '
    '.__('Author').''.__('Date').''.__('IP address').''.__('Status').''.__('Edit').'
    '. ($has_action ? form::checkbox(array('comments[]'),$rs->comment_id,isset($comments[$rs->comment_id]),'','',0,'title="'.($tb ? __('select this trackback') : __('select this comment')).'"') : '').''.html::escapeHTML($rs->comment_author).''.dt::dt2str(__('%Y-%m-%d %H:%M'),$rs->comment_dt).''.$rs->comment_ip.''.$img_status.''. ' '.__('Edit').'
    '; } dcPage::helpBlock('core_post','core_trackbacks','core_wiki'); dcPage::close(); dotclear-2.6.2+dfsg/admin/post_media.php000066400000000000000000000050461230033266200201640ustar00rootroot00000000000000blog->getPosts(array('post_id' => $post_id,'post_type'=>'')); if ($rs->isEmpty()) { exit; } try { if ($post_id && $media_id && !empty($_REQUEST['attach'])) { $core->media = new dcMedia($core); $core->media->addPostMedia($post_id,$media_id); if (!empty($_SERVER['HTTP_X_REQUESTED_WITH'])) { header('Content-type: application/json'); echo json_encode(array('url' => $core->getPostAdminURL($rs->post_type,$post_id,false))); exit(); } else { http::redirect($core->getPostAdminURL($rs->post_type,$post_id,false)); } } $core->media = new dcMedia($core); $f = $core->media->getPostMedia($post_id,$media_id); if (empty($f)) { $post_id = $media_id = null; throw new Exception(__('This attachment does not exist')); } $f = $f[0]; } catch (Exception $e) { $core->error->add($e->getMessage()); } # Remove a media from en if (($post_id && $media_id) || $core->error->flag()) { if (!empty($_POST['remove'])) { $core->media->removePostMedia($post_id,$media_id); dcPage::addSuccessNotice(__('Attachment has been successfully removed.')); http::redirect($core->getPostAdminURL($rs->post_type,$post_id,false)); } elseif (isset($_POST['post_id'])) { http::redirect($core->getPostAdminURL($rs->post_type,$post_id,false)); } if (!empty($_GET['remove'])) { dcPage::open(__('Remove attachment')); echo '

    '.__('Attachment').' › '.__('confirm removal').'

    '; echo '
    '. '

    '.__('Are you sure you want to remove this attachment?').'

    '. '

    '. '   '. form::hidden('post_id',$post_id). form::hidden('media_id',$media_id). $core->formNonce().'

    '. '
    '; dcPage::close(); exit; } } dotclear-2.6.2+dfsg/admin/posts.php000066400000000000000000000217231230033266200172100ustar00rootroot00000000000000blog->getCategories(array('post_type'=>'post')); } catch (Exception $e) { $core->error->add($e->getMessage()); } # Getting authors try { $users = $core->blog->getPostsUsers(); } catch (Exception $e) { $core->error->add($e->getMessage()); } # Getting dates try { $dates = $core->blog->getDates(array('type'=>'month')); } catch (Exception $e) { $core->error->add($e->getMessage()); } # Getting langs try { $langs = $core->blog->getLangs(); } catch (Exception $e) { $core->error->add($e->getMessage()); } # Creating filter combo boxes if (!$core->error->flag()) { # Filter form we'll put in html_block $users_combo = array_merge( array('-' => ''), dcAdminCombos::getUsersCombo($users) ); $categories_combo = array_merge( array( new formSelectOption('-',''), new formSelectOption(__('(No cat)'),'NULL')), dcAdminCombos::getCategoriesCombo($categories,false) ); $categories_values = array(); foreach ($categories_combo as $cat) { if (isset($cat->value)) { $categories_values[$cat->value]=true; } } $status_combo = array_merge( array('-' => ''), dcAdminCombos::getPostStatusesCombo() ); $selected_combo = array( '-' => '', __('Selected') => '1', __('Not selected') => '0' ); $attachment_combo = array( '-' => '', __('With attachments') => '1', __('Without attachments') => '0' ); # Months array $dt_m_combo = array_merge( array('-' => ''), dcAdminCombos::getDatesCombo($dates) ); $lang_combo = array_merge( array('-' => ''), dcAdminCombos::getLangsCombo($langs,false) ); $sortby_combo = array( __('Date') => 'post_dt', __('Title') => 'post_title', __('Category') => 'cat_title', __('Author') => 'user_id', __('Status') => 'post_status', __('Selected') => 'post_selected', __('Number of comments') => 'nb_comment', __('Number of trackbacks') => 'nb_trackback' ); $order_combo = array( __('Descending') => 'desc', __('Ascending') => 'asc' ); } # Actions combo box $posts_actions_page = new dcPostsActionsPage($core,'posts.php'); if ($posts_actions_page->process()) { return; } /* Get posts -------------------------------------------------------- */ $user_id = !empty($_GET['user_id']) ? $_GET['user_id'] : ''; $cat_id = !empty($_GET['cat_id']) ? $_GET['cat_id'] : ''; $status = isset($_GET['status']) ? $_GET['status'] : ''; $selected = isset($_GET['selected']) ? $_GET['selected'] : ''; $attachment = isset($_GET['attachment']) ? $_GET['attachment'] : ''; $month = !empty($_GET['month']) ? $_GET['month'] : ''; $lang = !empty($_GET['lang']) ? $_GET['lang'] : ''; $sortby = !empty($_GET['sortby']) ? $_GET['sortby'] : 'post_dt'; $order = !empty($_GET['order']) ? $_GET['order'] : 'desc'; $show_filters = false; $page = !empty($_GET['page']) ? max(1,(integer) $_GET['page']) : 1; $nb_per_page = 30; if (!empty($_GET['nb']) && (integer) $_GET['nb'] > 0) { if ($nb_per_page != $_GET['nb']) { $show_filters = true; } $nb_per_page = (integer) $_GET['nb']; } $params['limit'] = array((($page-1)*$nb_per_page),$nb_per_page); $params['no_content'] = true; # - User filter if ($user_id !== '' && in_array($user_id,$users_combo)) { $params['user_id'] = $user_id; $show_filters = true; } else { $user_id=''; } # - Categories filter if ($cat_id !== '' && isset($categories_values[$cat_id])) { $params['cat_id'] = $cat_id; $show_filters = true; } else { $cat_id=''; } # - Status filter if ($status !== '' && in_array($status,$status_combo)) { $params['post_status'] = $status; $show_filters = true; } else { $status=''; } # - Selected filter if ($selected !== '' && in_array($selected,$selected_combo)) { $params['post_selected'] = $selected; $show_filters = true; } else { $selected=''; } # - Selected filter if ($attachment !== '' && in_array($attachment,$attachment_combo)) { $params['media'] = $attachment; $params['link_type'] = 'attachment'; $show_filters = true; } else { $attachment=''; } # - Month filter if ($month !== '' && in_array($month,$dt_m_combo)) { $params['post_month'] = substr($month,4,2); $params['post_year'] = substr($month,0,4); $show_filters = true; } else { $month=''; } # - Lang filter if ($lang !== '' && in_array($lang,$lang_combo)) { $params['post_lang'] = $lang; $show_filters = true; } else { $lang=''; } # - Sortby and order filter if ($sortby !== '' && in_array($sortby,$sortby_combo)) { if ($order !== '' && in_array($order,$order_combo)) { $params['order'] = $sortby.' '.$order; } else { $order='desc'; } if ($sortby != 'post_dt' || $order != 'desc') { $show_filters = true; } } else { $sortby='post_dt'; $order='desc'; } # Get posts try { $posts = $core->blog->getPosts($params); $counter = $core->blog->getPosts($params,true); $post_list = new adminPostList($core,$posts,$counter->f(0)); } catch (Exception $e) { $core->error->add($e->getMessage()); } /* DISPLAY -------------------------------------------------------- */ $form_filter_title = __('Show filters and display options'); $starting_script = dcPage::jsLoad('js/_posts_list.js'); $starting_script .= dcPage::jsLoad('js/filter-controls.js'); $starting_script .= '"; dcPage::open(__('Entries'),$starting_script, dcPage::breadcrumb( array( html::escapeHTML($core->blog->name) => '', __('Entries') => '' )) ); if (!empty($_GET['upd'])) { dcPage::success(__('Selected entries have been successfully updated.')); } elseif (!empty($_GET['del'])) { dcPage::success(__('Selected entries have been successfully deleted.')); } if (!$core->error->flag()) { echo '

    '.__('New entry').'

    '. '
    '. '

    '.$form_filter_title.'

    '. '
    '. '
    '. '

    '.__('Filters').'

    '. '

    '. form::combo('user_id',$users_combo,$user_id).'

    '. '

    '. form::combo('cat_id',$categories_combo,$cat_id).'

    '. '

    ' . form::combo('status',$status_combo,$status).'

    '. '
    '. '
    '. '

    '. form::combo('selected',$selected_combo,$selected).'

    '. '

    '. form::combo('attachment',$attachment_combo,$attachment).'

    '. '

    '. form::combo('month',$dt_m_combo,$month).'

    '. '

    '. form::combo('lang',$lang_combo,$lang).'

    '. '
    '. '
    '. '

    '.__('Display options').'

    '. '

    '. form::combo('sortby',$sortby_combo,$sortby).'

    '. '

    '. form::combo('order',$order_combo,$order).'

    '. '

    '.__('Show').'

    '. '
    '. '
    '. '

    '. '

    '. //Opera sucks '
    '; # Show posts $post_list->display($page,$nb_per_page, '
    '. '%s'. '
    '. '

    '. '

    '. form::combo('action',$posts_actions_page->getCombo()). '

    '. form::hidden(array('user_id'),$user_id). form::hidden(array('cat_id'),$cat_id). form::hidden(array('status'),$status). form::hidden(array('selected'),$selected). form::hidden(array('attachment'),$attachment). form::hidden(array('month'),$month). form::hidden(array('lang'),$lang). form::hidden(array('sortby'),$sortby). form::hidden(array('order'),$order). form::hidden(array('page'),$page). form::hidden(array('nb'),$nb_per_page). $core->formNonce(). '
    '. '
    ', $show_filters ); } dcPage::helpBlock('core_posts'); dcPage::close(); dotclear-2.6.2+dfsg/admin/posts_actions.php000066400000000000000000000016461230033266200207320ustar00rootroot00000000000000setEnableRedirSelection(false); $posts_actions_page->process(); dotclear-2.6.2+dfsg/admin/preferences.php000066400000000000000000000520701230033266200203400ustar00rootroot00000000000000auth->getInfo('user_name'); $user_firstname = $core->auth->getInfo('user_firstname'); $user_displayname = $core->auth->getInfo('user_displayname'); $user_email = $core->auth->getInfo('user_email'); $user_url = $core->auth->getInfo('user_url'); $user_lang = $core->auth->getInfo('user_lang'); $user_tz = $core->auth->getInfo('user_tz'); $user_post_status = $core->auth->getInfo('user_post_status'); $user_options = $core->auth->getOptions(); $core->auth->user_prefs->addWorkspace('dashboard'); $user_dm_doclinks = $core->auth->user_prefs->dashboard->doclinks; $user_dm_dcnews = $core->auth->user_prefs->dashboard->dcnews; $user_dm_quickentry = $core->auth->user_prefs->dashboard->quickentry; $core->auth->user_prefs->addWorkspace('accessibility'); $user_acc_nodragdrop = $core->auth->user_prefs->accessibility->nodragdrop; $core->auth->user_prefs->addWorkspace('interface'); $user_ui_enhanceduploader = $core->auth->user_prefs->interface->enhanceduploader; if ($core->auth->isSuperAdmin()) { $user_ui_hide_std_favicon = $core->auth->user_prefs->interface->hide_std_favicon; } $user_ui_iconset = @$core->auth->user_prefs->interface->iconset; $user_ui_nofavmenu = $core->auth->user_prefs->interface->nofavmenu; $user_ui_media_by_page = ($core->auth->user_prefs->interface->media_by_page ? $core->auth->user_prefs->interface->media_by_page : 30); $default_tab = !empty($_GET['tab']) ? html::escapeHTML($_GET['tab']) : 'user-profile'; if (!empty($_GET['append']) || !empty($_GET['removed']) || !empty($_GET['neworder']) || !empty($_GET['replaced']) || !empty($_POST['appendaction']) || !empty($_POST['removeaction']) || !empty($_GET['db-updated'])) { $default_tab = 'user-favorites'; } elseif (!empty($_GET['updated'])) { $default_tab = 'user-options'; } if (($default_tab != 'user-profile') && ($default_tab != 'user-options') && ($default_tab != 'user-favorites')) { $default_tab = 'user-profile'; } # Formaters combo $formaters_combo = dcAdminCombos::getFormatersCombo(); $status_combo = dcAdminCombos::getPostStatusescombo(); $iconsets_combo = array(__('Default') => ''); $iconsets_root = dirname(__FILE__).'/images/iconset/'; if (is_dir($iconsets_root) && is_readable($iconsets_root)) { if (($d = @dir($iconsets_root)) !== false) { while (($entry = $d->read()) !== false) { if ($entry != '.' && $entry != '..' && substr($entry, 0, 1) != '.' && is_dir($iconsets_root.'/'.$entry)) { $iconsets_combo[$entry] = $entry; } } } } # Language codes $lang_combo = dcAdminCombos::getAdminLangsCombo(); # Add or update user if (isset($_POST['user_name'])) { try { $pwd_check = !empty($_POST['cur_pwd']) && $core->auth->checkPassword(crypt::hmac(DC_MASTER_KEY,$_POST['cur_pwd'])); if ($core->auth->allowPassChange() && !$pwd_check && $user_email != $_POST['user_email']) { throw new Exception(__('If you want to change your email or password you must provide your current password.')); } $cur = $core->con->openCursor($core->prefix.'user'); $cur->user_name = $user_name = $_POST['user_name']; $cur->user_firstname = $user_firstname = $_POST['user_firstname']; $cur->user_displayname = $user_displayname = $_POST['user_displayname']; $cur->user_email = $user_email = $_POST['user_email']; $cur->user_url = $user_url = $_POST['user_url']; $cur->user_lang = $user_lang = $_POST['user_lang']; $cur->user_tz = $user_tz = $_POST['user_tz']; $cur->user_options = new ArrayObject($user_options); if ($core->auth->allowPassChange() && !empty($_POST['new_pwd'])) { if (!$pwd_check) { throw new Exception(__('If you want to change your email or password you must provide your current password.')); } if ($_POST['new_pwd'] != $_POST['new_pwd_c']) { throw new Exception(__("Passwords don't match")); } $cur->user_pwd = $_POST['new_pwd']; } # --BEHAVIOR-- adminBeforeUserUpdate $core->callBehavior('adminBeforeUserProfileUpdate',$cur,$core->auth->userID()); # Udate user $core->updUser($core->auth->userID(),$cur); # --BEHAVIOR-- adminAfterUserUpdate $core->callBehavior('adminAfterUserProfileUpdate',$cur,$core->auth->userID()); dcPage::addSuccessNotice(__('Personal information has been successfully updated.')); http::redirect('preferences.php'); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Update user options if (isset($_POST['user_post_format'])) { try { $cur = $core->con->openCursor($core->prefix.'user'); $cur->user_name = $user_name; $cur->user_firstname = $user_firstname; $cur->user_displayname = $user_displayname; $cur->user_email = $user_email; $cur->user_url = $user_url; $cur->user_lang = $user_lang; $cur->user_tz = $user_tz; $cur->user_post_status = $user_post_status = $_POST['user_post_status']; $user_options['edit_size'] = (integer) $_POST['user_edit_size']; if ($user_options['edit_size'] < 1) { $user_options['edit_size'] = 10; } $user_options['post_format'] = $_POST['user_post_format']; $user_options['enable_wysiwyg'] = !empty($_POST['user_wysiwyg']); $cur->user_options = new ArrayObject($user_options); # --BEHAVIOR-- adminBeforeUserOptionsUpdate $core->callBehavior('adminBeforeUserOptionsUpdate',$cur,$core->auth->userID()); # Update user prefs $core->auth->user_prefs->accessibility->put('nodragdrop',!empty($_POST['user_acc_nodragdrop']),'boolean'); $core->auth->user_prefs->interface->put('enhanceduploader',!empty($_POST['user_ui_enhanceduploader']),'boolean'); if ($core->auth->isSuperAdmin()) { # Applied to all users $core->auth->user_prefs->interface->put('hide_std_favicon',!empty($_POST['user_ui_hide_std_favicon']),'boolean',null,true,true); } $core->auth->user_prefs->interface->put('media_by_page',(integer)$_POST['user_ui_media_by_page'],'integer'); # Udate user $core->updUser($core->auth->userID(),$cur); # --BEHAVIOR-- adminAfterUserOptionsUpdate $core->callBehavior('adminAfterUserOptionsUpdate',$cur,$core->auth->userID()); dcPage::addSuccessNotice(__('Personal options has been successfully updated.')); http::redirect('preferences.php#user-options'); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Dashboard options if (isset($_POST['db-options'])) { try { # --BEHAVIOR-- adminBeforeUserOptionsUpdate $core->callBehavior('adminBeforeDashboardOptionsUpdate',$core->auth->userID()); # Update user prefs $core->auth->user_prefs->dashboard->put('doclinks',!empty($_POST['user_dm_doclinks']),'boolean'); $core->auth->user_prefs->dashboard->put('dcnews',!empty($_POST['user_dm_dcnews']),'boolean'); $core->auth->user_prefs->dashboard->put('quickentry',!empty($_POST['user_dm_quickentry']),'boolean'); $core->auth->user_prefs->interface->put('iconset',(!empty($_POST['user_ui_iconset']) ? $_POST['user_ui_iconset'] : '')); $core->auth->user_prefs->interface->put('nofavmenu',empty($_POST['user_ui_nofavmenu']),'boolean'); # --BEHAVIOR-- adminAfterUserOptionsUpdate $core->callBehavior('adminAfterDashboardOptionsUpdate',$core->auth->userID()); dcPage::addSuccessNotice(__('Dashboard options has been successfully updated.')); http::redirect('preferences.php#user-favorites'); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Add selected favorites if (!empty($_POST['appendaction'])) { try { if (empty($_POST['append'])) { throw new Exception(__('No favorite selected')); } $user_favs = $core->favs->getFavoriteIDs(false); foreach ($_POST['append'] as $k => $v) { if ($core->favs->exists($v)) { $user_favs[] = $v; } } $core->favs->setFavoriteIDs($user_favs,false); if (!$core->error->flag()) { dcPage::addSuccessNotice(__('Favorites have been successfully added.')); http::redirect('preferences.php#user-favorites'); } } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Delete selected favorites if (!empty($_POST['removeaction'])) { try { if (empty($_POST['remove'])) { throw new Exception(__('No favorite selected')); } $user_fav_ids = array(); foreach ($core->favs->getFavoriteIDs(false) as $v) { $user_fav_ids[$v]=true; } foreach ($_POST['remove'] as $v) { if (isset($user_fav_ids[$v])) { unset($user_fav_ids[$v]); } } $core->favs->setFavoriteIDs(array_keys($user_fav_ids),false); if (!$core->error->flag()) { dcPage::addSuccessNotice(__('Favorites have been successfully removed.')); http::redirect('preferences.php#user-favorites'); } } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Order favs $order = array(); if (empty($_POST['favs_order']) && !empty($_POST['order'])) { $order = $_POST['order']; asort($order); $order = array_keys($order); } elseif (!empty($_POST['favs_order'])) { $order = explode(',',$_POST['favs_order']); } if (!empty($_POST['saveorder']) && !empty($order)) { foreach ($order as $k => $v) { if (!$core->favs->exists($v)) { unset($order[$k]); } } $core->favs->setFavoriteIDs($order,false); if (!$core->error->flag()) { dcPage::addSuccessNotice(__('Favorites have been successfully updated.')); http::redirect('preferences.php#user-favorites'); } } # Replace default favorites by current set (super admin only) if (!empty($_POST['replace']) && $core->auth->isSuperAdmin()) { $user_favs = $core->favs->getFavoriteIDs(false); $core->favs->setFavoriteIDs($user_favs,true); if (!$core->error->flag()) { dcPage::addSuccessNotice(__('Default favorites have been successfully updated.')); http::redirect('preferences.php#user-favorites'); } } /* DISPLAY -------------------------------------------------------- */ dcPage::open($page_title, dcPage::jsLoad('js/_preferences.js'). ($user_acc_nodragdrop ? '' : dcPage::jsLoad('js/_preferences-dragdrop.js')). dcPage::jsLoad('js/jquery/jquery-ui.custom.js'). dcPage::jsLoad('js/jquery/jquery.pwstrength.js'). '\n". dcPage::jsPageTabs($default_tab). dcPage::jsConfirmClose('user-form'). # --BEHAVIOR-- adminPreferencesHeaders $core->callBehavior('adminPreferencesHeaders'), dcPage::breadcrumb( array( html::escapeHTML($core->auth->userID()) => '', $page_title => '' )) ); if (!empty($_GET['upd'])) { dcPage::success(__('Personal information has been successfully updated.')); } if (!empty($_GET['updated'])) { dcPage::success(__('Personal options has been successfully updated.')); } if (!empty($_GET['db-updated'])) { dcPage::success(__('Dashboard options has been successfully updated.')); } if (!empty($_GET['append'])) { dcPage::success(__('Favorites have been successfully added.')); } if (!empty($_GET['neworder'])) { dcPage::success(__('Favorites have been successfully updated.')); } if (!empty($_GET['removed'])) { dcPage::success(__('Favorites have been successfully removed.')); } if (!empty($_GET['replaced'])) { dcPage::success(__('Default favorites have been successfully updated.')); } # User profile echo '
    '; echo '

    '.__('My profile').'

    '. '
    '. '

    '. form::field('user_name',20,255,html::escapeHTML($user_name)).'

    '. '

    '. form::field('user_firstname',20,255,html::escapeHTML($user_firstname)).'

    '. '

    '. form::field('user_displayname',20,255,html::escapeHTML($user_displayname)).'

    '. '

    '. form::field('user_email',20,255,html::escapeHTML($user_email)).'

    '. '

    '. form::field('user_url',30,255,html::escapeHTML($user_url)).'

    '. '

    '. form::combo('user_lang',$lang_combo,$user_lang,'l10n').'

    '. '

    '. form::combo('user_tz',dt::getZones(true,true),$user_tz).'

    '; if ($core->auth->allowPassChange()) { echo '

    '.__('Change my password').'

    '. '
    '. '

    '. form::password('new_pwd',20,255,'','','',false,' data-indicator="pwindicator" ').'

    '. '
    '. '
    '. '

    '. '
    '. '
    '. '

    '. form::password('new_pwd_c',20,255).'

    '. '

    '. form::password('cur_pwd',20,255).'

    '. '

    '. __('If you have changed your email or password you must provide your current password to save these modifications.'). '

    '; } echo '

    '. $core->formNonce(). '

    '. '
    '. '
    '; # User options : some from actual user profile, dashboard modules, ... echo '
    '; echo '
    '. '

    '.__('My options').'

    '; echo '
    '. '

    '.__('Interface').'

    '. '

    '. '

    '. '

    '.__('If checked, numeric fields will allow to type the elements\' ordering number.').'

    '; echo '

    '. form::field('user_ui_media_by_page',5,3,(integer) $user_ui_media_by_page).'

    '; if ($core->auth->isSuperAdmin()) { echo '

    '. ''.__('This will be applied for all users').'.'. '

    ';//Opera sucks; } echo '
    '; echo '
    '. '

    '.__('Edition').'

    '. '

    '. form::combo('user_post_format',$formaters_combo,$user_options['post_format']).'

    '. '

    '. form::combo('user_post_status',$status_combo,$user_post_status).'

    '. '

    '. form::field('user_edit_size',5,4,(integer) $user_options['edit_size']).'

    '. '

    '. '
    '; echo '

    '.__('Other options').'

    '; # --BEHAVIOR-- adminPreferencesForm $core->callBehavior('adminPreferencesForm',$core); echo '

    '. $core->formNonce(). '

    '. '
    '; echo '
    '; # My dashboard echo '
    '; $ws = $core->auth->user_prefs->addWorkspace('favorites'); echo '

    '.__('My dashboard').'

    '; echo '
    '; echo '

    '.__('My favorites').'

    '; $count = 0; $user_fav = $core->favs->getFavoriteIDs(false); foreach ($user_fav as $id) { $fav = $core->favs->getFavorite($id); if ($fav != false) { // User favorites only if ($count == 0) echo '
      '; $count++; echo '
    • '.''. '
    • '; } } if ($count > 0) echo '
    '; if ($count > 0) { echo '
    '. '

    '.form::hidden('favs_order',''). $core->formNonce(). ' '. '

    '. ($core->auth->isSuperAdmin() ? '
    '. '

    '.__('If you are a super administrator, you may define this set of favorites to be used by default on all blogs of this installation.').'

    '. '

    '.'

    '. '
    ' : ''). '
    '; } else { echo '

    '.__('Currently no personal favorites.').'

    '; } $avail_fav = $core->favs->getFavorites($core->favs->getAvailableFavoritesIDs()); $default_fav_ids = array(); foreach($core->favs->getFavoriteIDs(true) as $v) { $default_fav_ids[$v]=true; } echo '
    '; # /box my-fav echo '
    '; # Available favorites echo '
    '.__('Other available favorites').'
    '; $count = 0; function cmp($a,$b) { if ($a['title'] == $b['title']) { return 0; } return ($a['title'] < $b['title']) ? -1 : 1; } uasort($avail_fav,'cmp'); foreach ($avail_fav as $k => $v) { if (in_array($k,$user_fav)) { unset($avail_fav[$k]); } } foreach ($avail_fav as $k=>$fav) { if ($count == 0) echo '
      '; $count++; echo '
    • '.''. (isset($default_fav_ids[$k]) ? ' '.__('(default favorite)').'' : ''). '
    • '; } if ($count > 0) echo '
    '; echo '

    '. $core->formNonce(). '

    '; echo '
    '; # /available favorites echo '
    '; echo '
    '. '
    '. '

    '.__('Menu').'

    '. '

    '; if (count($iconsets_combo) > 1) { echo '
    '. '

    '.__('Dashboard icons').'

    '. '

    '. form::combo('user_ui_iconset',$iconsets_combo,$user_ui_iconset).'

    '. '
    '; } else { echo ''; } echo '
    '. '

    '.__('Dashboard modules').'

    '. '

    '. '

    '. '


    '. //Opera sucks '

    '; echo '
    '; # --BEHAVIOR-- adminDashboardOptionsForm $core->callBehavior('adminDashboardOptionsForm',$core); echo '

    '. form::hidden('db-options','-'). $core->formNonce(). '

    '. '
    '; echo '
    '; # /multipart-user-favorites dcPage::helpBlock('core_user_pref'); dcPage::close(); dotclear-2.6.2+dfsg/admin/search.php000066400000000000000000000106521230033266200173040ustar00rootroot00000000000000blog->getPosts($params); $counter = $core->blog->getPosts($params,true); $post_list = new adminPostList($core,$posts,$counter->f(0)); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Get comments elseif ($qtype == 'c') { $starting_scripts .= dcPage::jsLoad('js/_comments.js'); $params['search'] = $q; $params['limit'] = array((($page-1)*$nb_per_page),$nb_per_page); $params['no_content'] = true; $params['order'] = 'comment_dt DESC'; try { $comments = $core->blog->getComments($params); $counter = $core->blog->getComments($params,true); $comment_list = new adminCommentList($core,$comments,$counter->f(0)); } catch (Exception $e) { $core->error->add($e->getMessage()); } } } if ($qtype == 'p') { $posts_actions_page = new dcPostsActionsPage($core,'search.php',array('q'=>$q,'qtype'=>$qtype)); if ($posts_actions_page->process()) { return; } } else { $comments_actions_page = new dcCommentsActionsPage($core,'search.php',array('q'=>$q,'qtype'=>$qtype)); if ($comments_actions_page->process()) { return; } } dcPage::open(__('Search'),$starting_scripts, dcPage::breadcrumb( array( html::escapeHTML($core->blog->name) => '', __('Search') => '' )) ); echo '
    '. '

    '.__('Search options').'

    '. '

    '.form::field('q',30,255,html::escapeHTML($q)).'

    '. '

    '. '

    '. '

    '. '
    '. '
    '; if ($q && !$core->error->flag()) { $redir = html::escapeHTML($_SERVER['REQUEST_URI']); # Show posts if ($qtype == 'p') { if ($counter->f(0) > 0) { printf('

    '. ($counter->f(0) == 1 ? __('%d entry found') : __('%d entries found')). '

    ',$counter->f(0)); } $post_list->display($page,$nb_per_page, '
    '. '%s'. '
    '. '

    '. '

    '. form::combo(array('action','action1'),$posts_actions_page->getCombo()). '

    '. $core->formNonce(). $posts_actions_page->getHiddenFields(). '
    '. '
    ' ); } # Show posts elseif ($qtype == 'c') { # Actions combo box if ($counter->f(0) > 0) { printf('

    '. ($counter->f(0) == 1 ? __('%d comment found') : __('%d comments found')). '

    ',$counter->f(0)); } $comment_list->display($page,$nb_per_page, '
    '. '%s'. '
    '. '

    '. '

    '. form::combo(array('action','action2'),$comments_actions_page->getCombo()). '

    '. $core->formNonce(). $comments_actions_page->getHiddenFields(). '
    '. '
    ' ); } } dcPage::helpBlock('core_search'); dcPage::close(); dotclear-2.6.2+dfsg/admin/services.php000066400000000000000000000321441230033266200176620ustar00rootroot00000000000000rest->addFunction('getPostById',array('dcRestMethods','getPostById')); $core->rest->addFunction('getCommentById',array('dcRestMethods','getCommentById')); $core->rest->addFunction('quickPost',array('dcRestMethods','quickPost')); $core->rest->addFunction('validatePostMarkup',array('dcRestMethods','validatePostMarkup')); $core->rest->addFunction('getZipMediaContent',array('dcRestMethods','getZipMediaContent')); $core->rest->addFunction('getMeta',array('dcRestMethods','getMeta')); $core->rest->addFunction('delMeta',array('dcRestMethods','delMeta')); $core->rest->addFunction('setPostMeta',array('dcRestMethods','setPostMeta')); $core->rest->addFunction('searchMeta',array('dcRestMethods','searchMeta')); $core->rest->addFunction('setSectionFold',array('dcRestMethods','setSectionFold')); $core->rest->addFunction('getModuleById',array('dcRestMethods','getModuleById')); $core->rest->serve(); /* Common REST methods */ class dcRestMethods { public static function getPostById($core,$get) { if (empty($get['id'])) { throw new Exception('No post ID'); } $params = array('post_id' => (integer) $get['id']); if (isset($get['post_type'])) { $params['post_type'] = $get['post_type']; } $rs = $core->blog->getPosts($params); if ($rs->isEmpty()) { throw new Exception('No post for this ID'); } $rsp = new xmlTag('post'); $rsp->id = $rs->post_id; $rsp->blog_id($rs->blog_id); $rsp->user_id($rs->user_id); $rsp->cat_id($rs->cat_id); $rsp->post_dt($rs->post_dt); $rsp->post_creadt($rs->post_creadt); $rsp->post_upddt($rs->post_upddt); $rsp->post_format($rs->post_format); $rsp->post_url($rs->post_url); $rsp->post_lang($rs->post_lang); $rsp->post_title($rs->post_title); $rsp->post_excerpt($rs->post_excerpt); $rsp->post_excerpt_xhtml($rs->post_excerpt_xhtml); $rsp->post_content($rs->post_content); $rsp->post_content_xhtml($rs->post_content_xhtml); $rsp->post_notes($rs->post_notes); $rsp->post_status($rs->post_status); $rsp->post_selected($rs->post_selected); $rsp->post_open_comment($rs->post_open_comment); $rsp->post_open_tb($rs->post_open_tb); $rsp->nb_comment($rs->nb_comment); $rsp->nb_trackback($rs->nb_trackback); $rsp->user_name($rs->user_name); $rsp->user_firstname($rs->user_firstname); $rsp->user_displayname($rs->user_displayname); $rsp->user_email($rs->user_email); $rsp->user_url($rs->user_url); $rsp->cat_title($rs->cat_title); $rsp->cat_url($rs->cat_url); $rsp->post_display_content($rs->getContent(true)); $rsp->post_display_excerpt($rs->getExcerpt(true)); $metaTag = new xmlTag('meta'); if (($meta = @unserialize($rs->post_meta)) !== false) { foreach ($meta as $K => $V) { foreach ($V as $v) { $metaTag->$K($v); } } } $rsp->post_meta($metaTag); return $rsp; } public static function getCommentById($core,$get) { if (empty($get['id'])) { throw new Exception('No comment ID'); } $rs = $core->blog->getComments(array('comment_id' => (integer) $get['id'])); if ($rs->isEmpty()) { throw new Exception('No comment for this ID'); } $rsp = new xmlTag('post'); $rsp->id = $rs->comment_id; $rsp->comment_dt($rs->comment_dt); $rsp->comment_upddt($rs->comment_upddt); $rsp->comment_author($rs->comment_author); $rsp->comment_site($rs->comment_site); $rsp->comment_content($rs->comment_content); $rsp->comment_trackback($rs->comment_trackback); $rsp->comment_status($rs->comment_status); $rsp->post_title($rs->post_title); $rsp->post_url($rs->post_url); $rsp->post_id($rs->post_id); $rsp->post_dt($rs->post_dt); $rsp->user_id($rs->user_id); $rsp->comment_display_content($rs->getContent(true)); if ($core->auth->userID()) { $rsp->comment_ip($rs->comment_ip); $rsp->comment_email($rs->comment_email); $rsp->comment_spam_disp(dcAntispam::statusMessage($rs)); } return $rsp; } public static function quickPost($core,$get,$post) { # Create category if (!empty($post['new_cat_title']) && $core->auth->check('categories', $core->blog->id)) { $cur_cat = $core->con->openCursor($core->prefix.'category'); $cur_cat->cat_title = $post['new_cat_title']; $cur_cat->cat_url = ''; $parent_cat = !empty($post['new_cat_parent']) ? $post['new_cat_parent'] : ''; # --BEHAVIOR-- adminBeforeCategoryCreate $core->callBehavior('adminBeforeCategoryCreate', $cur_cat); $post['cat_id'] = $core->blog->addCategory($cur_cat, (integer) $parent_cat); # --BEHAVIOR-- adminAfterCategoryCreate $core->callBehavior('adminAfterCategoryCreate', $cur_cat, $post['cat_id']); } $cur = $core->con->openCursor($core->prefix.'post'); $cur->post_title = !empty($post['post_title']) ? $post['post_title'] : ''; $cur->user_id = $core->auth->userID(); $cur->post_content = !empty($post['post_content']) ? $post['post_content'] : ''; $cur->cat_id = !empty($post['cat_id']) ? (integer) $post['cat_id'] : null; $cur->post_format = !empty($post['post_format']) ? $post['post_format'] : 'xhtml'; $cur->post_lang = !empty($post['post_lang']) ? $post['post_lang'] : ''; $cur->post_status = !empty($post['post_status']) ? (integer) $post['post_status'] : 0; $cur->post_open_comment = (integer) $core->blog->settings->system->allow_comments; $cur->post_open_tb = (integer) $core->blog->settings->system->allow_trackbacks; # --BEHAVIOR-- adminBeforePostCreate $core->callBehavior('adminBeforePostCreate',$cur); $return_id = $core->blog->addPost($cur); # --BEHAVIOR-- adminAfterPostCreate $core->callBehavior('adminAfterPostCreate',$cur,$return_id); $rsp = new xmlTag('post'); $rsp->id = $return_id; $post = $core->blog->getPosts(array('post_id' => $return_id)); $rsp->post_status = $post->post_status; $rsp->post_url = $post->getURL(); return $rsp; } public static function validatePostMarkup($core,$get,$post) { if (!isset($post['excerpt'])) { throw new Exception('No entry excerpt'); } if (!isset($post['content'])) { throw new Exception('No entry content'); } if (empty($post['format'])) { throw new Exception('No entry format'); } if (!isset($post['lang'])) { throw new Exception('No entry lang'); } $excerpt = $post['excerpt']; $excerpt_xhtml = ''; $content = $post['content']; $content_xhtml = ''; $format = $post['format']; $lang = $post['lang']; $core->blog->setPostContent(0,$format,$lang,$excerpt,$excerpt_xhtml,$content,$content_xhtml); $rsp = new xmlTag('result'); $v = htmlValidator::validate($excerpt_xhtml.$content_xhtml); $rsp->valid($v['valid']); $rsp->errors($v['errors']); return $rsp; } public static function getZipMediaContent($core,$get,$post) { if (empty($get['id'])) { throw new Exception('No media ID'); } $id = (integer) $get['id']; if (!$core->auth->check('media,media_admin',$core->blog)) { throw new Exception('Permission denied'); } try { $core->media = new dcMedia($core); $file = $core->media->getFile($id); } catch (Exception $e) {} if ($file === null || $file->type != 'application/zip' || !$file->editable) { throw new Exception('Not a valid file'); } $rsp = new xmlTag('result'); $content = $core->media->getZipContent($file); foreach ($content as $k => $v) { $rsp->file($k); } return $rsp; } public static function getMeta($core,$get) { $postid = !empty($get['postId']) ? $get['postId'] : null; $limit = !empty($get['limit']) ? $get['limit'] : null; $metaId = !empty($get['metaId']) ? $get['metaId'] : null; $metaType = !empty($get['metaType']) ? $get['metaType'] : null; $sortby = !empty($get['sortby']) ? $get['sortby'] : 'meta_type,asc'; $rs = $core->meta->getMetadata(array( 'meta_type' => $metaType, 'limit' => $limit, 'meta_id' => $metaId, 'post_id' => $postid)); $rs = $core->meta->computeMetaStats($rs); $sortby = explode(',',$sortby); $sort = $sortby[0]; $order = isset($sortby[1]) ? $sortby[1] : 'asc'; switch ($sort) { case 'metaId': $sort = 'meta_id_lower'; break; case 'count': $sort = 'count'; break; case 'metaType': $sort = 'meta_type'; break; default: $sort = 'meta_type'; } $rs->sort($sort,$order); $rsp = new xmlTag(); while ($rs->fetch()) { $metaTag = new xmlTag('meta'); $metaTag->type = $rs->meta_type; $metaTag->uri = rawurlencode($rs->meta_id); $metaTag->count = $rs->count; $metaTag->percent = $rs->percent; $metaTag->roundpercent = $rs->roundpercent; $metaTag->CDATA($rs->meta_id); $rsp->insertNode($metaTag); } return $rsp; } public static function setPostMeta($core,$get,$post) { if (empty($post['postId'])) { throw new Exception('No post ID'); } if (empty($post['meta']) && $post['meta'] != '0') { throw new Exception('No meta'); } if (empty($post['metaType'])) { throw new Exception('No meta type'); } # Get previous meta for post $post_meta = $core->meta->getMetadata(array( 'meta_type' => $post['metaType'], 'post_id' => $post['postId'])); $pm = array(); while ($post_meta->fetch()) { $pm[] = $post_meta->meta_id; } foreach ($core->meta->splitMetaValues($post['meta']) as $m) { if (!in_array($m,$pm)) { $core->meta->setPostMeta($post['postId'],$post['metaType'],$m); } } return true; } public static function delMeta($core,$get,$post) { if (empty($post['postId'])) { throw new Exception('No post ID'); } if (empty($post['metaId']) && $post['metaId'] != '0') { throw new Exception('No meta ID'); } if (empty($post['metaType'])) { throw new Exception('No meta type'); } $core->meta->delPostMeta($post['postId'],$post['metaType'],$post['metaId']); return true; } public static function searchMeta($core,$get) { $q = !empty($get['q']) ? $get['q'] : null; $metaType = !empty($get['metaType']) ? $get['metaType'] : null; $sortby = !empty($get['sortby']) ? $get['sortby'] : 'meta_type,asc'; $rs = $core->meta->getMetadata(array('meta_type' => $metaType)); $rs = $core->meta->computeMetaStats($rs); $sortby = explode(',',$sortby); $sort = $sortby[0]; $order = isset($sortby[1]) ? $sortby[1] : 'asc'; switch ($sort) { case 'metaId': $sort = 'meta_id_lower'; break; case 'count': $sort = 'count'; break; case 'metaType': $sort = 'meta_type'; break; default: $sort = 'meta_type'; } $rs->sort($sort,$order); $rsp = new xmlTag(); while ($rs->fetch()) { if (stripos($rs->meta_id,$q) === 0) { $metaTag = new xmlTag('meta'); $metaTag->type = $rs->meta_type; $metaTag->uri = rawurlencode($rs->meta_id); $metaTag->count = $rs->count; $metaTag->percent = $rs->percent; $metaTag->roundpercent = $rs->roundpercent; $metaTag->CDATA($rs->meta_id); $rsp->insertNode($metaTag); } } return $rsp; } public static function setSectionFold($core,$get,$post) { if (empty($post['section'])) { throw new Exception('No section name'); } if ($core->auth->user_prefs->toggles === null) { $core->auth->user_prefs->addWorkspace('toggles'); } $section = $post['section']; $status = isset($post['value']) && ($post['value'] != 0); if ($core->auth->user_prefs->toggles->prefExists('unfolded_sections')) { $toggles = explode(',',trim($core->auth->user_prefs->toggles->unfolded_sections)); } else { $toggles = array(); } $k = array_search($section,$toggles); if ($status) { // true == Fold section ==> remove it from unfolded list if ($k !== false) { unset($toggles[$k]); } } else { // false == unfold section ==> add it to unfolded list if ($k === false) { $toggles[]=$section; }; } $core->auth->user_prefs->toggles->put('unfolded_sections',join(',',$toggles)); return true; } public static function getModuleById($core, $get, $post) { if (empty($get['id'])) { throw new Exception('No module ID'); } if (empty($get['list'])) { throw new Exception('No list ID'); } $id = $get['id']; $list = $get['list']; $module = array(); if ($list == 'plugin-activate') { $modules = $core->plugins->getModules(); if (empty($modules) || !isset($modules[$id])) { throw new Exception('Unknow module ID'); } $module = $modules[$id]; } elseif ($list == 'plugin-new') { $store = new dcStore( $core->plugins, $core->blog->settings->system->store_plugin_url ); $store->check(); $modules = $store->get(); if (empty($modules) || !isset($modules[$id])) { throw new Exception('Unknow module ID'); } $module = $modules[$id]; } else { // behavior not implemented yet } if (empty($module)) { throw new Exception('Unknow module ID'); } $module = adminModulesList::sanitizeModule($id, $module); $rsp = new xmlTag('module'); $rsp->id = $id; foreach($module as $k => $v) { $rsp->{$k}((string) $v); } return $rsp; } } dotclear-2.6.2+dfsg/admin/style/000077500000000000000000000000001230033266200164625ustar00rootroot00000000000000dotclear-2.6.2+dfsg/admin/style/bg_h2.png000066400000000000000000000002541230033266200201520ustar00rootroot00000000000000PNG  IHDRT*!'tEXtSoftwareAdobe ImageReadyqe<NIDATxA 0ٿ!85bC/`lpIENDB`dotclear-2.6.2+dfsg/admin/style/bg_menu.png000066400000000000000000000002031230033266200205770ustar00rootroot00000000000000PNG  IHDRd灘tEXtSoftwareAdobe ImageReadyqe<PLTEioIDATxb`` $0AAIENDB`dotclear-2.6.2+dfsg/admin/style/bg_wrapper.png000066400000000000000000000003421230033266200213170ustar00rootroot00000000000000PNG  IHDR :žtEXtSoftwareAdobe ImageReadyqe<IDATxA!s0Y3s|e@ t(b@@ 06=IENDB`dotclear-2.6.2+dfsg/admin/style/cancel.png000066400000000000000000000004651230033266200204220ustar00rootroot00000000000000PNG  IHDR [AsBITO!PLTE럟쟟랞``__00 .tRNS0J pHYs  ~tEXtCreation Time30/05/08WtEXtSoftwareAdobe Fireworks CS3FSIDAT 0 o<!dFewlBZב{JSvό2mZRe $Ko&lYg̸_IENDB`dotclear-2.6.2+dfsg/admin/style/dashboard-alt.png000066400000000000000000000005751230033266200217040ustar00rootroot00000000000000PNG  IHDR/\tEXtSoftwareAdobe ImageReadyqe<IDATxڬ10Em{hV AR84ۂT+rhi4gt{PRtٷE19-`ehʃTv0I+}^d8 B3H#@6T˫iJWSN/?F KJm0*ӷH Fl! ^-AWQ)FoMI{ P`.|#4b|зjE#&(6#]{M6EgmpIENDB`dotclear-2.6.2+dfsg/admin/style/dashboard.png000066400000000000000000000005241230033266200211200ustar00rootroot00000000000000PNG  IHDR醟tEXtSoftwareAdobe ImageReadyqe<IDATxڬ 0EA6 d@0#@oj#'VEaiQe]O0HhRmtAfT 01ZƉ1LD)TG^FD&Ȅ ,Lf=n0U }K<|,Ρ̈/JdbҌ{*#NuMIAC .e^=DnA"įי)gdm5}ZH}GB^IENDB`dotclear-2.6.2+dfsg/admin/style/date-picker.css000066400000000000000000000011431230033266200213630ustar00rootroot00000000000000.date-picker { border-collapse: collapse; background: #fff; color: #fff; border: 1px solid #666; border-width: 1px 2px 2px 1px; width: auto; } .date-picker th { border: none; color: #000; text-align: center; } .date-picker td { border: 1px solid #666; text-align: center; padding : 4px 6px; } th.date-picker-month { text-align: left; } th.date-picker-year { text-align: right; } .date-picker-control, th.date-picker-control { color: #2373A8; cursor: pointer; } .date-picker-day, .date-picker-today { color: #000; background: #eee; cursor: pointer; } .date-picker-today { background: #ccc; } dotclear-2.6.2+dfsg/admin/style/dc_logos/000077500000000000000000000000001230033266200202535ustar00rootroot00000000000000dotclear-2.6.2+dfsg/admin/style/dc_logos/b-dotclear120.png000066400000000000000000000065151230033266200232270ustar00rootroot00000000000000PNG  IHDR,~L,=tEXtSoftwareAdobe ImageReadyqe< IDATxM#G^ovdG"% #rc<8!z~Hg掴8qW`onL$.HIf?L3o-5*mgH%]zjoi8GT2wުۗU_ي_7BeRrӦi|%fEq`ށNPX?7eztqr啁M(}5ѪC˪v퐭cx[7zľwlQRi.cbfliˆ9Z xJ.ӵHޛZF΅c/Gu=D1z~9}dN% +פx{U0#K'jkGnnn_riD~錷4U_n[kН2e<ԷҶfJk=F){3HTְ:ډnƉ:KĦ4HE|Jf6>"LvQQ+[j>EoisNۇmoHL.бM Q>h],c81od+RV"O'ցr BnȻt3bI1u +!N3hSH!+,'$ ˓EmFa#uI߈DW9ꮇC,򤣐):@lBp]ƫI [ߑT'{3_-t|*J'[H>r_!3Ȫ\`.M#OXv2EUƃ`Ӿfb$E g"gHV'lSbǰEUK".Er.Ze)Ýtt* #iZJƜ=ۘ۞0B"pBiټ ݾ>7ED'5ikGu47biyTmn2M~d<{ɵ$ t ˊoXvd]h\E\~74G"MK.TFN8k*>3lE͚wkPƴN,)eVU )ֵoIӰS4nha:/֊z6~E&e/2wbs\I:E_]煦zl\`x;r:x|=}RG^䖆t 8L~.M'OL1UU?C4sN"#H}*K?yz☄e:>{ ^Tt. t9*HBIONςD> "wV3Q_?%sK?#םݮFNc-e7\PD6[E pijwU5:E D;):&x'#~LLr3TfhBkm|vTm mĶa&t t:)7](=nFIbEgM}FUvRh-,4]d3ph97T6b/~9s;>Sdtx_`;7Lg+%r 猖~ʈ'Dj6鮂X!TrV6uֈVJt={_EѡXHv=[G9k$'ܚ*;@xH]^w\=mi4i⭳JO4(H}:GT*1ޜ+?RZ44JiFVi΍cȣ9 ISB{HNSX:`Ӭ鷮IENDB`dotclear-2.6.2+dfsg/admin/style/dc_logos/dc_logo_footer.png000066400000000000000000000044301230033266200237460ustar00rootroot00000000000000PNG  IHDRW~tEXtSoftwareAdobe ImageReadyqe<IDATxY pTWI6&!BX,EZJ[)֎3NuƪQرk*- Hi -SL !!OR nn6Ol>Ruə{~)8tEUfZΝ룉0-_,)VUWnڹY27+^'$prP0eW @}D,P-WN& i==MTZZz)κ'#zf^Mƨ"o].ezhN^pDL0Y -))Q~go?uEb5'W?^.1WUFHnSY-&nH$V[***x\?BIg{9O_UYb_''wΞWZR!UDZ,k!C[]]=*z<ܻ6%/\vjllJ \ HI>6xtNAb h\xxoq6R[~>|*E>sJ+W\>t5JQLָ̝RpӉĴN4Z7OTkbSEIZ&E0WpOD k [ .ۛswgWxg|qY9k4e)jhj H.\NzԎتkVP,v>7ԭd,vdj VGQ[-D̶q||)ܽIkh*0.k+~`ذȻk 'n"m-KNÓ^2?h&*n4--O7"ܒ(&wy; Ė؂%4::Jb/"%ל$/8*J(9XAO<,T/Z7nh8'hAx:hRv/:Od:W'ɍķn71Ϫ|B6aWr̡ 7gk/jmbazi5!"Uq]EwU?^.*VQ[S_Evr)}MWU0auOi]L.6b)zsVؖ߬E[/͗GPm:nIENDB`dotclear-2.6.2+dfsg/admin/style/dc_logos/sq-logo-32.png000066400000000000000000000011131230033266200225600ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxV=OP}`5 K%%8j280AWevPgauW,PwI:mHDPDi^~M&wi9XbA뭜`m˻RPZ>_zP儴Hc k,±"! ;V` '}wm0žMmCRyOl0zbK i4{2)cLg#שŌET-fWTd%}l9ʙ6-W Ž`ԓj"(y :C$skU[jNNg5QP| prףz0D(KQh ɦ#RDk^ ZL*YIѪ>-\WW̔DB )-dGt"h: .ߗ \BaB4 GA7R3Jd߄bމ~o.hK,G /÷rIENDB`dotclear-2.6.2+dfsg/admin/style/dc_logos/w-dotclear180.png000066400000000000000000000054261230033266200232620ustar00rootroot00000000000000PNG  IHDR3^;tEXtSoftwareAdobe ImageReadyqe< IDATx]Ml&ODFil!R]T@E#=IR{b] 4=Vo|((U؅| LCFTJERq^^r)ir9v7wHzwvvc-X =mhUQ1Wp&R|zB&!#OarqHחN\qe8x1(4Qh|!Wg_MsÑ^m_"X>< h9#ס+>{+2!IҕKъMY ހʦAm4]Z,.]m ?qÖ*( 2 x>o@`Gku5T/u]=Yi F8rކ p9H;?r8n ;@B+_@ ^3m?C 9;# -d>V7YTpHpb ωBGm4z)t"6I/NQ8I$px$8#gvuu՛L񱵝yﶞ}>򚇕m[ NjWg3m|!o,(7%iffΝ;ʋ+6}Vv}}}kI̐e-wdlU2:c}ke2===1z >pzykG_2,fBe ~3}k~c-"N4SwWaG҄ tcGWI̙RV+{Eܕ۶[Q D{{,_`!Bep`d|B*G&hL [W榏_MͯhU. 8dJU˟>ZU|#j6&''ICOMR_gaXQ;3hG F1sdL |PbYcGGGM{{rJ`qϏA75>6 01q0 %' $p@Đِ RgG`bGDEtS |+C&R&>27HxddD3?zBpxX1;*'XBF:Ɔ'ko{fa)8.ْ"ũ;+3LGhQ j*`8p߂YA``kGbP DɷS6Ri.$ChYJÒEfs~KnK tT>m&)n$ xlyvlyv"+YTqT䦫bR\N+DQ%]VbE]|"b{l hZ PWdwOppRF]2(faͼQZ ݓq% .F@'w~D >Le P{n8gHt%'8DJ$;̈́ 0œ2b%\CY3F><5%lFVeIaj4Qm"A.K6(-^ (ҦrECԆA绘3ԢT.98P<:QeG/4rzȣJL3/#R`QmnglO靉 6TJ]&̨ %|P lGmRCDY׮وzT1qh,)AV.AkRd6YYfFR L -hCb,*C[@:5'vO}{$AQ{z셏{>ttCb͐\@`&S*zhcsPʔweP3Xz-@ Uq9*>B4Izdn*/->Dz7nHjT^ìV$6> U^VrQY|Ν;G >D)hHf;ϫoo|g3< (2J޻w/Jc1z bur:=!XI[[]Gx$I8O{l6"P 01PVL|ҷ*"b(FRE3OLcEՆ+PiΥKOڀg?cAײlߗ02h c+g>boo>W1щYaxKȀ/.~XeJπDiV\imbL='h%i+{9sϽ fggNsCCz2>][kUیrN (b u/DVnnD/%^9r~iML]} ޽6v|m+Q-y\X1bd@%ZD9ᐉ ԧl\'cMϕD_@]cL>C`.qP:ytA)oYH D7;yd)DChi'KɆJZ0A?5l%*ϖuvhF^{<3P]';vd"<ڼzMBCWے^+Sz$qKtEwn/b?*T<+x]?^:/{Dc~ 00StL7M3wi\:@B)?I($[/vFajQH '!|WHڼAŞnWI9L:ɿAa8z<4I(FڒV5DtFRl2$/L1_9PGm"D:t:P6n*'e=u1sR @XUUC3*1["h{:cdCMC^O .ݴ|rdȔtq]I7C*1n5֩ythX3Cx%ey-"i^mlX:zVv 2%5)/t ~")%rDʻx'u>.E2§m6F:`^W(&QYDf  mmMM=c]/]FYJ"G`ZqUmͯ̐1vʂău31(DȚ&!TkAG1d.O1}JXyu(F*yt@nGI_ϵ!g|bsEAQ-T CA}@[c׫1btFaWt.'*ȣH =:}&ȁN3}*M$miLăiҲ:EŠtnυ "bI`’BcahC-O)M0z*TiHGm!-,9ZH&D\tFHaWx짥@.Ÿ4@^ىi *F!KD~WbVo?[!I`5ēõty 5k3g}*/ݩ2obJ֨*duDa[!k^gȋL(LuDuI`t7IZ*ƶ"N9+m|| h5qWʨ/`OhZDS2$Bܱ} f-+-a"%V[yu n(:F[4+%y2~UPrC )|J(g;<%] ~ ΢^Zh𞰻 %+ l%o Ć1QtSqdPNu w[*K}$x*5DNA7xmF>ÄؼMlOd{Sy $>_]qm$ ;Ts4QPCo nѢ{&$t,8GGهGl6DaMVg[i_wǹ9p=wMڶ0e'` ZRVe|z0W0lm8F2sR7wځagH܇L~zFοfB=^-!`?t9̋l 3pF0 jXZh@~ԝ\1 ::B;ZGݯvN%:r&1 G W׍YN?SVnͮv82ᓄx F@PJ@.P<0CYa2MϑU̓Mkb>}fs]^AH(s!uZ3׻2J ͬ^7$k1$Hr$ 8Z,h@} B vQAԀF O/wU,nçJ\%yq?[ cxW>4GBcq 7YFox/~1#@n6?vspN@|6l]Gu7+e8p36Cg-} x/,q hlH(;81 >ϰ?qҕu_|}xܛڧǿ~ n^q^2 Eގ uI2/|k!)-CXPL;8FpLW4Dyh#O -wVm>s{K@;"_ p߾[ de,7p2$-nPJ0& NYkNV^2/Y.nbFXZ ñ~>]*Ņo~5"bN-Z&-,zMMe.aİ0OȖ)L`&0Z7Ãe"7ScFү"qHJT 8kSܗnT1TvoAN.UBT>e0Ik 0I8:Z5BJ玊XpEtMnZ1xY&Q+K\MBP5 Z\ݵCm~)o^Uܪ.0WUџd ~+$lk( t?|㻵TI;QGAAJ8zQ*# 4mc%3 Ie T ZWExK+}曨t6Jn%;65ңR>b姥7$0 mJǖY/h&>Αq
    the category record @return array the combo box (form::combo -compatible format) */ public static function getCategoriesCombo($categories,$include_empty = true,$use_url = false) { $categories_combo = array(); if ($include_empty) { $categories_combo = array(new formSelectOption(__('(No cat)'),'')); } while ($categories->fetch()) { $categories_combo[] = new formSelectOption ( html::escapeHTML($categories->cat_title).' ('.$categories->nb_post.')', ($use_url ? $categories->cat_url : $categories->cat_id), ($categories->level-1 ? 'sub-option'.($categories->level-1) : '') ); } return $categories_combo; } /** Returns available post status combo @return array the combo box (form::combo -compatible format) */ public static function getPostStatusesCombo() { $status_combo = array(); foreach (self::$core->blog->getAllPostStatus() as $k => $v) { $status_combo[$v] = (string) $k; } return $status_combo; } /** Returns an users combo from a users record @param users record the users record @return array the combo box (form::combo -compatible format) */ public static function getUsersCombo($users) { $users_combo = array(); while ($users->fetch()) { $user_cn = dcUtils::getUserCN($users->user_id,$users->user_name, $users->user_firstname,$users->user_displayname); if ($user_cn != $users->user_id) { $user_cn .= ' ('.$users->user_id.')'; } $users_combo[$user_cn] = $users->user_id; } return $users_combo; } /** Returns an date combo from a date record @param dates record the dates record @return array the combo box (form::combo -compatible format) */ public static function getDatesCombo($dates) { $dt_m_combo= array(); while ($dates->fetch()) { $dt_m_combo[dt::str('%B %Y',$dates->ts())] = $dates->year().$dates->month(); } return $dt_m_combo; } /** Returns an lang combo from a lang record @param langs record the langs record @param with_available boolean if false, only list items from record if true, also list available languages @return array the combo box (form::combo -compatible format) */ public static function getLangsCombo($langs,$with_available=false) { $all_langs = l10n::getISOcodes(0,1); if ($with_available) { $langs_combo = array('' => '', __('Most used') => array(), __('Available') => l10n::getISOcodes(1,1)); while ($langs->fetch()) { if (isset($all_langs[$langs->post_lang])) { $langs_combo[__('Most used')][$all_langs[$langs->post_lang]] = $langs->post_lang; unset($langs_combo[__('Available')][$all_langs[$langs->post_lang]]); } else { $langs_combo[__('Most used')][$langs->post_lang] = $langs->post_lang; } } } else { $langs_combo = array(); while ($langs->fetch()) { $lang_name = isset($all_langs[$langs->post_lang]) ? $all_langs[$langs->post_lang] : $langs->post_lang; $langs_combo[$lang_name] = $langs->post_lang; } } unset($all_langs); return $langs_combo; } /** Returns a combo containing all available and installed languages for administration pages @return array the combo box (form::combo -compatible format) */ public static function getAdminLangsCombo() { $lang_combo = array(); $langs = l10n::getISOcodes(1,1); foreach ($langs as $k => $v) { $lang_avail = $v == 'en' || is_dir(DC_L10N_ROOT.'/'.$v); $lang_combo[] = new formSelectOption($k,$v,$lang_avail ? 'avail10n' : ''); } return $lang_combo; } /** Returns a combo containing all available formaters in admin @return array the combo box (form::combo -compatible format) */ public static function getFormatersCombo() { foreach (self::$core->getFormaters() as $v) { $formaters_combo[$v] = $v; } return $formaters_combo; } /** Returns a combo containing available blog statuses @return array the combo box (form::combo -compatible format) */ public static function getBlogStatusesCombo() { $status_combo = array(); foreach (self::$core->getAllBlogStatus() as $k => $v) { $status_combo[$v] = (string) $k; } return $status_combo; } /** Returns a combo containing available comment statuses @return array the combo box (form::combo -compatible format) */ public static function getCommentStatusescombo() { $status_combo = array(); foreach (self::$core->blog->getAllCommentStatus() as $k => $v) { $status_combo[$v] = (string) $k; } return $status_combo; } } dcAdminCombos::$core = $GLOBALS['core']; dotclear-2.6.2+dfsg/inc/admin/lib.dc.page.php000066400000000000000000001024221230033266200206530ustar00rootroot00000000000000 "success", "warning" => "warning-msg", "error" => "error", "message" => "message", "static" => "static-msg"); # Auth check public static function check($permissions) { global $core; if ($core->blog && $core->auth->check($permissions,$core->blog->id)) { return; } if (session_id()) { $core->session->destroy(); } http::redirect(DC_AUTH_PAGE); } # Check super admin public static function checkSuper() { global $core; if (!$core->auth->isSuperAdmin()) { if (session_id()) { $core->session->destroy(); } http::redirect(DC_AUTH_PAGE); } } # Top of admin page public static function open($title='',$head='',$breadcrumb='') { global $core; # List of user's blogs if ($core->auth->getBlogCount() == 1 || $core->auth->getBlogCount() > 20) { $blog_box = '

    '.__('Blog:').' '. html::escapeHTML($core->blog->name).''; if ($core->auth->getBlogCount() > 20) { $blog_box .= ' - '.__('Change blog').''; } $blog_box .= '

    '; } else { $rs_blogs = $core->getBlogs(array('order'=>'LOWER(blog_name)','limit'=>20)); $blogs = array(); while ($rs_blogs->fetch()) { $blogs[html::escapeHTML($rs_blogs->blog_name.' - '.$rs_blogs->blog_url)] = $rs_blogs->blog_id; } $blog_box = '

    '. $core->formNonce(). form::combo('switchblog',$blogs,$core->blog->id). '

    '; } $safe_mode = isset($_SESSION['sess_safe_mode']) && $_SESSION['sess_safe_mode']; # Display header('Content-Type: text/html; charset=UTF-8'); echo ''."\n". ''."\n". "\n". ' '."\n". ' '."\n". ' '."\n". ' '."\n". ' '.$title.' - '.html::escapeHTML($core->blog->name).' - '.html::escapeHTML(DC_VENDOR_NAME).' - '.DC_VERSION.''."\n". self::jsLoadIE7(). ' '."\n"; if (l10n::getTextDirection($GLOBALS['_lang']) == 'rtl') { echo ' '."\n"; } $core->auth->user_prefs->addWorkspace('interface'); $user_ui_hide_std_favicon = $core->auth->user_prefs->interface->hide_std_favicon; if (!$user_ui_hide_std_favicon) { echo ''. ''; } echo self::jsCommon(). self::jsToggles(). $head; # --BEHAVIOR-- adminPageHTMLHead $core->callBehavior('adminPageHTMLHead'); echo "\n". ''."\n". ''."\n". ''; // end header echo '
    '."\n". ''. '
    '."\n". '
    '."\n"; # Safe mode if ($safe_mode) { echo '

    '.__('Safe mode').'

    '. '

    '.__('You are in safe mode. All plugins have been temporarily disabled. Remind to log out then log in again normally to get back all functionalities').'

    '. '
    '; } // Display breadcrumb (if given) before any error message echo $breadcrumb; if ($core->error->flag()) { echo '

    '.(count($core->error->getErrors()) > 1 ? __('Errors:') : __('Error:')).'

    '. $core->error->toHTML(). '
    '; } // Display notices echo self::notices(); } public static function notices() { // return notices if any $res = ''; if (isset($_SESSION['notifications'])) { $notifications = $_SESSION['notifications']; foreach ($_SESSION['notifications'] as $notification) { $res .= self::getNotification($notification); } unset($_SESSION['notifications']); } return $res; } public static function addNotice($type,$message,$options=array()) { if (isset(self::$N_TYPES[$type])){ $class = self::$N_TYPES[$type]; } else { $class=$type; } if (isset($_SESSION['notifications']) && is_array($_SESSION['notifications'])) { $notifications = $_SESSION['notifications']; } else { $notifications = array(); } $n = array_merge($options,array('class' => $class,'ts' => time(), 'text' => $message)); if ($type != "static") { $notifications[] = $n; } else { array_unshift($notifications, $n); } $_SESSION['notifications'] = $notifications; } public static function addSuccessNotice($message,$options=array()) { self::addNotice("success",$message,$options); } public static function addWarningNotice($message,$options=array()) { self::addNotice("warning",$message,$options); } public static function addErrorNotice($message,$options=array()) { self::addNotice("error",$message,$options); } protected static function getNotification($n) { global $core; $tag = (isset($n['divtag'])&& $n['divtag'])?'div':'p'; $ts = ''; if (!isset($n['with_ts']) || ($n['with_ts'] == true)) { $ts = dt::str(__('[%H:%M:%S]'),$n['ts'],$core->auth->getInfo('user_tz')).' '; } $res = '<'.$tag.' class="'.$n['class'].'">'.$ts.$n['text'].''; return $res; } public static function close() { global $core; if (!$GLOBALS['__resources']['ctxhelp']) { echo '

    '.__('Global help').'

    '; } $menu =& $GLOBALS['_menu']; echo "
    \n". // End of #content "
    \n". // End of #main ''."\n". // End of #main-menu "
    \n"; // End of #wrapper echo ''."\n". "\n"; if (defined('DC_DEV') && DC_DEV === true) { echo self::debugInfo(); } echo ''; } public static function openPopup($title='',$head='',$breadcrumb='') { global $core; # Display header('Content-Type: text/html; charset=UTF-8'); echo ''."\n". ''."\n". "\n". ' '."\n". ' '."\n". ' '.$title.' - '.html::escapeHTML($core->blog->name).' - '.html::escapeHTML(DC_VENDOR_NAME).' - '.DC_VERSION.''."\n". ' '."\n". ' '."\n". self::jsLoadIE7(). ' '."\n"; if (l10n::getTextDirection($GLOBALS['_lang']) == 'rtl') { echo ' '."\n"; } echo self::jsCommon(). self::jsToggles(). $head; # --BEHAVIOR-- adminPageHTMLHead $core->callBehavior('adminPageHTMLHead'); echo "\n". ''."\n". '

    '.DC_VENDOR_NAME.'

    '."\n"; echo '
    '."\n". '
    '."\n". '
    '."\n"; // display breadcrumb if given echo $breadcrumb; if ($core->error->flag()) { echo '
    '.__('Errors:').''. $core->error->toHTML(). '
    '; } } public static function closePopup() { echo "
    \n". // End of #content "
    \n". // End of #main "
    \n". // End of #wrapper ''."\n". ''; } public static function breadcrumb($elements=null,$options=array()) { $with_home_link = isset($options['home_link'])?$options['home_link']:true; $hl = isset($options['hl'])?$options['hl']:true; $hl_pos = isset($options['hl_pos'])?$options['hl_pos']:-1; // First item of array elements should be blog's name, System or Plugins $res = '

    '.($with_home_link ? ''.__('Go to dashboard').'' : ''); $index = 0; if ($hl_pos < 0) { $hl_pos = count($elements)+$hl_pos; } foreach ($elements as $element => $url) { if ($hl && $index == $hl_pos) { $element = sprintf('%s',$element); } $res .= ($with_home_link ? ($index == 1 ? ' : ' : ' › ') : ($index == 0 ? ' ' : ' › ')). ($url ? '' : '').$element.($url ? '' : ''); $index++; } $res .= '

    '; return $res; } public static function message($msg,$timestamp=true,$div=false,$echo=true,$class='message') { global $core; $res = ''; if ($msg != '') { $res = ($div ? '
    ' : '').''. ($timestamp ? dt::str(__('[%H:%M:%S]'),null,$core->auth->getInfo('user_tz')).' ' : '').$msg. '

    '.($div ? '
    ' : ''); if ($echo) { echo $res; } } return $res; } public static function success($msg,$timestamp=true,$div=false,$echo=true) { return self::message($msg,$timestamp,$div,$echo,"success"); } public static function warning($msg,$timestamp=true,$div=false,$echo=true) { return self::message($msg,$timestamp,$div,$echo,"warning-msg"); } private static function debugInfo() { $global_vars = implode(', ',array_keys($GLOBALS)); $res = '
    '. '

    memory usage: '.memory_get_usage().' ('.files::size(memory_get_usage()).')

    '; if (function_exists('xdebug_get_profiler_filename')) { $res .= '

    Elapsed time: '.xdebug_time_index().' seconds

    '; $prof_file = xdebug_get_profiler_filename(); if ($prof_file) { $res .= '

    Profiler file : '.xdebug_get_profiler_filename().'

    '; } else { $prof_url = http::getSelfURI(); $prof_url .= (strpos($prof_url,'?') === false) ? '?' : '&'; $prof_url .= 'XDEBUG_PROFILE'; $res .= '

    Trigger profiler

    '; } /* xdebug configuration: zend_extension = /.../xdebug.so xdebug.auto_trace = On xdebug.trace_format = 0 xdebug.trace_options = 1 xdebug.show_mem_delta = On xdebug.profiler_enable = 0 xdebug.profiler_enable_trigger = 1 xdebug.profiler_output_dir = /tmp xdebug.profiler_append = 0 xdebug.profiler_output_name = timestamp */ } $res .= '

    Global vars: '.$global_vars.'

    '. '
    '; return $res; } public static function help($page,$index='') { # Deprecated but we keep this for plugins. } public static function helpBlock() { $args = func_get_args(); $args = new ArrayObject($args); # --BEHAVIOR-- adminPageHelpBlock $GLOBALS['core']->callBehavior('adminPageHelpBlock',$args); if (empty($args)) { return; }; global $__resources; if (empty($__resources['help'])) { return; } $content = ''; foreach ($args as $v) { if (is_object($v) && isset($v->content)) { $content .= $v->content; continue; } if (!isset($__resources['help'][$v])) { continue; } $f = $__resources['help'][$v]; if (!file_exists($f) || !is_readable($f)) { continue; } $fc = file_get_contents($f); if (preg_match('|]*?>(.*?)|ms',$fc,$matches)) { $content .= $matches[1]; } else { $content .= $fc; } } if (trim($content) == '') { return; } // Set contextual help global flag $GLOBALS['__resources']['ctxhelp'] = true; echo '

    '.__('Help about this page').'

    '. $content. '
    '. '
    '; } public static function jsLoad($src) { $escaped_src = html::escapeHTML($src); if (!isset(self::$loaded_js[$escaped_src])) { self::$loaded_js[$escaped_src]=true; return ''."\n"; } } public static function jsVar($n,$v) { return $n." = '".html::escapeJS($v)."';\n"; } public static function jsToggles() { if($GLOBALS['core']->auth->user_prefs->toggles) { $unfolded_sections = explode(',',$GLOBALS['core']->auth->user_prefs->toggles->unfolded_sections); foreach ($unfolded_sections as $k=>&$v) { if ($v == '') { unset($unfolded_sections[$k]); } else { $v = "'".html::escapeJS($v)."':true"; } } } else { $unfolded_sections=array(); } return '\n"; } public static function jsCommon() { $mute_or_no = ''; if (empty($GLOBALS['core']->blog) || $GLOBALS['core']->blog->settings->system->jquery_migrate_mute) { $mute_or_no .= '\n"; } return self::jsLoad('js/jquery/jquery.js'). $mute_or_no. self::jsLoad('js/jquery/jquery-migrate-1.2.1.js'). self::jsLoad('js/jquery/jquery.biscuit.js'). self::jsLoad('js/jquery/jquery.bgFade.js'). self::jsLoad('js/common.js'). self::jsLoad('js/prelude.js'). '\n"; } public static function jsLoadIE7() { return ''."\n"; } public static function jsConfirmClose() { $args = func_get_args(); if (count($args) > 0) { foreach ($args as $k => $v) { $args[$k] = "'".html::escapeJS($v)."'"; } $args = implode(',',$args); } else { $args = ''; } return self::jsLoad('js/confirm-close.js'). '\n"; } public static function jsPageTabs($default=null) { if ($default) { $default = "'".html::escapeJS($default)."'"; } return self::jsLoad('js/jquery/jquery.pageTabs.js'). '\n". ''."\n"; } public static function jsModal() { return ''."\n". self::jsLoad('js/jquery/jquery.modal.js'). '\n"; } public static function jsColorPicker() { return ''."\n". self::jsLoad('js/jquery/jquery.farbtastic.js'). self::jsLoad('js/color-picker.js'); } public static function jsDatePicker() { return ''."\n". self::jsLoad('js/date-picker.js'). '\n"; } public static function jsToolBar() { $res = ''. ''; if (isset($GLOBALS['core']->auth) && $GLOBALS['core']->auth->getOption('enable_wysiwyg')) { $res .= ''; } $res .= ''. '\n"; return $res; } public static function jsUpload($params=array(),$base_url=null) { if (!$base_url) { $base_url = path::clean(dirname(preg_replace('/(\?.*$)?/','',$_SERVER['REQUEST_URI']))).'/'; } $params = array_merge($params,array( 'sess_id='.session_id(), 'sess_uid='.$_SESSION['sess_browser_uid'], 'xd_check='.$GLOBALS['core']->getNonce() )); return '\n". self::jsLoad('js/jsUpload/vendor/jquery.ui.widget.js'). self::jsLoad('js/jsUpload/tmpl.js'). self::jsLoad('js/jsUpload/template-upload.js'). self::jsLoad('js/jsUpload/template-download.js'). self::jsLoad('js/jsUpload/load-image.js'). self::jsLoad('js/jsUpload/jquery.iframe-transport.js'). self::jsLoad('js/jsUpload/jquery.fileupload.js'). self::jsLoad('js/jsUpload/jquery.fileupload-process.js'). self::jsLoad('js/jsUpload/jquery.fileupload-resize.js'). self::jsLoad('js/jsUpload/jquery.fileupload-ui.js'); } public static function jsToolMan() { return ''. ''. ''. ''. ''. ''. ''; } public static function jsMetaEditor() { return ''; } } dotclear-2.6.2+dfsg/inc/admin/lib.moduleslist.php000066400000000000000000001433321230033266200217230ustar00rootroot00000000000000core = $modules->core; $this->modules = $modules; $this->store = new dcStore($modules, $xml_url); $this->setPath($modules_root); $this->setIndex(__('other')); } /** * Begin a new list. * * @param string $id New list ID * @return adminModulesList self instance */ public function setList($id) { $this->data = array(); $this->page_tab = ''; $this->list_id = $id; return $this; } /** * Get list ID. * * @return List ID */ public function getList() { return $this->list_id; } /// @name Modules root directory methods //@{ /** * Set path info. * * @param string $root Modules root directories * @return adminModulesList self instance */ protected function setPath($root) { $paths = explode(PATH_SEPARATOR, $root); $path = array_pop($paths); unset($paths); $this->path = $path; if (is_dir($path) && is_writeable($path)) { $this->path_writable = true; $this->path_pattern = preg_quote($path,'!'); } return $this; } /** * Get modules root directory. * * @return Path to work on */ public function getPath() { return $this->path; } /** * Check if modules root directory is writable. * * @return True if directory is writable */ public function isWritablePath() { return $this->path_writable; } /** * Check if root directory of a module is deletable. * * @param string $root Module root directory * @return True if directory is delatable */ public function isDeletablePath($root) { return $this->path_writable && (preg_match('!^'.$this->path_pattern.'!', $root) || defined('DC_DEV') && DC_DEV) && $this->core->auth->isSuperAdmin(); } //@} /// @name Page methods //@{ /** * Set page base URL. * * @param string $url Page base URL * @return adminModulesList self instance */ public function setURL($url) { $this->page_qs = strpos('?', $url) ? '&' : '?'; $this->page_url = $url; return $this; } /** * Get page URL. * * @param string|array $queries Additionnal query string * @param booleany $with_tab Add current tab to URL end * @return Clean page URL */ public function getURL($queries='', $with_tab=true) { return $this->page_url. (!empty($queries) ? $this->page_qs : ''). (is_array($queries) ? http_build_query($queries) : $queries). ($with_tab && !empty($this->page_tab) ? '#'.$this->page_tab : ''); } /** * Set page tab. * * @param string $tab Page tab * @return adminModulesList self instance */ public function setTab($tab) { $this->page_tab = $tab; return $this; } /** * Get page tab. * * @return Page tab */ public function getTab() { return $this->page_tab; } /** * Set page redirection. * * @param string $default Default redirection * @return adminModulesList self instance */ public function setRedir($default='') { $this->page_redir = empty($_REQUEST['redir']) ? $default : $_REQUEST['redir']; return $this; } /** * Get page redirection. * * @return Page redirection */ public function getRedir() { return empty($this->page_redir) ? $this->getURL() : $this->page_redir; } //@} /// @name Search methods //@{ /** * Get search query. * * @return Search query */ public function getSearch() { $query = !empty($_REQUEST['m_search']) ? trim($_REQUEST['m_search']) : null; return strlen($query) > 2 ? $query : null; } /** * Display searh form. * * @return adminModulesList self instance */ public function displaySearch() { $query = $this->getSearch(); if (empty($this->data) && $query === null) { return $this; } echo ''; return $this; } //@} /// @name Navigation menu methods //@{ /** * Set navigation special index. * * @return adminModulesList self instance */ public function setIndex($str) { $this->nav_special = (string) $str; $this->nav_list = array_merge(str_split(self::$nav_indexes), array($this->nav_special)); return $this; } /** * Get index from query. * * @return Query index or default one */ public function getIndex() { return isset($_REQUEST['m_nav']) && in_array($_REQUEST['m_nav'], $this->nav_list) ? $_REQUEST['m_nav'] : $this->nav_list[0]; } /** * Display navigation by index menu. * * @return adminModulesList self instance */ public function displayIndex() { if (empty($this->data) || $this->getSearch() !== null) { return $this; } # Fetch modules required field $indexes = array(); foreach ($this->data as $id => $module) { if (!isset($module[$this->sort_field])) { continue; } $char = substr($module[$this->sort_field], 0, 1); if (!in_array($char, $this->nav_list)) { $char = $this->nav_special; } if (!isset($indexes[$char])) { $indexes[$char] = 0; } $indexes[$char]++; } $buttons = array(); foreach($this->nav_list as $char) { # Selected letter if ($this->getIndex() == $char) { $buttons[] = '
  • '.$char.'
  • '; } # Letter having modules elseif (!empty($indexes[$char])) { $title = sprintf(__('%d result', '%d results', $indexes[$char]), $indexes[$char]); $buttons[] = '
  • '.$char.'
  • '; } # Letter without modules else { $buttons[] = ''; } } # Parse navigation menu echo '
    '.__('Browse index:').'
      '.implode('',$buttons).'
    '; return $this; } //@} /// @name Sort methods //@{ /** * Set default sort field. * * @return adminModulesList self instance */ public function setSort($field, $asc=true) { $this->sort_field = $field; $this->sort_asc = (boolean) $asc; return $this; } /** * Get sort field from query. * * @return Query sort field or default one */ public function getSort() { return !empty($_REQUEST['m_sort']) ? $_REQUEST['m_sort'] : $this->sort_field; } /** * Display sort field form. * * @note This method is not implemented yet * @return adminModulesList self instance */ public function displaySort() { // return $this; } //@} /// @name Modules methods //@{ /** * Set modules and sanitize them. * * @return adminModulesList self instance */ public function setModules($modules) { $this->data = array(); if (!empty($modules) && is_array($modules)) { foreach($modules as $id => $module) { $this->data[$id] = self::sanitizeModule($id, $module); } } return $this; } /** * Get modules currently set. * * @return Array of modules */ public function getModules() { return $this->data; } /** * Sanitize a module. * * This clean infos of a module by adding default keys * and clean some of them, sanitize module can safely * be used in lists. * * @return Array of the module informations */ public static function sanitizeModule($id, $module) { $label = empty($module['label']) ? $id : $module['label']; $name = __(empty($module['name']) ? $label : $module['name']); return array_merge( # Default values array( 'desc' => '', 'author' => '', 'version' => 0, 'current_version' => 0, 'root' => '', 'root_writable' => false, 'permissions' => null, 'parent' => null, 'priority' => 1000, 'standalone_config' => false, 'support' => '', 'section' => '', 'tags' => '', 'details' => '', 'sshot' => '', 'score' => 0, 'type' => null ), # Module's values $module, # Clean up values array( 'id' => $id, 'sid' => self::sanitizeString($id), 'label' => $label, 'name' => $name, 'sname' => self::sanitizeString($name) ) ); } /** * Check if a module is part of the distribution. * * @param string $id Module root directory * @return True if module is part of the distribution */ public static function isDistributedModule($id) { $distributed_modules = self::$distributed_modules; return is_array($distributed_modules) && in_array($id, $distributed_modules); } /** * Sort modules list by specific field. * * @param string $module Array of modules * @param string $field Field to sort from * @param bollean $asc Sort asc if true, else decs * @return Array of sorted modules */ public static function sortModules($modules, $field, $asc=true) { $origin = $sorter = array(); foreach($modules as $id => $module) { $origin[] = $module; $sorter[] = isset($module[$field]) ? $module[$field] : $field; } array_multisort($sorter, $asc ? SORT_ASC : SORT_DESC, $origin); foreach($origin as $module) { $final[$module['id']] = $module; } return $final; } /** * Display list of modules. * * @param array $cols List of colones (module field) to display * @param array $actions List of predefined actions to show on form * @param boolean $nav_limit Limit list to previously selected index * @return adminModulesList self instance */ public function displayModules($cols=array('name', 'version', 'desc'), $actions=array(), $nav_limit=false) { echo '
    '. '
    '. ''. ''; if (in_array('name', $cols)) { $colspan = 1; if (in_array('checkbox', $cols)) { $colspan++; } if (in_array('icon', $cols)) { $colspan++; } echo ''; } if (in_array('score', $cols) && $this->getSearch() !== null && defined('DC_DEBUG') && DC_DEBUG) { echo ''; } if (in_array('version', $cols)) { echo ''; } if (in_array('current_version', $cols)) { echo ''; } if (in_array('desc', $cols)) { echo ''; } if (in_array('distrib', $cols)) { echo ''; } if (!empty($actions) && $this->core->auth->isSuperAdmin()) { echo ''; } echo ''; $sort_field = $this->getSort(); # Sort modules by $sort_field (default sname) $modules = $this->getSearch() === null ? self::sortModules($this->data, $sort_field, $this->sort_asc) : $this->data; $count = 0; foreach ($modules as $id => $module) { # Show only requested modules if ($nav_limit && $this->getSearch() === null) { $char = substr($module[$sort_field], 0, 1); if (!in_array($char, $this->nav_list)) { $char = $this->nav_special; } if ($this->getIndex() != $char) { continue; } } echo ''; $tds = 0; if (in_array('checkbox', $cols)) { $tds++; echo ''; } if (in_array('icon', $cols)) { $tds++; echo ''; } $tds++; echo ''; # Display score only for debug purpose if (in_array('score', $cols) && $this->getSearch() !== null && defined('DC_DEBUG') && DC_DEBUG) { $tds++; echo ''; } if (in_array('version', $cols)) { $tds++; echo ''; } if (in_array('current_version', $cols)) { $tds++; echo ''; } if (in_array('desc', $cols)) { $tds++; echo ''; } if (in_array('distrib', $cols)) { $tds++; echo ''; } if (!empty($actions) && $this->core->auth->isSuperAdmin()) { $buttons = $this->getActions($id, $module, $actions); $tds++; echo ''; } echo ''; # Other informations if (in_array('expander', $cols)) { echo ''; } $count++; } echo '
    1 ? ' colspan="'.$colspan.'"' : '').'>'.__('Name').''.__('Score').''.__('Version').''.__('Current version').''.__('Details').''.__('Action').'
    '. form::checkbox(array('modules['.$count.']', html::escapeHTML($this->list_id).'_modules_'.html::escapeHTML($id)), html::escapeHTML($id)). ''.sprintf( '%1$s', html::escapeHTML($id), file_exists($module['root'].'/icon.png') ? 'index.php?pf='.$id.'/icon.png' : 'images/module.png' ).''; if (in_array('checkbox', $cols)) { if (in_array('expander', $cols)) { echo html::escapeHTML($module['name']); } else { echo ''; } } else { echo html::escapeHTML($module['name']). form::hidden(array('modules['.$count.']'), html::escapeHTML($id)); } echo $this->core->formNonce(). ''.$module['score'].''.html::escapeHTML($module['version']).''.html::escapeHTML($module['current_version']).''.html::escapeHTML(__($module['desc'])).''.(self::isDistributedModule($id) ? ''.
					__('Plugin from official distribution').'' : '').''. '
    '.implode(' ', $buttons).'
    '. '
    '; if (!empty($module['author']) || !empty($module['details']) || !empty($module['support'])) { echo '
      '; if (!empty($module['author'])) { echo '
    • '.__('Author:').' '.html::escapeHTML($module['author']).'
    • '; } $more = array(); if (!empty($module['details'])) { $more[] = ''.__('Details').''; } if (!empty($module['support'])) { $more[] = ''.__('Support').''; } if (!empty($more)) { echo '
    • '.implode(' - ', $more).'
    • '; } echo '
    '; } $config = !empty($module['root']) && file_exists(path::real($module['root'].'/_config.php')); if ($config || !empty($module['section']) || !empty($module['section'])) { echo '
      '; if ($config) { echo '
    • '.__('Configure plugin').'
    • '; } if (!empty($module['section'])) { echo '
    • '.__('Section:').' '.html::escapeHTML($module['section']).'
    • '; } if (!empty($module['section'])) { echo '
    • '.__('Tags:').' '.html::escapeHTML($module['tags']).'
    • '; } echo '
    '; } echo '
    '; if(!$count && $this->getSearch() === null) { echo '

    '.__('No plugins matched your search.').'

    '; } elseif ((in_array('checkbox', $cols) || $count > 1) && !empty($actions) && $this->core->auth->isSuperAdmin()) { $buttons = $this->getGlobalActions($actions, in_array('checkbox', $cols)); if (!empty($buttons)) { if (in_array('checkbox', $cols)) { echo '

    '; } echo '
    '.implode(' ', $buttons).'
    '; } } echo '
    '; return $this; } /** * Get action buttons to add to modules list. * * @param string $id Module ID * @param array $module Module info * @param array $actions Actions keys * @return Array of actions buttons */ protected function getActions($id, $module, $actions) { $submits = array(); # Use loop to keep requested order foreach($actions as $action) { switch($action) { # Deactivate case 'activate': if ($this->core->auth->isSuperAdmin() && $module['root_writable']) { $submits[] = ''; } break; # Activate case 'deactivate': if ($this->core->auth->isSuperAdmin() && $module['root_writable']) { $submits[] = ''; } break; # Delete case 'delete': if ($this->core->auth->isSuperAdmin() && $this->isDeletablePath($module['root'])) { $dev = !preg_match('!^'.$this->path_pattern.'!', $module['root']) && defined('DC_DEV') && DC_DEV ? ' debug' : ''; $submits[] = ''; } break; # Install (from store) case 'install': if ($this->core->auth->isSuperAdmin() && $this->path_writable) { $submits[] = ''; } break; # Update (from store) case 'update': if ($this->core->auth->isSuperAdmin() && $this->path_writable) { $submits[] = ''; } break; # Behavior case 'behavior': # --BEHAVIOR-- adminModulesListGetActions $tmp = $this->core->callBehavior('adminModulesListGetActions', $this, $id, $module); if (!empty($tmp)) { $submits[] = $tmp; } break; } } return $submits; } /** * Get global action buttons to add to modules list. * * @param array $actions Actions keys * @param boolean $with_selection Limit action to selected modules * @return Array of actions buttons */ protected function getGlobalActions($actions, $with_selection=false) { $submits = array(); # Use loop to keep requested order foreach($actions as $action) { switch($action) { # Deactivate case 'activate': if ($this->core->auth->isSuperAdmin() && $this->path_writable) { $submits[] = ''; } break; # Activate case 'deactivate': if ($this->core->auth->isSuperAdmin() && $this->path_writable) { $submits[] = ''; } break; # Update (from store) case 'update': if ($this->core->auth->isSuperAdmin() && $this->path_writable) { $submits[] = ''; } break; # Behavior case 'behavior': # --BEHAVIOR-- adminModulesListGetGlobalActions $tmp = $this->core->callBehavior('adminModulesListGetGlobalActions', $this, $with_selection); if (!empty($tmp)) { $submits[] = $tmp; } break; } } return $submits; } /** * Execute POST action. * * @note Set a notice on success through dcPage::addSuccessNotice * @throw Exception Module not find or command failed * @return Null */ public function doActions() { if (empty($_POST) || !empty($_REQUEST['conf']) || !$this->isWritablePath()) { return null; } $modules = !empty($_POST['modules']) && is_array($_POST['modules']) ? array_values($_POST['modules']) : array(); if ($this->core->auth->isSuperAdmin() && !empty($_POST['delete'])) { if (is_array($_POST['delete'])) { $modules = array_keys($_POST['delete']); } $list = $this->modules->getDisabledModules(); $failed = false; $count = 0; foreach($modules as $id) { if (!isset($list[$id])) { if (!$this->modules->moduleExists($id)) { throw new Exception(__('No such plugin.')); } $module = $this->modules->getModules($id); $module['id'] = $id; if (!$this->isDeletablePath($module['root'])) { $failed = true; continue; } # --BEHAVIOR-- moduleBeforeDelete $this->core->callBehavior('pluginBeforeDelete', $module); $this->modules->deleteModule($id); # --BEHAVIOR-- moduleAfterDelete $this->core->callBehavior('pluginAfterDelete', $module); } else { $this->modules->deleteModule($id, true); } $count++; } if (!$count && $failed) { throw new Exception(__("You don't have permissions to delete this plugin.")); } elseif ($failed) { dcPage::addWarningNotice(__('Some plugins have not been delete.')); } else { dcPage::addSuccessNotice( __('Plugin has been successfully deleted.', 'Plugins have been successuflly deleted.', $count) ); } http::redirect($this->getURL()); } elseif ($this->core->auth->isSuperAdmin() && !empty($_POST['install'])) { if (is_array($_POST['install'])) { $modules = array_keys($_POST['install']); } $list = $this->store->get(); if (empty($list)) { throw new Exception(__('No such plugin.')); } $count = 0; foreach($list as $id => $module) { if (!in_array($id, $modules)) { continue; } $dest = $this->getPath().'/'.basename($module['file']); # --BEHAVIOR-- moduleBeforeAdd $this->core->callBehavior('pluginBeforeAdd', $module); $this->store->process($module['file'], $dest); # --BEHAVIOR-- moduleAfterAdd $this->core->callBehavior('pluginAfterAdd', $module); $count++; } dcPage::addSuccessNotice( __('Plugin has been successfully installed.', 'Plugins have been successuflly installed.', $count) ); http::redirect($this->getURL()); } elseif ($this->core->auth->isSuperAdmin() && !empty($_POST['activate'])) { if (is_array($_POST['activate'])) { $modules = array_keys($_POST['activate']); } $list = $this->modules->getDisabledModules(); if (empty($list)) { throw new Exception(__('No such plugin.')); } $count = 0; foreach($list as $id => $module) { if (!in_array($id, $modules)) { continue; } # --BEHAVIOR-- moduleBeforeActivate $this->core->callBehavior('pluginBeforeActivate', $id); $this->modules->activateModule($id); # --BEHAVIOR-- moduleAfterActivate $this->core->callBehavior('pluginAfterActivate', $id); $count++; } dcPage::addSuccessNotice( __('Plugin has been successfully activated.', 'Plugins have been successuflly activated.', $count) ); http::redirect($this->getURL()); } elseif ($this->core->auth->isSuperAdmin() && !empty($_POST['deactivate'])) { if (is_array($_POST['deactivate'])) { $modules = array_keys($_POST['deactivate']); } $list = $this->modules->getModules(); if (empty($list)) { throw new Exception(__('No such plugin.')); } $failed = false; $count = 0; foreach($list as $id => $module) { if (!in_array($id, $modules)) { continue; } if (!$module['root_writable']) { $failed = true; continue; } $module[$id] = $id; # --BEHAVIOR-- moduleBeforeDeactivate $this->core->callBehavior('pluginBeforeDeactivate', $module); $this->modules->deactivateModule($id); # --BEHAVIOR-- moduleAfterDeactivate $this->core->callBehavior('pluginAfterDeactivate', $module); $count++; } if ($failed) { dcPage::addWarningNotice(__('Some plugins have not been deactivated.')); } else { dcPage::addSuccessNotice( __('Plugin has been successfully deactivated.', 'Plugins have been successuflly deactivated.', $count) ); } http::redirect($this->getURL()); } elseif ($this->core->auth->isSuperAdmin() && !empty($_POST['update'])) { if (is_array($_POST['update'])) { $modules = array_keys($_POST['update']); } $list = $this->store->get(true); if (empty($list)) { throw new Exception(__('No such plugin.')); } $count = 0; foreach($list as $module) { if (!in_array($module['id'], $modules)) { continue; } if (!self::$allow_multi_install) { $dest = $module['root'].'/../'.basename($module['file']); } else { $dest = $this->getPath().'/'.basename($module['file']); if ($module['root'] != $dest) { @file_put_contents($module['root'].'/_disabled', ''); } } # --BEHAVIOR-- moduleBeforeUpdate $this->core->callBehavior('pluginBeforeUpdate', $module); $this->store->process($module['file'], $dest); # --BEHAVIOR-- moduleAfterUpdate $this->core->callBehavior('pluginAfterUpdate', $module); $count++; } $tab = $count && $count == count($list) ? '#plugins' : '#update'; dcPage::addSuccessNotice( __('Plugin has been successfully updated.', 'Plugins have been successuflly updated.', $count) ); http::redirect($this->getURL().$tab); } # Manual actions elseif (!empty($_POST['upload_pkg']) && !empty($_FILES['pkg_file']) || !empty($_POST['fetch_pkg']) && !empty($_POST['pkg_url'])) { if (empty($_POST['your_pwd']) || !$this->core->auth->checkPassword(crypt::hmac(DC_MASTER_KEY, $_POST['your_pwd']))) { throw new Exception(__('Password verification failed')); } if (!empty($_POST['upload_pkg'])) { files::uploadStatus($_FILES['pkg_file']); $dest = $this->getPath().'/'.$_FILES['pkg_file']['name']; if (!move_uploaded_file($_FILES['pkg_file']['tmp_name'], $dest)) { throw new Exception(__('Unable to move uploaded file.')); } } else { $url = urldecode($_POST['pkg_url']); $dest = $this->getPath().'/'.basename($url); $this->store->download($url, $dest); } # --BEHAVIOR-- moduleBeforeAdd $this->core->callBehavior('pluginBeforeAdd', null); $ret_code = $this->store->install($dest); # --BEHAVIOR-- moduleAfterAdd $this->core->callBehavior('pluginAfterAdd', null); dcPage::addSuccessNotice($ret_code == 2 ? __('Plugin has been successfully updated.') : __('Plugin has been successfully installed.') ); http::redirect($this->getURL().'#plugins'); } else { # --BEHAVIOR-- adminModulesListDoActions $this->core->callBehavior('adminModulesListDoActions', $this, $modules, 'plugin'); } return null; } /** * Display tab for manual installation. * * @return adminModulesList self instance */ public function displayManualForm() { if (!$this->core->auth->isSuperAdmin() || !$this->isWritablePath()) { return null; } # 'Upload module' form echo '
    '. '

    '.__('Upload a zip file').'

    '. '

    '. '

    '. '

    '. form::password(array('your_pwd','your_pwd1'),20,255).'

    '. '

    '. $this->core->formNonce().'

    '. '
    '; # 'Fetch module' form echo '
    '. '

    '.__('Download a zip file').'

    '. '

    '. form::field(array('pkg_url','pkg_url'),40,255).'

    '. '

    '. form::password(array('your_pwd','your_pwd2'),20,255).'

    '. '

    '. $this->core->formNonce().'

    '. '
    '; return $this; } //@} /// @name Module configuration methods //@{ /** * Prepare module configuration. * * We need to get configuration content in three steps * and out of this class to keep backward compatibility. * * if ($xxx->setConfiguration()) { * include $xxx->includeConfiguration(); * } * $xxx->getConfiguration(); * ... [put here page headers and other stuff] * $xxx->displayConfiguration(); * * @param string $id Module to work on or it gather through REQUEST * @return True if config set */ public function setConfiguration($id=null) { if (empty($_REQUEST['conf']) || empty($_REQUEST['module']) && !$id) { return false; } if (!empty($_REQUEST['module']) && empty($id)) { $id = $_REQUEST['module']; } if (!$this->modules->moduleExists($id)) { $this->core->error->add(__('Unknow plugin ID')); return false; } $module = $this->modules->getModules($id); $module = self::sanitizeModule($id, $module); $file = path::real($module['root'].'/_config.php'); if (!file_exists($file)) { $this->core->error->add(__('This plugin has no configuration file.')); return false; } $this->config_module = $module; $this->config_file = $file; $this->config_content = ''; if (!defined('DC_CONTEXT_MODULE')) { define('DC_CONTEXT_MODULE', true); } return true; } /** * Get path of module configuration file. * * @note Required previously set file info * @return Full path of config file or null */ public function includeConfiguration() { if (!$this->config_file) { return null; } $this->setRedir($this->getURL().'#plugins'); ob_start(); return $this->config_file; } /** * Gather module configuration file content. * * @note Required previously file inclusion * @return True if content has been captured */ public function getConfiguration() { if ($this->config_file) { $this->config_content = ob_get_contents(); } ob_end_clean(); return !empty($this->file_content); } /** * Display module configuration form. * * @note Required previously gathered content * @return adminModulesList self instance */ public function displayConfiguration() { if ($this->config_file) { if (!$this->config_module['standalone_config']) { echo '
    '. '

    '.sprintf(__('Configure "%s"'), html::escapeHTML($this->config_module['name'])).'

    '. '

    '.__('Back').'

    '; } echo $this->config_content; if (!$this->config_module['standalone_config']) { echo '

    '. form::hidden('module', $this->config_module['id']). form::hidden('redir', $this->getRedir()). $this->core->formNonce().'

    '. '
    '; } } return $this; } //@} /** * Helper to sanitize a string. * * Used for search or id. * * @param string $str String to sanitize * @return Sanitized string */ public static function sanitizeString($str) { return preg_replace('/[^A-Za-z0-9\@\#+_-]/', '', strtolower($str)); } } /** * @ingroup DC_CORE * @brief Helper to manage list of themes. * @since 2.6 */ class adminThemesList extends adminModulesList { protected $page_url = 'blog_theme.php'; public function displayModules($cols=array('name', 'config', 'version', 'desc'), $actions=array(), $nav_limit=false) { echo '
    '. '
    '; $sort_field = $this->getSort(); # Sort modules by id $modules = $this->getSearch() === null ? self::sortModules($this->data, $sort_field, $this->sort_asc) : $this->data; $res = ''; $count = 0; foreach ($modules as $id => $module) { # Show only requested modules if ($nav_limit && $this->getSearch() === null) { $char = substr($module[$sort_field], 0, 1); if (!in_array($char, $this->nav_list)) { $char = $this->nav_special; } if ($this->getIndex() != $char) { continue; } } $current = $this->core->blog->settings->system->theme == $id && $this->modules->moduleExists($id); $distrib = self::isDistributedModule($id) ? ' dc-box' : ''; $line = '
    '; if (in_array('name', $cols) && !$current) { $line .= '

    '; if (in_array('checkbox', $cols)) { $line .= ''; } else { $line .= form::hidden(array('modules['.$count.']'), html::escapeHTML($id)). html::escapeHTML($module['name']); } $line .= $this->core->formNonce(). '

    '; } # Display score only for debug purpose if (in_array('score', $cols) && $this->getSearch() !== null && defined('DC_DEBUG') && DC_DEBUG) { $line .= '

    '.sprintf(__('Score: %s'), $module['score']).'

    '; } if (in_array('sshot', $cols)) { # Screenshot from url if (preg_match('#^http(s)?://#', $module['sshot'])) { $sshot = $module['sshot']; } # Screenshot from installed module elseif (file_exists($this->core->blog->themes_path.'/'.$id.'/screenshot.jpg')) { $sshot = $this->getURL('shot='.rawurlencode($id)); } # Default screenshot else { $sshot = 'images/noscreenshot.png'; } $line .= '
    '.
				sprintf(__('%s screenshot.'), html::escapeHTML($module['name'])).'
    '; } $line .= '
    '; if (in_array('name', $cols) && $current) { $line .= '

    '; if (in_array('checkbox', $cols)) { $line .= ''; } else { $line .= form::hidden(array('modules['.$count.']'), html::escapeHTML($id)). html::escapeHTML($module['name']); } $line .= '

    '; } $line .= '

    '; if (in_array('desc', $cols)) { $line .= ''.html::escapeHTML(__($module['desc'])).' '; } if (in_array('author', $cols)) { $line .= ''.sprintf(__('by %s'),html::escapeHTML($module['author'])).' '; } if (in_array('version', $cols)) { $line .= ''.sprintf(__('version %s'),html::escapeHTML($module['version'])).' '; } if (in_array('current_version', $cols)) { $line .= ''.sprintf(__('(current version %s)'),html::escapeHTML($module['current_version'])).' '; } if (in_array('parent', $cols) && !empty($module['parent'])) { if ($this->modules->moduleExists($module['parent'])) { $line .= ''.sprintf(__('(built on "%s")'),html::escapeHTML($module['parent'])).' '; } else { $line .= ''.sprintf(__('(requires "%s")'),html::escapeHTML($module['parent'])).' '; } } $has_details = in_array('details', $cols) && !empty($module['details']); $has_support = in_array('support', $cols) && !empty($module['support']); if ($has_details || $has_support) { $line .= ''; if ($has_details) { $line .= ''.__('Details').''; } if ($has_support) { $line .= ' - '.__('Support').''; } $line .= ''; } $line .= '

    '. '
    '; $line .= '
    '; # Plugins actions if ($current) { # _GET actions if (file_exists(path::real($this->core->blog->themes_path.'/'.$id).'/style.css')) { $theme_url = preg_match('#^http(s)?://#', $this->core->blog->settings->system->themes_url) ? http::concatURL($this->core->blog->settings->system->themes_url, '/'.$id) : http::concatURL($this->core->blog->url, $this->core->blog->settings->system->themes_url.'/'.$id); $line .= '

    '.__('View stylesheet').'

    '; } $line .= '
    '; if (file_exists(path::real($this->core->blog->themes_path.'/'.$id).'/_config.php')) { $line .= '

    '.__('Configure theme').'

    '; } # --BEHAVIOR-- adminCurrentThemeDetails $line .= $this->core->callBehavior('adminCurrentThemeDetails', $this->core, $id, $module); $line .= '
    '; } # _POST actions if (!empty($actions)) { $line .= '

    '.implode(' ', $this->getActions($id, $module, $actions)).'

    '; } $line .= '
    '; $line .= '
    '; $count++; $res = $current ? $line.$res : $res.$line; } echo $res. '
    '; if(!$count && $this->getSearch() === null) { echo '

    '.__('No themes matched your search.').'

    '; } elseif ((in_array('checkbox', $cols) || $count > 1) && !empty($actions) && $this->core->auth->isSuperAdmin()) { $buttons = $this->getGlobalActions($actions, in_array('checkbox', $cols)); if (!empty($buttons)) { if (in_array('checkbox', $cols)) { echo '

    '; } echo '
    '.implode(' ', $buttons).'
    '; } } echo '
    '; return $this; } protected function getActions($id, $module, $actions) { $submits = array(); $this->core->blog->settings->addNamespace('system'); if ($id != $this->core->blog->settings->system->theme) { # Select theme to use on curent blog if (in_array('select', $actions) && $this->path_writable) { $submits[] = ''; } } return array_merge( $submits, parent::getActions($id, $module, $actions) ); } protected function getGlobalActions($actions, $with_selection=false) { $submits = array(); foreach($actions as $action) { switch($action) { # Update (from store) case 'update': if ($this->core->auth->isSuperAdmin() && $this->path_writable) { $submits[] = ''; } break; # Behavior case 'behavior': # --BEHAVIOR-- adminModulesListGetGlobalActions $tmp = $this->core->callBehavior('adminModulesListGetGlobalActions', $this); if (!empty($tmp)) { $submits[] = $tmp; } break; } } return $submits; } public function doActions() { if (empty($_POST) || !empty($_REQUEST['conf']) || !$this->isWritablePath()) { return null; } $modules = !empty($_POST['modules']) && is_array($_POST['modules']) ? array_values($_POST['modules']) : array(); if (!empty($_POST['select'])) { # Can select only one theme at a time! if (is_array($_POST['select'])) { $modules = array_keys($_POST['select']); $id = $modules[0]; if (!$this->modules->moduleExists($id)) { throw new Exception(__('No such theme.')); } $this->core->blog->settings->addNamespace('system'); $this->core->blog->settings->system->put('theme',$id); $this->core->blog->triggerBlog(); dcPage::addSuccessNotice(__('Theme has been successfully selected.')); http::redirect($this->getURL().'#themes'); } } elseif ($this->core->auth->isSuperAdmin() && !empty($_POST['activate'])) { if (is_array($_POST['activate'])) { $modules = array_keys($_POST['activate']); } $list = $this->modules->getDisabledModules(); if (empty($list)) { throw new Exception(__('No such theme.')); } $count = 0; foreach($list as $id => $module) { if (!in_array($id, $modules)) { continue; } # --BEHAVIOR-- themeBeforeActivate $this->core->callBehavior('themeBeforeActivate', $id); $this->modules->activateModule($id); # --BEHAVIOR-- themeAfterActivate $this->core->callBehavior('themeAfterActivate', $id); $count++; } dcPage::addSuccessNotice( __('Theme has been successfully activated.', 'Themes have been successuflly activated.', $count) ); http::redirect($this->getURL()); } elseif ($this->core->auth->isSuperAdmin() && !empty($_POST['deactivate'])) { if (is_array($_POST['deactivate'])) { $modules = array_keys($_POST['deactivate']); } $list = $this->modules->getModules(); if (empty($list)) { throw new Exception(__('No such theme.')); } $failed = false; $count = 0; foreach($list as $id => $module) { if (!in_array($id, $modules)) { continue; } if (!$module['root_writable']) { $failed = true; continue; } $module[$id] = $id; # --BEHAVIOR-- themeBeforeDeactivate $this->core->callBehavior('themeBeforeDeactivate', $module); $this->modules->deactivateModule($id); # --BEHAVIOR-- themeAfterDeactivate $this->core->callBehavior('themeAfterDeactivate', $module); $count++; } if ($failed) { dcPage::addWarningNotice(__('Some themes have not been deactivated.')); } else { dcPage::addSuccessNotice( __('Theme has been successfully deactivated.', 'Themes have been successuflly deactivated.', $count) ); } http::redirect($this->getURL()); } elseif ($this->core->auth->isSuperAdmin() && !empty($_POST['delete'])) { if (is_array($_POST['delete'])) { $modules = array_keys($_POST['delete']); } $list = $this->modules->getDisabledModules(); $failed = false; $count = 0; foreach($modules as $id) { if (!isset($list[$id])) { if (!$this->modules->moduleExists($id)) { throw new Exception(__('No such theme.')); } $module = $this->modules->getModules($id); $module['id'] = $id; if (!$this->isDeletablePath($module['root'])) { $failed = true; continue; } # --BEHAVIOR-- themeBeforeDelete $this->core->callBehavior('themeBeforeDelete', $module); $this->modules->deleteModule($id); # --BEHAVIOR-- themeAfterDelete $this->core->callBehavior('themeAfterDelete', $module); } else { $this->modules->deleteModule($id, true); } $count++; } if (!$count && $failed) { throw new Exception(__("You don't have permissions to delete this theme.")); } elseif ($failed) { dcPage::addWarningNotice(__('Some themes have not been delete.')); } else { dcPage::addSuccessNotice( __('Theme has been successfully deleted.', 'Themes have been successuflly deleted.', $count) ); } http::redirect($this->getURL()); } elseif ($this->core->auth->isSuperAdmin() && !empty($_POST['install'])) { if (is_array($_POST['install'])) { $modules = array_keys($_POST['install']); } $list = $this->store->get(); if (empty($list)) { throw new Exception(__('No such theme.')); } $count = 0; foreach($list as $id => $module) { if (!in_array($id, $modules)) { continue; } $dest = $this->getPath().'/'.basename($module['file']); # --BEHAVIOR-- themeBeforeAdd $this->core->callBehavior('themeBeforeAdd', $module); $this->store->process($module['file'], $dest); # --BEHAVIOR-- themeAfterAdd $this->core->callBehavior('themeAfterAdd', $module); $count++; } dcPage::addSuccessNotice( __('Theme has been successfully installed.', 'Themes have been successuflly installed.', $count) ); http::redirect($this->getURL()); } elseif ($this->core->auth->isSuperAdmin() && !empty($_POST['update'])) { if (is_array($_POST['update'])) { $modules = array_keys($_POST['update']); } $list = $this->store->get(true); if (empty($list)) { throw new Exception(__('No such theme.')); } $count = 0; foreach($list as $module) { if (!in_array($module['id'], $modules)) { continue; } $dest = $module['root'].'/../'.basename($module['file']); # --BEHAVIOR-- themeBeforeUpdate $this->core->callBehavior('themeBeforeUpdate', $module); $this->store->process($module['file'], $dest); # --BEHAVIOR-- themeAfterUpdate $this->core->callBehavior('themeAfterUpdate', $module); $count++; } $tab = $count && $count == count($list) ? '#themes' : '#update'; dcPage::addSuccessNotice( __('Theme has been successfully updated.', 'Themes have been successuflly updated.', $count) ); http::redirect($this->getURL().$tab); } # Manual actions elseif (!empty($_POST['upload_pkg']) && !empty($_FILES['pkg_file']) || !empty($_POST['fetch_pkg']) && !empty($_POST['pkg_url'])) { if (empty($_POST['your_pwd']) || !$this->core->auth->checkPassword(crypt::hmac(DC_MASTER_KEY, $_POST['your_pwd']))) { throw new Exception(__('Password verification failed')); } if (!empty($_POST['upload_pkg'])) { files::uploadStatus($_FILES['pkg_file']); $dest = $this->getPath().'/'.$_FILES['pkg_file']['name']; if (!move_uploaded_file($_FILES['pkg_file']['tmp_name'], $dest)) { throw new Exception(__('Unable to move uploaded file.')); } } else { $url = urldecode($_POST['pkg_url']); $dest = $this->getPath().'/'.basename($url); $this->store->download($url, $dest); } # --BEHAVIOR-- themeBeforeAdd $this->core->callBehavior('themeBeforeAdd', null); $ret_code = $this->store->install($dest); # --BEHAVIOR-- themeAfterAdd $this->core->callBehavior('themeAfterAdd', null); dcPage::addSuccessNotice($ret_code == 2 ? __('Theme has been successfully updated.') : __('Theme has been successfully installed.') ); http::redirect($this->getURL().'#themes'); } else { # --BEHAVIOR-- adminModulesListDoActions $this->core->callBehavior('adminModulesListDoActions', $this, $modules, 'theme'); } return null; } } dotclear-2.6.2+dfsg/inc/admin/lib.pager.php000066400000000000000000000403571230033266200204600ustar00rootroot00000000000000%s'; return sprintf ($formatter, $li_class,$href,$img_src,$img_alt,$img_alt); } else { $formatter = ''; return sprintf ($formatter, $li_class,$img_src_nolink,$img_alt,$img_alt); } } public function setURL() { parent::setURL(); $url = parse_url($_SERVER['REQUEST_URI']); if (isset($url['query'])) { parse_str($url['query'],$args); } else { $args=array(); } # Removing session information if (session_id()) { if (isset($args[session_name()])) unset($args[session_name()]); } if (isset($args[$this->var_page])) { unset($args[$this->var_page]); } if (isset($args['ok'])) { unset($args['ok']); } $this->form_hidden = ''; foreach ($args as $k=>$v) { if (is_array($v)) { foreach ($v as $k2=>$v2) { $this->form_hidden .= form::hidden(array($k.'[]'),$v2); } } else { $this->form_hidden .= form::hidden(array($k),$v); } } $this->form_action = $url['path']; } /** * Pager Links * * Returns pager links * * @return string */ public function getLinks() { $this->setURL(); $htmlFirst = $this->getLink( "first", sprintf($this->page_url,1), "images/pagination/first.png", "images/pagination/no-first.png", __('First page'), ($this->env > 1) ); $htmlPrev = $this->getLink( "prev", sprintf($this->page_url,$this->env-1), "images/pagination/previous.png", "images/pagination/no-previous.png", __('Previous page'), ($this->env > 1) ); $htmlNext = $this->getLink( "next", sprintf($this->page_url,$this->env+1), "images/pagination/next.png", "images/pagination/no-next.png", __('Next page'), ($this->env < $this->nb_pages) ); $htmlLast = $this->getLink( "last", sprintf($this->page_url,$this->nb_pages), "images/pagination/last.png", "images/pagination/no-last.png", __('Last page'), ($this->env < $this->nb_pages) ); $htmlCurrent = '
  • '. sprintf(__('Page %s / %s'),$this->env,$this->nb_pages). '
  • '; $htmlDirect = ($this->nb_pages > 1 ? sprintf('
  • '.__('Direct access page %s'), form::field(array($this->var_page),3,10)). ''.$this->form_hidden.'
  • ' : ''); $res = '
    '. '
      '. $htmlFirst. $htmlPrev. $htmlCurrent. $htmlNext. $htmlLast. $htmlDirect. '
    '. '
    '. '
    ' ; return $this->nb_elements > 0 ? $res : ''; } } class adminGenericList { protected $core; protected $rs; protected $rs_count; public function __construct($core,$rs,$rs_count) { $this->core =& $core; $this->rs =& $rs; $this->rs_count = $rs_count; $this->html_prev = __('« prev.'); $this->html_next = __('next »'); } } class adminPostList extends adminGenericList { public function display($page,$nb_per_page,$enclose_block='',$filter=false) { if ($this->rs->isEmpty()) { if( $filter ) { echo '

    '.__('No entry matches the filter').'

    '; } else { echo '

    '.__('No entry').'

    '; } } else { $pager = new dcPager($page,$this->rs_count,$nb_per_page,10); $entries = array(); if (isset($_REQUEST['entries'])) { foreach ($_REQUEST['entries'] as $v) { $entries[(integer)$v]=true; } } $html_block = '
    '. ''; if( $filter ) { $html_block .= ''; } else { $html_block .= ''; } $html_block .= ''. ''. ''. ''. ''. ''. ''. ''. '%s
    '.sprintf(__('List of %s entries match the filter.'), $this->rs_count).'
    '.__('Title').''.__('Date').''.__('Category').''.__('Author').''.__('Status').'
    '; if ($enclose_block) { $html_block = sprintf($enclose_block,$html_block); } echo $pager->getLinks(); $blocks = explode('%s',$html_block); echo $blocks[0]; while ($this->rs->fetch()) { echo $this->postLine(isset($entries[$this->rs->post_id])); } echo $blocks[1]; echo $pager->getLinks(); } } private function postLine($checked) { if ($this->core->auth->check('categories',$this->core->blog->id)) { $cat_link = '%s'; } else { $cat_link = '%2$s'; } if ($this->rs->cat_title) { $cat_title = sprintf($cat_link,$this->rs->cat_id, html::escapeHTML($this->rs->cat_title)); } else { $cat_title = __('(No cat)'); } $img = '%1$s'; switch ($this->rs->post_status) { case 1: $img_status = sprintf($img,__('Published'),'check-on.png'); break; case 0: $img_status = sprintf($img,__('Unpublished'),'check-off.png'); break; case -1: $img_status = sprintf($img,__('Scheduled'),'scheduled.png'); break; case -2: $img_status = sprintf($img,__('Pending'),'check-wrn.png'); break; } $protected = ''; if ($this->rs->post_password) { $protected = sprintf($img,__('Protected'),'locker.png'); } $selected = ''; if ($this->rs->post_selected) { $selected = sprintf($img,__('Selected'),'selected.png'); } $attach = ''; $nb_media = $this->rs->countMedia(); if ($nb_media > 0) { $attach_str = $nb_media == 1 ? __('%d attachment') : __('%d attachments'); $attach = sprintf($img,sprintf($attach_str,$nb_media),'attach.png'); } $res = ''; $res .= ''. form::checkbox(array('entries[]'),$this->rs->post_id,$checked,'','',!$this->rs->isEditable()).''. ''. html::escapeHTML($this->rs->post_title).''. ''.dt::dt2str(__('%Y-%m-%d %H:%M'),$this->rs->post_dt).''. ''.$cat_title.''. ''.html::escapeHTML($this->rs->user_id).''. ''.$this->rs->nb_comment.''. ''.$this->rs->nb_trackback.''. ''.$img_status.' '.$selected.' '.$protected.' '.$attach.''. ''; return $res; } } class adminPostMiniList extends adminGenericList { public function display($page,$nb_per_page,$enclose_block='') { if ($this->rs->isEmpty()) { echo '

    '.__('No entry').'

    '; } else { $pager = new dcPager($page,$this->rs_count,$nb_per_page,10); $html_block = '
    '. ''. ''. ''. ''. ''. '%s
    '.__('Title').''.__('Date').''.__('Author').''.__('Status').'
    '; if ($enclose_block) { $html_block = sprintf($enclose_block,$html_block); } echo $pager->getLinks(); $blocks = explode('%s',$html_block); echo $blocks[0]; while ($this->rs->fetch()) { echo $this->postLine(); } echo $blocks[1]; echo $pager->getLinks(); } } private function postLine() { $img = '%1$s'; switch ($this->rs->post_status) { case 1: $img_status = sprintf($img,__('Published'),'check-on.png'); break; case 0: $img_status = sprintf($img,__('Unpublished'),'check-off.png'); break; case -1: $img_status = sprintf($img,__('Scheduled'),'scheduled.png'); break; case -2: $img_status = sprintf($img,__('Pending'),'check-wrn.png'); break; } $protected = ''; if ($this->rs->post_password) { $protected = sprintf($img,__('Protected'),'locker.png'); } $selected = ''; if ($this->rs->post_selected) { $selected = sprintf($img,__('Selected'),'selected.png'); } $attach = ''; $nb_media = $this->rs->countMedia(); if ($nb_media > 0) { $attach_str = $nb_media == 1 ? __('%d attachment') : __('%d attachments'); $attach = sprintf($img,sprintf($attach_str,$nb_media),'attach.png'); } $res = ''; $res .= ''. html::escapeHTML($this->rs->post_title).''. ''.dt::dt2str(__('%Y-%m-%d %H:%M'),$this->rs->post_dt).''. ''.html::escapeHTML($this->rs->user_id).''. ''.$img_status.' '.$selected.' '.$protected.' '.$attach.''. ''; return $res; } } class adminCommentList extends adminGenericList { public function display($page,$nb_per_page,$enclose_block='',$filter=false) { if ($this->rs->isEmpty()) { if( $filter ) { echo '

    '.__('No comments or trackbacks matches the filter').'

    '; } else { echo '

    '.__('No comment').'

    '; } } else { $pager = new dcPager($page,$this->rs_count,$nb_per_page,10); $comments = array(); if (isset($_REQUEST['comments'])) { foreach ($_REQUEST['comments'] as $v) { $comments[(integer)$v]=true; } } $html_block = '
    '. ''; if( $filter ) { $html_block .= ''; } else { $html_block .= ''; } $html_block .= ''. ''. ''. ''. ''. ''. '%s
    '. sprintf(__( 'Comment or trackback matching the filter.', 'List of %s comments or trackbacks matching the filter.', $this->rs_count), $this->rs_count). '
    '.__('Type').''.__('Author').''.__('Date').''.__('Status').''.__('Entry').'
    '; if ($enclose_block) { $html_block = sprintf($enclose_block,$html_block); } echo $pager->getLinks(); $blocks = explode('%s',$html_block); echo $blocks[0]; while ($this->rs->fetch()) { echo $this->commentLine(isset($comments[$this->rs->comment_id])); } echo $blocks[1]; echo $pager->getLinks(); } } private function commentLine($checked=false) { global $author, $status, $sortby, $order, $nb_per_page; $author_url = 'comments.php?n='.$nb_per_page. '&status='.$status. '&sortby='.$sortby. '&order='.$order. '&author='.rawurlencode($this->rs->comment_author); $post_url = $this->core->getPostAdminURL($this->rs->post_type,$this->rs->post_id); $comment_url = 'comment.php?id='.$this->rs->comment_id; $comment_dt = dt::dt2str($this->core->blog->settings->system->date_format.' - '. $this->core->blog->settings->system->time_format,$this->rs->comment_dt); $img = '%1$s'; switch ($this->rs->comment_status) { case 1: $img_status = sprintf($img,__('Published'),'check-on.png'); break; case 0: $img_status = sprintf($img,__('Unpublished'),'check-off.png'); break; case -1: $img_status = sprintf($img,__('Pending'),'check-wrn.png'); break; case -2: $img_status = sprintf($img,__('Junk'),'junk.png'); break; } $post_title = html::escapeHTML($this->rs->post_title); if (mb_strlen($post_title) > 70) { $post_title = mb_strcut($post_title,0,67).'...'; } $comment_title = sprintf(__('Edit the %1$s from %2$s'), $this->rs->comment_trackback ? __('trackback') : __('comment'), html::escapeHTML($this->rs->comment_author)); $res = ''; $res .= ''. form::checkbox(array('comments[]'),$this->rs->comment_id,$checked,'','',0).''. ''. ''. ''.__('Edit').' '. ($this->rs->comment_trackback ? __('trackback') : __('comment')).' '.''. ''.html::escapeHTML($this->rs->comment_author).''. ''.dt::dt2str(__('%Y-%m-%d %H:%M'),$this->rs->comment_dt).''. ''.$img_status.''. ''. html::escapeHTML($post_title).''. ($this->rs->post_type != 'post' ? ' ('.html::escapeHTML($this->rs->post_type).')' : '').''; $res .= ''; return $res; } } class adminUserList extends adminGenericList { public function display($page,$nb_per_page,$enclose_block='',$filter=false) { if ($this->rs->isEmpty()) { if( $filter ) { echo '

    '.__('No user matches the filter').'

    '; } else { echo '

    '.__('No user').'

    '; } } else { $pager = new dcPager($page,$this->rs_count,$nb_per_page,10); $html_block = '
    '. ''; if( $filter ) { $html_block .= ''; } else { $html_block .= ''; } $html_block .= ''. ''. ''. ''. ''. ''. '%s
    '.sprintf(__('List of %s users match the filter.'), $this->rs_count).'
    '.__('Username').''.__('First Name').''.__('Last Name').''.__('Display name').''.__('Entries (all types)').'
    '; if ($enclose_block) { $html_block = sprintf($enclose_block,$html_block); } echo $pager->getLinks(); $blocks = explode('%s',$html_block); echo $blocks[0]; while ($this->rs->fetch()) { echo $this->userLine(); } echo $blocks[1]; echo $pager->getLinks(); } } private function userLine() { $img = '%1$s'; $img_status = ''; $p = $this->core->getUserPermissions($this->rs->user_id); if (isset($p[$this->core->blog->id]['p']['admin'])) { $img_status = sprintf($img,__('admin'),'admin.png'); } if ($this->rs->user_super) { $img_status = sprintf($img,__('superadmin'),'superadmin.png'); } return ''. ''.form::hidden(array('nb_post[]'),(integer) $this->rs->nb_post). form::checkbox(array('users[]'),$this->rs->user_id).''. ''. $this->rs->user_id.' '.$img_status.''. ''.html::escapeHTML($this->rs->user_firstname).''. ''.html::escapeHTML($this->rs->user_name).''. ''.html::escapeHTML($this->rs->user_displayname).''. ''. $this->rs->nb_post.''. ''; } } dotclear-2.6.2+dfsg/inc/admin/prepend.php000066400000000000000000000216621230033266200202500ustar00rootroot00000000000000auth->getInfo('user_lang'); $_lang = preg_match('/^[a-z]{2}(-[a-z]{2})?$/',$_lang) ? $_lang : 'en'; l10n::lang($_lang); if (l10n::set(dirname(__FILE__).'/../../locales/'.$_lang.'/date') === false && $_lang != 'en') { l10n::set(dirname(__FILE__).'/../../locales/en/date'); } l10n::set(dirname(__FILE__).'/../../locales/'.$_lang.'/main'); l10n::set(dirname(__FILE__).'/../../locales/'.$_lang.'/public'); l10n::set(dirname(__FILE__).'/../../locales/'.$_lang.'/plugins'); } function dc_admin_icon_url($img) { global $core; $core->auth->user_prefs->addWorkspace('interface'); $user_ui_iconset = @$core->auth->user_prefs->interface->iconset; if (($user_ui_iconset) && ($img)) { $icon = false; if ((preg_match('/^images\/menu\/(.+)$/',$img,$m)) || (preg_match('/^index\.php\?pf=(.+)$/',$img,$m))) { if ($m[1]) { $icon = path::real(dirname(__FILE__).'/../../admin/images/iconset/'.$user_ui_iconset.'/'.$m[1],false); if ($icon !== false) { $allow_types = array('png','jpg','jpeg','gif'); if (is_file($icon) && is_readable($icon) && in_array(files::getExtension($icon),$allow_types)) { return DC_ADMIN_URL.'images/iconset/'.$user_ui_iconset.'/'.$m[1]; } } } } } return $img; } if (defined('DC_AUTH_SESS_ID') && defined('DC_AUTH_SESS_UID')) { # We have session information in constants $_COOKIE[DC_SESSION_NAME] = DC_AUTH_SESS_ID; if (!$core->auth->checkSession(DC_AUTH_SESS_UID)) { throw new Exception('Invalid session data.'); } # Check nonce from POST requests if (!empty($_POST)) { if (empty($_POST['xd_check']) || !$core->checkNonce($_POST['xd_check'])) { throw new Exception('Precondition Failed.'); } } if (empty($_SESSION['sess_blog_id'])) { throw new Exception('Permission denied.'); } # Loading locales dc_load_locales(); $core->setBlog($_SESSION['sess_blog_id']); if (!$core->blog->id) { throw new Exception('Permission denied.'); } } elseif ($core->auth->sessionExists()) { # If we have a session we launch it now try { if (!$core->auth->checkSession()) { # Avoid loop caused by old cookie $p = $core->session->getCookieParameters(false,-600); $p[3] = '/'; call_user_func_array('setcookie',$p); http::redirect('auth.php'); } } catch (Exception $e) { __error(__('Database error') ,__('There seems to be no Session table in your database. Is Dotclear completly installed?') ,20); } # Check nonce from POST requests if (!empty($_POST)) { if (empty($_POST['xd_check']) || !$core->checkNonce($_POST['xd_check'])) { http::head(412); header('Content-Type: text/plain'); echo 'Precondition Failed'; exit; } } if (!empty($_REQUEST['switchblog']) && $core->auth->getPermissions($_REQUEST['switchblog']) !== false) { $_SESSION['sess_blog_id'] = $_REQUEST['switchblog']; if (isset($_SESSION['media_manager_dir'])) { unset($_SESSION['media_manager_dir']); } if (isset($_SESSION['media_manager_page'])) { unset($_SESSION['media_manager_page']); } # Removing switchblog from URL $redir = $_SERVER['REQUEST_URI']; $redir = preg_replace('/switchblog=(.*?)(&|$)/','',$redir); $redir = preg_replace('/\?$/','',$redir); http::redirect($redir); exit; } # Check blog to use and log out if no result if (isset($_SESSION['sess_blog_id'])) { if ($core->auth->getPermissions($_SESSION['sess_blog_id']) === false) { unset($_SESSION['sess_blog_id']); } } else { if (($b = $core->auth->findUserBlog($core->auth->getInfo('user_default_blog'))) !== false) { $_SESSION['sess_blog_id'] = $b; unset($b); } } # Loading locales dc_load_locales(); if (isset($_SESSION['sess_blog_id'])) { $core->setBlog($_SESSION['sess_blog_id']); } else { $core->session->destroy(); http::redirect('auth.php'); } /* # Check add to my fav fired if (!empty($_REQUEST['add-favorite'])) { $redir = $_SERVER['REQUEST_URI']; # Extract admin page from URI # TO BE COMPLETED } */ } if ($core->auth->userID() && $core->blog !== null) { # Loading resources and help files $locales_root = dirname(__FILE__).'/../../locales/'; require $locales_root.'/en/resources.php'; if (($f = l10n::getFilePath($locales_root,'resources.php',$_lang))) { require $f; } unset($f); if (($hfiles = @scandir($locales_root.$_lang.'/help')) !== false) { foreach ($hfiles as $hfile) { if (preg_match('/^(.*)\.html$/',$hfile,$m)) { $GLOBALS['__resources']['help'][$m[1]] = $locales_root.$_lang.'/help/'.$hfile; } } } unset($hfiles,$locales_root); // Contextual help flag $GLOBALS['__resources']['ctxhelp'] = false; $core->auth->user_prefs->addWorkspace('interface'); $user_ui_nofavmenu = $core->auth->user_prefs->interface->nofavmenu; $core->favs = new dcFavorites($core); # [] : Title, URL, small icon, large icon, permissions, id, class # NB : '*' in permissions means any, null means super admin only # Menus creation $_menu = new ArrayObject(); $_menu['Dashboard'] = new dcMenu('dashboard-menu',null); if (!$user_ui_nofavmenu) { $core->favs->appendMenuTitle($_menu); } $_menu['Blog'] = new dcMenu('blog-menu','Blog'); $_menu['System'] = new dcMenu('system-menu','System'); $_menu['Plugins'] = new dcMenu('plugins-menu','Plugins'); # Loading plugins $core->plugins->loadModules(DC_PLUGINS_ROOT,'admin',$_lang); $core->favs->setup(); if (!$user_ui_nofavmenu) { $core->favs->appendMenu($_menu); } # Set menu titles $_menu['System']->title = __('System settings'); $_menu['Blog']->title = __('Blog'); $_menu['Plugins']->title = __('Plugins'); $_menu['Blog']->prependItem(__('Blog appearance'),'blog_theme.php','images/menu/themes.png', preg_match('/blog_theme.php(\?.*)?$/',$_SERVER['REQUEST_URI']), $core->auth->check('admin',$core->blog->id)); $_menu['Blog']->prependItem(__('Blog settings'),'blog_pref.php','images/menu/blog-pref.png', preg_match('/blog_pref.php(\?.*)?$/',$_SERVER['REQUEST_URI']), $core->auth->check('admin',$core->blog->id)); $_menu['Blog']->prependItem(__('Media manager'),'media.php','images/menu/media.png', preg_match('/media(_item)?.php(\?.*)?$/',$_SERVER['REQUEST_URI']), $core->auth->check('media,media_admin',$core->blog->id)); $_menu['Blog']->prependItem(__('Categories'),'categories.php','images/menu/categories.png', preg_match('/categories.php(\?.*)?$/',$_SERVER['REQUEST_URI']), $core->auth->check('categories',$core->blog->id)); $_menu['Blog']->prependItem(__('Search'),'search.php','images/menu/search.png', preg_match('/search.php(\?.*)?$/',$_SERVER['REQUEST_URI']), $core->auth->check('usage,contentadmin',$core->blog->id)); $_menu['Blog']->prependItem(__('Comments'),'comments.php','images/menu/comments.png', preg_match('/comments.php(\?.*)?$/',$_SERVER['REQUEST_URI']), $core->auth->check('usage,contentadmin',$core->blog->id)); $_menu['Blog']->prependItem(__('Entries'),'posts.php','images/menu/entries.png', preg_match('/posts.php(\?.*)?$/',$_SERVER['REQUEST_URI']), $core->auth->check('usage,contentadmin',$core->blog->id)); $_menu['Blog']->prependItem(__('New entry'),'post.php','images/menu/edit.png', preg_match('/post.php$/',$_SERVER['REQUEST_URI']), $core->auth->check('usage,contentadmin',$core->blog->id)); $_menu['System']->prependItem(__('Update'),'update.php','images/menu/update.png', preg_match('/update.php(\?.*)?$/',$_SERVER['REQUEST_URI']), $core->auth->isSuperAdmin() && is_readable(DC_DIGESTS)); $_menu['System']->prependItem(__('Languages'),'langs.php','images/menu/langs.png', preg_match('/langs.php(\?.*)?$/',$_SERVER['REQUEST_URI']), $core->auth->isSuperAdmin()); $_menu['System']->prependItem(__('Plugins management'),'plugins.php','images/menu/plugins.png', preg_match('/plugins.php(\?.*)?$/',$_SERVER['REQUEST_URI']), $core->auth->isSuperAdmin()); $_menu['System']->prependItem(__('Users'),'users.php','images/menu/users.png', preg_match('/users.php$/',$_SERVER['REQUEST_URI']), $core->auth->isSuperAdmin()); $_menu['System']->prependItem(__('Blogs'),'blogs.php','images/menu/blogs.png', preg_match('/blogs.php$/',$_SERVER['REQUEST_URI']), $core->auth->isSuperAdmin() || $core->auth->check('usage,contentadmin',$core->blog->id) && $core->auth->getBlogCount() > 1); if (empty($core->blog->settings->system->jquery_migrate_mute)) { $core->blog->settings->system->put('jquery_migrate_mute', true, 'boolean', 'Mute warnings for jquery migrate plugin ?', false); } } dotclear-2.6.2+dfsg/inc/config.php.in000066400000000000000000000034541230033266200173740ustar00rootroot00000000000000core =& $core; $this->con =& $core->con; $this->blog_table = $core->prefix.'blog'; $this->user_table = $core->prefix.'user'; $this->perm_table = $core->prefix.'permissions'; $this->perm_types = array( 'admin' => __('administrator'), 'usage' => __('manage their own entries and comments'), 'publish' => __('publish entries and comments'), 'delete' => __('delete entries and comments'), 'contentadmin' => __('manage all entries and comments'), 'categories' => __('manage categories'), 'media' => __('manage their own media items'), 'media_admin' => __('manage all media items') ); } /// @name Credentials and user permissions //@{ /** * Checks if user exists and can log in. $pwd argument is optionnal * while you may need to check user without password. This method will create * credentials and populate all needed object properties. * * @param string $user_id User ID * @param string $pwd User password * @param string $user_key User key check * @param boolean $check_blog checks if user is associated to a blog or not. * @return boolean */ public function checkUser($user_id, $pwd=null, $user_key=null, $check_blog=true) { # Check user and password $strReq = 'SELECT user_id, user_super, user_pwd, user_change_pwd, '. 'user_name, user_firstname, user_displayname, user_email, '. 'user_url, user_default_blog, user_options, '. 'user_lang, user_tz, user_post_status, user_creadt, user_upddt '. 'FROM '.$this->con->escapeSystem($this->user_table).' '. "WHERE user_id = '".$this->con->escape($user_id)."' "; try { $rs = $this->con->select($strReq); } catch (Exception $e) { $err = $e->getMessage(); return false; } if ($rs->isEmpty()) { sleep(rand(2,5)); return false; } $rs->extend('rsExtUser'); if ($pwd != '') { if (crypt::hmac(DC_MASTER_KEY,$pwd) != $rs->user_pwd) { sleep(rand(2,5)); return false; } } elseif ($user_key != '') { if (http::browserUID(DC_MASTER_KEY.$rs->user_id.$rs->user_pwd) != $user_key) { return false; } } $this->user_id = $rs->user_id; $this->user_change_pwd = (boolean) $rs->user_change_pwd; $this->user_admin = (boolean) $rs->user_super; $this->user_info['user_pwd'] = $rs->user_pwd; $this->user_info['user_name'] = $rs->user_name; $this->user_info['user_firstname'] = $rs->user_firstname; $this->user_info['user_displayname'] = $rs->user_displayname; $this->user_info['user_email'] = $rs->user_email; $this->user_info['user_url'] = $rs->user_url; $this->user_info['user_default_blog'] = $rs->user_default_blog; $this->user_info['user_lang'] = $rs->user_lang; $this->user_info['user_tz'] = $rs->user_tz; $this->user_info['user_post_status'] = $rs->user_post_status; $this->user_info['user_creadt'] = $rs->user_creadt; $this->user_info['user_upddt'] = $rs->user_upddt; $this->user_info['user_cn'] = dcUtils::getUserCN($rs->user_id, $rs->user_name, $rs->user_firstname, $rs->user_displayname); $this->user_options = array_merge($this->core->userDefaults(),$rs->options()); $this->user_prefs = new dcPrefs($this->core,$this->user_id); # Get permissions on blogs if ($check_blog && ($this->findUserBlog() === false)) { return false; } return true; } /** * This method only check current user password. * * @param string $pwd User password * @return boolean */ public function checkPassword($pwd) { if (!empty($this->user_info['user_pwd'])) { return $pwd == $this->user_info['user_pwd']; } return false; } /** * This method checks if user session cookie exists * * @return boolean */ public function sessionExists() { return isset($_COOKIE[DC_SESSION_NAME]); } /** * This method checks user session validity. * * @return boolean */ public function checkSession($uid=null) { $this->core->session->start(); # If session does not exist, logout. if (!isset($_SESSION['sess_user_id'])) { $this->core->session->destroy(); return false; } # Check here for user and IP address $this->checkUser($_SESSION['sess_user_id']); $uid = $uid ? $uid : http::browserUID(DC_MASTER_KEY); $user_can_log = $this->userID() !== null && $uid == $_SESSION['sess_browser_uid']; if (!$user_can_log) { $this->core->session->destroy(); return false; } return true; } /** * Checks if user must change his password in order to login. * * @return boolean */ public function mustChangePassword() { return $this->user_change_pwd; } /** * Checks if user is super admin * * @return boolean */ public function isSuperAdmin() { return $this->user_admin; } /** * Checks if user has permissions given in $permissions for blog * $blog_id. $permissions is a coma separated list of * permissions. * * @param string $permissions Permissions list * @param string $blog_id Blog ID * @return boolean */ public function check($permissions,$blog_id) { if ($this->user_admin) { return true; } $p = explode(',',$permissions); $b = $this->getPermissions($blog_id); if ($b != false) { if (isset($b['admin'])) { return true; } foreach ($p as $v) { if (isset($b[$v])) { return true; } } } return false; } /** * Returns true if user is allowed to change its password. * * @return boolean */ public function allowPassChange() { return $this->allow_pass_change; } //@} /// @name User code handlers //@{ public function getUserCode() { $code = pack('a32',$this->userID()). pack('H*',crypt::hmac(DC_MASTER_KEY,$this->getInfo('user_pwd'))); return bin2hex($code); } public function checkUserCode($code) { $code = @pack('H*',$code); $user_id = trim(@pack('a32',substr($code,0,32))); $pwd = @unpack('H40hex',substr($code,32,40)); if ($user_id === false || $pwd === false) { return false; } $pwd = $pwd['hex']; $strReq = 'SELECT user_id, user_pwd '. 'FROM '.$this->user_table.' '. "WHERE user_id = '".$this->con->escape($user_id)."' "; $rs = $this->con->select($strReq); if ($rs->isEmpty()) { return false; } if (crypt::hmac(DC_MASTER_KEY,$rs->user_pwd) != $pwd) { return false; } return $rs->user_id; } //@} /// @name Sudo //@{ /** * Calls $f function with super admin rights. * Returns the function result. * * @param callback $f Callback function * @return mixed */ public function sudo($f) { if (!is_callable($f)) { throw new Exception($f.' function doest not exist'); } $args = func_get_args(); array_shift($args); if ($this->user_admin) { $res = call_user_func_array($f,$args); } else { $this->user_admin = true; try { $res = call_user_func_array($f,$args); $this->user_admin = false; } catch (Exception $e) { $this->user_admin = false; throw $e; } } return $res; } //@} /// @name User information and options //@{ /** * Returns user permissions for a blog as an array which looks like: * * - [blog_id] * - [permission] => true * - ... * * @param string $blog_id Blog ID * @return array */ public function getPermissions($blog_id) { if (isset($this->blogs[$blog_id])) { return $this->blogs[$blog_id]; } if ($this->user_admin) { $strReq = 'SELECT blog_id '. 'from '.$this->blog_table.' '. "WHERE blog_id = '".$this->con->escape($blog_id)."' "; $rs = $this->con->select($strReq); $this->blogs[$blog_id] = $rs->isEmpty() ? false : array('admin' => true); return $this->blogs[$blog_id]; } $strReq = 'SELECT permissions '. 'FROM '.$this->perm_table.' '. "WHERE user_id = '".$this->con->escape($this->user_id)."' ". "AND blog_id = '".$this->con->escape($blog_id)."' ". "AND (permissions LIKE '%|usage|%' OR permissions LIKE '%|admin|%' OR permissions LIKE '%|contentadmin|%') "; $rs = $this->con->select($strReq); $this->blogs[$blog_id] = $rs->isEmpty() ? false : $this->parsePermissions($rs->permissions); return $this->blogs[$blog_id]; } public function getBlogCount() { if ($this->blog_count === null) { $this->blog_count = $this->core->getBlogs(array(),true)->f(0); } return $this->blog_count; } public function findUserBlog($blog_id=null) { if ($blog_id && $this->getPermissions($blog_id) !== false) { return $blog_id; } else { if ($this->user_admin) { $strReq = 'SELECT blog_id '. 'FROM '.$this->blog_table.' '. 'ORDER BY blog_id ASC '. $this->con->limit(1); } else { $strReq = 'SELECT blog_id '. 'FROM '.$this->perm_table.' '. "WHERE user_id = '".$this->con->escape($this->user_id)."' ". "AND (permissions LIKE '%|usage|%' OR permissions LIKE '%|admin|%' OR permissions LIKE '%|contentadmin|%') ". 'ORDER BY blog_id ASC '. $this->con->limit(1); } $rs = $this->con->select($strReq); if (!$rs->isEmpty()) { return $rs->blog_id; } } return false; } /** * Returns current user ID * * @return string */ public function userID() { return $this->user_id; } /** * Returns information about a user . * * @param string $n Information name * @return string */ public function getInfo($n) { if (isset($this->user_info[$n])) { return $this->user_info[$n]; } return null; } /** * Returns a specific user option * * @param string $n Option name * @return string */ public function getOption($n) { if (isset($this->user_options[$n])) { return $this->user_options[$n]; } return null; } /** * Returns all user options in an associative array. * * @return array */ public function getOptions() { return $this->user_options; } //@} /// @name Permissions //@{ /** * Returns an array with permissions parsed from the string $level * * @param string $level Permissions string * @return array */ public function parsePermissions($level) { $level = preg_replace('/^\|/','',$level); $level = preg_replace('/\|$/','',$level); $res = array(); foreach (explode('|',$level) as $v) { $res[$v] = true; } return $res; } /** * Returns perm_types property content. * * @return array */ public function getPermissionsTypes() { return $this->perm_types; } /** * Adds a new permission type. * * @param string $name Permission name * @param string $title Permission title */ public function setPermissionType($name,$title) { $this->perm_types[$name] = $title; } //@} /// @name Password recovery //@{ /** * Add a recover key to a specific user identified by its email and * password. * * @param string $user_id User ID * @param string $user_email User Email * @return string */ public function setRecoverKey($user_id,$user_email) { $strReq = 'SELECT user_id '. 'FROM '.$this->user_table.' '. "WHERE user_id = '".$this->con->escape($user_id)."' ". "AND user_email = '".$this->con->escape($user_email)."' "; $rs = $this->con->select($strReq); if ($rs->isEmpty()) { throw new Exception(__('That user does not exist in the database.')); } $key = md5(uniqid()); $cur = $this->con->openCursor($this->user_table); $cur->user_recover_key = $key; $cur->update("WHERE user_id = '".$this->con->escape($user_id)."'"); return $key; } /** * Creates a new user password using recovery key. Returns an array: * * - user_email * - user_id * - new_pass * * @param string $recover_key Recovery key * @return array */ public function recoverUserPassword($recover_key) { $strReq = 'SELECT user_id, user_email '. 'FROM '.$this->user_table.' '. "WHERE user_recover_key = '".$this->con->escape($recover_key)."' "; $rs = $this->con->select($strReq); if ($rs->isEmpty()) { throw new Exception(__('That key does not exist in the database.')); } $new_pass = crypt::createPassword(); $cur = $this->con->openCursor($this->user_table); $cur->user_pwd = crypt::hmac(DC_MASTER_KEY,$new_pass); $cur->user_recover_key = null; $cur->update("WHERE user_recover_key = '".$this->con->escape($recover_key)."'"); return array('user_email' => $rs->user_email, 'user_id' => $rs->user_id, 'new_pass' => $new_pass); } //@} /** @name User management callbacks This 3 functions only matter if you extend this class and use DC_AUTH_CLASS constant. These are called after core user management functions. Could be useful if you need to add/update/remove stuff in your LDAP directory or other third party authentication database. */ //@{ /** * Called after core->addUser * @see dcCore::addUser * @param cursor $cur User cursor */ public function afterAddUser($cur) {} /** * Called after core->updUser * @see dcCore::updUser * @param string $id User ID * @param cursor $cur User cursor */ public function afterUpdUser($id,$cur) {} /** * Called after core->delUser * @see dcCore::delUser * @param string $id User ID */ public function afterDelUser($id) {} //@} } dotclear-2.6.2+dfsg/inc/core/class.dc.blog.php000066400000000000000000001723521230033266200210720ustar00rootroot00000000000000dcCore Dotclear core reference @param id string Blog ID */ public function __construct($core, $id) { $this->con =& $core->con; $this->prefix = $core->prefix; $this->core =& $core; if (($b = $this->core->getBlog($id)) !== false) { $this->id = $id; $this->uid = $b->blog_uid; $this->name = $b->blog_name; $this->desc = $b->blog_desc; $this->url = $b->blog_url; $this->host = http::getHostFromURL($this->url); $this->creadt = strtotime($b->blog_creadt); $this->upddt = strtotime($b->blog_upddt); $this->status = $b->blog_status; $this->settings = new dcSettings($this->core,$this->id); $this->themes_path = path::fullFromRoot($this->settings->system->themes_path,DC_ROOT); $this->public_path = path::fullFromRoot($this->settings->system->public_path,DC_ROOT); $this->post_status['-2'] = __('Pending'); $this->post_status['-1'] = __('Scheduled'); $this->post_status['0'] = __('Unpublished'); $this->post_status['1'] = __('Published'); $this->comment_status['-2'] = __('Junk'); $this->comment_status['-1'] = __('Pending'); $this->comment_status['0'] = __('Unpublished'); $this->comment_status['1'] = __('Published'); # --BEHAVIOR-- coreBlogConstruct $this->core->callBehavior('coreBlogConstruct',$this); } } /// @name Common public methods //@{ /** Returns blog URL ending with a question mark. */ public function getQmarkURL() { if (substr($this->url,-1) != '?') { return $this->url.'?'; } return $this->url; } /** Returns an entry status name given to a code. Status are translated, never use it for tests. If status code does not exist, returns unpublished. @param s integer Status code @return string Blog status name */ public function getPostStatus($s) { if (isset($this->post_status[$s])) { return $this->post_status[$s]; } return $this->post_status['0']; } /** Returns an array of available entry status codes and names. @return array Simple array with codes in keys and names in value */ public function getAllPostStatus() { return $this->post_status; } /** Returns an array of available comment status codes and names. @return array Simple array with codes in keys and names in value */ public function getAllCommentStatus() { return $this->comment_status; } /** Disallows entries password protection. You need to set it to false while serving a public blog. @param v boolean */ public function withoutPassword($v) { $this->without_password = (boolean) $v; } //@} /// @name Triggers methods //@{ /** Updates blog last update date. Should be called every time you change an element related to the blog. */ public function triggerBlog() { $cur = $this->con->openCursor($this->prefix.'blog'); $cur->blog_upddt = date('Y-m-d H:i:s'); $cur->update("WHERE blog_id = '".$this->con->escape($this->id)."' "); # --BEHAVIOR-- coreBlogAfterTriggerBlog $this->core->callBehavior('coreBlogAfterTriggerBlog',$cur); } /** Updates comment and trackback counters in post table. Should be called every time a comment or trackback is added, removed or changed its status. @param id integer Comment ID @param del boolean If comment is delete, set this to true */ public function triggerComment($id,$del=false) { $this->triggerComments($id,$del); } /** Updates comments and trackbacks counters in post table. Should be called every time comments or trackbacks are added, removed or changed their status. @param ids mixed Comment(s) ID(s) @param del boolean If comment is delete, set this to true @param affected_posts mixed Posts(s) ID(s) */ public function triggerComments($ids, $del=false, $affected_posts=null) { $comments_ids = dcUtils::cleanIds($ids); # Get posts affected by comments edition if (empty($affected_posts)) { $strReq = 'SELECT post_id '. 'FROM '.$this->prefix.'comment '. 'WHERE comment_id'.$this->con->in($comments_ids). 'GROUP BY post_id'; $rs = $this->con->select($strReq); $affected_posts = array(); while ($rs->fetch()) { $affected_posts[] = (integer) $rs->post_id; } } if (!is_array($affected_posts) || empty($affected_posts)) { return; } # Count number of comments if exists for affected posts $strReq = 'SELECT post_id, COUNT(post_id) AS nb_comment, comment_trackback '. 'FROM '.$this->prefix.'comment '. 'WHERE comment_status = 1 '. 'AND post_id'.$this->con->in($affected_posts). 'GROUP BY post_id,comment_trackback'; $rs = $this->con->select($strReq); $posts = array(); while ($rs->fetch()) { if ($rs->comment_trackback) { $posts[$rs->post_id]['trackback'] = $rs->nb_comment; } else { $posts[$rs->post_id]['comment'] = $rs->nb_comment; } } # Update number of comments on affected posts $cur = $this->con->openCursor($this->prefix.'post'); foreach($affected_posts as $post_id) { $cur->clean(); if (!array_key_exists($post_id,$posts)) { $cur->nb_trackback = 0; $cur->nb_comment = 0; } else { $cur->nb_trackback = empty($posts[$post_id]['trackback']) ? 0 : $posts[$post_id]['trackback']; $cur->nb_comment = empty($posts[$post_id]['comment']) ? 0 : $posts[$post_id]['comment']; } $cur->update('WHERE post_id = '.$post_id); } } //@} /// @name Categories management methods //@{ public function categories() { if (!($this->categories instanceof dcCategories)) { $this->categories = new dcCategories($this->core); } return $this->categories; } /** Retrieves categories. $params is an associative array which can take the following parameters: - post_type: Get only entries with given type (default "post") - cat_url: filter on cat_url field - cat_id: filter on cat_id field - start: start with a given category - level: categories level to retrieve @param params array Parameters @return record */ public function getCategories($params=array()) { $c_params = array(); if (isset($params['post_type'])) { $c_params['post_type'] = $params['post_type']; unset($params['post_type']); } $counter = $this->getCategoriesCounter($c_params); if (isset($params['without_empty']) && ($params['without_empty'] == false)) { $without_empty = false; } else { $without_empty = $this->core->auth->userID() == false; # Get all categories if in admin display } $start = isset($params['start']) ? (integer) $params['start'] : 0; $l = isset($params['level']) ? (integer) $params['level'] : 0; $rs = $this->categories()->getChildren($start,null,'desc'); # Get each categories total posts count $data = array(); $stack = array(); $level = 0; $cols = $rs->columns(); while ($rs->fetch()) { $nb_post = isset($counter[$rs->cat_id]) ? (integer) $counter[$rs->cat_id] : 0; if ($rs->level > $level) { $nb_total = $nb_post; $stack[$rs->level] = (integer) $nb_post; } elseif ($rs->level == $level) { $nb_total = $nb_post; $stack[$rs->level] += $nb_post; } else { $nb_total = $stack[$rs->level+1] + $nb_post; if (isset($stack[$rs->level])) { $stack[$rs->level] += $nb_total; } else { $stack[$rs->level] = $nb_total; } unset($stack[$rs->level+1]); } if ($nb_total == 0 && $without_empty) { continue; } $level = $rs->level; $t = array(); foreach ($cols as $c) { $t[$c] = $rs->f($c); } $t['nb_post'] = $nb_post; $t['nb_total'] = $nb_total; if ($l == 0 || ($l > 0 && $l == $rs->level)) { array_unshift($data,$t); } } # We need to apply filter after counting if (isset($params['cat_id']) && $params['cat_id'] !== '') { $found = false; foreach ($data as $v) { if ($v['cat_id'] == $params['cat_id']) { $found = true; $data = array($v); break; } } if (!$found) { $data = array(); } } if (isset($params['cat_url']) && ($params['cat_url'] !== '') && !isset($params['cat_id'])) { $found = false; foreach ($data as $v) { if ($v['cat_url'] == $params['cat_url']) { $found = true; $data = array($v); break; } } if (!$found) { $data = array(); } } return staticRecord::newFromArray($data); } /** Retrieves a category by its ID. @param id integer Category ID @return record */ public function getCategory($id) { return $this->getCategories(array('cat_id' => $id)); } /** Retrieves parents of a given category. @param id integer Category ID @return record */ public function getCategoryParents($id) { return $this->categories()->getParents($id); } /** Retrieves first parent of a given category. @param id integer Category ID @return record */ public function getCategoryParent($id) { return $this->categories()->getParent($id); } /** Retrieves all category's first children @param id integer Category ID @return record */ public function getCategoryFirstChildren($id) { return $this->getCategories(array('start' => $id,'level' => $id == 0 ? 1 : 2)); } private function getCategoriesCounter($params=array()) { $strReq = 'SELECT C.cat_id, COUNT(P.post_id) AS nb_post '. 'FROM '.$this->prefix.'category AS C '. 'JOIN '.$this->prefix."post P ON (C.cat_id = P.cat_id AND P.blog_id = '".$this->con->escape($this->id)."' ) ". "WHERE C.blog_id = '".$this->con->escape($this->id)."' "; if (!$this->core->auth->userID()) { $strReq .= 'AND P.post_status = 1 '; } if (!empty($params['post_type'])) { $strReq .= 'AND P.post_type '.$this->con->in($params['post_type']); } $strReq .= 'GROUP BY C.cat_id '; $rs = $this->con->select($strReq); $counters = array(); while ($rs->fetch()) { $counters[$rs->cat_id] = $rs->nb_post; } return $counters; } /** Creates a new category. Takes a cursor as input and returns the new category ID. @param cur cursor Category cursor @return integer New category ID */ public function addCategory($cur,$parent=0) { if (!$this->core->auth->check('categories',$this->id)) { throw new Exception(__('You are not allowed to add categories')); } $url = array(); if ($parent != 0) { $rs = $this->getCategory($parent); if ($rs->isEmpty()) { $url = array(); } else { $url[] = $rs->cat_url; } } if ($cur->cat_url == '') { $url[] = text::tidyURL($cur->cat_title,false); } else { $url[] = $cur->cat_url; } $cur->cat_url = implode('/',$url); $this->getCategoryCursor($cur); $cur->blog_id = (string) $this->id; # --BEHAVIOR-- coreBeforeCategoryCreate $this->core->callBehavior('coreBeforeCategoryCreate',$this,$cur); $id = $this->categories()->addNode($cur,$parent); # Update category's cursor $rs = $this->getCategory($id); if (!$rs->isEmpty()) { $cur->cat_lft = $rs->cat_lft; $cur->cat_rgt = $rs->cat_rgt; } # --BEHAVIOR-- coreAfterCategoryCreate $this->core->callBehavior('coreAfterCategoryCreate',$this,$cur); $this->triggerBlog(); return $cur->cat_id; } /** Updates an existing category. @param id integer Category ID @param cur cursor Category cursor */ public function updCategory($id,$cur) { if (!$this->core->auth->check('categories',$this->id)) { throw new Exception(__('You are not allowed to update categories')); } if ($cur->cat_url == '') { $url = array(); $rs = $this->categories()->getParents($id); while ($rs->fetch()) { if ($rs->index() == $rs->count()-1) { $url[] = $rs->cat_url; } } $url[] = text::tidyURL($cur->cat_title,false); $cur->cat_url = implode('/',$url); } $this->getCategoryCursor($cur,$id); # --BEHAVIOR-- coreBeforeCategoryUpdate $this->core->callBehavior('coreBeforeCategoryUpdate',$this,$cur); $cur->update( 'WHERE cat_id = '.(integer) $id.' '. "AND blog_id = '".$this->con->escape($this->id)."' "); # --BEHAVIOR-- coreAfterCategoryUpdate $this->core->callBehavior('coreAfterCategoryUpdate',$this,$cur); $this->triggerBlog(); } /** Set category position @param id integer Category ID @param left integer Category ID before @param right integer Category ID after */ public function updCategoryPosition($id,$left,$right) { $this->categories()->updatePosition($id,$left,$right); $this->triggerBlog(); } /** DEPRECATED METHOD. Use dcBlog::setCategoryParent and dcBlog::moveCategory instead. @param id integer Category ID @param order integer Category position */ public function updCategoryOrder($id,$order) { return; } /** Set a category parent @param id integer Category ID @param parent integer Parent Category ID */ public function setCategoryParent($id,$parent) { $this->categories()->setNodeParent($id,$parent); $this->triggerBlog(); } /** Set category position @param id integer Category ID @param sibling integer Sibling Category ID @param move integer Order (before|after) */ public function setCategoryPosition($id,$sibling,$move) { $this->categories()->setNodePosition($id,$sibling,$move); $this->triggerBlog(); } /** Deletes a category. @param id integer Category ID */ public function delCategory($id) { if (!$this->core->auth->check('categories',$this->id)) { throw new Exception(__('You are not allowed to delete categories')); } $strReq = 'SELECT COUNT(post_id) AS nb_post '. 'FROM '.$this->prefix.'post '. 'WHERE cat_id = '.(integer) $id.' '. "AND blog_id = '".$this->con->escape($this->id)."' "; $rs = $this->con->select($strReq); if ($rs->nb_post > 0) { throw new Exception(__('This category is not empty.')); } $this->categories()->deleteNode($id,true); $this->triggerBlog(); } /** Reset categories order and relocate them to first level */ public function resetCategoriesOrder() { if (!$this->core->auth->check('categories',$this->id)) { throw new Exception(__('You are not allowed to reset categories order')); } $this->categories()->resetOrder(); $this->triggerBlog(); } private function checkCategory($title,$url,$id=null) { # Let's check if URL is taken... $strReq = 'SELECT cat_url FROM '.$this->prefix.'category '. "WHERE cat_url = '".$this->con->escape($url)."' ". ($id ? 'AND cat_id <> '.(integer) $id. ' ' : ''). "AND blog_id = '".$this->con->escape($this->id)."' ". 'ORDER BY cat_url DESC'; $rs = $this->con->select($strReq); if (!$rs->isEmpty()) { if ($this->con->driver() == 'mysql' || $this->con->driver() == 'mysqli') { $clause = "REGEXP '^".$this->con->escape($url)."[0-9]+$'"; } elseif ($this->con->driver() == 'pgsql') { $clause = "~ '^".$this->con->escape($url)."[0-9]+$'"; } else { $clause = "LIKE '".$this->con->escape($url)."%'"; } $strReq = 'SELECT cat_url FROM '.$this->prefix.'category '. "WHERE cat_url ".$clause.' '. ($id ? 'AND cat_id <> '.(integer) $id. ' ' : ''). "AND blog_id = '".$this->con->escape($this->id)."' ". 'ORDER BY cat_url DESC '; $rs = $this->con->select($strReq); $a = array(); while ($rs->fetch()) { $a[] = $rs->cat_url; } natsort($a); $t_url = end($a); if (preg_match('/(.*?)([0-9]+)$/',$t_url,$m)) { $i = (integer) $m[2]; $url = $m[1]; } else { $i = 1; } return $url.($i+1); } # URL is empty? if ($url == '') { throw new Exception(__('Empty category URL')); } return $url; } private function getCategoryCursor($cur,$id=null) { if ($cur->cat_title == '') { throw new Exception(__('You must provide a category title')); } # If we don't have any cat_url, let's do one if ($cur->cat_url == '') { $cur->cat_url = text::tidyURL($cur->cat_title,false); } # Still empty ? if ($cur->cat_url == '') { throw new Exception(__('You must provide a category URL')); } else { $cur->cat_url = text::tidyURL($cur->cat_url,true); } # Check if title or url are unique $cur->cat_url = $this->checkCategory($cur->cat_title,$cur->cat_url,$id); if ($cur->cat_desc !== null) { $cur->cat_desc = $this->core->HTMLfilter($cur->cat_desc); } } //@} /// @name Entries management methods //@{ /** Retrieves entries. $params is an array taking the following optionnal parameters: - no_content: Don't retrieve entry content (excerpt and content) - post_type: Get only entries with given type (default "post", array for many types and '' for no type) - post_id: (integer or array) Get entry with given post_id - post_url: Get entry with given post_url field - user_id: (integer) Get entries belonging to given user ID - cat_id: (string or array) Get entries belonging to given category ID - cat_id_not: deprecated (use cat_id with "id ?not" instead) - cat_url: (string or array) Get entries belonging to given category URL - cat_url_not: deprecated (use cat_url with "url ?not" instead) - post_status: (integer) Get entries with given post_status - post_selected: (boolean) Get select flaged entries - post_year: (integer) Get entries with given year - post_month: (integer) Get entries with given month - post_day: (integer) Get entries with given day - post_lang: Get entries with given language code - search: Get entries corresponding of the following search string - columns: (array) More columns to retrieve - sql: Append SQL string at the end of the query - from: Append SQL string after "FROM" statement in query - order: Order of results (default "ORDER BY post_dt DES") - limit: Limit parameter - sql_only : return the sql request instead of results. Only ids are selected - exclude_post_id : (integer or array) Exclude entries with given post_id Please note that on every cat_id or cat_url, you can add ?not to exclude the category and ?sub to get subcategories. @param params array Parameters @param count_only boolean Only counts results @return record A record with some more capabilities or the SQL request */ public function getPosts($params=array(),$count_only=false) { # --BEHAVIOR-- coreBlogBeforeGetPosts $params = new ArrayObject($params); $this->core->callBehavior('coreBlogBeforeGetPosts',$params); if ($count_only) { $strReq = 'SELECT count(DISTINCT P.post_id) '; } elseif (!empty($params['sql_only'])) { $strReq = 'SELECT P.post_id '; } else { if (!empty($params['no_content'])) { $content_req = ''; } else { $content_req = 'post_excerpt, post_excerpt_xhtml, '. 'post_content, post_content_xhtml, post_notes, '; } if (!empty($params['columns']) && is_array($params['columns'])) { $content_req .= implode(', ',$params['columns']).', '; } $strReq = 'SELECT P.post_id, P.blog_id, P.user_id, P.cat_id, post_dt, '. 'post_tz, post_creadt, post_upddt, post_format, post_password, '. 'post_url, post_lang, post_title, '.$content_req. 'post_type, post_meta, post_status, post_selected, post_position, '. 'post_open_comment, post_open_tb, nb_comment, nb_trackback, '. 'U.user_name, U.user_firstname, U.user_displayname, U.user_email, '. 'U.user_url, '. 'C.cat_title, C.cat_url, C.cat_desc '; } $strReq .= 'FROM '.$this->prefix.'post P '. 'INNER JOIN '.$this->prefix.'user U ON U.user_id = P.user_id '. 'LEFT OUTER JOIN '.$this->prefix.'category C ON P.cat_id = C.cat_id '; if (!empty($params['from'])) { $strReq .= $params['from'].' '; } $strReq .= "WHERE P.blog_id = '".$this->con->escape($this->id)."' "; if (!$this->core->auth->check('contentadmin',$this->id)) { $strReq .= 'AND ((post_status = 1 '; if ($this->without_password) { $strReq .= 'AND post_password IS NULL '; } $strReq .= ') '; if ($this->core->auth->userID()) { $strReq .= "OR P.user_id = '".$this->con->escape($this->core->auth->userID())."')"; } else { $strReq .= ') '; } } #Adding parameters if (isset($params['post_type'])) { if (is_array($params['post_type']) || $params['post_type'] != '') { $strReq .= 'AND post_type '.$this->con->in($params['post_type']); } } else { $strReq .= "AND post_type = 'post' "; } if (isset($params['post_id']) && $params['post_id'] !== '') { if (is_array($params['post_id'])) { array_walk($params['post_id'],create_function('&$v,$k','if($v!==null){$v=(integer)$v;}')); } else { $params['post_id'] = array((integer) $params['post_id']); } $strReq .= 'AND P.post_id '.$this->con->in($params['post_id']); } if (isset($params['exclude_post_id']) && $params['exclude_post_id'] !== '') { if (is_array($params['exclude_post_id'])) { array_walk($params['exclude_post_id'],create_function('&$v,$k','if($v!==null){$v=(integer)$v;}')); } else { $params['exclude_post_id'] = array((integer) $params['exclude_post_id']); } $strReq .= 'AND P.post_id NOT '.$this->con->in($params['exclude_post_id']); } if (isset($params['post_url']) && $params['post_url'] !== '') { $strReq .= "AND post_url = '".$this->con->escape($params['post_url'])."' "; } if (!empty($params['user_id'])) { $strReq .= "AND U.user_id = '".$this->con->escape($params['user_id'])."' "; } if (isset($params['cat_id']) && $params['cat_id'] !== '') { if (!is_array($params['cat_id'])) { $params['cat_id'] = array($params['cat_id']); } if (!empty($params['cat_id_not'])) { array_walk($params['cat_id'],create_function('&$v,$k','$v=$v." ?not";')); } $strReq .= 'AND '.$this->getPostsCategoryFilter($params['cat_id'],'cat_id').' '; } elseif (isset($params['cat_url']) && $params['cat_url'] !== '') { if (!is_array($params['cat_url'])) { $params['cat_url'] = array($params['cat_url']); } if (!empty($params['cat_url_not'])) { array_walk($params['cat_url'],create_function('&$v,$k','$v=$v." ?not";')); } $strReq .= 'AND '.$this->getPostsCategoryFilter($params['cat_url'],'cat_url').' '; } /* Other filters */ if (isset($params['post_status'])) { $strReq .= 'AND post_status = '.(integer) $params['post_status'].' '; } if (isset($params['post_selected'])) { $strReq .= 'AND post_selected = '.(integer) $params['post_selected'].' '; } if (!empty($params['post_year'])) { $strReq .= 'AND '.$this->con->dateFormat('post_dt','%Y').' = '. "'".sprintf('%04d',$params['post_year'])."' "; } if (!empty($params['post_month'])) { $strReq .= 'AND '.$this->con->dateFormat('post_dt','%m').' = '. "'".sprintf('%02d',$params['post_month'])."' "; } if (!empty($params['post_day'])) { $strReq .= 'AND '.$this->con->dateFormat('post_dt','%d').' = '. "'".sprintf('%02d',$params['post_day'])."' "; } if (!empty($params['post_lang'])) { $strReq .= "AND P.post_lang = '".$this->con->escape($params['post_lang'])."' "; } if (!empty($params['search'])) { $words = text::splitWords($params['search']); if (!empty($words)) { # --BEHAVIOR-- corePostSearch if ($this->core->hasBehavior('corePostSearch')) { $this->core->callBehavior('corePostSearch',$this->core,array(&$words,&$strReq,&$params)); } if ($words) { foreach ($words as $i => $w) { $words[$i] = "post_words LIKE '%".$this->con->escape($w)."%'"; } $strReq .= 'AND '.implode(' AND ',$words).' '; } } } if (isset($params['media'])) { if ($params['media'] == '0') { $strReq .= 'AND NOT '; } else { $strReq .= 'AND '; } $strReq .= 'EXISTS (SELECT M.post_id FROM '.$this->prefix.'post_media M '. 'WHERE M.post_id = P.post_id '; if (isset($params['link_type'])) { $strReq .= " AND M.link_type ".$this->con->in($params['link_type'])." "; } $strReq .= ")"; } if (!empty($params['sql'])) { $strReq .= $params['sql'].' '; } if (!$count_only) { if (!empty($params['order'])) { $strReq .= 'ORDER BY '.$this->con->escape($params['order']).' '; } else { $strReq .= 'ORDER BY post_dt DESC '; } } if (!$count_only && !empty($params['limit'])) { $strReq .= $this->con->limit($params['limit']); } if (!empty($params['sql_only'])) { return $strReq; } $rs = $this->con->select($strReq); $rs->core = $this->core; $rs->_nb_media = array(); $rs->extend('rsExtPost'); # --BEHAVIOR-- coreBlogGetPosts $this->core->callBehavior('coreBlogGetPosts',$rs); return $rs; } /** Returns a record with post id, title and date for next or previous post according to the post ID. $dir could be 1 (next post) or -1 (previous post). @param post_id integer Post ID @param dir integer Search direction @param restrict_to_category boolean Restrict to post with same category @param restrict_to_lang boolean Restrict to post with same lang @return record */ public function getNextPost($post,$dir,$restrict_to_category=false, $restrict_to_lang=false) { $dt = $post->post_dt; $post_id = (integer) $post->post_id; if($dir > 0) { $sign = '>'; $order = 'ASC'; } else { $sign = '<'; $order = 'DESC'; } $params['post_type'] = $post->post_type; $params['limit'] = 1; $params['order'] = 'post_dt '.$order.', P.post_id '.$order; $params['sql'] = 'AND ( '. " (post_dt = '".$this->con->escape($dt)."' AND P.post_id ".$sign." ".$post_id.") ". " OR post_dt ".$sign." '".$this->con->escape($dt)."' ". ') '; if ($restrict_to_category) { $params['sql'] .= $post->cat_id ? 'AND P.cat_id = '.(integer) $post->cat_id.' ' : 'AND P.cat_id IS NULL '; } if ($restrict_to_lang) { $params['sql'] .= $post->post_lang ? 'AND P.post_lang = \''. $this->con->escape($post->post_lang) .'\' ': 'AND P.post_lang IS NULL '; } $rs = $this->getPosts($params); if ($rs->isEmpty()) { return null; } return $rs; } /** Retrieves different languages and post count on blog, based on post_lang field. $params is an array taking the following optionnal parameters: - post_type: Get only entries with given type (default "post", '' for no type) - lang: retrieve post count for selected lang - order: order statement (default post_lang DESC) @param params array Parameters @return record */ public function getLangs($params=array()) { $strReq = 'SELECT COUNT(post_id) as nb_post, post_lang '. 'FROM '.$this->prefix.'post '. "WHERE blog_id = '".$this->con->escape($this->id)."' ". "AND post_lang <> '' ". "AND post_lang IS NOT NULL "; if (!$this->core->auth->check('contentadmin',$this->id)) { $strReq .= 'AND ((post_status = 1 '; if ($this->without_password) { $strReq .= 'AND post_password IS NULL '; } $strReq .= ') '; if ($this->core->auth->userID()) { $strReq .= "OR user_id = '".$this->con->escape($this->core->auth->userID())."')"; } else { $strReq .= ') '; } } if (isset($params['post_type'])) { if ($params['post_type'] != '') { $strReq .= "AND post_type = '".$this->con->escape($params['post_type'])."' "; } } else { $strReq .= "AND post_type = 'post' "; } if (isset($params['lang'])) { $strReq .= "AND post_lang = '".$this->con->escape($params['lang'])."' "; } $strReq .= 'GROUP BY post_lang '; $order = 'desc'; if (!empty($params['order']) && preg_match('/^(desc|asc)$/i',$params['order'])) { $order = $params['order']; } $strReq .= 'ORDER BY post_lang '.$order.' '; return $this->con->select($strReq); } /** Returns a record with all distinct blog dates and post count. $params is an array taking the following optionnal parameters: - type: (day|month|year) Get days, months or years - year: (integer) Get dates for given year - month: (integer) Get dates for given month - day: (integer) Get dates for given day - cat_id: (integer) Category ID filter - cat_url: Category URL filter - post_lang: lang of the posts - next: Get date following match - previous: Get date before match - order: Sort by date "ASC" or "DESC" @param params array Parameters array @return record */ public function getDates($params=array()) { $dt_f = '%Y-%m-%d'; $dt_fc = '%Y%m%d'; if (isset($params['type'])) { if ($params['type'] == 'year') { $dt_f = '%Y-01-01'; $dt_fc = '%Y0101'; } elseif ($params['type'] == 'month') { $dt_f = '%Y-%m-01'; $dt_fc = '%Y%m01'; } } $dt_f .= ' 00:00:00'; $dt_fc .= '000000'; $cat_field = $catReq = $limit = ''; if (isset($params['cat_id']) && $params['cat_id'] !== '') { $catReq = 'AND P.cat_id = '.(integer) $params['cat_id'].' '; $cat_field = ', C.cat_url '; } elseif (isset($params['cat_url']) && $params['cat_url'] !== '') { $catReq = "AND C.cat_url = '".$this->con->escape($params['cat_url'])."' "; $cat_field = ', C.cat_url '; } if (!empty($params['post_lang'])) { $catReq = 'AND P.post_lang = \''. $params['post_lang'].'\' '; } $strReq = 'SELECT DISTINCT('.$this->con->dateFormat('post_dt',$dt_f).') AS dt '. $cat_field. ',COUNT(P.post_id) AS nb_post '. 'FROM '.$this->prefix.'post P LEFT JOIN '.$this->prefix.'category C '. 'ON P.cat_id = C.cat_id '. "WHERE P.blog_id = '".$this->con->escape($this->id)."' ". $catReq; if (!$this->core->auth->check('contentadmin',$this->id)) { $strReq .= 'AND ((post_status = 1 '; if ($this->without_password) { $strReq .= 'AND post_password IS NULL '; } $strReq .= ') '; if ($this->core->auth->userID()) { $strReq .= "OR P.user_id = '".$this->con->escape($this->core->auth->userID())."')"; } else { $strReq .= ') '; } } if (!empty($params['post_type'])) { $strReq .= "AND post_type ".$this->con->in($params['post_type'])." "; } else { $strReq .= "AND post_type = 'post' "; } if (!empty($params['year'])) { $strReq .= 'AND '.$this->con->dateFormat('post_dt','%Y')." = '".sprintf('%04d',$params['year'])."' "; } if (!empty($params['month'])) { $strReq .= 'AND '.$this->con->dateFormat('post_dt','%m')." = '".sprintf('%02d',$params['month'])."' "; } if (!empty($params['day'])) { $strReq .= 'AND '.$this->con->dateFormat('post_dt','%d')." = '".sprintf('%02d',$params['day'])."' "; } # Get next or previous date if (!empty($params['next']) || !empty($params['previous'])) { if (!empty($params['next'])) { $pdir = ' > '; $params['order'] = 'asc'; $dt = $params['next']; } else { $pdir = ' < '; $params['order'] = 'desc'; $dt = $params['previous']; } $dt = date('YmdHis',strtotime($dt)); $strReq .= 'AND '.$this->con->dateFormat('post_dt',$dt_fc).$pdir."'".$dt."' "; $limit = $this->con->limit(1); } $strReq .= 'GROUP BY dt '.$cat_field; $order = 'desc'; if (!empty($params['order']) && preg_match('/^(desc|asc)$/i',$params['order'])) { $order = $params['order']; } $strReq .= 'ORDER BY dt '.$order.' '. $limit; $rs = $this->con->select($strReq); $rs->extend('rsExtDates'); return $rs; } /** Creates a new entry. Takes a cursor as input and returns the new entry ID. @param cur cursor Post cursor @return integer New post ID */ public function addPost($cur) { if (!$this->core->auth->check('usage,contentadmin',$this->id)) { throw new Exception(__('You are not allowed to create an entry')); } $this->con->writeLock($this->prefix.'post'); try { # Get ID $rs = $this->con->select( 'SELECT MAX(post_id) '. 'FROM '.$this->prefix.'post ' ); $cur->post_id = (integer) $rs->f(0) + 1; $cur->blog_id = (string) $this->id; $cur->post_creadt = date('Y-m-d H:i:s'); $cur->post_upddt = date('Y-m-d H:i:s'); $cur->post_tz = $this->core->auth->getInfo('user_tz'); # Post excerpt and content $this->getPostContent($cur,$cur->post_id); $this->getPostCursor($cur); $cur->post_url = $this->getPostURL($cur->post_url,$cur->post_dt,$cur->post_title,$cur->post_id); if (!$this->core->auth->check('publish,contentadmin',$this->id)) { $cur->post_status = -2; } # --BEHAVIOR-- coreBeforePostCreate $this->core->callBehavior('coreBeforePostCreate',$this,$cur); $cur->insert(); $this->con->unlock(); } catch (Exception $e) { $this->con->unlock(); throw $e; } # --BEHAVIOR-- coreAfterPostCreate $this->core->callBehavior('coreAfterPostCreate',$this,$cur); $this->triggerBlog(); return $cur->post_id; } /** Updates an existing post. @param id integer Post ID @param cur cursor Post cursor */ public function updPost($id,$cur) { if (!$this->core->auth->check('usage,contentadmin',$this->id)) { throw new Exception(__('You are not allowed to update entries')); } $id = (integer) $id; if (empty($id)) { throw new Exception(__('No such entry ID')); } # Post excerpt and content $this->getPostContent($cur,$id); $this->getPostCursor($cur); if ($cur->post_url !== null) { $cur->post_url = $this->getPostURL($cur->post_url,$cur->post_dt,$cur->post_title,$id); } if (!$this->core->auth->check('publish,contentadmin',$this->id)) { $cur->unsetField('post_status'); } $cur->post_upddt = date('Y-m-d H:i:s'); #If user is only "usage", we need to check the post's owner if (!$this->core->auth->check('contentadmin',$this->id)) { $strReq = 'SELECT post_id '. 'FROM '.$this->prefix.'post '. 'WHERE post_id = '.$id.' '. "AND user_id = '".$this->con->escape($this->core->auth->userID())."' "; $rs = $this->con->select($strReq); if ($rs->isEmpty()) { throw new Exception(__('You are not allowed to edit this entry')); } } # --BEHAVIOR-- coreBeforePostUpdate $this->core->callBehavior('coreBeforePostUpdate',$this,$cur); $cur->update('WHERE post_id = '.$id.' '); # --BEHAVIOR-- coreAfterPostUpdate $this->core->callBehavior('coreAfterPostUpdate',$this,$cur); $this->triggerBlog(); } /** Updates post status. @param id integer Post ID @param status integer Post status */ public function updPostStatus($id,$status) { $this->updPostsStatus($id,$status); } /** Updates posts status. @param ids mixed Post(s) ID(s) @param status integer Post status */ public function updPostsStatus($ids,$status) { if (!$this->core->auth->check('publish,contentadmin',$this->id)) { throw new Exception(__('You are not allowed to change this entry status')); } $posts_ids = dcUtils::cleanIds($ids); $status = (integer) $status; $strReq = "WHERE blog_id = '".$this->con->escape($this->id)."' ". "AND post_id ".$this->con->in($posts_ids); #If user can only publish, we need to check the post's owner if (!$this->core->auth->check('contentadmin',$this->id)) { $strReq .= "AND user_id = '".$this->con->escape($this->core->auth->userID())."' "; } $cur = $this->con->openCursor($this->prefix.'post'); $cur->post_status = $status; $cur->post_upddt = date('Y-m-d H:i:s'); $cur->update($strReq); $this->triggerBlog(); } /** Updates post selection. @param id integer Post ID @param selected integer Is selected post */ public function updPostSelected($id,$selected) { $this->updPostsSelected($id,$selected); } /** Updates posts selection. @param ids mixed Post(s) ID(s) @param selected integer Is selected post(s) */ public function updPostsSelected($ids,$selected) { if (!$this->core->auth->check('usage,contentadmin',$this->id)) { throw new Exception(__('You are not allowed to change this entry category')); } $posts_ids = dcUtils::cleanIds($ids); $selected = (boolean) $selected; $strReq = "WHERE blog_id = '".$this->con->escape($this->id)."' ". "AND post_id ".$this->con->in($posts_ids); # If user is only usage, we need to check the post's owner if (!$this->core->auth->check('contentadmin',$this->id)) { $strReq .= "AND user_id = '".$this->con->escape($this->core->auth->userID())."' "; } $cur = $this->con->openCursor($this->prefix.'post'); $cur->post_selected = (integer) $selected; $cur->post_upddt = date('Y-m-d H:i:s'); $cur->update($strReq); $this->triggerBlog(); } /** Updates post category. $cat_id can be null. @param id integer Post ID @param cat_id integer Category ID */ public function updPostCategory($id,$cat_id) { $this->updPostsCategory($id,$cat_id); } /** Updates posts category. $cat_id can be null. @param ids mixed Post(s) ID(s) @param cat_id integer Category ID */ public function updPostsCategory($ids,$cat_id) { if (!$this->core->auth->check('usage,contentadmin',$this->id)) { throw new Exception(__('You are not allowed to change this entry category')); } $posts_ids = dcUtils::cleanIds($ids); $cat_id = (integer) $cat_id; $strReq = "WHERE blog_id = '".$this->con->escape($this->id)."' ". "AND post_id ".$this->con->in($posts_ids); # If user is only usage, we need to check the post's owner if (!$this->core->auth->check('contentadmin',$this->id)) { $strReq .= "AND user_id = '".$this->con->escape($this->core->auth->userID())."' "; } $cur = $this->con->openCursor($this->prefix.'post'); $cur->cat_id = ($cat_id ? $cat_id : null); $cur->post_upddt = date('Y-m-d H:i:s'); $cur->update($strReq); $this->triggerBlog(); } /** Updates posts category. $new_cat_id can be null. @param old_cat_id integer Old category ID @param new_cat_id integer New category ID */ public function changePostsCategory($old_cat_id,$new_cat_id) { if (!$this->core->auth->check('contentadmin,categories',$this->id)) { throw new Exception(__('You are not allowed to change entries category')); } $old_cat_id = (integer) $old_cat_id; $new_cat_id = (integer) $new_cat_id; $cur = $this->con->openCursor($this->prefix.'post'); $cur->cat_id = ($new_cat_id ? $new_cat_id : null); $cur->post_upddt = date('Y-m-d H:i:s'); $cur->update( 'WHERE cat_id = '.$old_cat_id.' '. "AND blog_id = '".$this->con->escape($this->id)."' " ); $this->triggerBlog(); } /** Deletes a post. @param id integer Post ID */ public function delPost($id) { $this->delPosts($id); } /** Deletes multiple posts. @param ids mixed Post(s) ID(s) */ public function delPosts($ids) { if (!$this->core->auth->check('delete,contentadmin',$this->id)) { throw new Exception(__('You are not allowed to delete entries')); } $posts_ids = dcUtils::cleanIds($ids); if (empty($posts_ids)) { throw new Exception(__('No such entry ID')); } $strReq = 'DELETE FROM '.$this->prefix.'post '. "WHERE blog_id = '".$this->con->escape($this->id)."' ". "AND post_id ".$this->con->in($posts_ids); #If user can only delete, we need to check the post's owner if (!$this->core->auth->check('contentadmin',$this->id)) { $strReq .= "AND user_id = '".$this->con->escape($this->core->auth->userID())."' "; } $this->con->execute($strReq); $this->triggerBlog(); } /** Publishes all entries flaged as "scheduled". */ public function publishScheduledEntries() { $strReq = 'SELECT post_id, post_dt, post_tz '. 'FROM '.$this->prefix.'post '. 'WHERE post_status = -1 '. "AND blog_id = '".$this->con->escape($this->id)."' "; $rs = $this->con->select($strReq); $now = dt::toUTC(time()); $to_change = new ArrayObject(); if ($rs->isEmpty()) { return; } while ($rs->fetch()) { # Now timestamp with post timezone $now_tz = $now + dt::getTimeOffset($rs->post_tz,$now); # Post timestamp $post_ts = strtotime($rs->post_dt); # If now_tz >= post_ts, we publish the entry if ($now_tz >= $post_ts) { $to_change[] = (integer) $rs->post_id; } } if (count($to_change)) { # --BEHAVIOR-- coreBeforeScheduledEntriesPublish $this->core->callBehavior('coreBeforeScheduledEntriesPublish',$this,$to_change); $strReq = 'UPDATE '.$this->prefix.'post SET '. 'post_status = 1 '. "WHERE blog_id = '".$this->con->escape($this->id)."' ". 'AND post_id '.$this->con->in((array)$to_change).' '; $this->con->execute($strReq); $this->triggerBlog(); # --BEHAVIOR-- coreAfterScheduledEntriesPublish $this->core->callBehavior('coreAfterScheduledEntriesPublish',$this,$to_change); } } /** Retrieves all users having posts on current blog. @param post_type string post_type filter (post) @return record */ public function getPostsUsers($post_type='post') { $strReq = 'SELECT P.user_id, user_name, user_firstname, '. 'user_displayname, user_email '. 'FROM '.$this->prefix.'post P, '.$this->prefix.'user U '. 'WHERE P.user_id = U.user_id '. "AND blog_id = '".$this->con->escape($this->id)."' "; if ($post_type) { $strReq .= "AND post_type = '".$this->con->escape($post_type)."' "; } $strReq .= 'GROUP BY P.user_id, user_name, user_firstname, user_displayname, user_email '; return $this->con->select($strReq); } private function getPostsCategoryFilter($arr,$field='cat_id') { $field = $field == 'cat_id' ? 'cat_id' : 'cat_url'; $sub = array(); $not = array(); $queries = array(); foreach ($arr as $v) { $v = trim($v); $args = preg_split('/\s*[?]\s*/',$v,-1,PREG_SPLIT_NO_EMPTY); $id = array_shift($args); $args = array_flip($args); if (isset($args['not'])) { $not[$id] = 1; } if (isset($args['sub'])) { $sub[$id] = 1; } if ($field == 'cat_id') { if (preg_match('/^null$/i',$id)) { $queries[$id] = 'P.cat_id IS NULL'; } else { $queries[$id] = 'P.cat_id = '.(integer) $id; } } else { $queries[$id] = "C.cat_url = '".$this->con->escape($id)."' "; } } if (!empty($sub)) { $rs = $this->con->select( 'SELECT cat_id, cat_url, cat_lft, cat_rgt FROM '.$this->prefix.'category '. "WHERE blog_id = '".$this->con->escape($this->id)."' ". 'AND '.$field.' '.$this->con->in(array_keys($sub)) ); while ($rs->fetch()) { $queries[$rs->f($field)] = '(C.cat_lft BETWEEN '.$rs->cat_lft.' AND '.$rs->cat_rgt.')'; } } # Create queries $sql = array( 0 => array(), # wanted categories 1 => array() # excluded categories ); foreach ($queries as $id => $q) { $sql[(integer) isset($not[$id])][] = $q; } $sql[0] = implode(' OR ',$sql[0]); $sql[1] = implode(' OR ',$sql[1]); if ($sql[0]) { $sql[0] = '('.$sql[0].')'; } else { unset($sql[0]); } if ($sql[1]) { $sql[1] = '(P.cat_id IS NULL OR NOT('.$sql[1].'))'; } else { unset($sql[1]); } return implode(' AND ',$sql); } private function getPostCursor($cur,$post_id=null) { if ($cur->post_title == '') { throw new Exception(__('No entry title')); } if ($cur->post_content == '') { throw new Exception(__('No entry content')); } if ($cur->post_password === '') { $cur->post_password = null; } if ($cur->post_dt == '') { $offset = dt::getTimeOffset($this->core->auth->getInfo('user_tz')); $now = time() + $offset; $cur->post_dt = date('Y-m-d H:i:00',$now); } $post_id = is_int($post_id) ? $post_id : $cur->post_id; if ($cur->post_content_xhtml == '') { throw new Exception(__('No entry content')); } # Words list if ($cur->post_title !== null && $cur->post_excerpt_xhtml !== null && $cur->post_content_xhtml !== null) { $words = $cur->post_title.' '. $cur->post_excerpt_xhtml.' '. $cur->post_content_xhtml; $cur->post_words = implode(' ',text::splitWords($words)); } } private function getPostContent($cur,$post_id) { $post_excerpt = $cur->post_excerpt; $post_excerpt_xhtml = $cur->post_excerpt_xhtml; $post_content = $cur->post_content; $post_content_xhtml = $cur->post_content_xhtml; $this->setPostContent( $post_id,$cur->post_format,$cur->post_lang, $post_excerpt,$post_excerpt_xhtml, $post_content,$post_content_xhtml ); $cur->post_excerpt = $post_excerpt; $cur->post_excerpt_xhtml = $post_excerpt_xhtml; $cur->post_content = $post_content; $cur->post_content_xhtml = $post_content_xhtml; } /** Creates post HTML content, taking format and lang into account. @param post_id integer Post ID @param format string Post format @param lang string Post lang @param excerpt string Post excerpt @param[out] excerpt_xhtml string Post excerpt HTML @param content string Post content @param[out] content_xhtml string Post content HTML */ public function setPostContent($post_id,$format,$lang,&$excerpt,&$excerpt_xhtml,&$content,&$content_xhtml) { if ($format == 'wiki') { $this->core->initWikiPost(); $this->core->wiki2xhtml->setOpt('note_prefix','pnote-'.$post_id); switch ($this->settings->system->note_title_tag) { case 1: $tag = 'h3'; break; case 2: $tag = 'p'; break; default: $tag = 'h4'; break; } $this->core->wiki2xhtml->setOpt('note_str','
    <'.$tag.' class="footnotes-title">'. __('Notes').'%s
    '); $this->core->wiki2xhtml->setOpt('note_str_single','
    <'.$tag.' class="footnotes-title">'. __('Note').'%s
    '); if (strpos($lang,'fr') === 0) { $this->core->wiki2xhtml->setOpt('active_fr_syntax',1); } } if ($excerpt) { $excerpt_xhtml = $this->core->callFormater($format,$excerpt); $excerpt_xhtml = $this->core->HTMLfilter($excerpt_xhtml); } else { $excerpt_xhtml = ''; } if ($content) { $content_xhtml = $this->core->callFormater($format,$content); $content_xhtml = $this->core->HTMLfilter($content_xhtml); } else { $content_xhtml = ''; } # --BEHAVIOR-- coreAfterPostContentFormat $this->core->callBehavior('coreAfterPostContentFormat',array( 'excerpt' => &$excerpt, 'content' => &$content, 'excerpt_xhtml' => &$excerpt_xhtml, 'content_xhtml' => &$content_xhtml )); } /** Returns URL for a post according to blog setting post_url_format. It will try to guess URL and append some figures if needed. @param url string Origin URL, could be empty @param post_dt string Post date (in YYYY-MM-DD HH:mm:ss) @param post_title string Post title @param post_id integer Post ID @return string result URL */ public function getPostURL($url,$post_dt,$post_title,$post_id) { $url = trim($url); $url_patterns = array( '{y}' => date('Y',strtotime($post_dt)), '{m}' => date('m',strtotime($post_dt)), '{d}' => date('d',strtotime($post_dt)), '{t}' => text::tidyURL($post_title), '{id}' => (integer) $post_id ); # If URL is empty, we create a new one if ($url == '') { # Transform with format $url = str_replace( array_keys($url_patterns), array_values($url_patterns), $this->settings->system->post_url_format ); } else { $url = text::tidyURL($url); } # Let's check if URL is taken... $strReq = 'SELECT post_url FROM '.$this->prefix.'post '. "WHERE post_url = '".$this->con->escape($url)."' ". 'AND post_id <> '.(integer) $post_id. ' '. "AND blog_id = '".$this->con->escape($this->id)."' ". 'ORDER BY post_url DESC'; $rs = $this->con->select($strReq); if (!$rs->isEmpty()) { if ($this->con->driver() == 'mysql' || $this->con->driver() == 'mysqli') { $clause = "REGEXP '^".$this->con->escape($url)."[0-9]+$'"; } elseif ($this->con->driver() == 'pgsql') { $clause = "~ '^".$this->con->escape($url)."[0-9]+$'"; } else { $clause = "LIKE '".$this->con->escape($url)."%'"; } $strReq = 'SELECT post_url FROM '.$this->prefix.'post '. "WHERE post_url ".$clause.' '. 'AND post_id <> '.(integer) $post_id.' '. "AND blog_id = '".$this->con->escape($this->id)."' ". 'ORDER BY post_url DESC '; $rs = $this->con->select($strReq); $a = array(); while ($rs->fetch()) { $a[] = $rs->post_url; } natsort($a); $t_url = end($a); if (preg_match('/(.*?)([0-9]+)$/',$t_url,$m)) { $i = (integer) $m[2]; $url = $m[1]; } else { $i = 1; } return $url.($i+1); } # URL is empty? if ($url == '') { throw new Exception(__('Empty entry URL')); } return $url; } //@} /// @name Comments management methods //@{ /** Retrieves comments. $params is an array taking the following optionnal parameters: - no_content: Don't retrieve comment content - post_type: Get only entries with given type (default no type, array for many types) - post_id: (integer) Get comments belonging to given post_id - cat_id: (integer or array) Get comments belonging to entries of given category ID - comment_id: (integer) Get comment with given ID - comment_site: (string) Get comments with given comment_site - comment_status: (integer) Get comments with given comment_status - comment_trackback: (integer) Get only comments (0) or trackbacks (1) - comment_ip: (string) Get comments with given IP address - post_url: Get entry with given post_url field - user_id: (integer) Get entries belonging to given user ID - q_author: Search comments by author - sql: Append SQL string at the end of the query - from: Append SQL string after "FROM" statement in query - order: Order of results (default "ORDER BY comment_dt DES") - limit: Limit parameter - sql_only : return the sql request instead of results. Only ids are selected @param params array Parameters @param count_only boolean Only counts results @return record A record with some more capabilities */ public function getComments($params=array(),$count_only=false) { if ($count_only) { $strReq = 'SELECT count(comment_id) '; } elseif (!empty($params['sql_only'])) { $strReq = 'SELECT P.post_id '; } else { if (!empty($params['no_content'])) { $content_req = ''; } else { $content_req = 'comment_content, '; } if (!empty($params['columns']) && is_array($params['columns'])) { $content_req .= implode(', ',$params['columns']).', '; } $strReq = 'SELECT C.comment_id, comment_dt, comment_tz, comment_upddt, '. 'comment_author, comment_email, comment_site, '. $content_req.' comment_trackback, comment_status, '. 'comment_spam_status, comment_spam_filter, comment_ip, '. 'P.post_title, P.post_url, P.post_id, P.post_password, P.post_type, '. 'P.post_dt, P.user_id, U.user_email, U.user_url '; } $strReq .= 'FROM '.$this->prefix.'comment C '. 'INNER JOIN '.$this->prefix.'post P ON C.post_id = P.post_id '. 'INNER JOIN '.$this->prefix.'user U ON P.user_id = U.user_id '; if (!empty($params['from'])) { $strReq .= $params['from'].' '; } $strReq .= "WHERE P.blog_id = '".$this->con->escape($this->id)."' "; if (!$this->core->auth->check('contentadmin',$this->id)) { $strReq .= 'AND ((comment_status = 1 AND P.post_status = 1 '; if ($this->without_password) { $strReq .= 'AND post_password IS NULL '; } $strReq .= ') '; if ($this->core->auth->userID()) { $strReq .= "OR P.user_id = '".$this->con->escape($this->core->auth->userID())."')"; } else { $strReq .= ') '; } } if (!empty($params['post_type'])) { $strReq .= 'AND post_type '.$this->con->in($params['post_type']); } if (isset($params['post_id']) && $params['post_id'] !== '') { $strReq .= 'AND P.post_id = '.(integer) $params['post_id'].' '; } if (isset($params['cat_id']) && $params['cat_id'] !== '') { $strReq .= 'AND P.cat_id = '.(integer) $params['cat_id'].' '; } if (isset($params['comment_id']) && $params['comment_id'] !== '') { $strReq .= 'AND comment_id = '.(integer) $params['comment_id'].' '; } if (isset($params['comment_site'])) { $comment_site = $this->con->escape(str_replace('*','%',$params['comment_site'])); $strReq .= "AND comment_site LIKE '".$comment_site."' "; } if (isset($params['comment_status'])) { $strReq .= 'AND comment_status = '.(integer) $params['comment_status'].' '; } if (!empty($params['comment_status_not'])) { $strReq .= 'AND comment_status <> '.(integer) $params['comment_status_not'].' '; } if (isset($params['comment_trackback'])) { $strReq .= 'AND comment_trackback = '.(integer) (boolean) $params['comment_trackback'].' '; } if (isset($params['comment_ip'])) { $comment_ip = $this->con->escape(str_replace('*','%',$params['comment_ip'])); $strReq .= "AND comment_ip LIKE '".$comment_ip."' "; } if (isset($params['q_author'])) { $q_author = $this->con->escape(str_replace('*','%',strtolower($params['q_author']))); $strReq .= "AND LOWER(comment_author) LIKE '".$q_author."' "; } if (!empty($params['search'])) { $words = text::splitWords($params['search']); if (!empty($words)) { # --BEHAVIOR coreCommentSearch if ($this->core->hasBehavior('coreCommentSearch')) { $this->core->callBehavior('coreCommentSearch',$this->core,array(&$words,&$strReq,&$params)); } if ($words) { foreach ($words as $i => $w) { $words[$i] = "comment_words LIKE '%".$this->con->escape($w)."%'"; } $strReq .= 'AND '.implode(' AND ',$words).' '; } } } if (!empty($params['sql'])) { $strReq .= $params['sql'].' '; } if (!$count_only) { if (!empty($params['order'])) { $strReq .= 'ORDER BY '.$this->con->escape($params['order']).' '; } else { $strReq .= 'ORDER BY comment_dt DESC '; } } if (!$count_only && !empty($params['limit'])) { $strReq .= $this->con->limit($params['limit']); } if (!empty($params['sql_only'])) { return $strReq; } $rs = $this->con->select($strReq); $rs->core = $this->core; $rs->extend('rsExtComment'); # --BEHAVIOR-- coreBlogGetComments $this->core->callBehavior('coreBlogGetComments',$rs); return $rs; } /** Creates a new comment. Takes a cursor as input and returns the new comment ID. @param cur cursor Comment cursor @return integer New comment ID */ public function addComment($cur) { $this->con->writeLock($this->prefix.'comment'); try { # Get ID $rs = $this->con->select( 'SELECT MAX(comment_id) '. 'FROM '.$this->prefix.'comment ' ); $cur->comment_id = (integer) $rs->f(0) + 1; $cur->comment_upddt = date('Y-m-d H:i:s'); $offset = dt::getTimeOffset($this->settings->system->blog_timezone); $cur->comment_dt = date('Y-m-d H:i:s',time() + $offset); $cur->comment_tz = $this->settings->system->blog_timezone; $this->getCommentCursor($cur); if ($cur->comment_ip === null) { $cur->comment_ip = http::realIP(); } # --BEHAVIOR-- coreBeforeCommentCreate $this->core->callBehavior('coreBeforeCommentCreate',$this,$cur); $cur->insert(); $this->con->unlock(); } catch (Exception $e) { $this->con->unlock(); throw $e; } # --BEHAVIOR-- coreAfterCommentCreate $this->core->callBehavior('coreAfterCommentCreate',$this,$cur); $this->triggerComment($cur->comment_id); if ($cur->comment_status != -2) { $this->triggerBlog(); } return $cur->comment_id; } /** Updates an existing comment. @param id integer Comment ID @param cur cursor Comment cursor */ public function updComment($id,$cur) { if (!$this->core->auth->check('usage,contentadmin',$this->id)) { throw new Exception(__('You are not allowed to update comments')); } $id = (integer) $id; if (empty($id)) { throw new Exception(__('No such comment ID')); } $rs = $this->getComments(array('comment_id' => $id)); if ($rs->isEmpty()) { throw new Exception(__('No such comment ID')); } #If user is only usage, we need to check the post's owner if (!$this->core->auth->check('contentadmin',$this->id)) { if ($rs->user_id != $this->core->auth->userID()) { throw new Exception(__('You are not allowed to update this comment')); } } $this->getCommentCursor($cur); $cur->comment_upddt = date('Y-m-d H:i:s'); if (!$this->core->auth->check('publish,contentadmin',$this->id)) { $cur->unsetField('comment_status'); } # --BEHAVIOR-- coreBeforeCommentUpdate $this->core->callBehavior('coreBeforeCommentUpdate',$this,$cur,$rs); $cur->update('WHERE comment_id = '.$id.' '); # --BEHAVIOR-- coreAfterCommentUpdate $this->core->callBehavior('coreAfterCommentUpdate',$this,$cur,$rs); $this->triggerComment($id); $this->triggerBlog(); } /** Updates comment status. @param id integer Comment ID @param status integer Comment status */ public function updCommentStatus($id,$status) { $this->updCommentsStatus($id,$status); } /** Updates comments status. @param ids mixed Comment(s) ID(s) @param status integer Comment status */ public function updCommentsStatus($ids,$status) { if (!$this->core->auth->check('publish,contentadmin',$this->id)) { throw new Exception(__("You are not allowed to change this comment's status")); } $co_ids = dcUtils::cleanIds($ids); $status = (integer) $status; $strReq = 'UPDATE '.$this->prefix.'comment '. 'SET comment_status = '.$status.' '; $strReq .= 'WHERE comment_id'.$this->con->in($co_ids). 'AND post_id in (SELECT tp.post_id '. 'FROM '.$this->prefix.'post tp '. "WHERE tp.blog_id = '".$this->con->escape($this->id)."' "; if (!$this->core->auth->check('contentadmin',$this->id)) { $strReq .= "AND user_id = '".$this->con->escape($this->core->auth->userID())."' "; } $strReq .= ')'; $this->con->execute($strReq); $this->triggerComments($co_ids); $this->triggerBlog(); } /** Delete a comment @param id integer Comment ID */ public function delComment($id) { $this->delComments($id); } /** Delete comments @param ids mixed Comment(s) ID(s) */ public function delComments($ids) { if (!$this->core->auth->check('delete,contentadmin',$this->id)) { throw new Exception(__('You are not allowed to delete comments')); } $co_ids = dcUtils::cleanIds($ids); if (empty($co_ids)) { throw new Exception(__('No such comment ID')); } # Retrieve posts affected by comments edition $affected_posts = array(); $strReq = 'SELECT post_id '. 'FROM '.$this->prefix.'comment '. 'WHERE comment_id'.$this->con->in($co_ids). 'GROUP BY post_id'; $rs = $this->con->select($strReq); while ($rs->fetch()) { $affected_posts[] = (integer) $rs->post_id; } $strReq = 'DELETE FROM '.$this->prefix.'comment '. 'WHERE comment_id'.$this->con->in($co_ids).' '. 'AND post_id in (SELECT tp.post_id '. 'FROM '.$this->prefix.'post tp '. "WHERE tp.blog_id = '".$this->con->escape($this->id)."' "; #If user can only delete, we need to check the post's owner if (!$this->core->auth->check('contentadmin',$this->id)) { $strReq .= "AND tp.user_id = '".$this->con->escape($this->core->auth->userID())."' "; } $strReq .= ")"; $this->con->execute($strReq); $this->triggerComments($co_ids, true, $affected_posts); $this->triggerBlog(); } public function delJunkComments() { if (!$this->core->auth->check('delete,contentadmin',$this->id)) { throw new Exception(__('You are not allowed to delete comments')); } $strReq = 'DELETE FROM '.$this->prefix.'comment '. 'WHERE comment_status = -2 '. 'AND post_id in (SELECT tp.post_id '. 'FROM '.$this->prefix.'post tp '. "WHERE tp.blog_id = '".$this->con->escape($this->id)."' "; #If user can only delete, we need to check the post's owner if (!$this->core->auth->check('contentadmin',$this->id)) { $strReq .= "AND tp.user_id = '".$this->con->escape($this->core->auth->userID())."' "; } $strReq .= ")"; $this->con->execute($strReq); $this->triggerBlog(); } private function getCommentCursor($cur) { if ($cur->comment_content !== null && $cur->comment_content == '') { throw new Exception(__('You must provide a comment')); } if ($cur->comment_author !== null && $cur->comment_author == '') { throw new Exception(__('You must provide an author name')); } if ($cur->comment_email != '' && !text::isEmail($cur->comment_email)) { throw new Exception(__('Email address is not valid.')); } if ($cur->comment_site !== null && $cur->comment_site != '') { if (!preg_match('|^http(s?)://|i',$cur->comment_site, $matches)) { $cur->comment_site = 'http://'.$cur->comment_site; }else{ $cur->comment_site = strtolower($matches[0]).substr($cur->comment_site, strlen($matches[0])); } } if ($cur->comment_status === null) { $cur->comment_status = (integer) $this->settings->system->comments_pub; } # Words list if ($cur->comment_content !== null) { $cur->comment_words = implode(' ',text::splitWords($cur->comment_content)); } } //@} } dotclear-2.6.2+dfsg/inc/core/class.dc.categories.php000066400000000000000000000412341230033266200222660ustar00rootroot00000000000000core =& $core; $this->con =& $core->con; $this->blog_id = $core->blog->id; $this->table = $core->prefix.'category'; $this->add_condition = array('blog_id' => "'".$this->con->escape($this->blog_id)."'"); } public function getChildren($start=0,$id=null,$sort='asc',$fields=array()) { $fields = array_merge(array('cat_title','cat_url','cat_desc'),$fields); return parent::getChildren($start,$id,$sort,$fields); } public function getParents($id,$fields=array()) { $fields = array_merge(array('cat_title','cat_url','cat_desc'),$fields); return parent::getParents($id,$fields); } public function getParent($id,$fields=array()) { $fields = array_merge(array('cat_title','cat_url','cat_desc'),$fields); return parent::getParent($id,$fields); } } abstract class nestedTree { protected $con; protected $table; protected $f_left; protected $f_right; protected $f_id; protected $add_condition = array(); protected $parents; public function __construct($con) { $this->con =& $con; } public function getChildren($start=0,$id=null,$sort='asc',$fields=array()) { $fields = count($fields) > 0 ? ', C2.'.implode(', C2.',$fields) : ''; $sql = 'SELECT C2.'.$this->f_id.', C2.'.$this->f_left.', C2.'.$this->f_right.', COUNT(C1.'.$this->f_id.') AS level ' . $fields.' ' . 'FROM '.$this->table.' AS C1, '.$this->table.' AS C2 %s ' . 'WHERE C2.'.$this->f_left.' BETWEEN C1.'.$this->f_left.' AND C1.'.$this->f_right.' ' . ' %s ' . $this->getCondition('AND','C2.') . $this->getCondition('AND','C1.') . 'GROUP BY C2.'.$this->f_id.', C2.'.$this->f_left.', C2.'.$this->f_right.' '.$fields.' ' . ' %s ' . 'ORDER BY C2.'.$this->f_left.' '.($sort == 'asc' ? 'ASC' : 'DESC').' '; $from = $where = ''; if ($start > 0) { $from = ', '.$this->table.' AS C3'; $where = 'AND C3.'.$this->f_id.' = '.(integer) $start.' AND C1.'.$this->f_left.' >= C3.'.$this->f_left.' AND C1.'.$this->f_right.' <= C3.'.$this->f_right; $where .= $this->getCondition('AND','C3.'); } $having = ''; if ($id !== null) { $having = ' HAVING C2.'.$this->f_id.' = '.(integer) $id; } $sql = sprintf($sql,$from,$where,$having); return $this->con->select($sql); } public function getParents($id,$fields=array()) { $fields = count($fields) > 0 ? ', C1.'.implode(', C1.',$fields) : ''; return $this->con->select( 'SELECT C1.'.$this->f_id.' '.$fields.' ' . 'FROM '.$this->table.' C1, '.$this->table.' C2 ' . 'WHERE C2.'.$this->f_id.' = '.(integer) $id.' ' . 'AND C1.'.$this->f_left.' < C2.'.$this->f_left.' ' . 'AND C1.'.$this->f_right.' > C2.'.$this->f_right.' ' . $this->getCondition('AND','C2.') . $this->getCondition('AND','C1.') . 'ORDER BY C1.'.$this->f_left.' ASC ' ); } public function getParent($id,$fields=array()) { $fields = count($fields) > 0 ? ', C1.'.implode(', C1.',$fields) : ''; return $this->con->select( 'SELECT C1.'.$this->f_id.' '.$fields.' ' . 'FROM '.$this->table.' C1, '.$this->table.' C2 ' . 'WHERE C2.'.$this->f_id.' = '.(integer) $id.' ' . 'AND C1.'.$this->f_left.' < C2.'.$this->f_left.' ' . 'AND C1.'.$this->f_right.' > C2.'.$this->f_right.' ' . $this->getCondition('AND','C2.') . $this->getCondition('AND','C1.') . 'ORDER BY C1.'.$this->f_left.' DESC ' . $this->con->limit(1) ); } /* ------------------------------------------------ * Tree manipulations * ---------------------------------------------- */ public function addNode($data,$target=0) { if (!is_array($data) && !($data instanceof cursor)) { throw new Exception('Invalid data block'); } if (is_array($data)) { $D = $data; $data = $this->con->openCursor($this->table); foreach ($D as $k => $v) { $data->{$k} = $v; } unset($D); } # We want to put it at the end $this->con->writeLock($this->table); try { $rs = $this->con->select('SELECT MAX('.$this->f_id.') as n_id FROM '.$this->table); $id = $rs->n_id; $rs = $this->con->select( 'SELECT MAX('.$this->f_right.') as n_r '. 'FROM '.$this->table. $this->getCondition('WHERE') ); $last = $rs->n_r == 0 ? 1 : $rs->n_r; $data->{$this->f_id} = $id+1; $data->{$this->f_left} = $last+1; $data->{$this->f_right} = $last+2; $data->insert(); $this->con->unlock(); try { $this->setNodeParent($id+1,$target); return $data->{$this->f_id}; } catch (Exception $e) {} # We don't mind error in this case } catch (Exception $e) { $this->con->unlock(); throw $e; } } public function updatePosition($id,$left,$right) { $sql = 'UPDATE '.$this->table.' SET ' .$this->f_left.' = '.$left.', ' .$this->f_right.' = '.$right .' WHERE '.$this->f_id .' = '.(integer) $id .$this->getCondition(); $this->con->begin(); try { $this->con->execute($sql); $this->con->commit(); } catch (Exception $e) { $this->con->rollback(); throw $e; } } public function deleteNode($node,$keep_children=true) { $node = (integer) $node; $rs = $this->getChildren(0,$node); if ($rs->isEmpty()) { throw new Exception('Node does not exist.'); } $node_left = (integer) $rs->{$this->f_left}; $node_right = (integer) $rs->{$this->f_right}; try { $this->con->begin(); if ($keep_children) { $this->con->execute('DELETE FROM '.$this->table.' WHERE '.$this->f_id.' = '.$node); $sql = 'UPDATE '.$this->table.' SET ' . $this->f_right.' = CASE ' . 'WHEN '.$this->f_right.' BETWEEN '.$node_left.' AND '.$node_right.' ' . 'THEN '.$this->f_right.' - 1 ' . 'WHEN '.$this->f_right.' > '.$node_right.' ' . 'THEN '.$this->f_right.' - 2 ' . 'ELSE '.$this->f_right.' ' . 'END, ' . $this->f_left.' = CASE ' . 'WHEN '.$this->f_left.' BETWEEN '.$node_left.' AND '.$node_right.' ' . 'THEN '.$this->f_left.' - 1 ' . 'WHEN '.$this->f_left.' > '.$node_right.' ' . 'THEN '.$this->f_left.' - 2 ' . 'ELSE '.$this->f_left.' ' . 'END ' . 'WHERE '.$this->f_right.' > '.$node_left . $this->getCondition(); $this->con->execute($sql); } else { $this->con->execute('DELETE FROM '.$this->table.' WHERE '.$this->f_left.' BETWEEN '.$node_left.' AND '.$node_right); $node_delta = $node_right - $node_left + 1; $sql = 'UPDATE '.$this->table.' SET ' . $this->f_left.' = CASE ' . 'WHEN '.$this->f_left.' > '.$node_left.' ' . 'THEN '.$this->f_left.' - ('.$node_delta.') ' . 'ELSE '.$this->f_left.' ' . 'END, ' . $this->f_right.' = CASE ' . 'WHEN '.$this->f_right.' > '.$node_left.' ' . 'THEN '.$this->f_right.' - ('.$node_delta.') ' . 'ELSE '.$this->f_right.' ' . 'END ' . 'WHERE '.$this->f_right.' > '.$node_right . $this->getCondition(); } $this->con->commit(); } catch (Exception $e) { $this->con->rollback(); throw $e; } } public function resetOrder() { $rs = $this->con->select( 'SELECT '.$this->f_id.' ' .'FROM '.$this->table.' ' .$this->getCondition('WHERE') .'ORDER BY '.$this->f_left.' ASC ' ); $lft = 2; $this->con->begin(); try { while ($rs->fetch()) { $this->con->execute( 'UPDATE '.$this->table.' SET ' .$this->f_left.' = '.($lft++).', ' .$this->f_right.' = '.($lft++).' ' .'WHERE '.$this->f_id .' = '.(integer) $rs->{$this->f_id}.' ' .$this->getCondition() ); } $this->con->commit(); } catch (Exception $e) { $this->con->rollback(); throw $e; } } public function setNodeParent($node,$target=0) { if ($node == $target) { return; } $node = (integer) $node; $target = (integer) $target; $rs = $this->getChildren(0,$node); if ($rs->isEmpty()) { throw new Exception('Node does not exist.'); } $node_left = (integer) $rs->{$this->f_left}; $node_right = (integer) $rs->{$this->f_right}; $node_level = (integer) $rs->level; if ($target > 0) { $rs = $this->getChildren(0,$target); } else { $rs = $this->con->select( 'SELECT MIN('.$this->f_left.')-1 AS '.$this->f_left.', MAX('.$this->f_right.')+1 AS '.$this->f_right.', 0 AS level '. 'FROM '.$this->table.' '. $this->getCondition('WHERE') ); } $target_left = (integer) $rs->{$this->f_left}; $target_right = (integer) $rs->{$this->f_right}; $target_level = (integer) $rs->level; if ($node_left == $target_left || ($target_left >= $node_left && $target_left <= $node_right) || ($node_level == $target_level+1 && $node_left > $target_left && $node_right < $target_right) ) { throw new Exception('Cannot move tree'); } if ($target_left < $node_left && $target_right > $node_right && $target_level < $node_level -1) { $sql = 'UPDATE '.$this->table.' SET ' . $this->f_right.' = CASE ' . 'WHEN '.$this->f_right.' BETWEEN '.($node_right+1).' AND '.($target_right-1).' ' . 'THEN '.$this->f_right.'-('.($node_right-$node_left+1).') ' . 'WHEN '.$this->f_left.' BETWEEN '.$node_left.' AND '.$node_right.' ' . 'THEN '.$this->f_right.'+'.((($target_right-$node_right-$node_level+$target_level)/2)*2+$node_level-$target_level-1).' ' . 'ELSE ' . $this->f_right.' ' . 'END, ' . $this->f_left.' = CASE ' . 'WHEN '.$this->f_left.' BETWEEN '.($node_right+1).' AND '.($target_right-1).' ' . 'THEN '.$this->f_left.'-('.($node_right-$node_left+1).') ' . 'WHEN '.$this->f_left.' BETWEEN '.$node_left.' AND '.$node_right.' ' . 'THEN '.$this->f_left.'+'.((($target_right-$node_right-$node_level+$target_level)/2)*2+$node_level-$target_level-1).' ' . 'ELSE '.$this->f_left.' ' . 'END ' . 'WHERE '.$this->f_left.' BETWEEN '.($target_left+1).' AND '.($target_right-1).''; } elseif ($target_left < $node_left) { $sql = 'UPDATE '.$this->table.' SET ' . $this->f_left.' = CASE ' . 'WHEN '.$this->f_left.' BETWEEN '.$target_right.' AND '.($node_left-1).' ' . 'THEN '.$this->f_left.'+'.($node_right-$node_left+1).' ' . 'WHEN '.$this->f_left.' BETWEEN '.$node_left.' AND '.$node_right.' ' . 'THEN '.$this->f_left.'-('.($node_left-$target_right).') ' . 'ELSE '.$this->f_left .' ' . 'END, ' . $this->f_right.' = CASE ' . 'WHEN '.$this->f_right.' BETWEEN '.$target_right.' AND '.$node_left.' ' . 'THEN '.$this->f_right.'+'.($node_right-$node_left+1).' ' . 'WHEN '.$this->f_right.' BETWEEN '.$node_left.' AND '.$node_right.' ' . 'THEN '.$this->f_right.'-('.($node_left-$target_right).') ' . 'ELSE '.$this->f_right.' ' . 'END ' . 'WHERE ('.$this->f_left.' BETWEEN '.$target_left.' AND '.$node_right. ' ' . 'OR '.$this->f_right.' BETWEEN '.$target_left.' AND '.$node_right.')'; } else { $sql = 'UPDATE '.$this->table.' SET ' . $this->f_left.' = CASE ' . 'WHEN '.$this->f_left.' BETWEEN '.$node_right.' AND '.$target_right.' ' . 'THEN '.$this->f_left.'-'.($node_right-$node_left+1).' ' . 'WHEN '.$this->f_left.' BETWEEN '.$node_left.' AND '.$node_right.' ' . 'THEN '.$this->f_left.'+'.($target_right-1-$node_right).' ' . 'ELSE '.$this->f_left.' ' . 'END, ' . $this->f_right.' = CASE ' . 'WHEN '.$this->f_right.' BETWEEN '.($node_right+1).' AND '.($target_right-1).' ' . 'THEN '.$this->f_right.'-'.($node_right-$node_left+1).' ' . 'WHEN '.$this->f_right.' BETWEEN '.$node_left.' AND '.$node_right.' ' . 'THEN '.$this->f_right.'+'.($target_right-1-$node_right).' ' . 'ELSE '.$this->f_right.' ' . 'END ' . 'WHERE ('.$this->f_left.' BETWEEN '.$node_left.' AND '.$target_right.' ' . 'OR '.$this->f_right.' BETWEEN '.$node_left.' AND '.$target_right.')'; } $sql .= ' '.$this->getCondition(); $this->con->execute($sql); } public function setNodePosition($nodeA,$nodeB,$position='after') { $nodeA = (integer) $nodeA; $nodeB = (integer) $nodeB; $rs = $this->getChildren(0,$nodeA); if ($rs->isEmpty()) { throw new Exception('Node does not exist.'); } $A_left = $rs->{$this->f_left}; $A_right = $rs->{$this->f_right}; $A_level = $rs->level; $rs = $this->getChildren(0,$nodeB); if ($rs->isEmpty()) { throw new Exception('Node does not exist.'); } $B_left = $rs->{$this->f_left}; $B_right = $rs->{$this->f_right}; $B_level = $rs->level; if ($A_level != $B_level) { throw new Exception('Cannot change position'); } $rs = $this->getParents($nodeA); $parentA = $rs->isEmpty() ? 0 : $rs->{$this->f_id}; $rs = $this->getParents($nodeB); $parentB = $rs->isEmpty() ? 0 : $rs->{$this->f_id}; if ($parentA != $parentB) { throw new Exception('Cannot change position'); } if ($position == 'before') { if ($A_left > $B_left) { $sql = 'UPDATE '.$this->table.' SET ' . $this->f_right.' = CASE WHEN '.$this->f_left.' BETWEEN '.$A_left.' AND '.$A_right.' THEN '.$this->f_right.' - ('.($A_left - $B_left).') ' . 'WHEN '.$this->f_left.' BETWEEN '.$B_left.' AND '.($A_left - 1).' THEN '.$this->f_right.' + '.($A_right - $A_left + 1).' ELSE '.$this->f_right.' END, ' . $this->f_left.' = CASE WHEN '.$this->f_left.' BETWEEN '.$A_left.' AND '.$A_right.' THEN '.$this->f_left.' - ('.($A_left - $B_left).') ' . 'WHEN '.$this->f_left.' BETWEEN '.$B_left.' AND '.($A_left - 1).' THEN '.$this->f_left.' + '.($A_right - $A_left + 1).' ELSE '.$this->f_left.' END ' . 'WHERE '.$this->f_left.' BETWEEN '.$B_left.' AND '.$A_right; } else { $sql = 'UPDATE '.$this->table.' SET ' . $this->f_right.' = CASE WHEN '.$this->f_left.' BETWEEN '.$A_left.' AND '.$A_right.' THEN '.$this->f_right.' + '.(($B_left - $A_left) - ($A_right - $A_left + 1)).' ' . 'WHEN '.$this->f_left.' BETWEEN '.($A_right + 1).' AND '.($B_left - 1).' THEN '.$this->f_right.' - ('.(($A_right - $A_left + 1)).') ELSE '.$this->f_right.' END, ' . $this->f_left.' = CASE WHEN '.$this->f_left.' BETWEEN '.$A_left.' AND '.$A_right.' THEN '.$this->f_left.' + '.(($B_left - $A_left) - ($A_right - $A_left + 1)).' ' . 'WHEN '.$this->f_left.' BETWEEN '.($A_right + 1).' AND '.($B_left - 1).' THEN '.$this->f_left.' - ('.($A_right - $A_left + 1).') ELSE '.$this->f_left.' END ' . 'WHERE '.$this->f_left.' BETWEEN '.$A_left.' AND '.($B_left - 1); } } else { if ($A_left > $B_left) { $sql = 'UPDATE '.$this->table.' SET ' . $this->f_right.' = CASE WHEN '.$this->f_left.' BETWEEN '.$A_left.' AND '.$A_right.' THEN '.$this->f_right.' - ('.($A_left - $B_left - ($B_right - $B_left + 1)).') ' . 'WHEN '.$this->f_left.' BETWEEN '.($B_right + 1).' AND '.($A_left - 1).' THEN '.$this->f_right.' + '.($A_right - $A_left + 1).' ELSE '.$this->f_right.' END, ' . $this->f_left.' = CASE WHEN '.$this->f_left.' BETWEEN '.$A_left.' AND '.$A_right.' THEN '.$this->f_left.' - ('.($A_left - $B_left - ($B_right - $B_left + 1)).') ' . 'WHEN '.$this->f_left.' BETWEEN '.($B_right + 1).' AND '.($A_left - 1).' THEN '.$this->f_left.' + '.($A_right - $A_left + 1).' ELSE '.$this->f_left.' END ' . 'WHERE '.$this->f_left.' BETWEEN '.($B_right + 1).' AND '.$A_right; } else { $sql = 'UPDATE '.$this->table.' SET ' . $this->f_right.' = CASE WHEN '.$this->f_left.' BETWEEN '.$A_left.' AND '.$A_right.' THEN '.$this->f_right.' + '.($B_right - $A_right).' ' . 'WHEN '.$this->f_left.' BETWEEN '.($A_right + 1).' AND '.$B_right.' THEN '.$this->f_right.' - ('.(($A_right - $A_left + 1)).') ELSE '.$this->f_right.' END, ' . $this->f_left.' = CASE WHEN '.$this->f_left.' BETWEEN '.$A_left.' AND '.$A_right.' THEN '.$this->f_left.' + '.($B_right - $A_right).' ' . 'WHEN '.$this->f_left.' BETWEEN '.($A_right + 1).' AND '.$B_right.' THEN '.$this->f_left.' - ('.($A_right - $A_left + 1).') ELSE '.$this->f_left.' END ' . 'WHERE '.$this->f_left.' BETWEEN '.$A_left.' AND '.$B_right; } } $sql .= $this->getCondition(); $this->con->execute($sql); } protected function getCondition($start='AND',$prefix='') { if (empty($this->add_condition)) { return ''; } $w = array(); foreach ($this->add_condition as $c => $n) { $w[] = $prefix.$c.' = '.$n; } return ' '.$start.' '.implode(' AND ',$w).' '; } } dotclear-2.6.2+dfsg/inc/core/class.dc.core.php000066400000000000000000001071001230033266200210640ustar00rootroot00000000000000connection Database connection object public $prefix; ///< string Database tables prefix public $blog; ///< dcBlog dcBlog object public $error; ///< dcError dcError object public $auth; ///< dcAuth dcAuth object public $session; ///< sessionDB sessionDB object public $url; ///< urlHandler urlHandler object public $wiki2xhtml; ///< wiki2xhtml wiki2xhtml object public $plugins; ///< dcModules dcModules object public $media; ///< dcMedia dcMedia object public $postmedia; ///< dcPostMedia dcPostMedia object public $rest; ///< dcRestServer dcRestServer object public $log; ///< dcLog dcLog object private $versions = null; private $formaters = array(); private $behaviors = array(); private $post_types = array(); /** dcCore constructor inits everything related to Dotclear. It takes arguments to init database connection. @param driver string Database driver name @param host string Database hostname @param db string Database name @param user string Database username @param password string Database password @param prefix string DotClear tables prefix @param persist boolean Persistent database connection */ public function __construct($driver, $host, $db, $user, $password, $prefix, $persist) { $this->con = dbLayer::init($driver,$host,$db,$user,$password,$persist); # define weak_locks for mysql if ($this->con instanceof mysqlConnection) { mysqlConnection::$weak_locks = true; } elseif ($this->con instanceof mysqliConnection) { mysqliConnection::$weak_locks = true; } # define searchpath for postgresql if ($this->con instanceof pgsqlConnection) { $searchpath = explode ('.',$prefix,2); if (count($searchpath) > 1) { $prefix = $searchpath[1]; $sql = 'SET search_path TO '.$searchpath[0].',public;'; $this->con->execute($sql); } } $this->prefix = $prefix; $this->error = new dcError(); $this->auth = $this->authInstance(); $this->session = new sessionDB($this->con,$this->prefix.'session',DC_SESSION_NAME,'',null,DC_ADMIN_SSL); $this->url = new dcUrlHandlers(); $this->plugins = new dcPlugins($this); $this->rest = new dcRestServer($this); $this->meta = new dcMeta($this); $this->log = new dcLog($this); $this->addFormater('xhtml', create_function('$s','return $s;')); $this->addFormater('wiki', array($this,'wikiTransform')); } private function authInstance() { # You can set DC_AUTH_CLASS to whatever you want. # Your new class *should* inherits dcAuth. if (!defined('DC_AUTH_CLASS')) { $c = 'dcAuth'; } else { $c = DC_AUTH_CLASS; } if (!class_exists($c)) { throw new Exception('Authentication class '.$c.' does not exist.'); } if ($c != 'dcAuth' && !is_subclass_of($c,'dcAuth')) { throw new Exception('Authentication class '.$c.' does not inherit dcAuth.'); } return new $c($this); } /// @name Blog init methods //@{ /** Sets a blog to use in blog property. @param id string Blog ID */ public function setBlog($id) { $this->blog = new dcBlog($this, $id); } /** Unsets blog property. */ public function unsetBlog() { $this->blog = null; } //@} /// @name Blog status methods //@{ /** Returns an array of available blog status codes and names. @return array Simple array with codes in keys and names in value */ public function getAllBlogStatus() { return array( 1 => __('online'), 0 => __('offline'), -1 => __('removed') ); } /** Returns a blog status name given to a code. This is intended to be human-readable and will be translated, so never use it for tests. If status code does not exist, returns offline. @param s integer Status code @return string Blog status name */ public function getBlogStatus($s) { $r = $this->getAllBlogStatus(); if (isset($r[$s])) { return $r[$s]; } return $r[0]; } //@} /// @name Admin nonce secret methods //@{ public function getNonce() { return crypt::hmac(DC_MASTER_KEY,session_id()); } public function checkNonce($secret) { if (!preg_match('/^([0-9a-f]{40,})$/i',$secret)) { return false; } return $secret == crypt::hmac(DC_MASTER_KEY,session_id()); } public function formNonce() { if (!session_id()) { return; } return form::hidden(array('xd_check'),$this->getNonce()); } //@} /// @name Text Formatters methods //@{ /** Adds a new text formater which will call the function $func to transform text. The function must be a valid callback and takes one argument: the string to transform. It returns the transformed string. @param name string Formater name @param func callback Function to use, must be a valid and callable callback */ public function addFormater($name,$func) { if (is_callable($func)) { $this->formaters[$name] = $func; } } /** Returns formaters list. @return array An array of formaters names in values. */ public function getFormaters() { return array_keys($this->formaters); } /** If $name is a valid formater, it returns $str transformed using that formater. @param name string Formater name @param str string String to transform @return string String transformed */ public function callFormater($name,$str) { if (isset($this->formaters[$name])) { return call_user_func($this->formaters[$name],$str); } return $str; } //@} /// @name Behaviors methods //@{ /** Adds a new behavior to behaviors stack. $func must be a valid and callable callback. @param behavior string Behavior name @param func callback Function to call */ public function addBehavior($behavior,$func) { if (is_callable($func)) { $this->behaviors[$behavior][] = $func; } } /** Tests if a particular behavior exists in behaviors stack. @param behavior string Behavior name @return boolean */ public function hasBehavior($behavior) { return isset($this->behaviors[$behavior]); } /** Get behaviors stack (or part of). @param behavior string Behavior name @return array */ public function getBehaviors($behavior='') { if (empty($this->behaviors)) return null; if ($behavior == '') { return $this->behaviors; } elseif (isset($this->behaviors[$behavior])) { return $this->behaviors[$behavior]; } return array(); } /** Calls every function in behaviors stack for a given behavior and returns concatened result of each function. Every parameters added after $behavior will be pass to behavior calls. @param behavior string Behavior name @return string Behavior concatened result */ public function callBehavior($behavior) { if (isset($this->behaviors[$behavior])) { $args = func_get_args(); array_shift($args); $res = ''; foreach ($this->behaviors[$behavior] as $f) { $res .= call_user_func_array($f,$args); } return $res; } } //@} /// @name Post types URLs management //@{ public function getPostAdminURL($type,$post_id,$escaped=true) { if (!isset($this->post_types[$type])) { $type = 'post'; } $url = sprintf($this->post_types[$type]['admin_url'],$post_id); return $escaped ? html::escapeURL($url) : $url; } public function getPostPublicURL($type,$post_url,$escaped=true) { if (!isset($this->post_types[$type])) { $type = 'post'; } $url = sprintf($this->post_types[$type]['public_url'],$post_url); return $escaped ? html::escapeURL($url) : $url; } public function setPostType($type,$admin_url,$public_url,$label='') { $this->post_types[$type] = array( 'admin_url' => $admin_url, 'public_url' => $public_url, 'label' => ($label != '' ? $label : $type) ); } public function getPostTypes() { return $this->post_types; } //@} /// @name Versions management methods //@{ /** Returns a given $module version. @param module string Module name @return string Module version */ public function getVersion($module='core') { # Fetch versions if needed if (!is_array($this->versions)) { $strReq = 'SELECT module, version FROM '.$this->prefix.'version'; $rs = $this->con->select($strReq); while ($rs->fetch()) { $this->versions[$rs->module] = $rs->version; } } if (isset($this->versions[$module])) { return $this->versions[$module]; } else { return null; } } /** Sets $version to given $module. @param module string Module name @param version string Module version */ public function setVersion($module,$version) { $cur_version = $this->getVersion($module); $cur = $this->con->openCursor($this->prefix.'version'); $cur->module = (string) $module; $cur->version = (string) $version; if ($cur_version === null) { $cur->insert(); } else { $cur->update("WHERE module='".$this->con->escape($module)."'"); } $this->versions[$module] = $version; } /** Removes given $module version entry. @param module string Module name */ public function delVersion($module) { $strReq = 'DELETE FROM '.$this->prefix.'version '. "WHERE module = '".$this->con->escape($module)."' "; $this->con->execute($strReq); if (is_array($this->versions)) { unset($this->versions[$module]); } } //@} /// @name Users management methods //@{ /** Returns a user by its ID. @param id string User ID @return record */ public function getUser($id) { $params['user_id'] = $id; return $this->getUsers($params); } /** Returns a users list. $params is an array with the following optionnal parameters: - q: search string (on user_id, user_name, user_firstname) - user_id: user ID - order: ORDER BY clause (default: user_id ASC) - limit: LIMIT clause (should be an array ![limit,offset]) @param params array Parameters @param count_only boolean Only counts results @return record */ public function getUsers($params=array(),$count_only=false) { if ($count_only) { $strReq = 'SELECT count(U.user_id) '. 'FROM '.$this->prefix.'user U '. 'WHERE NULL IS NULL '; } else { $strReq = 'SELECT U.user_id,user_super,user_status,user_pwd,user_change_pwd,'. 'user_name,user_firstname,user_displayname,user_email,user_url,'. 'user_desc, user_lang,user_tz, user_post_status,user_options, '. 'count(P.post_id) AS nb_post '. 'FROM '.$this->prefix.'user U '. 'LEFT JOIN '.$this->prefix.'post P ON U.user_id = P.user_id '. 'WHERE NULL IS NULL '; } if (!empty($params['q'])) { $q = $this->con->escape(str_replace('*','%',strtolower($params['q']))); $strReq .= 'AND ('. "LOWER(U.user_id) LIKE '".$q."' ". "OR LOWER(user_name) LIKE '".$q."' ". "OR LOWER(user_firstname) LIKE '".$q."' ". ') '; } if (!empty($params['user_id'])) { $strReq .= "AND U.user_id = '".$this->con->escape($params['user_id'])."' "; } if (!$count_only) { $strReq .= 'GROUP BY U.user_id,user_super,user_status,user_pwd,user_change_pwd,'. 'user_name,user_firstname,user_displayname,user_email,user_url,'. 'user_desc, user_lang,user_tz,user_post_status,user_options '; if (!empty($params['order']) && !$count_only) { $strReq .= 'ORDER BY '.$this->con->escape($params['order']).' '; } else { $strReq .= 'ORDER BY U.user_id ASC '; } } if (!$count_only && !empty($params['limit'])) { $strReq .= $this->con->limit($params['limit']); } $rs = $this->con->select($strReq); $rs->extend('rsExtUser'); return $rs; } /** Create a new user. Takes a cursor as input and returns the new user ID. @param cur cursor User cursor @return string */ public function addUser($cur) { if (!$this->auth->isSuperAdmin()) { throw new Exception(__('You are not an administrator')); } if ($cur->user_id == '') { throw new Exception(__('No user ID given')); } if ($cur->user_pwd == '') { throw new Exception(__('No password given')); } $this->getUserCursor($cur); if ($cur->user_creadt === null) { $cur->user_creadt = date('Y-m-d H:i:s'); } $cur->insert(); $this->auth->afterAddUser($cur); return $cur->user_id; } /** Updates an existing user. Returns the user ID. @param id string User ID @param cur cursor User cursor @return string */ public function updUser($id,$cur) { $this->getUserCursor($cur); if (($cur->user_id !== null || $id != $this->auth->userID()) && !$this->auth->isSuperAdmin()) { throw new Exception(__('You are not an administrator')); } $cur->update("WHERE user_id = '".$this->con->escape($id)."' "); $this->auth->afterUpdUser($id,$cur); if ($cur->user_id !== null) { $id = $cur->user_id; } # Updating all user's blogs $rs = $this->con->select( 'SELECT DISTINCT(blog_id) FROM '.$this->prefix.'post '. "WHERE user_id = '".$this->con->escape($id)."' " ); while ($rs->fetch()) { $b = new dcBlog($this,$rs->blog_id); $b->triggerBlog(); unset($b); } return $id; } /** Deletes a user. @param id string User ID */ public function delUser($id) { if (!$this->auth->isSuperAdmin()) { throw new Exception(__('You are not an administrator')); } if ($id == $this->auth->userID()) { return; } $rs = $this->getUser($id); if ($rs->nb_post > 0) { return; } $strReq = 'DELETE FROM '.$this->prefix.'user '. "WHERE user_id = '".$this->con->escape($id)."' "; $this->con->execute($strReq); $this->auth->afterDelUser($id); } /** Checks whether a user exists. @param id string User ID @return boolean */ public function userExists($id) { $strReq = 'SELECT user_id '. 'FROM '.$this->prefix.'user '. "WHERE user_id = '".$this->con->escape($id)."' "; $rs = $this->con->select($strReq); return !$rs->isEmpty(); } /** Returns all user permissions as an array which looks like: - [blog_id] - [name] => Blog name - [url] => Blog URL - [p] - [permission] => true - ... @param id string User ID @return array */ public function getUserPermissions($id) { $strReq = 'SELECT B.blog_id, blog_name, blog_url, permissions '. 'FROM '.$this->prefix.'permissions P '. 'INNER JOIN '.$this->prefix.'blog B ON P.blog_id = B.blog_id '. "WHERE user_id = '".$this->con->escape($id)."' "; $rs = $this->con->select($strReq); $res = array(); while ($rs->fetch()) { $res[$rs->blog_id] = array( 'name' => $rs->blog_name, 'url' => $rs->blog_url, 'p' => $this->auth->parsePermissions($rs->permissions) ); } return $res; } /** Sets user permissions. The $perms array looks like: - [blog_id] => '|perm1|perm2|' - ... @param id string User ID @param perms array Permissions array */ public function setUserPermissions($id,$perms) { if (!$this->auth->isSuperAdmin()) { throw new Exception(__('You are not an administrator')); } $strReq = 'DELETE FROM '.$this->prefix.'permissions '. "WHERE user_id = '".$this->con->escape($id)."' "; $this->con->execute($strReq); foreach ($perms as $blog_id => $p) { $this->setUserBlogPermissions($id, $blog_id, $p, false); } } /** Sets user permissions for a given blog. $perms is an array with permissions in values @param id string User ID @param blog_id string Blog ID @param perms array Permissions @param delete_first boolean Delete permissions before */ public function setUserBlogPermissions($id, $blog_id, $perms, $delete_first=true) { if (!$this->auth->isSuperAdmin()) { throw new Exception(__('You are not an administrator')); } $no_perm = empty($perms); $perms = '|'.implode('|',array_keys($perms)).'|'; $cur = $this->con->openCursor($this->prefix.'permissions'); $cur->user_id = (string) $id; $cur->blog_id = (string) $blog_id; $cur->permissions = $perms; if ($delete_first || $no_perm) { $strReq = 'DELETE FROM '.$this->prefix.'permissions '. "WHERE blog_id = '".$this->con->escape($blog_id)."' ". "AND user_id = '".$this->con->escape($id)."' "; $this->con->execute($strReq); } if (!$no_perm) { $cur->insert(); } } /** Sets a user default blog. This blog will be selected when user log in. @param id string User ID @param blog_id string Blog ID */ public function setUserDefaultBlog($id, $blog_id) { $cur = $this->con->openCursor($this->prefix.'user'); $cur->user_default_blog = (string) $blog_id; $cur->update("WHERE user_id = '".$this->con->escape($id)."'"); } private function getUserCursor($cur) { if ($cur->isField('user_id') && !preg_match('/^[A-Za-z0-9@._-]{2,}$/',$cur->user_id)) { throw new Exception(__('User ID must contain at least 2 characters using letters, numbers or symbols.')); } if ($cur->user_url !== null && $cur->user_url != '') { if (!preg_match('|^http(s?)://|',$cur->user_url)) { $cur->user_url = 'http://'.$cur->user_url; } } if ($cur->isField('user_pwd')) { if (strlen($cur->user_pwd) < 6) { throw new Exception(__('Password must contain at least 6 characters.')); } $cur->user_pwd = crypt::hmac(DC_MASTER_KEY,$cur->user_pwd); } if ($cur->user_lang !== null && !preg_match('/^[a-z]{2}(-[a-z]{2})?$/',$cur->user_lang)) { throw new Exception(__('Invalid user language code')); } if ($cur->user_upddt === null) { $cur->user_upddt = date('Y-m-d H:i:s'); } if ($cur->user_options !== null) { $cur->user_options = serialize((array) $cur->user_options); } } /** Returns user default settings in an associative array with setting names in keys. @return array */ public function userDefaults() { return array( 'edit_size' => 24, 'enable_wysiwyg' => true, 'post_format' => 'wiki' ); } //@} /// @name Blog management methods //@{ /** Returns all blog permissions (users) as an array which looks like: - [user_id] - [name] => User name - [firstname] => User firstname - [displayname] => User displayname - [super] => (true|false) super admin - [p] - [permission] => true - ... @param id string Blog ID @param with_super boolean Includes super admins in result @return array */ public function getBlogPermissions($id,$with_super=true) { $strReq = 'SELECT U.user_id AS user_id, user_super, user_name, user_firstname, '. 'user_displayname, user_email, permissions '. 'FROM '.$this->prefix.'user U '. 'JOIN '.$this->prefix.'permissions P ON U.user_id = P.user_id '. "WHERE blog_id = '".$this->con->escape($id)."' "; if ($with_super) { $strReq .= 'UNION '. 'SELECT U.user_id AS user_id, user_super, user_name, user_firstname, '. "user_displayname, user_email, NULL AS permissions ". 'FROM '.$this->prefix.'user U '. 'WHERE user_super = 1 '; } $rs = $this->con->select($strReq); $res = array(); while ($rs->fetch()) { $res[$rs->user_id] = array( 'name' => $rs->user_name, 'firstname' => $rs->user_firstname, 'displayname' => $rs->user_displayname, 'email' => $rs->user_email, 'super' => (boolean) $rs->user_super, 'p' => $this->auth->parsePermissions($rs->permissions) ); } return $res; } /** Returns a blog of given ID. @param id string Blog ID @return record */ public function getBlog($id) { $blog = $this->getBlogs(array('blog_id'=>$id)); if ($blog->isEmpty()) { return false; } return $blog; } /** Returns a record of blogs. $params is an array with the following optionnal parameters: - blog_id: Blog ID - q: Search string on blog_id, blog_name and blog_url - limit: limit results @param params array Parameters @param count_only boolean Count only results @return record */ public function getBlogs($params=array(),$count_only=false) { $join = ''; // %1$s $where = ''; // %2$s if ($count_only) { $strReq = 'SELECT count(B.blog_id) '. 'FROM '.$this->prefix.'blog B '. '%1$s '. 'WHERE NULL IS NULL '. '%2$s '; } else { $strReq = 'SELECT B.blog_id, blog_uid, blog_url, blog_name, blog_desc, blog_creadt, '. 'blog_upddt, blog_status '. 'FROM '.$this->prefix.'blog B '. '%1$s '. 'WHERE NULL IS NULL '. '%2$s '; if (!empty($params['order'])) { $strReq .= 'ORDER BY '.$this->con->escape($params['order']).' '; } else { $strReq .= 'ORDER BY B.blog_id ASC '; } if (!empty($params['limit'])) { $strReq .= $this->con->limit($params['limit']); } } if ($this->auth->userID() && !$this->auth->isSuperAdmin()) { $join = 'INNER JOIN '.$this->prefix.'permissions PE ON B.blog_id = PE.blog_id '; $where = "AND PE.user_id = '".$this->con->escape($this->auth->userID())."' ". "AND (permissions LIKE '%|usage|%' OR permissions LIKE '%|admin|%' OR permissions LIKE '%|contentadmin|%') ". "AND blog_status IN (1,0) "; } elseif (!$this->auth->userID()) { $where = 'AND blog_status IN (1,0) '; } if (!empty($params['blog_id'])) { $where .= "AND B.blog_id = '".$this->con->escape($params['blog_id'])."' "; } if (!empty($params['q'])) { $params['q'] = strtolower(str_replace('*','%',$params['q'])); $where .= 'AND ('. "LOWER(B.blog_id) LIKE '".$this->con->escape($params['q'])."' ". "OR LOWER(B.blog_name) LIKE '".$this->con->escape($params['q'])."' ". "OR LOWER(B.blog_url) LIKE '".$this->con->escape($params['q'])."' ". ') '; } $strReq = sprintf($strReq,$join,$where); return $this->con->select($strReq); } /** Creates a new blog. @param cur cursor Blog cursor */ public function addBlog($cur) { if (!$this->auth->isSuperAdmin()) { throw new Exception(__('You are not an administrator')); } $this->getBlogCursor($cur); $cur->blog_creadt = date('Y-m-d H:i:s'); $cur->blog_upddt = date('Y-m-d H:i:s'); $cur->blog_uid = md5(uniqid()); $cur->insert(); } /** Updates a given blog. @param id string Blog ID @param cur cursor Blog cursor */ public function updBlog($id,$cur) { $this->getBlogCursor($cur); $cur->blog_upddt = date('Y-m-d H:i:s'); $cur->update("WHERE blog_id = '".$this->con->escape($id)."'"); } private function getBlogCursor($cur) { if ($cur->blog_id !== null && !preg_match('/^[A-Za-z0-9._-]{2,}$/',$cur->blog_id)) { throw new Exception(__('Blog ID must contain at least 2 characters using letters, numbers or symbols.')); } if ($cur->blog_name !== null && $cur->blog_name == '') { throw new Exception(__('No blog name')); } if ($cur->blog_url !== null && $cur->blog_url == '') { throw new Exception(__('No blog URL')); } if ($cur->blog_desc !== null) { $cur->blog_desc = html::clean($cur->blog_desc); } } /** Removes a given blog. @warning This will remove everything related to the blog (posts, categories, comments, links...) @param id string Blog ID */ public function delBlog($id) { if (!$this->auth->isSuperAdmin()) { throw new Exception(__('You are not an administrator')); } $strReq = 'DELETE FROM '.$this->prefix.'blog '. "WHERE blog_id = '".$this->con->escape($id)."' "; $this->con->execute($strReq); } /** Checks if a blog exist. @param id string Blog ID @return boolean */ public function blogExists($id) { $strReq = 'SELECT blog_id '. 'FROM '.$this->prefix.'blog '. "WHERE blog_id = '".$this->con->escape($id)."' "; $rs = $this->con->select($strReq); return !$rs->isEmpty(); } /** Count posts on a blog @param id string Blog ID @param type string Post type @return boolean */ public function countBlogPosts($id,$type=null) { $strReq = 'SELECT COUNT(post_id) '. 'FROM '.$this->prefix.'post '. "WHERE blog_id = '".$this->con->escape($id)."' "; if ($type) { $strReq .= "AND post_type = '".$this->con->escape($type)."' "; } return $this->con->select($strReq)->f(0); } //@} /// @name HTML Filter methods //@{ /** Calls HTML filter to drop bad tags and produce valid XHTML output (if tidy extension is present). If enable_html_filter blog setting is false, returns not filtered string. @param str string String to filter @return string Filtered string. */ public function HTMLfilter($str) { if ($this->blog instanceof dcBlog && !$this->blog->settings->system->enable_html_filter) { return $str; } $filter = new htmlFilter; $str = trim($filter->apply($str)); return $str; } //@} /// @name wiki2xhtml methods //@{ private function initWiki() { $this->wiki2xhtml = new wiki2xhtml; } /** Returns a transformed string with wiki2xhtml. @param str string String to transform @return string Transformed string */ public function wikiTransform($str) { if (!($this->wiki2xhtml instanceof wiki2xhtml)) { $this->initWiki(); } return $this->wiki2xhtml->transform($str); } /** Inits wiki2xhtml property for blog post. */ public function initWikiPost() { $this->initWiki(); $this->wiki2xhtml->setOpts(array( 'active_title' => 1, 'active_setext_title' => 0, 'active_hr' => 1, 'active_lists' => 1, 'active_quote' => 1, 'active_pre' => 1, 'active_empty' => 1, 'active_auto_br' => 0, 'active_auto_urls' => 0, 'active_urls' => 1, 'active_auto_img' => 0, 'active_img' => 1, 'active_anchor' => 1, 'active_em' => 1, 'active_strong' => 1, 'active_br' => 1, 'active_q' => 1, 'active_code' => 1, 'active_acronym' => 1, 'active_ins' => 1, 'active_del' => 1, 'active_footnotes' => 1, 'active_wikiwords' => 0, 'active_macros' => 1, 'parse_pre' => 1, 'active_fr_syntax' => 0, 'first_title_level' => 3, 'note_prefix' => 'wiki-footnote', 'note_str' => '

    Notes

    %s
    ' )); $this->wiki2xhtml->registerFunction('url:post',array($this,'wikiPostLink')); # --BEHAVIOR-- coreWikiPostInit $this->callBehavior('coreInitWikiPost',$this->wiki2xhtml); } /** Inits wiki2xhtml property for simple blog comment (basic syntax). */ public function initWikiSimpleComment() { $this->initWiki(); $this->wiki2xhtml->setOpts(array( 'active_title' => 0, 'active_setext_title' => 0, 'active_hr' => 0, 'active_lists' => 0, 'active_quote' => 0, 'active_pre' => 0, 'active_empty' => 0, 'active_auto_br' => 1, 'active_auto_urls' => 1, 'active_urls' => 0, 'active_auto_img' => 0, 'active_img' => 0, 'active_anchor' => 0, 'active_em' => 0, 'active_strong' => 0, 'active_br' => 0, 'active_q' => 0, 'active_code' => 0, 'active_acronym' => 0, 'active_ins' => 0, 'active_del' => 0, 'active_footnotes' => 0, 'active_wikiwords' => 0, 'active_macros' => 0, 'parse_pre' => 0, 'active_fr_syntax' => 0 )); # --BEHAVIOR-- coreInitWikiSimpleComment $this->callBehavior('coreInitWikiSimpleComment',$this->wiki2xhtml); } /** Inits wiki2xhtml property for blog comment. */ public function initWikiComment() { $this->initWiki(); $this->wiki2xhtml->setOpts(array( 'active_title' => 0, 'active_setext_title' => 0, 'active_hr' => 0, 'active_lists' => 1, 'active_quote' => 0, 'active_pre' => 1, 'active_empty' => 0, 'active_auto_br' => 1, 'active_auto_urls' => 1, 'active_urls' => 1, 'active_auto_img' => 0, 'active_img' => 0, 'active_anchor' => 0, 'active_em' => 1, 'active_strong' => 1, 'active_br' => 1, 'active_q' => 1, 'active_code' => 1, 'active_acronym' => 1, 'active_ins' => 1, 'active_del' => 1, 'active_footnotes' => 0, 'active_wikiwords' => 0, 'active_macros' => 0, 'parse_pre' => 0, 'active_fr_syntax' => 0 )); # --BEHAVIOR-- coreInitWikiComment $this->callBehavior('coreInitWikiComment',$this->wiki2xhtml); } public function wikiPostLink($url,$content) { if (!($this->blog instanceof dcBlog)) { return array(); } $post_id = abs((integer) substr($url,5)); if (!$post_id) { return array(); } $post = $this->blog->getPosts(array('post_id'=>$post_id)); if ($post->isEmpty()) { return array(); } $res = array('url' => $post->getURL()); $post_title = $post->post_title; if ($content != $url) { $res['title'] = html::escapeHTML($post->post_title); } if ($content == '' || $content == $url) { $res['content'] = html::escapeHTML($post->post_title); } if ($post->post_lang) { $res['lang'] = $post->post_lang; } return $res; } //@} /// @name Maintenance methods //@{ /** Creates default settings for active blog. Optionnal parameter defaults replaces default params while needed. @param defaults array Default parameters */ public function blogDefaults($defaults=null) { if (!is_array($defaults)) { $defaults = array( array('allow_comments','boolean',true, 'Allow comments on blog'), array('allow_trackbacks','boolean',true, 'Allow trackbacks on blog'), array('blog_timezone','string','Europe/London', 'Blog timezone'), array('comments_nofollow','boolean',true, 'Add rel="nofollow" to comments URLs'), array('comments_pub','boolean',true, 'Publish comments immediately'), array('comments_ttl','integer',0, 'Number of days to keep comments open (0 means no ttl)'), array('copyright_notice','string','','Copyright notice (simple text)'), array('date_format','string','%A, %B %e %Y', 'Date format. See PHP strftime function for patterns'), array('editor','string','', 'Person responsible of the content'), array('enable_html_filter','boolean',0, 'Enable HTML filter'), array('enable_xmlrpc','boolean',0, 'Enable XML/RPC interface'), array('lang','string','en', 'Default blog language'), array('media_exclusion','string','/\.php$/i', 'File name exclusion pattern in media manager. (PCRE value)'), array('media_img_m_size','integer',448, 'Image medium size in media manager'), array('media_img_s_size','integer',240, 'Image small size in media manager'), array('media_img_t_size','integer',100, 'Image thumbnail size in media manager'), array('media_img_title_pattern','string','Title ;; Date(%b %Y) ;; separator(, )', 'Pattern to set image title when you insert it in a post'), array('nb_post_per_page','integer',20, 'Number of entries on home page and category pages'), array('nb_post_per_feed','integer',20, 'Number of entries on feeds'), array('nb_comment_per_feed','integer',20, 'Number of comments on feeds'), array('post_url_format','string','{y}/{m}/{d}/{t}', 'Post URL format. {y}: year, {m}: month, {d}: day, {id}: post id, {t}: entry title'), array('public_path','string','public', 'Path to public directory, begins with a / for a full system path'), array('public_url','string','/public', 'URL to public directory'), array('robots_policy','string','INDEX,FOLLOW', 'Search engines robots policy'), array('short_feed_items','boolean',false, 'Display short feed items'), array('theme','string','default', 'Blog theme'), array('themes_path','string','themes', 'Themes root path'), array('themes_url','string','/themes', 'Themes root URL'), array('time_format','string','%H:%M', 'Time format. See PHP strftime function for patterns'), array('tpl_allow_php','boolean',false, 'Allow PHP code in templates'), array('tpl_use_cache','boolean',true, 'Use template caching'), array('trackbacks_pub','boolean',true, 'Publish trackbacks immediately'), array('trackbacks_ttl','integer',0, 'Number of days to keep trackbacks open (0 means no ttl)'), array('url_scan','string','query_string', 'URL handle mode (path_info or query_string)'), array('use_smilies','boolean',false, 'Show smilies on entries and comments'), array('inc_subcats','boolean',false, 'Include sub-categories in category page and category posts feed'), array('wiki_comments','boolean',false, 'Allow commenters to use a subset of wiki syntax') ); } $settings = new dcSettings($this,null); $settings->addNamespace('system'); foreach ($defaults as $v) { $settings->system->put($v[0],$v[2],$v[1],$v[3],false,true); } } /** Recreates entries search engine index. @param start integer Start entry index @param limit integer Number of entry to index @return integer $start and $limit sum */ public function indexAllPosts($start=null,$limit=null) { $strReq = 'SELECT COUNT(post_id) '. 'FROM '.$this->prefix.'post'; $rs = $this->con->select($strReq); $count = $rs->f(0); $strReq = 'SELECT post_id, post_title, post_excerpt_xhtml, post_content_xhtml '. 'FROM '.$this->prefix.'post '; if ($start !== null && $limit !== null) { $strReq .= $this->con->limit($start,$limit); } $rs = $this->con->select($strReq,true); $cur = $this->con->openCursor($this->prefix.'post'); while ($rs->fetch()) { $words = $rs->post_title.' '. $rs->post_excerpt_xhtml.' '. $rs->post_content_xhtml; $cur->post_words = implode(' ',text::splitWords($words)); $cur->update('WHERE post_id = '.(integer) $rs->post_id); $cur->clean(); } if ($start+$limit > $count) { return null; } return $start+$limit; } /** Recreates comments search engine index. @param start integer Start comment index @param limit integer Number of comments to index @return integer $start and $limit sum */ public function indexAllComments($start=null,$limit=null) { $strReq = 'SELECT COUNT(comment_id) '. 'FROM '.$this->prefix.'comment'; $rs = $this->con->select($strReq); $count = $rs->f(0); $strReq = 'SELECT comment_id, comment_content '. 'FROM '.$this->prefix.'comment '; if ($start !== null && $limit !== null) { $strReq .= $this->con->limit($start,$limit); } $rs = $this->con->select($strReq); $cur = $this->con->openCursor($this->prefix.'comment'); while ($rs->fetch()) { $cur->comment_words = implode(' ',text::splitWords($rs->comment_content)); $cur->update('WHERE comment_id = '.(integer) $rs->comment_id); $cur->clean(); } if ($start+$limit > $count) { return null; } return $start+$limit; } /** Reinits nb_comment and nb_trackback in post table. */ public function countAllComments() { $updCommentReq = 'UPDATE '.$this->prefix.'post P '. 'SET nb_comment = ('. 'SELECT COUNT(C.comment_id) from '.$this->prefix.'comment C '. 'WHERE C.post_id = P.post_id AND C.comment_trackback <> 1 '. 'AND C.comment_status = 1 '. ')'; $updTrackbackReq = 'UPDATE '.$this->prefix.'post P '. 'SET nb_trackback = ('. 'SELECT COUNT(C.comment_id) from '.$this->prefix.'comment C '. 'WHERE C.post_id = P.post_id AND C.comment_trackback = 1 '. 'AND C.comment_status = 1 '. ')'; $this->con->execute($updCommentReq); $this->con->execute($updTrackbackReq); } /** Empty templates cache directory */ public function emptyTemplatesCache() { if (is_dir(DC_TPL_CACHE.'/cbtpl')) { files::deltree(DC_TPL_CACHE.'/cbtpl'); } } //@} } dotclear-2.6.2+dfsg/inc/core/class.dc.error.php000066400000000000000000000045341230033266200212740ustar00rootroot00000000000000\n%s\n"; /** @var string HTML error item pattern */ protected $html_item = "
  • %s
  • \n"; /** * Object constructor. */ public function __construct() { $this->code = 0; $this->msg = ''; } /** * Object string representation. Returns errors stack. * * @return string */ public function __toString() { $res = ''; foreach ($this->errors as $msg) { $res .= $msg."\n"; } return $res; } /** * Adds an error to stack. * * @param string $msg Error message */ public function add($msg) { $this->flag = true; $this->errors[] = $msg; } /** * Returns the value of flag property. True if errors stack is not empty * * @return boolean */ public function flag() { return $this->flag; } /** * Resets errors stack. */ public function reset() { $this->flag = false; $this->errors = array(); } /** * Returns errors property. * * @return array */ public function getErrors() { return $this->errors; } /** * Sets list and item properties. * * @param string $list HTML errors list pattern * @param string $item HTML error item pattern */ public function setHTMLFormat($list,$item) { $this->html_list = $list; $this->html_item = $item; } /** * Returns errors stack as HTML. * * @return string */ public function toHTML() { $res = ''; if ($this->flag) { foreach ($this->errors as $msg) { $res .= sprintf($this->html_item,$msg); } $res = sprintf($this->html_list,$res); } return $res; } } dotclear-2.6.2+dfsg/inc/core/class.dc.log.php000066400000000000000000000107731230033266200207260ustar00rootroot00000000000000dcCore dcCore instance */ public function __construct($core) { $this->core =& $core; $this->prefix = $core->prefix; } /** Retrieves logs. $params is an array taking the following optionnal parameters: - blog_id: Get logs belonging to given blog ID - user_id: Get logs belonging to given user ID - log_ip: Get logs belonging to given IP address - log_table: Get logs belonging to given log table - order: Order of results (default "ORDER BY log_dt DESC") - limit: Limit parameter @param params array Parameters @param count_only boolean Only counts results @return record A record with some more capabilities */ public function getLogs($params = array(),$count_only = false) { if ($count_only) { $f = 'COUNT(log_id)'; } else { $f = 'L.log_id, L.user_id, L.log_table, L.log_dt, '. 'L.log_ip, L.log_msg, L.blog_id, U.user_name, '. 'U.user_firstname, U.user_displayname, U.user_url'; } $strReq = 'SELECT '.$f.' FROM '.$this->prefix.'log L '; if (!$count_only) { $strReq .= 'LEFT JOIN '.$this->prefix.'user U '. 'ON U.user_id = L.user_id '; } if (!empty($params['blog_id'])) { if ($params['blog_id'] === 'all') { $strReq .= "WHERE NULL IS NULL "; } else { $strReq .= "WHERE L.blog_id = '".$this->core->con->escape($params['blog_id'])."' "; } } else { $strReq .= "WHERE L.blog_id = '".$this->core->blog->id."' "; } if (!empty($params['user_id'])) { $strReq .= 'AND L.user_id'.$this->core->con->in($params['user_id']); } if (!empty($params['log_ip'])) { $strReq .= 'AND log_ip'.$this->core->con->in($params['log_ip']); } if (!empty($params['log_table'])) { $strReq .= 'AND log_table'.$this->core->con->in($params['log_table']); } if (!$count_only) { if (!empty($params['order'])) { $strReq .= 'ORDER BY '.$this->core->con->escape($params['order']).' '; } else { $strReq .= 'ORDER BY log_dt DESC '; } } if (!empty($params['limit'])) { $strReq .= $this->core->con->limit($params['limit']); } $rs = $this->core->con->select($strReq); $rs->extend('rsExtLog'); return $rs; } /** Creates a new log. Takes a cursor as input and returns the new log ID. @param cur cursor Log cursor @return integer New log ID */ public function addLog($cur) { $this->core->con->writeLock($this->prefix.'log'); try { # Get ID $rs = $this->core->con->select( 'SELECT MAX(log_id) '. 'FROM '.$this->prefix.'log ' ); $cur->log_id = (integer) $rs->f(0) + 1; $cur->blog_id = (string) $this->core->blog->id; $cur->log_dt = date('Y-m-d H:i:s'); $this->getLogCursor($cur,$cur->log_id); # --BEHAVIOR-- coreBeforeLogCreate $this->core->callBehavior('coreBeforeLogCreate',$this,$cur); $cur->insert(); $this->core->con->unlock(); } catch (Exception $e) { $this->core->con->unlock(); throw $e; } # --BEHAVIOR-- coreAfterLogCreate $this->core->callBehavior('coreAfterLogCreate',$this,$cur); return $cur->log_id; } /** Deletes a log. @param id integer Log ID */ public function delLogs($id,$all = false) { $strReq = $all ? 'TRUNCATE TABLE '.$this->prefix.'log' : 'DELETE FROM '.$this->prefix.'log WHERE log_id'.$this->core->con->in($id); $this->core->con->execute($strReq); } private function getLogCursor($cur,$log_id = null) { if ($cur->log_msg === '') { throw new Exception(__('No log message')); } if ($cur->log_table === null) { $cur->log_table = 'none'; } if ($cur->user_id === null) { $cur->user_id = 'unknown'; } if ($cur->log_dt === '' || $cur->log_dt === null) { $cur->log_dt = date('Y-m-d H:i:s'); } if ($cur->log_ip === null) { $cur->log_ip = http::realIP(); } $log_id = is_int($log_id) ? $log_id : $cur->log_id; } } class rsExtLog { public static function getUserCN($rs) { $user = dcUtils::getUserCN($rs->user_id, $rs->user_name, $rs->user_firstname, $rs->user_displayname); if ($user === 'unknown') { $user = __('unknown'); } return $user; } } dotclear-2.6.2+dfsg/inc/core/class.dc.media.php000066400000000000000000000743521230033266200212270ustar00rootroot00000000000000dcCore dcCore instance protected $con; ///< connection Database connection protected $table; ///< string Media table name protected $type; ///< string Media type filter protected $postmedia; protected $file_sort = 'name-asc'; protected $file_handler = array(); ///< array Array of callbacks public $thumb_tp = '%s/.%s_%s.jpg'; ///< string Thumbnail file pattern public $thumb_tp_alpha = '%s/.%s_%s.png'; ///< string Thumbnail file pattern (with alpha layer) /** array Tubmnail sizes: - m: medium image - s: small image - t: thumbnail image - sq: square image */ public $thumb_sizes = array( 'm' => array(448,'ratio','medium'), 's' => array(240,'ratio','small'), 't' => array(100,'ratio','thumbnail'), 'sq' => array(48,'crop','square') ); public $icon_img = 'images/media/%s.png'; ///< string Icon file pattern /** Object constructor. @param core dcCore dcCore instance @param type string Media type filter */ public function __construct($core,$type='') { $this->core =& $core; $this->con =& $core->con; $this->postmedia = new dcPostMedia($core); if ($this->core->blog == null) { throw new Exception(__('No blog defined.')); } $this->table = $this->core->prefix.'media'; $root = $this->core->blog->public_path; if (preg_match('#^http(s)?://#',$this->core->blog->settings->system->public_url)) { $root_url = rawurldecode($this->core->blog->settings->system->public_url); } else { $root_url = rawurldecode($this->core->blog->host.path::clean($this->core->blog->settings->system->public_url)); } if (!is_dir($root)) { # Check public directory if ( $core->auth->isSuperAdmin() ) { throw new Exception(__("There is no writable directory /public/ at the location set in about:config \"public_path\". You must create this directory with sufficient rights (or change this setting).")); } else { throw new Exception(__("There is no writable root directory for the media manager. You should contact your administrator.")); } } $this->type = $type; parent::__construct($root,$root_url); $this->chdir(''); $this->path = $this->core->blog->settings->system->public_path; $this->addExclusion(DC_RC_PATH); $this->addExclusion(dirname(__FILE__).'/../'); $this->exclude_pattern = $core->blog->settings->system->media_exclusion; # Event handlers $this->addFileHandler('image/jpeg','create',array($this,'imageThumbCreate')); $this->addFileHandler('image/png','create',array($this,'imageThumbCreate')); $this->addFileHandler('image/gif','create',array($this,'imageThumbCreate')); $this->addFileHandler('image/png','update',array($this,'imageThumbUpdate')); $this->addFileHandler('image/jpeg','update',array($this,'imageThumbUpdate')); $this->addFileHandler('image/gif','update',array($this,'imageThumbUpdate')); $this->addFileHandler('image/png','remove',array($this,'imageThumbRemove')); $this->addFileHandler('image/jpeg','remove',array($this,'imageThumbRemove')); $this->addFileHandler('image/gif','remove',array($this,'imageThumbRemove')); $this->addFileHandler('image/jpeg','create',array($this,'imageMetaCreate')); $this->addFileHandler('image/jpeg','recreate',array($this,'imageThumbCreate')); $this->addFileHandler('image/png','recreate',array($this,'imageThumbCreate')); $this->addFileHandler('image/gif','recreate',array($this,'imageThumbCreate')); $this->addFileHandler('image/jpeg','recreate',array($this,'imageThumbCreate')); $this->addFileHandler('image/png','recreate',array($this,'imageThumbCreate')); $this->addFileHandler('image/gif','recreate',array($this,'imageThumbCreate')); # Thumbnails sizes $this->thumb_sizes['m'][0] = abs($core->blog->settings->system->media_img_m_size); $this->thumb_sizes['s'][0] = abs($core->blog->settings->system->media_img_s_size); $this->thumb_sizes['t'][0] = abs($core->blog->settings->system->media_img_t_size); # Thumbnails sizes names $this->thumb_sizes['m'][2] = __($this->thumb_sizes['m'][2]); $this->thumb_sizes['s'][2] = __($this->thumb_sizes['s'][2]); $this->thumb_sizes['t'][2] = __($this->thumb_sizes['t'][2]); $this->thumb_sizes['sq'][2] = __($this->thumb_sizes['sq'][2]); # --BEHAVIOR-- coreMediaConstruct $this->core->callBehavior('coreMediaConstruct',$this); } /** Changes working directory. @param dir string Directory name. */ public function chdir($dir) { parent::chdir($dir); $this->relpwd = preg_replace('/^'.preg_quote($this->root,'/').'\/?/','',$this->pwd); } /** Adds a new file handler for a given media type and event. Available events are: - create: file creation - update: file update - remove: file deletion @param type string Media type @param event string Event @param function callback */ public function addFileHandler($type,$event,$function) { if (is_callable($function)) { $this->file_handler[$type][$event][] = $function; } } protected function callFileHandler($type,$event) { if (!empty($this->file_handler[$type][$event])) { $args = func_get_args(); array_shift($args); array_shift($args); foreach ($this->file_handler[$type][$event] as $f) { call_user_func_array($f,$args); } } } /** Returns HTML breadCrumb for media manager navigation. @param href string URL pattern @param last string Last item pattern @return string HTML code */ public function breadCrumb($href,$last='') { $res = ''; if ($this->relpwd && $this->relpwd != '.') { $pwd = ''; $arr = explode('/',$this->relpwd); $count = count($arr); foreach ($arr as $v) { if (($last != '') && (0 === --$count)) { $res .= sprintf($last,$v); } else { $pwd .= rawurlencode($v).'/'; $res .= ''.$v.' / '; } } } return $res; } protected function fileRecord($rs) { if ($rs->isEmpty()) { return null; } if (!$this->isFileExclude($this->root.'/'.$rs->media_file) && is_file($this->root.'/'.$rs->media_file)) { $f = new fileItem($this->root.'/'.$rs->media_file,$this->root,$this->root_url); if ($this->type && $f->type_prefix != $this->type) { return null; } $meta = @simplexml_load_string($rs->media_meta); $f->editable = true; $f->media_id = $rs->media_id; $f->media_title = $rs->media_title; $f->media_meta = $meta instanceof SimpleXMLElement ? $meta : simplexml_load_string(''); $f->media_user = $rs->user_id; $f->media_priv = (boolean) $rs->media_private; $f->media_dt = strtotime($rs->media_dt); $f->media_dtstr = dt::str('%Y-%m-%d %H:%M',$f->media_dt); $f->media_image = false; if (!$this->core->auth->check('media_admin',$this->core->blog->id) && $this->core->auth->userID() != $f->media_user) { $f->del = false; $f->editable = false; } $type_prefix = explode('/',$f->type); $type_prefix = $type_prefix[0]; switch ($type_prefix) { case 'image': $f->media_image = true; $f->media_icon = 'image'; break; case 'audio': $f->media_icon = 'audio'; break; case 'text': $f->media_icon = 'text'; break; case 'video': $f->media_icon = 'video'; break; default: $f->media_icon = 'blank'; } switch ($f->type) { case 'application/msword': case 'application/vnd.oasis.opendocument.text': case 'application/vnd.sun.xml.writer': case 'application/pdf': case 'application/postscript': $f->media_icon = 'document'; break; case 'application/msexcel': case 'application/vnd.oasis.opendocument.spreadsheet': case 'application/vnd.sun.xml.calc': $f->media_icon = 'spreadsheet'; break; case 'application/mspowerpoint': case 'application/vnd.oasis.opendocument.presentation': case 'application/vnd.sun.xml.impress': $f->media_icon = 'presentation'; break; case 'application/x-debian-package': case 'application/x-bzip': case 'application/x-gzip': case 'application/x-java-archive': case 'application/rar': case 'application/x-redhat-package-manager': case 'application/x-tar': case 'application/x-gtar': case 'application/zip': $f->media_icon = 'package'; break; case 'application/octet-stream': $f->media_icon = 'executable'; break; case 'application/x-shockwave-flash': $f->media_icon = 'video'; break; case 'application/ogg': $f->media_icon = 'audio'; break; case 'text/html': $f->media_icon = 'html'; break; } $f->media_type = $f->media_icon; $f->media_icon = sprintf($this->icon_img,$f->media_icon); # Thumbnails $f->media_thumb = array(); $p = path::info($f->relname); $alpha = ($p['extension'] == 'png') || ($p['extension'] == 'PNG'); $thumb = sprintf(($alpha ? $this->thumb_tp_alpha : $this->thumb_tp),$this->root.'/'.$p['dirname'],$p['base'],'%s'); $thumb_url = sprintf(($alpha ? $this->thumb_tp_alpha : $this->thumb_tp),$this->root_url.$p['dirname'],$p['base'],'%s'); # Cleaner URLs $thumb_url = preg_replace('#\./#','/',$thumb_url); $thumb_url = preg_replace('#(?thumb_tp,$this->root.'/'.$p['dirname'],$p['base'],'%s'); $thumb_url_alt = sprintf($this->thumb_tp,$this->root_url.$p['dirname'],$p['base'],'%s'); # Cleaner URLs $thumb_url_alt = preg_replace('#\./#','/',$thumb_url_alt); $thumb_url_alt = preg_replace('#(?thumb_sizes as $suffix => $s) { if (file_exists(sprintf($thumb,$suffix))) { $f->media_thumb[$suffix] = sprintf($thumb_url,$suffix); } elseif ($alpha && file_exists(sprintf($thumb_alt,$suffix))) { $f->media_thumb[$suffix] = sprintf($thumb_url_alt,$suffix); } } if (isset($f->media_thumb['sq']) && $f->media_type == 'image') { $f->media_icon = $f->media_thumb['sq']; } return $f; } return null; } public function setFileSort($type='name') { if (in_array($type,array('name-asc','name-desc','date-asc','date-desc'))) { $this->file_sort = $type; } } protected function sortFileHandler($a,$b) { switch ($this->file_sort) { case 'date-asc': if ($a->media_dt == $b->media_dt) { return 0; } return ($a->media_dt < $b->media_dt) ? -1 : 1; case 'date-desc': if ($a->media_dt == $b->media_dt) { return 0; } return ($a->media_dt > $b->media_dt) ? -1 : 1; case 'name-desc': return strcasecmp($b->basename,$a->basename); case 'name-asc': default: return strcasecmp($a->basename,$b->basename); } } /** Gets current working directory content (using filesystem) */ public function getFSDir() { parent::getDir(); } /** Gets current working directory content. @param type string Media type filter */ public function getDir($type=null) { if ($type) { $this->type = $type; } $media_dir = $this->relpwd ? $this->relpwd : '.'; $strReq = 'SELECT media_file, media_id, media_path, media_title, media_meta, media_dt, '. 'media_creadt, media_upddt, media_private, user_id '. 'FROM '.$this->table.' '. "WHERE media_path = '".$this->path."' ". "AND media_dir = '".$this->con->escape($media_dir)."' "; if (!$this->core->auth->check('media_admin',$this->core->blog->id)) { $strReq .= 'AND (media_private <> 1 '; if ($this->core->auth->userID()) { $strReq .= "OR user_id = '".$this->con->escape($this->core->auth->userID())."'"; } $strReq .= ') '; } $rs = $this->con->select($strReq); parent::getDir(); $f_res = array(); $p_dir = $this->dir; # If type is set, remove items from p_dir if ($this->type) { foreach ($p_dir['files'] as $k => $f) { if ($f->type_prefix != $this->type) { unset($p_dir['files'][$k]); } } } $f_reg = array(); while ($rs->fetch()) { # File in subdirectory, forget about it! if (dirname($rs->media_file) != '.' && dirname($rs->media_file) != $this->relpwd) { continue; } if ($this->inFiles($rs->media_file)) { $f = $this->fileRecord($rs); if ($f !== null) { if (isset($f_reg[$rs->media_file])) { # That media is duplicated in the database, # time to do a bit of house cleaning. $this->con->execute( 'DELETE FROM '.$this->table.' '. "WHERE media_id = ".$this->fileRecord($rs)->media_id ); } else { $f_res[] = $this->fileRecord($rs); $f_reg[$rs->media_file] = 1; } } } elseif (!empty($p_dir['files']) && $this->relpwd == '') { # Physical file does not exist remove it from DB # Because we don't want to erase everything on # dotclear upgrade, do it only if there are files # in directory and directory is root $this->con->execute( 'DELETE FROM '.$this->table.' '. "WHERE media_path = '".$this->con->escape($this->path)."' ". "AND media_file = '".$this->con->escape($rs->media_file)."' " ); $this->callFileHandler(files::getMimeType($rs->media_file),'remove',$this->pwd.'/'.$rs->media_file); } } $this->dir['files'] = $f_res; foreach ($this->dir['dirs'] as $k => $v) { $v->media_icon = sprintf($this->icon_img,($v->parent ? 'folder-up' : 'folder')); } # Check files that don't exist in database and create them if ($this->core->auth->check('media,media_admin',$this->core->blog->id)) { foreach ($p_dir['files'] as $f) { if (!isset($f_reg[$f->relname])) { if (($id = $this->createFile($f->basename,null,false,null,false)) !== false) { $this->dir['files'][] = $this->getFile($id); } } } } usort($this->dir['files'],array($this,'sortFileHandler')); } /** Gets file by its id. Returns a filteItem object. @param id integer File ID @return fileItem */ public function getFile($id) { $strReq = 'SELECT media_id, media_path, media_title, '. 'media_file, media_meta, media_dt, media_creadt, '. 'media_upddt, media_private, user_id '. 'FROM '.$this->table.' '. "WHERE media_path = '".$this->path."' ". 'AND media_id = '.(integer) $id.' '; if (!$this->core->auth->check('media_admin',$this->core->blog->id)) { $strReq .= 'AND (media_private <> 1 '; if ($this->core->auth->userID()) { $strReq .= "OR user_id = '".$this->con->escape($this->core->auth->userID())."'"; } $strReq .= ') '; } $rs = $this->con->select($strReq); return $this->fileRecord($rs); } /** Returns media items attached to a blog post. Result is an array containing fileItems objects. @param post_id integer Post ID @param media_id integer Optionnal media ID @return array Array of fileItems */ public function getPostMedia($post_id,$media_id=null) { $params = array( 'post_id' => $post_id, 'media_path' => $this->path ); if ($media_id) { $params['media_id'] = (integer) $media_id; } $rs = $this->postmedia->getPostMedia($params); $res = array(); while ($rs->fetch()) { $f = $this->fileRecord($rs); if ($f !== null) { $res[] = $f; } } return $res; } /** @deprecated since version 2.4 @see dcPostMedia::addPostMedia */ public function addPostMedia($post_id,$media_id) { $this->postmedia->addPostMedia($post_id,$media_id); } /** @deprecated since version 2.4 @see dcPostMedia::removePostMedia */ public function removePostMedia($post_id,$media_id) { $this->postmedia->removePostMedia($post_id,$media_id,"attachment"); } /** Rebuilds database items collection. Optional $pwd parameter is the path where to start rebuild. @param pwd string Directory to rebuild */ public function rebuild($pwd='') { if (!$this->core->auth->isSuperAdmin()) { throw new Exception(__('You are not a super administrator.')); } $this->chdir($pwd); parent::getDir(); $dir = $this->dir; foreach ($dir['dirs'] as $d) { if (!$d->parent) { $this->rebuild($d->relname,false); } } foreach ($dir['files'] as $f) { $this->chdir(dirname($f->relname)); $this->createFile($f->basename); } $this->rebuildDB($pwd); } protected function rebuildDB($pwd) { $media_dir = $pwd ? $pwd : '.'; $strReq = 'SELECT media_file, media_id '. 'FROM '.$this->table.' '. "WHERE media_path = '".$this->path."' ". "AND media_dir = '".$this->con->escape($media_dir)."' "; $rs = $this->con->select($strReq); $delReq = 'DELETE FROM '.$this->table.' '. 'WHERE media_id IN (%s) '; $del_ids = array(); while ($rs->fetch()) { if (!is_file($this->root.'/'.$rs->media_file)) { $del_ids[] = (integer) $rs->media_id; } } if (!empty($del_ids)) { $this->con->execute(sprintf($delReq,implode(',',$del_ids))); } } public function makeDir($d) { $d = files::tidyFileName($d); parent::makeDir($d); } /** Creates or updates a file in database. Returns new media ID or false if file does not exist. @param name string File name (relative to working directory) @param title string File title @param private boolean File is private @param dt string File date @return integer New media ID */ public function createFile($name,$title=null,$private=false,$dt=null,$force=true) { if (!$this->core->auth->check('media,media_admin',$this->core->blog->id)) { throw new Exception(__('Permission denied.')); } $file = $this->pwd.'/'.$name; if (!file_exists($file)) { return false; } $media_file = $this->relpwd ? path::clean($this->relpwd.'/'.$name) : path::clean($name); $media_type = files::getMimeType($name); $cur = $this->con->openCursor($this->table); $strReq = 'SELECT media_id '. 'FROM '.$this->table.' '. "WHERE media_path = '".$this->con->escape($this->path)."' ". "AND media_file = '".$this->con->escape($media_file)."' "; $rs = $this->con->select($strReq); if ($rs->isEmpty()) { $this->con->writeLock($this->table); try { $rs = $this->con->select('SELECT MAX(media_id) FROM '.$this->table); $media_id = (integer) $rs->f(0) + 1; $cur->media_id = $media_id; $cur->user_id = (string) $this->core->auth->userID(); $cur->media_path = (string) $this->path; $cur->media_file = (string) $media_file; $cur->media_dir = (string) dirname($media_file); $cur->media_creadt = date('Y-m-d H:i:s'); $cur->media_upddt = date('Y-m-d H:i:s'); $cur->media_title = !$title ? (string) $name : (string) $title; $cur->media_private = (integer) (boolean) $private; if ($dt) { $cur->media_dt = (string) $dt; } else { $cur->media_dt = strftime('%Y-%m-%d %H:%M:%S',filemtime($file)); } try { $cur->insert(); } catch (Exception $e) { @unlink($name); throw $e; } $this->con->unlock(); } catch (Exception $e) { $this->con->unlock(); throw $e; } } else { $media_id = (integer) $rs->media_id; $cur->media_upddt = date('Y-m-d H:i:s'); $cur->update('WHERE media_id = '.$media_id); } $this->callFileHandler($media_type,'create',$cur,$name,$media_id,$force); return $media_id; } /** Updates a file in database. @param file fileItem Current fileItem object @param newFile fileItem New fileItem object */ public function updateFile($file,$newFile) { if (!$this->core->auth->check('media,media_admin',$this->core->blog->id)) { throw new Exception(__('Permission denied.')); } $id = (integer) $file->media_id; if (!$id) { throw new Exception('No file ID'); } if (!$this->core->auth->check('media_admin',$this->core->blog->id) && $this->core->auth->userID() != $file->media_user) { throw new Exception(__('You are not the file owner.')); } $cur = $this->con->openCursor($this->table); # We need to tidy newFile basename. If dir isn't empty, concat to basename $newFile->relname = files::tidyFileName($newFile->basename); if ($newFile->dir) { $newFile->relname = $newFile->dir.'/'.$newFile->relname; } if ($file->relname != $newFile->relname) { $newFile->file = $this->root.'/'.$newFile->relname; if ($this->isFileExclude($newFile->relname)) { throw new Exception(__('This file is not allowed.')); } if (file_exists($newFile->file)) { throw new Exception(__('New file already exists.')); } $this->moveFile($file->relname,$newFile->relname); $cur->media_file = (string) $newFile->relname; $cur->media_dir = (string) dirname($newFile->relname); } $cur->media_title = (string) $newFile->media_title; $cur->media_dt = (string) $newFile->media_dtstr; $cur->media_upddt = date('Y-m-d H:i:s'); $cur->media_private = (integer) $newFile->media_priv; $cur->update('WHERE media_id = '.$id); $this->callFileHandler($file->type,'update',$file,$newFile); } /** Uploads a file. @param tmp string Full path of temporary uploaded file @param name string File name (relative to working directory) @param title string File title @param private boolean File is private */ public function uploadFile($tmp,$name,$title=null,$private=false,$overwrite=false) { if (!$this->core->auth->check('media,media_admin',$this->core->blog->id)) { throw new Exception(__('Permission denied.')); } $name = files::tidyFileName($name); parent::uploadFile($tmp,$name,$overwrite); return $this->createFile($name,$title,$private); } /** Creates a file from binary content. @param name string File name (relative to working directory) @param bits string Binary file content */ public function uploadBits($name,$bits) { if (!$this->core->auth->check('media,media_admin',$this->core->blog->id)) { throw new Exception(__('Permission denied.')); } $name = files::tidyFileName($name); parent::uploadBits($name,$bits); return $this->createFile($name,null,null); } /** Removes a file. @param f fileItem fileItem object */ public function removeFile($f) { if (!$this->core->auth->check('media,media_admin',$this->core->blog->id)) { throw new Exception(__('Permission denied.')); } $media_file = $this->relpwd ? path::clean($this->relpwd.'/'.$f) : path::clean($f); $strReq = 'DELETE FROM '.$this->table.' '. "WHERE media_path = '".$this->con->escape($this->path)."' ". "AND media_file = '".$this->con->escape($media_file)."' "; if (!$this->core->auth->check('media_admin',$this->core->blog->id)) { $strReq .= "AND user_id = '".$this->con->escape($this->core->auth->userID())."'"; } $this->con->execute($strReq); if ($this->con->changes() == 0) { throw new Exception(__('File does not exist in the database.')); } parent::removeFile($f); $this->callFileHandler(files::getMimeType($media_file),'remove',$f); } /** * Root directories * * Returns an array of directory under {@link $root} directory. * * @uses fileItem * @return array */ public function getDBDirs() { $media_dir = $this->relpwd ? $this->relpwd : '.'; $strReq = 'SELECT distinct media_dir '. 'FROM '.$this->table.' '. "WHERE media_path = '".$this->path."'"; $rs = $this->con->select($strReq); while ($rs->fetch()) { if (is_dir($this->root.'/'.$rs->media_dir)) $dir[] = ($rs->media_dir == '.' ? '' : $rs->media_dir); } return $dir; } /** Extract zip file in current location @param f fileRecord fileRecord object */ public function inflateZipFile($f,$create_dir=true) { $zip = new fileUnzip($f->file); $zip->setExcludePattern($this->exclude_pattern); $zip->getList(false,'#(^|/)(__MACOSX|\.svn|\.DS_Store|\.directory|Thumbs\.db)(/|$)#'); if ($create_dir) { $zip_root_dir = $zip->getRootDir(); if ($zip_root_dir != false) { $destination = $zip_root_dir; $target = $f->dir; } else { $destination = preg_replace('/\.([^.]+)$/','',$f->basename); $target = $f->dir.'/'.$destination; } if (is_dir($f->dir.'/'.$destination)) { throw new Exception(sprintf(__('Extract destination directory %s already exists.'),dirname($f->relname).'/'.$destination)); } } else { $target = $f->dir; $destination = ''; } $zip->unzipAll($target); $zip->close(); return dirname($f->relname).'/'.$destination; } /** Returns zip file content @param f fileRecord fileRecord object @return array */ public function getZipContent($f) { $zip = new fileUnzip($f->file); $list = $zip->getList(false,'#(^|/)(__MACOSX|\.svn|\.DS_Store|\.directory|Thumbs\.db)(/|$)#'); $zip->close(); return $list; } /** Calls file handlers registered for recreate event @param f fileItem fileItem object */ public function mediaFireRecreateEvent($f) { $media_type = files::getMimeType($f->basename); $this->callFileHandler($media_type,'recreate',null,$f->basename); // Args list to be completed as necessary (Franck) } /* Image handlers ------------------------------------------------------- */ public function imageThumbCreate($cur,$f,$force=true) { $file = $this->pwd.'/'.$f; if (!file_exists($file)) { return false; } $p = path::info($file); $alpha = ($p['extension'] == 'png') || ($p['extension'] == 'PNG'); $thumb = sprintf(($alpha ? $this->thumb_tp_alpha : $this->thumb_tp),$p['dirname'],$p['base'],'%s'); try { $img = new imageTools(); $img->loadImage($file); $w = $img->getW(); $h = $img->getH(); if ($force) $this->imageThumbRemove($f); foreach ($this->thumb_sizes as $suffix => $s) { $thumb_file = sprintf($thumb,$suffix); if (!file_exists($thumb_file) && $s[0] > 0 && ($suffix == 'sq' || $w > $s[0] || $h > $s[0])) { $rate = ($s[0] < 100 ? 95 : ($s[0] < 600 ? 90 : 85)); $img->resize($s[0],$s[0],$s[1]); $img->output(($alpha ? 'png' : 'jpeg'),$thumb_file,$rate); $img->loadImage($file); } } $img->close(); } catch (Exception $e) { if ($cur === null) { # Called only if cursor is null (public call) throw $e; } } } protected function imageThumbUpdate($file,$newFile) { if ($file->relname != $newFile->relname) { $p = path::info($file->relname); $alpha = ($p['extension'] == 'png') || ($p['extension'] == 'PNG'); $thumb_old = sprintf(($alpha ? $this->thumb_tp_alpha : $this->thumb_tp),$p['dirname'],$p['base'],'%s'); $p = path::info($newFile->relname); $alpha = ($p['extension'] == 'png') || ($p['extension'] == 'PNG'); $thumb_new = sprintf(($alpha ? $this->thumb_tp_alpha : $this->thumb_tp),$p['dirname'],$p['base'],'%s'); foreach ($this->thumb_sizes as $suffix => $s) { try { parent::moveFile(sprintf($thumb_old,$suffix),sprintf($thumb_new,$suffix)); } catch (Exception $e) {} } } } protected function imageThumbRemove($f) { $p = path::info($f); $alpha = ($p['extension'] == 'png') || ($p['extension'] == 'PNG'); $thumb = sprintf(($alpha ? $this->thumb_tp_alpha : $this->thumb_tp),'',$p['base'],'%s'); foreach ($this->thumb_sizes as $suffix => $s) { try { parent::removeFile(sprintf($thumb,$suffix)); } catch (Exception $e) {} } } protected function imageMetaCreate($cur,$f,$id) { $file = $this->pwd.'/'.$f; if (!file_exists($file)) { return false; } $xml = new xmlTag('meta'); $meta = imageMeta::readMeta($file); $xml->insertNode($meta); $c = $this->core->con->openCursor($this->table); $c->media_meta = $xml->toXML(); if ($cur->media_title !== null && $cur->media_title == basename($cur->media_file)) { if ($meta['Title']) { $c->media_title = $meta['Title']; } } if ($meta['DateTimeOriginal'] && $cur->media_dt === '') { # We set picture time to user timezone $media_ts = strtotime($meta['DateTimeOriginal']); if ($media_ts !== false) { $o = dt::getTimeOffset($this->core->auth->getInfo('user_tz'),$media_ts); $c->media_dt = dt::str('%Y-%m-%d %H:%M:%S',$media_ts+$o); } } $c->update('WHERE media_id = '.$id); } /** Returns HTML code for MP3 player @param url string MP3 URL to play @param player string Player URL @param args array Player parameters @return string */ public static function mp3player($url,$player=null,$args=null) { if (!$player) { $player = 'player_mp3.swf'; } if (!is_array($args)) { $args = array( 'showvolume' => 1, 'loadingcolor' => 'ff9900', 'bgcolor1' => 'eeeeee', 'bgcolor2' => 'cccccc', 'buttoncolor' => '0066cc', 'buttonovercolor' => 'ff9900', 'slidercolor1' => 'cccccc', 'slidercolor2' => '999999', 'sliderovercolor' => '0066cc' ); } $args['mp3'] = $url; if (empty($args['width'])) { $args['width'] = 200; } if (empty($args['height'])) { $args['height'] = 20; } $vars = array(); foreach ($args as $k => $v) { $vars[] = $k.'='.$v; } return ''. ''. ''. ''. __('Embedded Audio Player'). ''; } public static function flvplayer($url,$player=null,$args=null) { if (!$player) { $player = 'player_flv.swf'; } if (!is_array($args)) { $args = array( 'margin' => 1, 'showvolume' => 1, 'showtime' => 1, 'showfullscreen' => 1, 'buttonovercolor' => 'ff9900', 'slidercolor1' => 'cccccc', 'slidercolor2' => '999999', 'sliderovercolor' => '0066cc' ); } $args['flv'] = $url; if (empty($args['width'])) { $args['width'] = 400; } if (empty($args['height'])) { $args['height'] = 300; } $vars = array(); foreach ($args as $k => $v) { $vars[] = $k.'='.$v; } return ''. ''. ''. ''. ''. __('Embedded Video Player'). ''; } } dotclear-2.6.2+dfsg/inc/core/class.dc.meta.php000066400000000000000000000372641230033266200210770ustar00rootroot00000000000000dcCore dcCore instance private $con; ///< connection Database connection object private $table; ///< string Media table name /** Object constructor. @param core dcCore dcCore instance */ public function __construct($core) { $this->core =& $core; $this->con =& $this->core->con; $this->table = $this->core->prefix.'meta'; } /** Splits up comma-separated values into an array of unique, URL-proof metadata values. @param str string Comma-separated metadata. @return Array The array of sanitized metadata */ public function splitMetaValues($str) { $res = array(); foreach (explode(',',$str) as $i => $tag) { $tag = trim($tag); $tag = self::sanitizeMetaID($tag); if ($tag != false) { $res[$i] = $tag; } } return array_unique($res); } /** Make a metadata ID URL-proof. @param str string the metadata ID. @return string The sanitized metadata */ public static function sanitizeMetaID($str) { return text::tidyURL($str,false,true); } /** Converts serialized metadata (for instance in dc_post post_meta) into a meta array. @param str string the serialized metadata. @return Array the resulting array of post meta */ public function getMetaArray($str) { $meta = @unserialize($str); if (!is_array($meta)) { return array(); } return $meta; } /** Converts serialized metadata (for instance in dc_post post_meta) into a comma-separated meta list for a given type. @param str string the serialized metadata. @param type string meta type to retrieve metaIDs from. @return string the comma-separated list of meta */ public function getMetaStr($str,$type) { $meta = $this->getMetaArray($str); if (!isset($meta[$type])) { return ''; } return implode(', ',$meta[$type]); } /** Converts serialized metadata (for instance in dc_post post_meta) into a "fetchable" metadata record. @param str string the serialized metadata. @param type string meta type to retrieve metaIDs from. @return record the meta recordset */ public function getMetaRecordset($str,$type) { $meta = $this->getMetaArray($str); $data = array(); if (isset($meta[$type])) { foreach ($meta[$type] as $v) { $data[] = array( 'meta_id' => $v, 'meta_type' => $type, 'meta_id_lower' => mb_strtolower($v), 'count' => 0, 'percent' => 0, 'roundpercent' => 0 ); } } return staticRecord::newFromArray($data); } /** @deprecated since version 2.2 : $core->meta is always defined @see getMetaRecordset static version of getMetaRecordset */ public static function getMetaRecord($core,$str,$type) { $meta = new self($core); return $meta->getMetaRecordset($str,$type); } /** Checks whether the current user is allowed to change post meta An exception is thrown if user is not allowed. @param post_id string the post_id to check. */ private function checkPermissionsOnPost($post_id) { $post_id = (integer) $post_id; if (!$this->core->auth->check('usage,contentadmin',$this->core->blog->id)) { throw new Exception(__('You are not allowed to change this entry status')); } #�If user can only publish, we need to check the post's owner if (!$this->core->auth->check('contentadmin',$this->core->blog->id)) { $strReq = 'SELECT post_id '. 'FROM '.$this->core->prefix.'post '. 'WHERE post_id = '.$post_id.' '. "AND user_id = '".$this->con->escape($this->core->auth->userID())."' "; $rs = $this->con->select($strReq); if ($rs->isEmpty()) { throw new Exception(__('You are not allowed to change this entry status')); } } } /** Updates serialized post_meta information with dc_meta table information. @param post_id string the post_id to update. */ private function updatePostMeta($post_id) { $post_id = (integer) $post_id; $strReq = 'SELECT meta_id, meta_type '. 'FROM '.$this->table.' '. 'WHERE post_id = '.$post_id.' '; $rs = $this->con->select($strReq); $meta = array(); while ($rs->fetch()) { $meta[$rs->meta_type][] = $rs->meta_id; } $post_meta = serialize($meta); $cur = $this->con->openCursor($this->core->prefix.'post'); $cur->post_meta = $post_meta; $cur->update('WHERE post_id = '.$post_id); $this->core->blog->triggerBlog(); } /** Retrieves posts corresponding to given meta criteria. $params is an array taking the following optional parameters: - meta_id : get posts having meta id - meta_type : get posts having meta type @param params array Parameters @param count_only boolean Only counts results @return record the resulting posts record */ public function getPostsByMeta($params=array(),$count_only=false) { if (!isset($params['meta_id'])) { return null; } $params['from'] = ', '.$this->table.' META '; $params['sql'] = 'AND META.post_id = P.post_id '; $params['sql'] .= "AND META.meta_id = '".$this->con->escape($params['meta_id'])."' "; if (!empty($params['meta_type'])) { $params['sql'] .= "AND META.meta_type = '".$this->con->escape($params['meta_type'])."' "; unset($params['meta_type']); } unset($params['meta_id']); return $this->core->blog->getPosts($params,$count_only); } /** Retrieves comments to posts corresponding to given meta criteria. $params is an array taking the following optional parameters: - meta_id : get comments to posts having meta id - meta_type : get comments to posts having meta type @param params array Parameters @param count_only boolean Only counts results @return record the resulting comments record */ public function getCommentsByMeta($params=array(),$count_only=false) { if (!isset($params['meta_id'])) { return null; } $params['from'] = ', '.$this->table.' META '; $params['sql'] = 'AND META.post_id = P.post_id '; $params['sql'] .= "AND META.meta_id = '".$this->con->escape($params['meta_id'])."' "; if (!empty($params['meta_type'])) { $params['sql'] .= "AND META.meta_type = '".$this->con->escape($params['meta_type'])."' "; unset($params['meta_type']); } return $this->core->blog->getComments($params,$count_only); } /** @deprecated since 2.2. Use getMetadata and computeMetaStats instead. Generic-purpose metadata retrieval : gets metadatas according to given criteria. Metadata get enriched with stastistics columns (only relevant if limit parameter is not set). Metadata are sorted by post count descending @param type string if not null, get metas having the given type @param limit string if not null, number of max fetched metas @param meta_id string if not null, get metas having the given id @param post_id string if not null, get metas for the given post id @return record the meta recordset */ public function getMeta($type=null,$limit=null,$meta_id=null,$post_id=null) { $params = array(); if ($type != null) $params['meta_type'] = $type; if ($limit != null) $params['limit'] = $limit; if ($meta_id != null) $params['meta_id'] = $meta_id; if ($meta_id != null) $params['post_id'] = $post_id; $rs = $this->getMetadata($params, false); return $this->computeMetaStats($rs); } /** Generic-purpose metadata retrieval : gets metadatas according to given criteria. $params is an array taking the following optionnal parameters: - type: get metas having the given type - meta_id: if not null, get metas having the given id - post_id: get metas for the given post id - limit: number of max fetched metas - order: results order (default : posts count DESC) @param params array Parameters @param count_only boolean Only counts results @return record the resulting comments record */ public function getMetadata($params=array(), $count_only=false) { if ($count_only) { $strReq = 'SELECT count(distinct M.meta_id) '; } else { $strReq = 'SELECT M.meta_id, M.meta_type, COUNT(M.post_id) as count '; } $strReq .= 'FROM '.$this->table.' M LEFT JOIN '.$this->core->prefix.'post P '. 'ON M.post_id = P.post_id '. "WHERE P.blog_id = '".$this->con->escape($this->core->blog->id)."' "; if (isset($params['meta_type'])) { $strReq .= " AND meta_type = '".$this->con->escape($params['meta_type'])."' "; } if (isset($params['meta_id'])) { $strReq .= " AND meta_id = '".$this->con->escape($params['meta_id'])."' "; } if (isset($params['post_id'])) { $strReq .= ' AND P.post_id '.$this->con->in($params['post_id']).' '; } if (!$this->core->auth->check('contentadmin',$this->core->blog->id)) { $strReq .= 'AND ((post_status = 1 '; if ($this->core->blog->without_password) { $strReq .= 'AND post_password IS NULL '; } $strReq .= ') '; if ($this->core->auth->userID()) { $strReq .= "OR P.user_id = '".$this->con->escape($this->core->auth->userID())."')"; } else { $strReq .= ') '; } } if (!$count_only) { if (!isset($params['order'])) { $params['order'] = 'count DESC'; } $strReq .= 'GROUP BY meta_id,meta_type,P.blog_id '. 'ORDER BY '.$params['order']; if (isset($params['limit'])) { $strReq .= $this->con->limit($params['limit']); } } $rs = $this->con->select($strReq); return $rs; } /** Computes statistics from a metadata recordset. Each record gets enriched with lowercase name, percent and roundpercent columns @param rs record recordset to enrich @return record the enriched recordset */ public function computeMetaStats($rs) { $rs_static = $rs->toStatic(); $max = array(); while ($rs_static->fetch()) { $type = $rs_static->meta_type; if (!isset($max[$type])) { $max[$type] = $rs_static->count; } else { if ($rs_static->count > $max[$type]) { $max[$type] = $rs_static->count; } } } while ($rs_static->fetch()) { $rs_static->set('meta_id_lower',mb_strtolower($rs_static->meta_id)); $count = $rs_static->count; $percent = ((integer) $rs_static->count) * 100 / $max[$rs_static->meta_type]; $rs_static->set('percent',(integer) round($percent)); $rs_static->set('roundpercent',round($percent/10)*10); } return $rs_static; } /** Adds a metadata to a post. @param post_id integer the post id @param type string meta type @param value integer meta value */ public function setPostMeta($post_id,$type,$value) { $this->checkPermissionsOnPost($post_id); $value = trim($value); if ($value === false) { return; } $cur = $this->con->openCursor($this->table); $cur->post_id = (integer) $post_id; $cur->meta_id = (string) $value; $cur->meta_type = (string) $type; $cur->insert(); $this->updatePostMeta((integer) $post_id); } /** Removes metadata from a post. @param post_id integer the post id @param type string meta type (if null, delete all types) @param value integer meta value (if null, delete all values) */ public function delPostMeta($post_id,$type=null,$meta_id=null) { $post_id = (integer) $post_id; $this->checkPermissionsOnPost($post_id); $strReq = 'DELETE FROM '.$this->table.' '. 'WHERE post_id = '.$post_id; if ($type !== null) { $strReq .= " AND meta_type = '".$this->con->escape($type)."' "; } if ($meta_id !== null) { $strReq .= " AND meta_id = '".$this->con->escape($meta_id)."' "; } $this->con->execute($strReq); $this->updatePostMeta((integer) $post_id); } /** Mass updates metadata for a given post_type. @param meta_id integer old value @param new_meta integer new value @param type string meta type (if null, select all types) @param post_type integer impacted post_type (if null, select all types) @return boolean true if at least 1 post has been impacted */ public function updateMeta($meta_id,$new_meta_id,$type=null,$post_type=null) { $new_meta_id = self::sanitizeMetaID($new_meta_id); if ($new_meta_id == $meta_id) { return true; } $getReq = 'SELECT M.post_id '. 'FROM '.$this->table.' M, '.$this->core->prefix.'post P '. 'WHERE P.post_id = M.post_id '. "AND P.blog_id = '".$this->con->escape($this->core->blog->id)."' ". "AND meta_id = '%s' "; if (!$this->core->auth->check('contentadmin',$this->core->blog->id)) { $getReq .= "AND P.user_id = '".$this->con->escape($this->core->auth->userID())."' "; } if ($post_type !== null) { $getReq .= "AND P.post_type = '".$this->con->escape($post_type)."' "; } $delReq = 'DELETE FROM '.$this->table.' '. 'WHERE post_id IN (%s) '. "AND meta_id = '%s' "; $updReq = 'UPDATE '.$this->table.' '. "SET meta_id = '%s' ". 'WHERE post_id IN (%s) '. "AND meta_id = '%s' "; if ($type !== null) { $plus = " AND meta_type = '%s' "; $getReq .= $plus; $delReq .= $plus; $updReq .= $plus; } $to_update = $to_remove = array(); $rs = $this->con->select(sprintf($getReq,$this->con->escape($meta_id), $this->con->escape($type))); while ($rs->fetch()) { $to_update[] = $rs->post_id; } if (empty($to_update)) { return false; } $rs = $this->con->select(sprintf($getReq,$new_meta_id,$type)); while ($rs->fetch()) { if (in_array($rs->post_id,$to_update)) { $to_remove[] = $rs->post_id; unset($to_update[array_search($rs->post_id,$to_update)]); } } # Delete duplicate meta if (!empty($to_remove)) { $this->con->execute(sprintf($delReq,implode(',',$to_remove), $this->con->escape($meta_id), $this->con->escape($type))); foreach ($to_remove as $post_id) { $this->updatePostMeta($post_id); } } # Update meta if (!empty($to_update)) { $this->con->execute(sprintf($updReq,$this->con->escape($new_meta_id), implode(',',$to_update), $this->con->escape($meta_id), $this->con->escape($type))); foreach ($to_update as $post_id) { $this->updatePostMeta($post_id); } } return true; } /** Mass delete metadata for a given post_type. @param meta_id integer meta value @param type string meta type (if null, select all types) @param post_type integer impacted post_type (if null, select all types) @return Array the list of impacted post_ids */ public function delMeta($meta_id,$type=null,$post_type=null) { $strReq = 'SELECT M.post_id '. 'FROM '.$this->table.' M, '.$this->core->prefix.'post P '. 'WHERE P.post_id = M.post_id '. "AND P.blog_id = '".$this->con->escape($this->core->blog->id)."' ". "AND meta_id = '".$this->con->escape($meta_id)."' "; if ($type !== null) { $strReq .= " AND meta_type = '".$this->con->escape($type)."' "; } if ($post_type !== null) { $strReq .= " AND P.post_type = '".$this->con->escape($post_type)."' "; } $rs = $this->con->select($strReq); if ($rs->isEmpty()) return array(); $ids = array(); while ($rs->fetch()) { $ids[] = $rs->post_id; } $strReq = 'DELETE FROM '.$this->table.' '. 'WHERE post_id IN ('.implode(',',$ids).') '. "AND meta_id = '".$this->con->escape($meta_id)."' "; if ($type !== null) { $strReq .= " AND meta_type = '".$this->con->escape($type)."' "; } $rs = $this->con->execute($strReq); foreach ($ids as $post_id) { $this->updatePostMeta($post_id); } return $ids; } } dotclear-2.6.2+dfsg/inc/core/class.dc.modules.php000066400000000000000000000347201230033266200216130ustar00rootroot00000000000000dcCore dcCore instance /** Object constructor. @param core dcCore dcCore instance */ public function __construct($core) { $this->core =& $core; } /** Loads modules. $path could be a separated list of paths (path separator depends on your OS). $ns indicates if an additionnal file needs to be loaded on plugin load, value could be: - admin (loads module's _admin.php) - public (loads module's _public.php) - xmlrpc (loads module's _xmlrpc.php) $lang indicates if we need to load a lang file on plugin loading. */ public function loadModules($path,$ns=null,$lang=null) { $this->path = explode(PATH_SEPARATOR,$path); $this->ns = $ns; $disabled = isset($_SESSION['sess_safe_mode']) && $_SESSION['sess_safe_mode']; $disabled = $disabled && !get_parent_class($this) ? true : false; foreach ($this->path as $root) { if (!is_dir($root) || !is_readable($root)) { continue; } if (substr($root,-1) != '/') { $root .= '/'; } if (($d = @dir($root)) === false) { continue; } while (($entry = $d->read()) !== false) { $full_entry = $root.$entry; if ($entry != '.' && $entry != '..' && is_dir($full_entry) && file_exists($full_entry.'/_define.php')) { if (!file_exists($full_entry.'/_disabled') && !$disabled) { $this->id = $entry; $this->mroot = $full_entry; require $full_entry.'/_define.php'; $this->id = null; $this->mroot = null; } else { $this->disabled[$entry] = array( 'root' => $full_entry, 'root_writable' => is_writable($full_entry) ); } } } $d->close(); } # Sort plugins uasort($this->modules,array($this,'sortModules')); # Load translation, _prepend and ns_file foreach ($this->modules as $id => $m) { if (file_exists($m['root'].'/_prepend.php')) { $r = $this->loadModuleFile($m['root'].'/_prepend.php'); # If _prepend.php file returns null (ie. it has a void return statement) if (is_null($r)) { continue; } unset($r); } $this->loadModuleL10N($id,$lang,'main'); if ($ns == 'admin') { $this->loadModuleL10Nresources($id,$lang); } $this->loadNsFile($id,$ns); } } public function requireDefine($dir,$id) { if (file_exists($dir.'/_define.php')) { $this->id = $id; require $dir.'/_define.php'; $this->id = null; } } /** This method registers a module in modules list. You should use this to register a new module. $permissions is a comma separated list of permissions for your module. If $permissions is null, only super admin has access to this module. $priority is an integer. Modules are sorted by priority and name. Lowest priority comes first. @param name string Module name @param desc string Module description @param author string Module author name @param version string Module version @param properties array extra properties (currently available keys : permissions, priority, type) */ public function registerModule($name,$desc,$author,$version, $properties = array()) { # Fallback to legacy registerModule parameters if (!is_array($properties)) { $args = func_get_args(); $properties = array(); if (isset($args[4])) { $properties['permissions']=$args[4]; } if (isset($args[5])) { $properties['priority']= (integer)$args[5]; } } # Default module properties $properties = array_merge( array( 'permissions' => null, 'priority' => 1000, 'standalone_config' => false, 'type' => null ), $properties ); # Check module type if (self::$type !== null && $properties['type'] !== null && $properties['type'] != self::$type) { $this->errors[] = sprintf( __('Module "%s" has type "%s" that mismatch required module type "%s".'), ''.html::escapeHTML($name).'', ''.html::escapeHTML($properties['type']).'', ''.html::escapeHTML(self::$type).'' ); return; } # Check module perms on admin side $permissions = $properties['permissions']; if ($this->ns == 'admin') { if ($permissions == '' && !$this->core->auth->isSuperAdmin()) { return; } elseif (!$this->core->auth->check($permissions,$this->core->blog->id)) { return; } } # Check module install on multiple path if ($this->id) { $module_exists = array_key_exists($name,$this->modules_names); $module_overwrite = $module_exists ? version_compare($this->modules_names[$name],$version,'<') : false; if (!$module_exists || ($module_exists && $module_overwrite)) { $this->modules_names[$name] = $version; $this->modules[$this->id] = array_merge( $properties, array( 'root' => $this->mroot, 'name' => $name, 'desc' => $desc, 'author' => $author, 'version' => $version, 'root_writable' => is_writable($this->mroot) ) ); } else { $path1 = path::real($this->moduleInfo($name,'root')); $path2 = path::real($this->mroot); $this->errors[] = sprintf( __('Module "%s" is installed twice in "%s" and "%s".'), ''.$name.'', ''.$path1.'', ''.$path2.'' ); } } } public function resetModulesList() { $this->modules = array(); $this->modules_names = array(); $this->errors = array(); } public static function installPackage($zip_file,dcModules &$modules) { $zip = new fileUnzip($zip_file); $zip->getList(false,'#(^|/)(__MACOSX|\.svn|\.hg|\.git|\.DS_Store|\.directory|Thumbs\.db)(/|$)#'); $zip_root_dir = $zip->getRootDir(); $define = ''; if ($zip_root_dir != false) { $target = dirname($zip_file); $destination = $target.'/'.$zip_root_dir; $define = $zip_root_dir.'/_define.php'; $has_define = $zip->hasFile($define); } else { $target = dirname($zip_file).'/'.preg_replace('/\.([^.]+)$/','',basename($zip_file)); $destination = $target; $define = '_define.php'; $has_define = $zip->hasFile($define); } if ($zip->isEmpty()) { $zip->close(); unlink($zip_file); throw new Exception(__('Empty module zip file.')); } if (!$has_define) { $zip->close(); unlink($zip_file); throw new Exception(__('The zip file does not appear to be a valid Dotclear module.')); } $ret_code = 1; if (!is_dir($destination)) { try { files::makeDir($destination,true); $sandbox = clone $modules; $zip->unzip($define, $target.'/_define.php'); $sandbox->resetModulesList(); $sandbox->requireDefine($target,basename($destination)); unlink($target.'/_define.php'); $new_errors = $sandbox->getErrors(); if (!empty($new_errors)) { $new_errors = is_array($new_errors) ? implode(" \n",$new_errors) : $new_errors; throw new Exception($new_errors); } files::deltree($destination); } catch(Exception $e) { $zip->close(); unlink($zip_file); files::deltree($destination); throw new Exception($e->getMessage()); } } else { # test for update $sandbox = clone $modules; $zip->unzip($define, $target.'/_define.php'); $sandbox->resetModulesList(); $sandbox->requireDefine($target,basename($destination)); unlink($target.'/_define.php'); $new_modules = $sandbox->getModules(); if (!empty($new_modules)) { $tmp = array_keys($new_modules); $id = $tmp[0]; $cur_module = $modules->getModules($id); if (!empty($cur_module) && (defined('DC_DEV') && DC_DEV === true || dcUtils::versionsCompare($new_modules[$id]['version'], $cur_module['version'], '>', true))) { # delete old module if (!files::deltree($destination)) { throw new Exception(__('An error occurred during module deletion.')); } $ret_code = 2; } else { $zip->close(); unlink($zip_file); throw new Exception(sprintf(__('Unable to upgrade "%s". (older or same version)'),basename($destination))); } } else { $zip->close(); unlink($zip_file); throw new Exception(sprintf(__('Unable to read new _define.php file'))); } } $zip->unzipAll($target); $zip->close(); unlink($zip_file); return $ret_code; } /** This method installs all modules having a _install file. @see dcModules::installModule */ public function installModules() { $res = array('success'=>array(),'failure'=>array()); foreach ($this->modules as $id => &$m) { $i = $this->installModule($id,$msg); if ($i === true) { $res['success'][$id] = true; } elseif ($i === false) { $res['failure'][$id] = $msg; } } return $res; } /** This method installs module with ID $id and having a _install file. This file should throw exception on failure or true if it installs successfully. $msg is an out parameter that handle installer message. @param id string Module ID @param msg string Module installer message @return boolean */ public function installModule($id,&$msg) { try { $i = $this->loadModuleFile($this->modules[$id]['root'].'/_install.php'); if ($i === true) { return true; } } catch (Exception $e) { $msg = $e->getMessage(); return false; } return null; } public function deleteModule($id,$disabled=false) { if ($disabled) { $p =& $this->disabled; } else { $p =& $this->modules; } if (!isset($p[$id])) { throw new Exception(__('No such module.')); } if (!files::deltree($p[$id]['root'])) { throw new Exception(__('Cannot remove module files')); } } public function deactivateModule($id) { if (!isset($this->modules[$id])) { throw new Exception(__('No such module.')); } if (!$this->modules[$id]['root_writable']) { throw new Exception(__('Cannot deactivate plugin.')); } if (@file_put_contents($this->modules[$id]['root'].'/_disabled','')) { throw new Exception(__('Cannot deactivate plugin.')); } } public function activateModule($id) { if (!isset($this->disabled[$id])) { throw new Exception(__('No such module.')); } if (!$this->disabled[$id]['root_writable']) { throw new Exception(__('Cannot activate plugin.')); } if (@unlink($this->disabled[$id]['root'].'/_disabled') === false) { throw new Exception(__('Cannot activate plugin.')); } } /** This method will search for file $file in language $lang for module $id. $file should not have any extension. @param id string Module ID @param lang string Language code @param file string File name (without extension) */ public function loadModuleL10N($id,$lang,$file) { if (!$lang || !isset($this->modules[$id])) { return; } $lfile = $this->modules[$id]['root'].'/locales/%s/%s'; if (l10n::set(sprintf($lfile,$lang,$file)) === false && $lang != 'en') { l10n::set(sprintf($lfile,'en',$file)); } } public function loadModuleL10Nresources($id,$lang) { if (!$lang || !isset($this->modules[$id])) { return; } $f = l10n::getFilePath($this->modules[$id]['root'].'/locales','resources.php',$lang); if ($f) { $this->loadModuleFile($f); } } /** Returns all modules associative array or only one module if $id is present. @param id string Optionnal module ID @return array */ public function getModules($id=null) { if ($id && isset($this->modules[$id])) { return $this->modules[$id]; } return $this->modules; } /** Returns true if the module with ID $id exists. @param id string Module ID @return boolean */ public function moduleExists($id) { return isset($this->modules[$id]); } /** Returns all disabled modules in an array @return array */ public function getDisabledModules() { return $this->disabled; } /** Returns root path for module with ID $id. @param id string Module ID @return string */ public function moduleRoot($id) { return $this->moduleInfo($id,'root'); } /** Returns a module information that could be: - root - name - desc - author - version - permissions - priority @param id string Module ID @param info string Information to retrieve @return string */ public function moduleInfo($id,$info) { return isset($this->modules[$id][$info]) ? $this->modules[$id][$info] : null; } /** Loads namespace $ns specific files for all modules. @param ns string Namespace name */ public function loadNsFiles($ns=null) { foreach ($this->modules as $k => $v) { $this->loadNsFile($k,$ns); } } /** Loads namespace $ns specific file for module with ID $id @param id string Module ID @param ns string Namespace name */ public function loadNsFile($id,$ns=null) { switch ($ns) { case 'admin': $this->loadModuleFile($this->modules[$id]['root'].'/_admin.php'); break; case 'public': $this->loadModuleFile($this->modules[$id]['root'].'/_public.php'); break; case 'xmlrpc': $this->loadModuleFile($this->modules[$id]['root'].'/_xmlrpc.php'); break; } } public function getErrors() { return $this->errors; } protected function loadModuleFile($________) { if (!file_exists($________)) { return; } self::$_k = array_keys($GLOBALS); foreach (self::$_k as self::$_n) { if (!in_array(self::$_n,self::$superglobals)) { global ${self::$_n}; } } return require $________; } private function sortModules($a,$b) { if ($a['priority'] == $b['priority']) { return strcasecmp($a['name'],$b['name']); } return ($a['priority'] < $b['priority']) ? -1 : 1; } } dotclear-2.6.2+dfsg/inc/core/class.dc.namespace.php000066400000000000000000000222251230033266200220740ustar00rootroot00000000000000connection Database connection object protected $table; ///< string Settings table name protected $blog_id; ///< string Blog ID protected $global_settings = array(); ///< array Global settings array protected $local_settings = array(); ///< array Local settings array protected $settings = array(); ///< array Associative settings array protected $ns; ///< string Current namespace /** Object constructor. Retrieves blog settings and puts them in $settings array. Local (blog) settings have a highest priority than global settings. @param name string ID for this namespace */ public function __construct(&$core, $blog_id, $name, $rs=null) { if (preg_match('/^[a-zA-Z][a-zA-Z0-9]+$/',$name)) { $this->ns = $name; } else { throw new Exception(sprintf(__('Invalid setting dcNamespace: %s'),$name)); } $this->con =& $core->con; $this->table = $core->prefix.'setting'; $this->blog_id =& $blog_id; $this->getSettings($rs); } private function getSettings($rs=null) { if ($rs == null) { $strReq = 'SELECT blog_id, setting_id, setting_value, '. 'setting_type, setting_label, setting_ns '. 'FROM '.$this->table.' '. "WHERE (blog_id = '".$this->con->escape($this->blog_id)."' ". 'OR blog_id IS NULL) '. "AND setting_ns = '".$this->con->escape($this->ns)."' ". 'ORDER BY setting_id DESC '; try { $rs = $this->con->select($strReq); } catch (Exception $e) { trigger_error(__('Unable to retrieve settings:').' '.$this->con->error(), E_USER_ERROR); } } while ($rs->fetch()) { if ($rs->f('setting_ns') != $this->ns){ break; } $id = trim($rs->f('setting_id')); $value = $rs->f('setting_value'); $type = $rs->f('setting_type'); if ($type == 'float' || $type == 'double') { $type = 'float'; } elseif ($type != 'boolean' && $type != 'integer') { $type = 'string'; } settype($value,$type); $array = $rs->blog_id ? 'local' : 'global'; $this->{$array.'_settings'}[$id] = array( 'ns' => $this->ns, 'value' => $value, 'type' => $type, 'label' => (string) $rs->f('setting_label'), 'global' => $rs->blog_id == '' ); } $this->settings = $this->global_settings; foreach ($this->local_settings as $id => $v) { $this->settings[$id] = $v; } return true; } private function settingExists($id,$global=false) { $array = $global ? 'global' : 'local'; return isset($this->{$array.'_settings'}[$id]); } /** Returns setting value if exists. @param n string Setting name @return mixed */ public function get($n) { if (isset($this->settings[$n]['value'])) { return $this->settings[$n]['value']; } return null; } /** Magic __get method. @copydoc ::get */ public function __get($n) { return $this->get($n); } /** Sets a setting in $settings property. This sets the setting for script execution time only and if setting exists. @param n string Setting name @param v mixed Setting value */ public function set($n,$v) { if (isset($this->settings[$n])) { $this->settings[$n]['value'] = $v; } } /** Magic __set method. @copydoc ::set */ public function __set($n,$v) { $this->set($n,$v); } /** Creates or updates a setting. $type could be 'string', 'integer', 'float', 'boolean' or null. If $type is null and setting exists, it will keep current setting type. $value_change allow you to not change setting. Useful if you need to change a setting label or type and don't want to change its value. @param id string Setting ID @param value mixed Setting value @param type string Setting type @param label string Setting label @param value_change boolean Change setting value or not @param global boolean Setting is global */ public function put($id,$value,$type=null,$label=null,$value_change=true,$global=false) { if (!preg_match('/^[a-zA-Z][a-zA-Z0-9_]+$/',$id)) { throw new Exception(sprintf(__('%s is not a valid setting id'),$id)); } # We don't want to change setting value if (!$value_change) { if (!$global && $this->settingExists($id,false)) { $value = $this->local_settings[$id]['value']; } elseif ($this->settingExists($id,true)) { $value = $this->global_settings[$id]['value']; } } # Setting type if ($type == 'double') { $type = 'float'; } elseif ($type === null) { if (!$global && $this->settingExists($id,false)) { $type = $this->local_settings[$id]['type']; } elseif ($this->settingExists($id,true)) { $type = $this->global_settings[$id]['type']; } else { $type = 'string'; } } elseif ($type != 'boolean' && $type != 'integer' && $type != 'float') { $type = 'string'; } # We don't change label if ($label == null) { if (!$global && $this->settingExists($id,false)) { $label = $this->local_settings[$id]['label']; } elseif ($this->settingExists($id,true)) { $label = $this->global_settings[$id]['label']; } } settype($value,$type); $cur = $this->con->openCursor($this->table); $cur->setting_value = ($type == 'boolean') ? (string) (integer) $value : (string) $value; $cur->setting_type = $type; $cur->setting_label = $label; #If we are local, compare to global value if (!$global && $this->settingExists($id,true)) { $g = $this->global_settings[$id]; $same_setting = $g['ns'] == $this->ns && $g['value'] == $value && $g['type'] == $type && $g['label'] == $label; # Drop setting if same value as global if ($same_setting && $this->settingExists($id,false)) { $this->drop($id); } elseif ($same_setting) { return; } } if ($this->settingExists($id,$global) && $this->ns == $this->settings[$id]['ns']) { if ($global) { $where = 'WHERE blog_id IS NULL '; } else { $where = "WHERE blog_id = '".$this->con->escape($this->blog_id)."' "; } $cur->update($where."AND setting_id = '".$this->con->escape($id)."' AND setting_ns = '".$this->con->escape($this->ns)."' "); } else { $cur->setting_id = $id; $cur->blog_id = $global ? null : $this->blog_id; $cur->setting_ns = $this->ns; $cur->insert(); } } /** Rename an existing setting in a Namespace @param $oldId string Current setting name @param $newId string New setting name @return boolean */ public function rename($oldId,$newId) { if (!$this->ns) { throw new Exception(__('No namespace specified')); } if (!array_key_exists($oldId,$this->settings) || array_key_exists($newId,$this->settings)) { return false; } // Rename the setting in the settings array $this->settings[$newId] = $this->settings[$oldId]; unset($this->settings[$oldId]); // Rename the setting in the database $strReq = 'UPDATE '.$this->table. " SET setting_id = '".$this->con->escape($newId)."' ". " WHERE setting_ns = '".$this->con->escape($this->ns)."' ". " AND setting_id = '".$this->con->escape($oldId)."' "; $this->con->execute($strReq); return true; } /** Removes an existing setting in a Namespace @param id string Setting ID */ public function drop($id) { if (!$this->ns) { throw new Exception(__('No namespace specified')); } $strReq = 'DELETE FROM '.$this->table.' '; if ($this->blog_id === null) { $strReq .= 'WHERE blog_id IS NULL '; } else { $strReq .= "WHERE blog_id = '".$this->con->escape($this->blog_id)."' "; } $strReq .= "AND setting_id = '".$this->con->escape($id)."' "; $strReq .= "AND setting_ns = '".$this->con->escape($this->ns)."' "; $this->con->execute($strReq); } /** Removes all existing settings in a Namespace @param force_global boolean Force global pref drop */ public function dropAll($force_global=false) { if (!$this->ns) { throw new Exception(__('No namespace specified')); } $strReq = 'DELETE FROM '.$this->table.' '; if (($force_global) || ($this->blog_id === null)) { $strReq .= 'WHERE blog_id IS NULL '; $global = true; } else { $strReq .= "WHERE blog_id = '".$this->con->escape($this->blog_id)."' "; $global = false; } $strReq .= "AND setting_ns = '".$this->con->escape($this->ns)."' "; $this->con->execute($strReq); $array = $global ? 'global' : 'local'; unset($this->{$array.'_settings'}); $this->{$array.'_settings'} = array(); $array = $global ? 'local' : 'global'; $this->settings = $this->{$array.'_settings'}; } /** Returns $settings property content. @return array */ public function dumpSettings() { return $this->settings; } /** Returns $global_settings property content. @return array */ public function dumpGlobalSettings() { return $this->global_settings; } } dotclear-2.6.2+dfsg/inc/core/class.dc.plugins.php000066400000000000000000000032611230033266200216200ustar00rootroot00000000000000$priority is an integer. Modules are sorted by priority and name. Lowest priority comes first. This property is currently ignored when dealing with themes. @param name string Module name @param desc string Module description @param author string Module author name @param version string Module version @param properties array extra properties (currently available keys : permissions, priority, standalone_config, type) */ public function registerModule($name,$desc,$author,$version,$properties = array()) { # Fallback to legacy registerModule parameters if (!is_array($properties)) { $args = func_get_args(); $properties = array(); if (isset($args[4])) { $properties['permissions']=$args[4]; } if (isset($args[5])) { $properties['priority']= (integer)$args[5]; } } parent::registerModule($name, $desc, $author, $version, $properties); } } dotclear-2.6.2+dfsg/inc/core/class.dc.postmedia.php000066400000000000000000000105671230033266200221330ustar00rootroot00000000000000dcCore dcCore instance protected $con; ///< connection Database connection protected $table; ///< string Post-Media table name /** Object constructor. @param core dcCore dcCore instance @param type string Media type filter */ public function __construct($core,$type='') { $this->core =& $core; $this->con =& $core->con; $this->table = $this->core->prefix.'post_media'; } /** Returns media items attached to a blog post. Result is an array containing fileItems objects. @param post_id integer Post ID @param media_id integer Optionnal media ID @return array Array of fileItems */ public function getPostMedia($params=array()) { $strReq = 'SELECT M.media_file, M.media_id, M.media_path, M.media_title, M.media_meta, M.media_dt, '. 'M.media_creadt, M.media_upddt, M.media_private, M.user_id, PM.post_id '; if (!empty($params['columns']) && is_array($params['columns'])) { $strReq .= implode(', ',$params['columns']).', '; } $strReq .= 'FROM '.$this->core->prefix.'media M '. 'INNER JOIN '.$this->table.' PM ON (M.media_id = PM.media_id) '; if (!empty($params['from'])) { $strReq .= $params['from'].' '; } $where=''; if (isset($params['post_id'])) { $where[]="PM.post_id ".$this->con->in($params['post_id']); } if (isset($params['media_id'])) { $where[]="M.media_id ".$this->con->in($params['media_id']); } if (isset($params['media_path'])) { $where[]="M.media_path ".$this->con->in($params['media_path']); } if (isset($params['link_type'])) { $where[]="PM.link_type ".$this->con->in($params['link_type']); } else { $where[]="PM.link_type='attachment'"; } $strReq .= 'WHERE '.join('AND ',$where).' '; if (isset($params['sql'])) { $strReq .= $params['sql']; } //echo $strReq; exit; $rs = $this->con->select($strReq); return $rs; } /** Attaches a media to a post. @param post_id integer Post ID @param media_id integer Optionnal media ID */ public function addPostMedia($post_id,$media_id,$link_type='attachment') { $post_id = (integer) $post_id; $media_id = (integer) $media_id; $f = $this->getPostMedia(array('post_id'=>$post_id,'media_id'=>$media_id,'link_type'=>$link_type)); if (!$f->isEmpty()) { return; } $cur = $this->con->openCursor($this->table); $cur->post_id = $post_id; $cur->media_id = $media_id; $cur->link_type = $link_type; $cur->insert(); $this->core->blog->triggerBlog(); } /** Detaches a media from a post. @param post_id integer Post ID @param media_id integer Optionnal media ID */ public function removePostMedia($post_id,$media_id,$link_type=null) { $post_id = (integer) $post_id; $media_id = (integer) $media_id; $strReq = 'DELETE FROM '.$this->table.' '. 'WHERE post_id = '.$post_id.' '. 'AND media_id = '.$media_id.' '; if ($link_type != null) { $strReq .= "AND link_type = '".$this->con->escape($link_type)."'"; } $this->con->execute($strReq); $this->core->blog->triggerBlog(); } /** Returns media items attached to a blog post. Result is an array containing fileItems objects. @param post_id integer Post ID @param media_id integer Optionnal media ID @return array Array of fileItems */ public function getLegacyPostMedia($post_id,$media_id=null) { $post_id = (integer) $post_id; $strReq = 'SELECT media_file, M.media_id, media_path, media_title, media_meta, media_dt, '. 'media_creadt, media_upddt, media_private, user_id '. 'FROM '.$this->table.' M '. 'INNER JOIN '.$this->table_ref.' PM ON (M.media_id = PM.media_id) '. "WHERE media_path = '".$this->path."' ". 'AND post_id = '.$post_id.' '; if ($media_id) { $strReq .= 'AND M.media_id = '.(integer) $media_id.' '; } $rs = $this->con->select($strReq); $res = array(); while ($rs->fetch()) { $f = $this->fileRecord($rs); if ($f !== null) { $res[] = $f; } } return $res; } } dotclear-2.6.2+dfsg/inc/core/class.dc.prefs.php000066400000000000000000000110211230033266200212470ustar00rootroot00000000000000connection Database connection object protected $table; ///< string Prefs table name protected $user_id; ///< string User ID protected $workspaces = array(); ///< array Associative workspaces array protected $ws; ///< string Current workspace /** Object constructor. Retrieves user prefs and puts them in $workspaces array. Local (user) prefs have a highest priority than global prefs. @param core dcCore dcCore object @param user_id string User ID */ public function __construct($core,$user_id) { $this->con =& $core->con; $this->table = $core->prefix.'pref'; $this->user_id =& $user_id; try {$this->loadPrefs();} catch (Exception $e) { if (version_compare($core->getVersion('core'),'2.3','>')) { trigger_error(__('Unable to retrieve workspaces:').' '.$this->con->error(), E_USER_ERROR); } } } /** Retrieves all workspaces (and their prefs) from database, with one query. */ private function loadPrefs() { $strReq = 'SELECT user_id, pref_id, pref_value, '. 'pref_type, pref_label, pref_ws '. 'FROM '.$this->table.' '. "WHERE user_id = '".$this->con->escape($this->user_id)."' ". 'OR user_id IS NULL '. 'ORDER BY pref_ws ASC, pref_id ASC'; try { $rs = $this->con->select($strReq); } catch (Exception $e) { throw $e; } /* Prevent empty tables (install phase, for instance) */ if ($rs->isEmpty()) { return; } do { $ws = trim($rs->f('pref_ws')); if (!$rs->isStart()) { // we have to go up 1 step, since workspaces construction performs a fetch() // at very first time $rs->movePrev(); } $this->workspaces[$ws] = new dcWorkspace($GLOBALS['core'], $this->user_id, $ws,$rs); } while(!$rs->isStart()); } /** Create a new workspace. If the workspace already exists, return it without modification. @param ws string Workspace name @return dcWorkspace The workspace created */ public function addWorkspace($ws) { if (!array_key_exists($ws, $this->workspaces)) { $this->workspaces[$ws] = new dcWorkspace($GLOBALS['core'], $this->user_id, $ws); } return $this->workspaces[$ws]; } /** Rename a workspace. @param oldWs string Old workspace name @param newws string New workspace name @return boolean */ public function renWorkspace($oldNs,$newNs) { if (!array_key_exists($oldWs, $this->workspaces) || array_key_exists($newWs, $this->workspaces)) { return false; } // Rename the workspace in the workspace array $this->workspaces[$newWs] = $this->workspaces[$oldWs]; unset($this->workspaces[$oldWs]); // Rename the workspace in the database $strReq = 'UPDATE '.$this->table. " SET pref_ws = '".$this->con->escape($newWs)."' ". " WHERE pref_ws = '".$this->con->escape($oldWs)."' "; $this->con->execute($strReq); return true; } /** Delete a whole workspace with all preferences pertaining to it. @param ws string Workspace name @return boolean */ public function delWorkspace($ws) { if (!array_key_exists($ws, $this->workspaces)) { return false; } // Remove the workspace from the workspace array unset($this->workspaces[$ws]); // Delete all preferences from the workspace in the database $strReq = 'DELETE FROM '.$this->table. " WHERE pref_ws = '".$this->con->escape($ws)."' "; $this->con->execute($strReq); return true; } /** Returns full workspace with all prefs pertaining to it. @param ws string Workspace name @return dcWorkspace */ public function get($ws) { if (array_key_exists($ws, $this->workspaces)) { return $this->workspaces[$ws]; } return null; } /** Magic __get method. @copydoc ::get */ public function __get($n) { return $this->get($n); } /** Returns $workspaces property content. @return array */ public function dumpWorkspaces() { return $this->workspaces; } } dotclear-2.6.2+dfsg/inc/core/class.dc.rest.php000066400000000000000000000023231230033266200211120ustar00rootroot00000000000000dcCore dcCore instance */ public function __construct($core) { parent::__construct(); $this->core =& $core; } /** Rest method call. @param name string Method name @param get array GET parameters copy @param post array POST parameters copy @return mixed Rest method result */ protected function callFunction($name,$get,$post) { if (isset($this->functions[$name])) { return call_user_func($this->functions[$name],$this->core,$get,$post); } } } dotclear-2.6.2+dfsg/inc/core/class.dc.rs.extensions.php000066400000000000000000000471241230033266200227670ustar00rootroot00000000000000boolean */ public static function isEditable($rs) { # If user is admin or contentadmin, true if ($rs->core->auth->check('contentadmin',$rs->core->blog->id)) { return true; } # No user id in result ? false if (!$rs->exists('user_id')) { return false; } # If user is usage and owner of the entrie if ($rs->core->auth->check('usage',$rs->core->blog->id) && $rs->user_id == $rs->core->auth->userID()) { return true; } return false; } /** Returns whether post is deletable @param rs Invisible parameter @return boolean */ public static function isDeletable($rs) { # If user is admin, or contentadmin, true if ($rs->core->auth->check('contentadmin',$rs->core->blog->id)) { return true; } # No user id in result ? false if (!$rs->exists('user_id')) { return false; } # If user has delete rights and is owner of the entrie if ($rs->core->auth->check('delete',$rs->core->blog->id) && $rs->user_id == $rs->core->auth->userID()) { return true; } return false; } /** Returns whether post is the first one of its day. @param rs Invisible parameter @return boolean */ public static function firstPostOfDay($rs) { if ($rs->isStart()) { return true; } $cdate = date('Ymd',strtotime($rs->post_dt)); $rs->movePrev(); $ndate = date('Ymd',strtotime($rs->post_dt)); $rs->moveNext(); return $ndate != $cdate; } /** Returns whether post is the last one of its day. @param rs Invisible parameter @return boolean */ public static function lastPostOfDay($rs) { if ($rs->isEnd()) { return true; } $cdate = date('Ymd',strtotime($rs->post_dt)); $rs->moveNext(); $ndate = date('Ymd',strtotime($rs->post_dt)); $rs->movePrev(); return $ndate != $cdate; } /** Returns whether comments are enabled on post. @param rs Invisible parameter @return boolean */ public static function commentsActive($rs) { return $rs->core->blog->settings->system->allow_comments && $rs->post_open_comment && ($rs->core->blog->settings->system->comments_ttl == 0 || time()-($rs->core->blog->settings->system->comments_ttl*86400) < $rs->getTS()); } /** Returns whether trackbacks are enabled on post. @param rs Invisible parameter @return boolean */ public static function trackbacksActive($rs) { return $rs->core->blog->settings->system->allow_trackbacks && $rs->post_open_tb && ($rs->core->blog->settings->system->trackbacks_ttl == 0 || time()-($rs->core->blog->settings->system->trackbacks_ttl*86400) < $rs->getTS()); } /** Returns whether post has at least one comment. @param rs Invisible parameter @return boolean */ public static function hasComments($rs) { return $rs->nb_comment > 0; } /** Returns whether post has at least one trackbacks. @return boolean */ public static function hasTrackbacks($rs) { return $rs->nb_trackback > 0; } /** Returns whether post has been updated since publication. @return boolean */ public static function isRepublished($rs) { return ($rs->getTS('upddt') + dt::getTimeOffset($rs->post_tz)) > $rs->getTS(); } /** Returns full post URL. @param rs Invisible parameter @return string */ public static function getURL($rs) { return $rs->core->blog->url.$rs->core->getPostPublicURL( $rs->post_type,html::sanitizeURL($rs->post_url) ); } /** Returns full post category URL. @param rs Invisible parameter @return string */ public static function getCategoryURL($rs) { return $rs->core->blog->url.$rs->core->url->getURLFor('category',html::sanitizeURL($rs->cat_url)); } /** Returns whether post has an excerpt. @param rs Invisible parameter @return boolean */ public static function isExtended($rs) { return $rs->post_excerpt_xhtml != ''; } /** Returns post timestamp. @param rs Invisible parameter @param type string (dt|upddt|creadt) defaults to post_dt @return integer */ public static function getTS($rs,$type='') { if ($type == 'upddt') { return strtotime($rs->post_upddt); } elseif ($type == 'creadt') { return strtotime($rs->post_creadt); } else { return strtotime($rs->post_dt); } } /** Returns post date formating according to the ISO 8601 standard. @param rs Invisible parameter @param type string (dt|upddt|creadt) defaults to post_dt @return string */ public static function getISO8601Date($rs,$type='') { if ($type == 'upddt' || $type == 'creadt') { return dt::iso8601($rs->getTS($type)+dt::getTimeOffset($rs->post_tz),$rs->post_tz); } else { return dt::iso8601($rs->getTS(),$rs->post_tz); } } /** Returns post date formating according to RFC 822. @param rs Invisible parameter @param type string (dt|upddt|creadt) defaults to post_dt @return string */ public static function getRFC822Date($rs,$type='') { if ($type == 'upddt' || $type == 'creadt') { return dt::rfc822($rs->getTS($type)+dt::getTimeOffset($rs->post_tz),$rs->post_tz); } else { return dt::rfc822($rs->getTS($type),$rs->post_tz); } } /** Returns post date with $format as formatting pattern. If format is empty, uses date_format blog setting. @param rs Invisible parameter @param format string Date format pattern @param type string (dt|upddt|creadt) defaults to post_dt @return string */ public static function getDate($rs,$format,$type='') { if (!$format) { $format = $rs->core->blog->settings->system->date_format; } if ($type == 'upddt') { return dt::dt2str($format,$rs->post_upddt,$rs->post_tz); } elseif ($type == 'creadt') { return dt::dt2str($format,$rs->post_creadt,$rs->post_tz); } else { return dt::dt2str($format,$rs->post_dt); } } /** Returns post time with $format as formatting pattern. If format is empty, uses time_format blog setting. @param rs Invisible parameter @param format string Time format pattern @param type string (dt|upddt|creadt) defaults to post_dt @return string */ public static function getTime($rs,$format,$type='') { if (!$format) { $format = $rs->core->blog->settings->system->time_format; } if ($type == 'upddt') { return dt::dt2str($format,$rs->post_upddt,$rs->post_tz); } elseif ($type == 'creadt') { return dt::dt2str($format,$rs->post_creadt,$rs->post_tz); } else { return dt::dt2str($format,$rs->post_dt); } } /** Returns author common name using user_id, user_name, user_firstname and user_displayname fields. @param rs Invisible parameter @return string */ public static function getAuthorCN($rs) { return dcUtils::getUserCN($rs->user_id, $rs->user_name, $rs->user_firstname, $rs->user_displayname); } /** Returns author common name with a link if he specified one in its preferences. @param rs Invisible parameter @return string */ public static function getAuthorLink($rs) { $res = '%1$s'; $url = $rs->user_url; if ($url) { $res = '%1$s'; } return sprintf($res,html::escapeHTML($rs->getAuthorCN()),html::escapeHTML($url)); } /** Returns author e-mail address. If $encoded is true, "@" sign is replaced by "%40" and "." by "%2e". @param rs Invisible parameter @param encoded boolean Encode address. @return string */ public static function getAuthorEmail($rs,$encoded=true) { if ($encoded) { return strtr($rs->user_email,array('@'=>'%40','.'=>'%2e')); } return $rs->user_email; } /** Returns post feed unique ID. @param rs Invisible parameter @return string */ public static function getFeedID($rs) { return 'urn:md5:'.md5($rs->core->blog->uid.$rs->post_id); $url = parse_url($rs->core->blog->url); $date_part = date('Y-m-d',strtotime($rs->post_creadt)); return 'tag:'.$url['host'].','.$date_part.':'.$rs->post_id; } /** Returns trackback RDF information block in HTML comment. @param rs Invisible parameter @return string */ public static function getTrackbackData($rs) { return "\n". "\n"; } /** Returns post trackback full URL. @param rs Invisible parameter @return string */ public static function getTrackbackLink($rs) { return $rs->core->blog->url.$rs->core->url->getURLFor('trackback',$rs->post_id); } /** Returns post content. If $absolute_urls is true, appends full blog URL to each relative post URLs. @param rs Invisible parameter @param absolute_urls boolean With absolute URLs @return string */ public static function getContent($rs,$absolute_urls=false) { if ($absolute_urls) { return html::absoluteURLs($rs->post_content_xhtml,$rs->getURL()); } else { return $rs->post_content_xhtml; } } /** Returns post excerpt. If $absolute_urls is true, appends full blog URL to each relative post URLs. @param rs Invisible parameter @param absolute_urls boolean With absolute URLs @return string */ public static function getExcerpt($rs,$absolute_urls=false) { if ($absolute_urls) { return html::absoluteURLs($rs->post_excerpt_xhtml,$rs->getURL()); } else { return $rs->post_excerpt_xhtml; } } /** Returns post media count using a subquery. @param rs Invisible parameter @return integer */ public static function countMedia($rs) { if (isset($rs->_nb_media[$rs->index()])) { return $rs->_nb_media[$rs->index()]; } else { $strReq = 'SELECT count(media_id) '. 'FROM '.$rs->core->prefix.'post_media '. 'WHERE post_id = '.(integer) $rs->post_id.' '; $res = (integer) $rs->core->con->select($strReq)->f(0); $rs->_nb_media[$rs->index()] = $res; return $res; } } } /** @ingroup DC_CORE @brief Dotclear comment record helpers. This class adds new methods to database comment results. You can call them on every record comming from dcBlog::getComments and similar methods. @warning You should not give the first argument (usualy $rs) of every described function. */ class rsExtComment { /** Returns comment date with $format as formatting pattern. If format is empty, uses date_format blog setting. @param rs Invisible parameter @param format string Date format pattern @param type string (dt|upddt) defaults to comment_dt @return string */ public static function getDate($rs,$format,$type='') { if (!$format) { $format = $rs->core->blog->settings->system->date_format; } if ($type == 'upddt') { return dt::dt2str($format,$rs->comment_upddt,$rs->comment_tz); } else { return dt::dt2str($format,$rs->comment_dt); } } /** Returns comment time with $format as formatting pattern. If format is empty, uses time_format blog setting. @param rs Invisible parameter @param format string Date format pattern @param type string (dt|upddt) defaults to comment_dt @return string */ public static function getTime($rs,$format,$type='') { if (!$format) { $format = $rs->core->blog->settings->system->time_format; } if ($type == 'upddt') { return dt::dt2str($format,$rs->comment_updt,$rs->comment_tz); } else { return dt::dt2str($format,$rs->comment_dt); } } /** Returns comment timestamp. @param rs Invisible parameter @param type string (dt|upddt) defaults to comment_dt @return integer */ public static function getTS($rs,$type='') { if ($type == 'upddt') { return strtotime($rs->comment_upddt); } else { return strtotime($rs->comment_dt); } } /** Returns comment date formating according to the ISO 8601 standard. @param rs Invisible parameter @param type string (dt|upddt) defaults to comment_dt @return string */ public static function getISO8601Date($rs,$type='') { if ($type == 'upddt') { return dt::iso8601($rs->getTS($type)+dt::getTimeOffset($rs->comment_tz),$rs->comment_tz); } else { return dt::iso8601($rs->getTS(),$rs->comment_tz); } } /** Returns comment date formating according to RFC 822. @param rs Invisible parameter @param type string (dt|upddt) defaults to comment_dt @return string */ public static function getRFC822Date($rs,$type='') { if ($type == 'upddt') { return dt::rfc822($rs->getTS($type)+dt::getTimeOffset($rs->comment_tz),$rs->comment_tz); } else { return dt::rfc822($rs->getTS(),$rs->comment_tz); } } /** Returns comment content. If $absolute_urls is true, appends full blog URL to each relative post URLs. @param rs Invisible parameter @param absolute_urls boolean With absolute URLs @return string */ public static function getContent($rs,$absolute_urls=false) { $res = $rs->comment_content; if ($rs->core->blog->settings->system->comments_nofollow) { $res = preg_replace_callback('##ms',array('self','noFollowURL'),$res); } if ($absolute_urls) { $res = html::absoluteURLs($res,$rs->getPostURL()); } return $res; } private static function noFollowURL($m) { if (preg_match('/rel="nofollow"/',$m[1])) { return $m[0]; } return ''; } /** Returns comment author link to his website if he specified one. @param rs Invisible parameter @return string */ public static function getAuthorURL($rs) { if (trim($rs->comment_site)) { return trim($rs->comment_site); } } /** Returns comment post full URL. @param rs Invisible parameter @return string */ public static function getPostURL($rs) { return $rs->core->blog->url.$rs->core->getPostPublicURL( $rs->post_type,html::sanitizeURL($rs->post_url) ); } /** Returns comment author name in a link to his website if he specified one. @param rs Invisible parameter @return string */ public static function getAuthorLink($rs) { $res = '%1$s'; $url = $rs->getAuthorURL(); if ($url) { $res = '%1$s'; } $nofollow = ''; if ($rs->core->blog->settings->system->comments_nofollow) { $nofollow = ' rel="nofollow"'; } return sprintf($res,html::escapeHTML($rs->comment_author),html::escapeHTML($url),$nofollow); } /** Returns comment author e-mail address. If $encoded is true, "@" sign is replaced by "%40" and "." by "%2e". @param rs Invisible parameter @param encoded boolean Encode address. @return string */ public static function getEmail($rs,$encoded=true) { if ($encoded) { return strtr($rs->comment_email,array('@'=>'%40','.'=>'%2e')); } return $rs->comment_email; } /** Returns trackback site title if comment is a trackback. @param rs Invisible parameter @return string */ public static function getTrackbackTitle($rs) { if ($rs->comment_trackback == 1 && preg_match('|

    (.*?)

    |msU',$rs->comment_content, $match)) { return html::decodeEntities($match[1]); } } /** Returns trackback content if comment is a trackback. @param rs Invisible parameter @return string */ public static function getTrackbackContent($rs) { if ($rs->comment_trackback == 1) { return preg_replace('|

    .*?

    |msU','', $rs->comment_content); } } /** Returns comment feed unique ID. @param rs Invisible parameter @return string */ public static function getFeedID($rs) { return 'urn:md5:'.md5($rs->core->blog->uid.$rs->comment_id); $url = parse_url($rs->core->blog->url); $date_part = date('Y-m-d',strtotime($rs->comment_dt)); return 'tag:'.$url['host'].','.$date_part.':'.$rs->comment_id; } /** Returns whether comment is from the post author. @param rs Invisible parameter @return boolean */ public static function isMe($rs) { return $rs->comment_email && $rs->comment_site && $rs->comment_email == $rs->user_email && $rs->comment_site == $rs->user_url; } } /** @ingroup DC_CORE @brief Dotclear dates record helpers. This class adds new methods to database dates results. You can call them on every record comming from dcBlog::getDates. @warning You should not give the first argument (usualy $rs) of every described function. */ class rsExtDates { /** @param rs Invisible parameter @return integer Date timestamp */ public static function ts($rs) { return strtotime($rs->dt); } /** @param rs Invisible parameter @return string Date year */ public static function year($rs) { return date('Y',strtotime($rs->dt)); } /** @param rs Invisible parameter @return string Date month */ public static function month($rs) { return date('m',strtotime($rs->dt)); } /** @param rs Invisible parameter @return integer Date day */ public static function day($rs) { return date('d',strtotime($rs->dt)); } /** Returns date month archive full URL. @param rs Invisible parameter @param core dcCore dcCore instance @return integer */ public static function url($rs,$core) { $url = date('Y/m',strtotime($rs->dt)); return $core->blog->url.$core->url->getURLFor('archive',$url); } /** Returns whether date is the first of year. @param rs Invisible parameter @return boolean */ public static function yearHeader($rs) { if ($rs->isStart()) { return true; } $y = $rs->year(); $rs->movePrev(); $py = $rs->year(); $rs->moveNext(); return $y != $py; } /** Returns whether date is the last of year. @param rs Invisible parameter @return boolean */ public static function yearFooter($rs) { if ($rs->isEnd()) { return true; } $y = $rs->year(); if ($rs->moveNext()) { $ny = $rs->year(); $rs->movePrev(); return $y != $ny; } return false; } } /** @ingroup DC_CORE @brief Dotclear dates record helpers. This class adds new methods to database dates results. You can call them on every record comming from dcAuth::checkUser and dcCore::getUsers. @warning You should not give the first argument (usualy $rs) of every described function. */ class rsExtUser { /** Returns a user option. @param rs Invisible parameter @param name string Option name @return string */ public static function option($rs,$name) { $options = self::options($rs); if (isset($options[$name])) { return $options[$name]; } return null; } /** Returns all user options. @param rs Invisible parameter @return array */ public static function options($rs) { $options = @unserialize($rs->user_options); if (is_array($options)) { return $options; } return array(); } } dotclear-2.6.2+dfsg/inc/core/class.dc.settings.php000066400000000000000000000275461230033266200220130ustar00rootroot00000000000000connection Database connection object protected $table; ///< string Settings table name protected $blog_id; ///< string Blog ID protected $namespaces = array(); ///< array Associative namespaces array protected $ns; ///< string Current namespace /** Object constructor. Retrieves blog settings and puts them in $namespaces array. Local (blog) settings have a highest priority than global settings. @param core dcCore dcCore object @param blog_id string Blog ID */ public function __construct($core,$blog_id) { $this->con =& $core->con; $this->table = $core->prefix.'setting'; $this->blog_id =& $blog_id; $this->loadSettings(); } /** Retrieves all namespaces (and their settings) from database, with one query. */ private function loadSettings() { $strReq = 'SELECT blog_id, setting_id, setting_value, '. 'setting_type, setting_label, setting_ns '. 'FROM '.$this->table.' '. "WHERE blog_id = '".$this->con->escape($this->blog_id)."' ". 'OR blog_id IS NULL '. 'ORDER BY setting_ns ASC, setting_id DESC'; try { $rs = $this->con->select($strReq); } catch (Exception $e) { trigger_error(__('Unable to retrieve namespaces:').' '.$this->con->error(), E_USER_ERROR); } /* Prevent empty tables (install phase, for instance) */ if ($rs->isEmpty()) { return; } do { $ns = trim($rs->f('setting_ns')); if (!$rs->isStart()) { // we have to go up 1 step, since namespaces construction performs a fetch() // at very first time $rs->movePrev(); } $this->namespaces[$ns] = new dcNamespace($GLOBALS['core'], $this->blog_id, $ns,$rs); } while(!$rs->isStart()); } /** Create a new namespace. If the namespace already exists, return it without modification. @param ns string Namespace name @return dcNamespace The namespace created */ public function addNamespace($ns) { if (!array_key_exists($ns, $this->namespaces)) { $this->namespaces[$ns] = new dcNamespace($GLOBALS['core'], $this->blog_id, $ns); } return $this->namespaces[$ns]; } /** Rename a namespace. @param oldNs string Old namespace name @param newNs string New namespace name @return boolean */ public function renNamespace($oldNs,$newNs) { if (!array_key_exists($oldNs, $this->namespaces) || array_key_exists($newNs, $this->namespaces)) { return false; } // Rename the namespace in the namespace array $this->namespaces[$newNs] = $this->namespaces[$oldNs]; unset($this->namespaces[$oldNs]); // Rename the namespace in the database $strReq = 'UPDATE '.$this->table. " SET setting_ns = '".$this->con->escape($newNs)."' ". " WHERE setting_ns = '".$this->con->escape($oldNs)."' "; $this->con->execute($strReq); return true; } /** Delete a whole namespace with all settings pertaining to it. @param ns string Namespace name @return boolean */ public function delNamespace($ns) { if (!array_key_exists($ns, $this->namespaces)) { return false; } // Remove the namespace from the namespace array unset($this->namespaces[$ns]); // Delete all settings from the namespace in the database $strReq = 'DELETE FROM '.$this->table. " WHERE setting_ns = '".$this->con->escape($ns)."' "; $this->con->execute($strReq); return true; } /** Returns full namespace with all settings pertaining to it. @param ns string Namespace name @return dcNamespace */ public function get($ns) { return $this->namespaces[$ns]; } /** Magic __get method. @copydoc ::get */ public function __get($n) { if (!array_key_exists($n, $this->namespaces)) { // For backward compatibility only: the developer tried to access // a setting directly, without passing via a namespace. $this->raiseDeprecated('old_style_get'); return $this->getSetting($n); } return $this->get($n); } /** Magic __set method. @copydoc ::set */ public function __set($n,$v) { $this->set($n,$v); } /** Returns $namespaces property content. @return array */ public function dumpNamespaces() { return $this->namespaces; } /** Raises a E_USER_NOTICE errror for deprecated functions. This allows the developer to know he's been using deprecated functions. @param name string Name of the deprecated function that was called. */ private function raiseDeprecated($name) { if (DC_DEBUG) { $trace = debug_backtrace(); array_shift($trace); $grand = array_shift($trace); $msg = 'Deprecated function called. ('; $msg .= 'dcSettings::'.$name . ' was called from '.$grand['file'].' ['.$grand['line'].'])'; trigger_error($msg, E_USER_NOTICE); } } /** @deprecated Please set your settings via $core->blog->settings->{namespace}->{setting} Sets a setting in $settings property. This sets the setting for script execution time only and if setting exists. @param n string Setting name @param v mixed Setting value */ public function set($n,$v) { // For backward compatibility only: the developer tried to access // a setting directly, without passing via a namespace. $this->raiseDeprecated('old_style_set'); if (!$this->ns) { throw new Exception(__('No namespace specified')); } if (isset($this->namespaces[$this->ns]->$n)) { $this->namespaces[$this->ns]->$n['value'] = $v; } else { $this->namespaces[$this->ns]->$n = array( 'ns' => $this->ns, 'value' => $v, 'type' => gettype($n), 'label' => '', 'global' => false ); } } /** @deprecated Please access your settings via $core->blog->settings->{namespace}->... Sets a working namespace. You should do this before accessing any setting. @param ns string Namespace name */ public function setNamespace($ns) { $this->raiseDeprecated('setNamespace'); if (preg_match('/^[a-zA-Z][a-zA-Z0-9]+$/',$ns)) { $this->ns = $ns; } else { throw new Exception(sprintf(__('Invalid setting namespace: %s'),$ns)); } } /** @deprecated Please set your settings via $core->blog->settings->{namespace}->put() Creates or updates a setting. $type could be 'string', 'integer', 'float', 'boolean' or null. If $type is null and setting exists, it will keep current setting type. $value_change allow you to not change setting. Useful if you need to change a setting label or type and don't want to change its value. Don't forget to set namespace before calling this method. @param id string Setting ID @param value mixed Setting value @param type string Setting type @param label string Setting label @param value_change boolean Change setting value or not @param global boolean Setting is global */ public function put($id,$value,$type=null,$label=null,$value_change=true,$global=false) { $this->raiseDeprecated('put'); if (!$this->ns) { throw new Exception(__('No namespace specified')); } if (!isset($this->namespaces[$this->ns])) { // Create namespace if needed $this->namespaces[$this->ns] = new dcNamespace($GLOBALS['core'], $this->blog_id, $this->ns); } $this->namespaces[$this->ns]->put($id, $value, $type, $label, $value_change, $global); } /** @deprecated Please get your settings via $core->blog->settings->{namespace}->{setting} Returns setting value if exists. @param n string Setting name @return mixed */ public function getSetting($n) { if ($this->namespaces['system']->get($n) != null) { // Give preference to system settings return $this->namespaces['system']->get($n); } else { // Parse all the namespaces foreach (array_keys($this->namespaces) as $id => $ns) { if ($this->namespaces[$ns]->get($n) != null) { // Return the first setting with matching name return $this->namespaces[$ns]->get($n); } } } return null; } /** @deprecated Please get your settings via $core->blog->settings->{namespace}->dumpSettings Returns all settings content. @return array */ public function dumpSettings() { // For backward compatibility only: the developer tried to access // the settings directly, without passing via a namespace. $this->raiseDeprecated('dumpSettings'); $settings = array(); // Parse all the namespaces foreach (array_keys($this->namespaces) as $id => $ns) { $settings = array_merge($settings, $this->namespaces[$ns]->dumpSettings()); } return $settings; } /** @deprecated Please get your settings via $core->blog->settings->{namespace}->dumpGlobalSettings Returns all global settings content. @return array */ public function dumpGlobalSettings() { // For backward compatibility only: the developer tried to access // the settings directly, without passing via a namespace. $this->raiseDeprecated('dumpGlobalSettings'); $settings = array(); // Parse all the namespaces foreach (array_keys($this->namespaces) as $id => $ns) { $settings = array_merge($settings, $this->namespaces[$ns]->dumpGlobalSettings()); } return $settings; } /** Returns a list of settings matching given criteria, for any blog. $params is an array taking the following optionnal parameters: - ns : retrieve setting from given namespace - id : retrieve only settings corresponding to the given id @param params array Parameters @return record A record */ public function getGlobalSettings($params=array()) { $strReq = "SELECT * from ".$this->table." "; $where = array(); if (!empty($params['ns'])) { $where[] = "setting_ns = '".$this->con->escape($params['ns'])."'"; } if (!empty($params['id'])) { $where[] = "setting_id = '".$this->con->escape($params['id'])."'"; } if (isset($params['blog_id'])) { if (!empty($params['blog_id'])) { $where[] = "blog_id = '".$this->con->escape($params['blog_id'])."'"; } else { $where[] = "blog_id IS NULL"; } } if (count($where) != 0) { $strReq .= " WHERE ".join(" AND ", $where); } $strReq .= " ORDER by blog_id"; return $this->con->select($strReq); } /** Updates a setting from a given record @param rs record the setting to update */ public function updateSetting($rs) { $cur = $this->con->openCursor($this->table); $cur->setting_id = $rs->setting_id; $cur->setting_value = $rs->setting_value; $cur->setting_type = $rs->setting_type; $cur->setting_label = $rs->setting_label; $cur->blog_id = $rs->blog_id; $cur->setting_ns = $rs->setting_ns; if ($cur->blog_id == null) { $where = 'WHERE blog_id IS NULL '; } else { $where = "WHERE blog_id = '".$this->con->escape($cur->blog_id)."' "; } $cur->update($where."AND setting_id = '".$this->con->escape($cur->setting_id)."' AND setting_ns = '".$this->con->escape($cur->setting_ns)."' "); } /** Drops a setting from a given record @param rs record the setting to drop @return int number of deleted records (0 if setting does not exist) */ public function dropSetting($rs) { $strReq = "DELETE FROM ".$this->table.' '; if ($rs->blog_id == null) { $strReq .= 'WHERE blog_id IS NULL '; } else { $strReq .= "WHERE blog_id = '".$this->con->escape($rs->blog_id)."' "; } $strReq .= "AND setting_id = '".$this->con->escape($rs->setting_id)."' AND setting_ns = '".$this->con->escape($rs->setting_ns)."' "; return $this->con->execute($strReq); } } dotclear-2.6.2+dfsg/inc/core/class.dc.store.parser.php000066400000000000000000000050541230033266200225700ustar00rootroot00000000000000xml = simplexml_load_string($data); $this->items = array(); if ($this->xml === false) { throw new Exception(__('Wrong data feed')); } $this->_parse(); unset($data); unset($this->xml); } /** * Parse XML into array */ protected function _parse() { if (empty($this->xml->module)) { return; } foreach ($this->xml->module as $i) { $attrs = $i->attributes(); $item = array(); # DC/DA shared markers $item['id'] = (string) $attrs['id']; $item['file'] = (string) $i->file; $item['label'] = (string) $i->name; // deprecated $item['name'] = (string) $i->name; $item['version'] = (string) $i->version; $item['author'] = (string) $i->author; $item['desc'] = (string) $i->desc; # DA specific markers $item['dc_min'] = (string) $i->children(self::$bloc)->dcmin; $item['details'] = (string) $i->children(self::$bloc)->details; $item['section'] = (string) $i->children(self::$bloc)->section; $item['support'] = (string) $i->children(self::$bloc)->support; $item['sshot'] = (string) $i->children(self::$bloc)->sshot; $tags = array(); foreach($i->children(self::$bloc)->tags as $t) { $tags[] = (string) $t->tag; } $item['tags'] = implode(', ',$tags); # First filter right now. If DC_DEV is set all modules are parse if (defined('DC_DEV') && DC_DEV === true || dcUtils::versionsCompare(DC_VERSION, $item['dc_min'], '>=', false)) { $this->items[$item['id']] = $item; } } } /** * Get modules. * * @return array Modules list */ public function getModules() { return $this->items; } } dotclear-2.6.2+dfsg/inc/core/class.dc.store.php000066400000000000000000000151131230033266200212720ustar00rootroot00000000000000 10, 'name' => 8, 'author' => 6, 'tags' => 4, 'desc' => 2); /** @var string User agent used to query repository */ protected $user_agent = 'DotClear.org RepoBrowser/0.1'; /** @var string XML feed URL */ protected $xml_url; /** @var array Array of new/update modules from repository */ protected $data; /** * Constructor. * * @param object $modules dcModules instance * @param string $xml_url XML feed URL */ public function __construct(dcModules $modules, $xml_url) { $this->core = $modules->core; $this->modules = $modules; $this->xml_url = $xml_url; $this->user_agent = sprintf('Dotclear/%s)', DC_VERSION); $this->check(); } /** * Check repository. * * @param boolean $force Force query repository * @return boolean True if get feed or cache */ public function check($force=false) { if (!$this->xml_url) { return false; } if (($parser = dcStoreReader::quickParse($this->xml_url, DC_TPL_CACHE, $force)) === false) { return false; } $raw_datas = $parser->getModules(); uasort($raw_datas, array('self','sort')); $skipped = array_keys($this->modules->getDisabledModules()); foreach ($skipped as $p_id) { if (isset($raw_datas[$p_id])) { unset($raw_datas[$p_id]); } } $updates = array(); $current = $this->modules->getModules(); foreach ($current as $p_id => $p_infos) { if (isset($raw_datas[$p_id])) { if (dcUtils::versionsCompare($raw_datas[$p_id]['version'],$p_infos['version'],'>')) { $updates[$p_id] = $raw_datas[$p_id]; $updates[$p_id]['root'] = $p_infos['root']; $updates[$p_id]['root_writable'] = $p_infos['root_writable']; $updates[$p_id]['current_version'] = $p_infos['version']; } unset($raw_datas[$p_id]); } } $this->data = array( 'new' => $raw_datas, 'update' => $updates ); return true; } /** * Get a list of modules. * * @param boolean $update True to get update modules, false for new ones * @return array List of update/new modules */ public function get($update=false) { return $this->data[$update ? 'update' : 'new']; } /** * Search a module. * * Search string is cleaned, split and compare to split: * - module id and clean id, * - module name, clean name, * - module desccription. * * Every time a part of query is find on module, * result accuracy grow. Result is sorted by accuracy. * * @param string $pattern String to search * @return array Match modules */ public function search($pattern) { $result = array(); # Split query into small clean words if (!($patterns = self::patternize($pattern))) { return $result; } # For each modules foreach ($this->data['new'] as $id => $module) { $module['id'] = $id; # Loop through required module fields foreach(self::$weighting as $field => $weight) { # Skip fields which not exsist on module if (empty($module[$field])) { continue; } # Split field value into small clean word if (!($subjects = self::patternize($module[$field]))) { continue; } # Check contents if (!($nb = preg_match_all('/('.implode('|', $patterns).')/', implode(' ', $subjects), $_))) { continue; } # Add module to result if (!isset($sorter[$id])) { $sorter[$id] = 0; $result[$id] = $module; } # Increment score by matches count * field weight $sorter[$id] += $nb * $weight; $result[$id]['score'] = $sorter[$id]; } } # Sort response by matches count if (!empty($result)) { array_multisort($sorter, SORT_DESC, $result); } return $result; } /** * Quick download and install module. * * @param string $url Module package URL * @param string $dest Path to install module * @return integer 1 = installed, 2 = update */ public function process($url, $dest) { $this->download($url, $dest); return $this->install($dest); } /** * Download a module. * * @param string $url Module package URL * @param string $dest Path to put module package */ public function download($url, $dest) { try { $client = netHttp::initClient($url, $path); $client->setUserAgent($this->user_agent); $client->useGzip(false); $client->setPersistReferers(false); $client->setOutput($dest); $client->get($path); unset($client); } catch (Exception $e) { unset($client); throw new Exception(__('An error occurred while downloading the file.')); } } /** * Install a previously downloaded module. * * @param string $path Module package URL * @param string $path Path to module package * @return integer 1 = installed, 2 = update */ public function install($path) { return dcModules::installPackage($path, $this->modules); } /** * User Agent String. * * @param string $str User agent string */ public function agent($str) { $this->user_agent = $str; } /** * Split and clean pattern. * * @param string $str String to sanitize * @return array Array of cleaned pieces of string or false if none */ public static function patternize($str) { $arr = array(); foreach(explode(' ', $str) as $_) { $_ = strtolower(preg_replace('/[^A-Za-z0-9]/', '', $_)); if (strlen($_) > 2) { $arr[] = $_; } } return empty($arr) ? false : $arr; } /** * Compare version. * * @param string $v1 Version * @param string $v2 Version * @param string $op Comparison operator * @return boolean True is comparison is true, dude! */ private static function compare($v1, $v2, $op) { return version_compare( preg_replace('!-r(\d+)$!', '-p$1', $v1), preg_replace('!-r(\d+)$!', '-p$1', $v2), $op ); } /** * Sort modules list. * * @param array $a A module * @param array $b A module * @return integer */ private static function sort($a,$b) { $c = strtolower($a['id']); $d = strtolower($b['id']); if ($c == $d) { return 0; } return ($c < $d) ? -1 : 1; } } dotclear-2.6.2+dfsg/inc/core/class.dc.store.reader.php000066400000000000000000000140341230033266200225340ustar00rootroot00000000000000setUserAgent(sprintf('Dotclear/%s)', DC_VERSION)); } /** * Parse modules feed. * * @param string $url XML feed URL * @return object dcStore instance */ public function parse($url) { $this->validators = array(); if ($this->cache_dir) { return $this->withCache($url); } elseif (!$this->getModulesXML($url) || $this->getStatus() != '200') { return false; } return new dcStoreParser($this->getContent()); } /** * Quick parse modules feed. * * @param string $url XML feed URL * @param string $cache_dir Cache directoy or null for no cache * @param boolean $force Force query repository * @return object Self instance */ public static function quickParse($url, $cache_dir=null, $force=false) { $parser = new self(); if ($cache_dir) { $parser->setCacheDir($cache_dir); } if ($force) { $parser->setForce($force); } return $parser->parse($url); } /** * Set cache directory. * * @param string $dir Cache directory * @return boolean True if cache dierctory is useable */ public function setCacheDir($dir) { $this->cache_dir = null; if (!empty($dir) && is_dir($dir) && is_writeable($dir)) { $this->cache_dir = $dir; return true; } return false; } /** * Set cache TTL. * * @param string $str Cache TTL */ public function setCacheTTL($str) { $str = trim($str); if (!empty($str)) { $this->cache_ttl = substr($str, 0, 1) == '-' ? $str : '-'.$str; } } /** * Set force query repository. * * @param boolean $force True to force query */ public function setForce($force) { $this->force = $force; } /** * Get repository XML feed URL content. * * @param string $url XML feed URL * @return string Feed content */ protected function getModulesXML($url) { if (!self::readURL($url, $ssl, $host, $port, $path, $user, $pass)) { return false; } $this->setHost($host, $port); $this->useSSL($ssl); $this->setAuthorization($user, $pass); try { return $this->get($path); } catch(Exception $e) { // @todo Log error when repository query fail return false; } } /** * Get repository modules list using cache. * * @param string $url XML feed URL * @return array Feed content or False on fail */ protected function withCache($url) { $url_md5 = md5($url); $cached_file = sprintf('%s/%s/%s/%s/%s.ser', $this->cache_dir, $this->cache_file_prefix, substr($url_md5,0,2), substr($url_md5,2,2), $url_md5 ); $may_use_cached = false; # Use cache file ? if (@file_exists($cached_file) && !$this->force) { $may_use_cached = true; $ts = @filemtime($cached_file); if ($ts > strtotime($this->cache_ttl)) { # Direct cache return unserialize(file_get_contents($cached_file)); } $this->setValidator('IfModifiedSince', $ts); } # Query repository if (!$this->getModulesXML($url)) { if ($may_use_cached) { # Touch cache TTL even if query failed ? if ($this->cache_touch_on_fail) { @files::touch($cached_file); } # Connection failed - fetched from cache return unserialize(file_get_contents($cached_file)); } return false; } # Parse response switch ($this->getStatus()) { # Not modified, use cache case '304': @files::touch($cached_file); return unserialize(file_get_contents($cached_file)); # Ok, parse feed case '200': if ($modules = new dcStoreParser($this->getContent())) { try { files::makeDir(dirname($cached_file), true); } catch (Exception $e) { return $modules; } if (($fp = @fopen($cached_file, 'wb'))) { fwrite($fp, serialize($modules)); fclose($fp); files::inheritChmod($cached_file); } return $modules; } } return false; } /** * Prepare query. * * @return array Query headers */ protected function buildRequest() { $headers = parent::buildRequest(); # Cache validators if (!empty($this->validators)) { if (isset($this->validators['IfModifiedSince'])) { $headers[] = 'If-Modified-Since: '.$this->validators['IfModifiedSince']; } if (isset($this->validators['IfNoneMatch'])) { if (is_array($this->validators['IfNoneMatch'])) { $etags = implode(',', $this->validators['IfNoneMatch']); } else { $etags = $this->validators['IfNoneMatch']; } $headers[] = ''; } } return $headers; } /** * Tweak query cache validator. * * @param string $key Validator key * @param string $value Validator value */ private function setValidator($key, $value) { if ($key == 'IfModifiedSince') { $value = gmdate('D, d M Y H:i:s', $value).' GMT'; } $this->validators[$key] = $value; } } dotclear-2.6.2+dfsg/inc/core/class.dc.themes.php000066400000000000000000000053151230033266200214260ustar00rootroot00000000000000$parent is a optional value to indicate them inheritance. If $parent is null / not set, we simply fall back to the standard behavior, by using 'default'. $priority is an integer. Modules are sorted by priority and name. Lowest priority comes first. This property is currently ignored when dealing with themes. @param name string Module name @param desc string Module description @param author string Module author name @param version string Module version @param properties array extra properties (currently available keys : parent, priority, standalone_config, type) */ public function registerModule($name,$desc,$author,$version,$properties = array()) { # Fallback to legacy registerModule parameters if (!is_array($properties)) { $args = func_get_args(); $properties = array(); if (isset($args[4])) { $properties['parent']=$args[4]; } if (isset($args[5])) { $properties['priority']= (integer)$args[5]; } } # Themes specifics properties $properties = array_merge( array('parent' => null), $properties, array('permissions' => 'admin') // force themes perms ); parent::registerModule($name, $desc, $author, $version, $properties); } /** Loads namespace $ns specific file for module with ID $id Note : actually, only 'public' namespace is supported with themes. @param id string Module ID @param ns string Namespace name */ public function loadNsFile($id,$ns=null) { switch ($ns) { case 'public': $parent = $this->modules[$id]['parent']; if ($parent) { // This is not a real cascade - since we don't call loadNsFile -, // thus limiting inclusion process. // TODO : See if we have to change this. $this->loadModuleFile($this->modules[$parent]['root'].'/_public.php'); } $this->loadModuleFile($this->modules[$id]['root'].'/_public.php'); break; } } } dotclear-2.6.2+dfsg/inc/core/class.dc.trackback.php000066400000000000000000000363331230033266200220720ustar00rootroot00000000000000dcCore dcCore instance public $table; ///< string done pings table name /** Object constructor @param core dcCore dcCore instance */ public function __construct($core) { $this->core =& $core; $this->con =& $this->core->con; $this->table = $this->core->prefix.'ping'; } /// @name Send trackbacks //@{ /** Get all pings sent for a given post. @param post_id integer Post ID @return record */ public function getPostPings($post_id) { $strReq = 'SELECT ping_url, ping_dt '. 'FROM '.$this->table.' '. 'WHERE post_id = '.(integer) $post_id; return $this->con->select($strReq); } /** Sends a ping to given $url. @param url string URL to ping @param post_id integer Post ID @param post_title string Post title @param post_excerpt string Post excerpt @param post_url string Post URL */ public function ping($url,$post_id,$post_title,$post_excerpt,$post_url) { if ($this->core->blog === null) { return false; } $post_id = (integer) $post_id; # Check for previously done trackback $strReq = 'SELECT post_id, ping_url FROM '.$this->table.' '. 'WHERE post_id = '.$post_id.' '. "AND ping_url = '".$this->con->escape($url)."' "; $rs = $this->con->select($strReq); if (!$rs->isEmpty()) { throw new Exception(sprintf(__('%s has still been pinged'),$url)); } $ping_parts = explode('|',$url); # Let's walk by the trackback way if (count($ping_parts) < 2) { $data = array( 'title' => $post_title, 'excerpt' => $post_excerpt, 'url' => $post_url, 'blog_name' => trim(html::escapeHTML(html::clean($this->core->blog->name))) //,'__debug' => false ); # Ping try { $http = self::initHttp($url,$path); $http->post($path,$data,'UTF-8'); $res = $http->getContent(); } catch (Exception $e) { throw new Exception(__('Unable to ping URL')); } $pattern = '|.*(.*)(.*)'. '((.*)(.*))?'. '|msU'; if (!preg_match($pattern,$res,$match)) { throw new Exception(sprintf(__('%s is not a ping URL'),$url)); } $ping_error = trim($match[1]); $ping_msg = (!empty($match[4])) ? $match[4] : ''; } # Damnit ! Let's play pingback else { try { $xmlrpc = new xmlrpcClient($ping_parts[0]); $res = $xmlrpc->query('pingback.ping', $post_url, $ping_parts[1]); $ping_error = '0'; } catch (xmlrpcException $e) { $ping_error = $e->getCode(); $ping_msg = $e->getMessage(); } catch (Exception $e) { throw new Exception(__('Unable to ping URL')); } } if ($ping_error != '0') { throw new Exception(sprintf(__('%s, ping error:'),$url).' '.$ping_msg); } else { # Notify ping result in database $cur = $this->con->openCursor($this->table); $cur->post_id = $post_id; $cur->ping_url = $url; $cur->ping_dt = date('Y-m-d H:i:s'); $cur->insert(); } } //@} private function pingAlreadyDone($post_id, $from_url) { $params = array( 'post_id' => $post_id, 'comment_site' => $from_url, 'comment_trackback' => 1, ); $rs = $this->core->blog->getComments($params, true); if ($rs && !$rs->isEmpty()) { return ($rs->f(0)); } return false; } private function addBacklink($post_id, $url, $blog_name, $title, $excerpt, &$comment) { if (empty($blog_name)) { $blog_name = 'Anonymous blog'; } $comment = "\n". '

    '.($title ? $title : $blog_name)."

    \n". '

    '.$excerpt.'

    '; $cur = $this->core->con->openCursor($this->core->prefix.'comment'); $cur->comment_author = (string) $blog_name; $cur->comment_site = (string) $url; $cur->comment_content = (string) $comment; $cur->post_id = $post_id; $cur->comment_trackback = 1; $cur->comment_status = $this->core->blog->settings->system->trackbacks_pub ? 1 : -1; $cur->comment_ip = http::realIP(); # --BEHAVIOR-- publicBeforeTrackbackCreate $this->core->callBehavior('publicBeforeTrackbackCreate',$cur); if ($cur->post_id) { $comment_id = $this->core->blog->addComment($cur); # --BEHAVIOR-- publicAfterTrackbackCreate $this->core->callBehavior('publicAfterTrackbackCreate',$cur,$comment_id); } } /// @name Receive trackbacks //@{ /** Receives a trackback and insert it as a comment of given post. @param post_id integer Post ID */ public function receive($post_id) { header('Content-Type: text/xml; charset=UTF-8'); if (empty($_POST)) { http::head(405,'Method Not Allowed'); echo ''."\n". "\n". " 1\n". " POST request needed\n". ""; return; } $post_id = (integer) $post_id; $title = !empty($_POST['title']) ? $_POST['title'] : ''; $excerpt = !empty($_POST['excerpt']) ? $_POST['excerpt'] : ''; $url = !empty($_POST['url']) ? $_POST['url'] : ''; $blog_name = !empty($_POST['blog_name']) ? $_POST['blog_name'] : ''; $charset = ''; $comment = ''; $err = false; $msg = ''; if ($this->core->blog === null) { $err = true; $msg = 'No blog.'; } elseif ($url == '') { $err = true; $msg = 'URL parameter is required.'; } elseif ($blog_name == '') { $err = true; $msg = 'Blog name is required.'; } if (!$err) { $post = $this->core->blog->getPosts(array('post_id'=>$post_id,'post_type'=>'')); if ($post->isEmpty()) { $err = true; $msg = 'No such post.'; } elseif (!$post->trackbacksActive()) { $err = true; $msg = 'Trackbacks are not allowed for this post or weblog.'; } $url = trim(html::clean($url)); if ($this->pingAlreadyDone($post->post_id, $url)) { $err = true; $msg = 'The trackback has already been registered'; } } if (!$err) { $charset = self::getCharsetFromRequest(); if (!$charset) { $charset = self::detectCharset($title.' '.$excerpt.' '.$blog_name); } if (strtolower($charset) != 'utf-8') { $title = iconv($charset,'UTF-8',$title); $excerpt = iconv($charset,'UTF-8',$excerpt); $blog_name = iconv($charset,'UTF-8',$blog_name); } $title = trim(html::clean($title)); $title = html::decodeEntities($title); $title = html::escapeHTML($title); $title = text::cutString($title,60); $excerpt = trim(html::clean($excerpt)); $excerpt = html::decodeEntities($excerpt); $excerpt = preg_replace('/\s+/ms',' ',$excerpt); $excerpt = text::cutString($excerpt,252); $excerpt = html::escapeHTML($excerpt).'...'; $blog_name = trim(html::clean($blog_name)); $blog_name = html::decodeEntities($blog_name); $blog_name = html::escapeHTML($blog_name); $blog_name = text::cutString($blog_name,60); try { $this->addBacklink($post_id, $url, $blog_name, $title, $excerpt, $comment); } catch (Exception $e) { $err = 1; $msg = 'Something went wrong : '.$e->getMessage(); } } $resp = ''."\n". "\n". ' '.(integer) $err."\n"; if ($msg) { $resp .= ' '.$msg."\n"; } if (!empty($_POST['__debug'])) { $resp .= " \n". ' '.$title."\n". ' '.$excerpt."\n". ' '.$url."\n". ' '.$blog_name."\n". ' '.$charset."\n". ' '.$comment."\n". " \n"; } echo $resp.""; } //@} /// @name Receive pingbacks //@{ /** Receives a pingback and insert it as a comment of given post. @param from_url string Source URL @param to_url string Target URL */ public function receive_pb($from_url, $to_url) { $reg = '!^'.preg_quote($this->core->blog->url).'(.*)!'; $type = $args = $next = ''; # Are you dumb? if (!preg_match($reg, $to_url, $m)) { throw new Exception(__('Any chance you ping one of my contents? No? Really?'), 0); } # Does the targeted URL look like a registered post type? $url_part = $m[1]; $p_type = ''; $post_types = $this->core->getPostTypes(); foreach ($post_types as $k => $v) { $reg = '!^'.preg_quote(str_replace('%s', '', $v['public_url'])).'(.*)!'; if (preg_match($reg, $url_part, $n)) { $p_type = $k; $post_url = $n[1]; break; } } if (empty($p_type)) { throw new Exception(__('Sorry but you can not ping this type of content.'), 33); } # Time to see if we've got a winner... $params = array( 'post_type' => $p_type, 'post_url' => $post_url, ); $posts = $this->core->blog->getPosts($params); # Missed! if ($posts->isEmpty()) { throw new Exception(__('Oops. Kinda "not found" stuff. Please check the target URL twice.'), 33); } # Nice try. But, sorry, no. if (!$posts->trackbacksActive()) { throw new Exception(__('Sorry, dude. This entry does not accept pingback at the moment.'), 33); } if ($this->pingAlreadyDone($posts->post_id, $from_url)) { throw new Exception(__('Don\'t repeat yourself, please.'), 48); } # OK. We've found our champion. Time to check the remote part. try { $http = self::initHttp($from_url, $from_path); # First round : just to be sure the ping comes from an acceptable resource type. $http->setHeadersOnly(true); $http->get($from_path); $c_type = explode(';', $http->getHeader('content-type')); # Bad luck. Bye, bye... if (!in_array($c_type[0],array('text/html', 'application/xhtml+xml'))) { throw new Exception(__('Your source URL does not look like a supported content type. Sorry. Bye, bye!'), 0); } # Second round : let's go fetch and parse the remote content $http->setHeadersOnly(false); $http->get($from_path); $remote_content = $http->getContent(); $charset = self::getCharsetFromRequest($http->getHeader('content-type')); if (!$charset) { $charset = self::detectCharset($remote_content); } if (strtolower($charset) != 'utf-8') { $remote_content = iconv($charset,'UTF-8',$remote_content); } # We want a title... if (!preg_match('!([^<].*?)!mis', $remote_content, $m)) { throw new Exception(__('Where\'s your title?'), 0); } $title = trim(html::clean($m[1])); $title = html::decodeEntities($title); $title = html::escapeHTML($title); $title = text::cutString($title,60); preg_match('!]*?>(.*)?!msi', $remote_content, $m); $source = $m[1]; $source = preg_replace('![\r\n\s]+!ms',' ',$source); $source = preg_replace( "/<\/*(h\d|p|th|td|li|dt|dd|pre|caption|input|textarea|button)[^>]*>/", "\n\n", $source ); $source = strip_tags($source, ''); $source = explode("\n\n",$source); $excerpt = ''; foreach ($source as $line) { if (strpos($line, $to_url) !== false) { if (preg_match("!]+?".$to_url."[^>]*>([^>]+?)!", $line, $m)) { $excerpt = strip_tags($line); break; } } } if ($excerpt) { $excerpt = '(…) '.text::cutString(html::escapeHTML($excerpt),200).' (…)'; } else { $excerpt = '(…)'; } $this->addBacklink($posts->post_id, $from_url, '', $title, $excerpt, $comment); } catch (Exception $e) { throw new Exception(__('Sorry, an internal problem has occured.'), 0); } return __('Thanks, mate. It was a pleasure.'); } //@} private static function initHttp($url,&$path) { $client = netHttp::initClient($url,$path); $client->setTimeout(5); $client->setUserAgent('Dotclear - http://www.dotclear.org/'); $client->useGzip(false); $client->setPersistReferers(false); return $client; } private static function getCharsetFromRequest($header = '') { if (!$header && isset($_SERVER['CONTENT_TYPE'])) { $header = $_SERVER['CONTENT_TYPE']; } if ($header) { if (preg_match('|charset=([a-zA-Z0-9-]+)|',$header,$m)) { return $m[1]; } } return null; } private static function detectCharset($string) { return mb_detect_encoding($remote_content, 'UTF-8,ISO-8859-1,ISO-8859-2,ISO-8859-3,'. 'ISO-8859-4,ISO-8859-5,ISO-8859-6,ISO-8859-7,ISO-8859-8,'. 'ISO-8859-9,ISO-8859-10,ISO-8859-13,ISO-8859-14,ISO-8859-15'); } /// @name Trackbacks auto discovery //@{ /** Returns an array containing all discovered trackbacks URLs in $text. @param text string Input text @return array */ public function discover($text) { $res = array(); foreach ($this->getTextLinks($text) as $link) { if (($url = $this->getPingURL($link)) !== null) { $res[] = $url; } } return $res; } //@} private function getTextLinks($text) { $res = array(); # href attribute on "a" tags if (preg_match_all('/]+)>/ms', $text, $match, PREG_SET_ORDER)) { for ($i = 0; $i]+)>/ms', $text, $match, PREG_SET_ORDER)) { for ($i = 0; $iget($path); $page_content = $http->getContent(); $pb_url = $http->getHeader('x-pingback'); } catch (Exception $e) { return false; } # If we've got a X-Pingback header and it's a valid URL, it will be enough if ($pb_url && filter_var($pb_url,FILTER_VALIDATE_URL) && preg_match('!^https?:!',$pb_url)) { return $pb_url.'|'.$url; } # No X-Pingback header. A link rel=pingback, maybe ? $pattern_pingback = '!!msi'; if (preg_match($pattern_pingback,$page_content,$m)) { $pb_url = $m[1]; if (filter_var($pb_url,FILTER_VALIDATE_URL) && preg_match('!^https?:!',$pb_url)) { return $pb_url.'|'.$url; } } # No pingback ? OK, let's check for a trackback data chunk... $pattern_rdf = '/.*?'. ''. '.*?<\/rdf:RDF>'. '/msi'; preg_match_all($pattern_rdf,$page_content,$rdf_all,PREG_SET_ORDER); $url_path = parse_url($url, PHP_URL_PATH); $sanitized_url = str_replace($url_path, html::sanitizeURL($url_path), $url); for ($i=0; $i null, 'href' => null, 'checksum' => null, 'info' => null, 'notify' => true ); protected $cache_ttl = '-6 hours'; protected $forced_files = array(); /** * Constructor * * @param url string Versions file URL * @param subject string Subject to check * @param version string Version type * @param cache_dir string Directory cache path */ public function __construct($url,$subject,$version,$cache_dir) { $this->url = $url; $this->subject = $subject; $this->version = $version; $this->cache_file = $cache_dir.'/'.$subject.'-'.$version; } /** * Checks for Dotclear updates. * Returns latest version if available or false. * * @param version string Current version to compare * @param nocache boolean Force checking * @return string Latest version if available */ public function check($version, $nocache=false) { $this->getVersionInfo($nocache); $v = $this->getVersion(); if ($v && version_compare($version,$v,'<')) { return $v; } return false; } public function getVersionInfo($nocache=false) { # Check cached file if (is_readable($this->cache_file) && filemtime($this->cache_file) > strtotime($this->cache_ttl) && !$nocache) { $c = @file_get_contents($this->cache_file); $c = @unserialize($c); if (is_array($c)) { $this->version_info = $c; return; } } $cache_dir = dirname($this->cache_file); $can_write = (!is_dir($cache_dir) && is_writable(dirname($cache_dir))) || (!file_exists($this->cache_file) && is_writable($cache_dir)) || is_writable($this->cache_file); # If we can't write file, don't bug host with queries if (!$can_write) { return; } if (!is_dir($cache_dir)) { try { files::makeDir($cache_dir); } catch (Exception $e) { return; } } # Try to get latest version number try { $path = ''; $client = netHttp::initClient($this->url,$path); if ($client !== false) { $client->setTimeout(4); $client->setUserAgent($_SERVER['HTTP_USER_AGENT']); $client->get($path); $this->readVersion($client->getContent()); } } catch (Exception $e) {} # Create cache file_put_contents($this->cache_file,serialize($this->version_info)); } public function getVersion() { return $this->version_info['version']; } public function getFileURL() { return $this->version_info['href']; } public function getInfoURL() { return $this->version_info['info']; } public function getChecksum() { return $this->version_info['checksum']; } public function getNotify() { return $this->version_info['notify']; } public function getForcedFiles() { return $this->forced_files; } public function setForcedFiles() { $this->forced_files = func_get_args(); } /** * Sets notification flag. */ public function setNotify($n) { if (!is_writable($this->cache_file)) { return; } $this->version_info['notify'] = (boolean) $n; file_put_contents($this->cache_file,serialize($this->version_info)); } public function checkIntegrity($digests_file,$root) { if (!$digests_file) { throw new Exception(__('Digests file not found.')); } $changes = $this->md5sum($root,$digests_file); if (!empty($changes)) { $e = new Exception('Some files have changed.',self::ERR_FILES_CHANGED); $e->bad_files = $changes; throw $e; } return true; } /** * Downloads new version to destination $dest. */ public function download($dest) { $url = $this->getFileURL(); if (!$url) { throw new Exception(__('No file to download')); } if (!is_writable(dirname($dest))) { throw new Exception(__('Root directory is not writable.')); } try { $client = netHttp::initClient($url,$path); $client->setTimeout(4); $client->setUserAgent($_SERVER['HTTP_USER_AGENT']); $client->useGzip(false); $client->setPersistReferers(false); $client->setOutput($dest); $client->get($path); if ($client->getStatus() != 200) { @unlink($dest); throw new Exception(); } } catch (Exception $e) { throw new Exception(__('An error occurred while downloading archive.')); } } /** * Checks if archive was successfully downloaded. */ public function checkDownload($zip) { $cs = $this->getChecksum(); return $cs && is_readable($zip) && md5_file($zip) == $cs; } /** * Backups changed files before an update. */ public function backup($zip_file,$zip_digests,$root,$root_digests,$dest) { if (!is_readable($zip_file)) { throw new Exception(__('Archive not found.')); } if (!is_readable($root_digests)) { @unlink($zip_file); throw new Exception(__('Unable to read current digests file.')); } # Stop everything if a backup already exists and can not be overrided if (!is_writable(dirname($dest)) && !file_exists($dest)) { throw new Exception(__('Root directory is not writable.')); } if (file_exists($dest) && !is_writable($dest)) { return false; } $b_fp = @fopen($dest,'wb'); if ($b_fp === false) { return false; } $zip = new fileUnzip($zip_file); $b_zip = new fileZip($b_fp); if (!$zip->hasFile($zip_digests)) { @unlink($zip_file); throw new Exception(__('Downloaded file does not seem to be a valid archive.')); } $opts = FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES; $cur_digests = file($root_digests,$opts); $new_digests = explode("\n",$zip->unzip($zip_digests)); $new_files = $this->getNewFiles($cur_digests,$new_digests); $zip->close(); unset($opts,$cur_digests,$new_digests,$zip); $not_readable = array(); if (!empty($this->forced_files)) { $new_files = array_merge($new_files,$this->forced_files); } foreach ($new_files as $file) { if (!$file || !file_exists($root.'/'.$file)) { continue; } try { $b_zip->addFile($root.'/'.$file,$file); } catch (Exception $e) { $not_readable[] = $file; } } # If only one file is not readable, stop everything now if (!empty($not_readable)) { $e = new Exception('Some files are not readable.',self::ERR_FILES_UNREADABLE); $e->bad_files = $not_readable; throw $e; } $b_zip->write(); fclose($b_fp); $b_zip->close(); return true; } /** * Upgrade process. */ public function performUpgrade($zip_file,$zip_digests,$zip_root,$root,$root_digests) { if (!is_readable($zip_file)) { throw new Exception(__('Archive not found.')); } if (!is_readable($root_digests)) { @unlink($zip_file); throw new Exception(__('Unable to read current digests file.')); } $zip = new fileUnzip($zip_file); if (!$zip->hasFile($zip_digests)) { @unlink($zip_file); throw new Exception(__('Downloaded file does not seem to be a valid archive.')); } $opts = FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES; $cur_digests = file($root_digests,$opts); $new_digests = explode("\n",$zip->unzip($zip_digests)); $new_files = self::getNewFiles($cur_digests,$new_digests); if (!empty($this->forced_files)) { $new_files = array_merge($new_files,$this->forced_files); } $zip_files = array(); $not_writable = array(); foreach ($new_files as $file) { if (!$file) { continue; } if (!$zip->hasFile($zip_root.'/'.$file)) { @unlink($zip_file); throw new Exception(__('Incomplete archive.')); } $dest = $dest_dir = $root.'/'.$file; while (!is_dir($dest_dir = dirname($dest_dir))); if ((file_exists($dest) && !is_writable($dest)) || (!file_exists($dest) && !is_writable($dest_dir))) { $not_writable[] = $file; continue; } $zip_files[] = $file; } # If only one file is not writable, stop everything now if (!empty($not_writable)) { $e = new Exception('Some files are not writable',self::ERR_FILES_UNWRITALBE); $e->bad_files = $not_writable; throw $e; } # Everything's fine, we can write files, then do it now $can_touch = function_exists('touch'); foreach ($zip_files as $file) { $zip->unzip($zip_root.'/'.$file, $root.'/'.$file); if ($can_touch) { @touch($root.'/'.$file); } } @unlink($zip_file); } protected function getNewFiles($cur_digests,$new_digests) { $cur_md5 = $cur_path = $cur_digests; $new_md5 = $new_path = $new_digests; array_walk($cur_md5, array($this,'parseLine'),1); array_walk($cur_path,array($this,'parseLine'),2); array_walk($new_md5, array($this,'parseLine'),1); array_walk($new_path,array($this,'parseLine'),2); $cur = array_combine($cur_md5,$cur_path); $new = array_combine($new_md5,$new_path); return array_values(array_diff_key($new,$cur)); } protected function readVersion($str) { try { $xml = new SimpleXMLElement($str,LIBXML_NOERROR); $r = $xml->xpath("/versions/subject[@name='".$this->subject."']/release[@name='".$this->version."']"); if (!empty($r) && is_array($r)) { $r = $r[0]; $this->version_info['version'] = isset($r['version']) ? (string) $r['version'] : null; $this->version_info['href'] = isset($r['href']) ? (string) $r['href'] : null; $this->version_info['checksum'] = isset($r['checksum']) ? (string) $r['checksum'] : null; $this->version_info['info'] = isset($r['info']) ? (string) $r['info'] : null; } } catch (Exception $e) { throw $e; } } protected function md5sum($root,$digests_file) { if (!is_readable($digests_file)) { throw new Exception(__('Unable to read digests file.')); } $opts = FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES; $contents = file($digests_file,$opts); $changes = array(); foreach ($contents as $digest) { if (!preg_match('#^([\da-f]{32})\s+(.+?)$#',$digest,$m)) { continue; } $md5 = $m[1]; $filename = $root.'/'.$m[2]; # Invalid checksum if (!is_readable($filename) || !self::md5_check($filename, $md5)) { $changes[] = substr($m[2],2); } } # No checksum found in digests file if (empty($md5)) { throw new Exception(__('Invalid digests file.')); } return $changes; } protected function parseLine(&$v,$k,$n) { if (!preg_match('#^([\da-f]{32})\s+(.+?)$#',$v,$m)) { return; } $v = $n == 1 ? md5($m[2].$m[1]) : substr($m[2],2); } protected static function md5_check($filename,$md5) { if (md5_file($filename) == $md5) { return true; } else { $filecontent = file_get_contents($filename); $filecontent = str_replace ("\r\n","\n",$filecontent); $filecontent = str_replace ("\r","\n",$filecontent); if (md5($filecontent) == $md5) return true; } return false; } } dotclear-2.6.2+dfsg/inc/core/class.dc.utils.php000066400000000000000000000047571230033266200213120ustar00rootroot00000000000000user_id, user_name, user_firstname and user_displayname. @param user_id string User ID @param user_name string User's name @param user_firstname string User's first name @param user_displayname string User's display name @return string */ public static function getUserCN($user_id, $user_name, $user_firstname, $user_displayname) { if (!empty($user_displayname)) { return $user_displayname; } if (!empty($user_name)) { if (!empty($user_firstname)) { return $user_firstname.' '.$user_name; } else { return $user_name; } } elseif (!empty($user_firstname)) { return $user_firstname; } return $user_id; } /** Cleanup a list of IDs @param ids mixed ID(s) @return array */ public static function cleanIds($ids) { $clean_ids = array(); if (!is_array($ids)) { $ids = array($ids); } foreach($ids as $id) { $id = abs((integer) $id); if (!empty($id)) { $clean_ids[] = $id; } } return $clean_ids; } /** * Compare two versions with option of using only main numbers. * * @param string $current_version Current version * @param string $required_version Required version * @param string $operator Comparison operand * @param boolean $strict Use full version * @return boolean True if comparison success */ public static function versionsCompare($current_version, $required_version, $operator='>=', $strict=true) { if ($strict) { $current_version = preg_replace('!-r(\d+)$!', '-p$1', $current_version); $required_version = preg_replace('!-r(\d+)$!', '-p$1', $required_version); } else { $current_version = preg_replace('/^([0-9\.]+)(.*?)$/', '$1', $current_version); $required_version = preg_replace('/^([0-9\.]+)(.*?)$/', '$1', $required_version); } return (boolean) version_compare($current_version, $required_version, $operator); } } dotclear-2.6.2+dfsg/inc/core/class.dc.workspace.php000066400000000000000000000236531230033266200221440ustar00rootroot00000000000000connection Database connection object protected $table; ///< string Preferences table name protected $user_id; ///< string User ID protected $global_prefs = array(); ///< array Global prefs array protected $local_prefs = array(); ///< array Local prefs array protected $prefs = array(); ///< array Associative prefs array protected $ws; ///< string Current workspace /** Object constructor. Retrieves user prefs and puts them in $prefs array. Local (user) prefs have a highest priority than global prefs. @param name string ID for this workspace */ public function __construct(&$core, $user_id, $name, $rs=null) { if (preg_match('/^[a-zA-Z][a-zA-Z0-9]+$/',$name)) { $this->ws = $name; } else { throw new Exception(sprintf(__('Invalid dcWorkspace: %s'),$name)); } $this->con =& $core->con; $this->table = $core->prefix.'pref'; $this->user_id =& $user_id; try {$this->getPrefs($rs);} catch (Exception $e) { if (version_compare($core->getVersion('core'),'2.3','>')) { trigger_error(__('Unable to retrieve prefs:').' '.$this->con->error(), E_USER_ERROR); } } } private function getPrefs($rs=null) { if ($rs == null) { $strReq = 'SELECT user_id, pref_id, pref_value, '. 'pref_type, pref_label, pref_ws '. 'FROM '.$this->table.' '. "WHERE (user_id = '".$this->con->escape($this->user_id)."' ". 'OR user_id IS NULL) '. "AND pref_ws = '".$this->con->escape($this->ws)."' ". 'ORDER BY pref_id ASC '; try { $rs = $this->con->select($strReq); } catch (Exception $e) { throw $e; } } while ($rs->fetch()) { if ($rs->f('pref_ws') != $this->ws){ break; } $id = trim($rs->f('pref_id')); $value = $rs->f('pref_value'); $type = $rs->f('pref_type'); if ($type == 'float' || $type == 'double') { $type = 'float'; } elseif ($type != 'boolean' && $type != 'integer') { $type = 'string'; } settype($value,$type); $array = $rs->user_id ? 'local' : 'global'; $this->{$array.'_prefs'}[$id] = array( 'ws' => $this->ws, 'value' => $value, 'type' => $type, 'label' => (string) $rs->f('pref_label'), 'global' => $rs->user_id == '' ); } $this->prefs = $this->global_prefs; foreach ($this->local_prefs as $id => $v) { $this->prefs[$id] = $v; } return true; } public function prefExists($id,$global=false) { $array = $global ? 'global' : 'local'; return isset($this->{$array.'_prefs'}[$id]); } /** Returns pref value if exists. @param n string Pref name @return mixed */ public function get($n) { if (isset($this->prefs[$n]['value'])) { return $this->prefs[$n]['value']; } return null; } /** Returns global pref value if exists. @param n string Pref name @return mixed */ public function getGlobal($n) { if (isset($this->global_prefs[$n]['value'])) { return $this->global_prefs[$n]['value']; } return null; } /** Returns local pref value if exists. @param n string Pref name @return mixed */ public function getLocal($n) { if (isset($this->local_prefs[$n]['value'])) { return $this->local_prefs[$n]['value']; } return null; } /** Magic __get method. @copydoc ::get */ public function __get($n) { return $this->get($n); } /** Sets a pref in $prefs property. This sets the pref for script execution time only and if pref exists. @param n string Pref name @param v mixed Pref value */ public function set($n,$v) { if (isset($this->prefs[$n])) { $this->prefs[$n]['value'] = $v; } } /** Magic __set method. @copydoc ::set */ public function __set($n,$v) { $this->set($n,$v); } /** Creates or updates a pref. $type could be 'string', 'integer', 'float', 'boolean' or null. If $type is null and pref exists, it will keep current pref type. $value_change allow you to not change pref. Useful if you need to change a pref label or type and don't want to change its value. @param id string Pref ID @param value mixed Pref value @param type string Pref type @param label string Pref label @param value_change boolean Change pref value or not @param global boolean Pref is global */ public function put($id,$value,$type=null,$label=null,$value_change=true,$global=false) { if (!preg_match('/^[a-zA-Z][a-zA-Z0-9_]+$/',$id)) { throw new Exception(sprintf(__('%s is not a valid pref id'),$id)); } # We don't want to change pref value if (!$value_change) { if (!$global && $this->prefExists($id,false)) { $value = $this->local_prefs[$id]['value']; } elseif ($this->prefExists($id,true)) { $value = $this->global_prefs[$id]['value']; } } # Pref type if ($type == 'double') { $type = 'float'; } elseif ($type === null) { if (!$global && $this->prefExists($id,false)) { $type = $this->local_prefs[$id]['type']; } elseif ($this->prefExists($id,true)) { $type = $this->global_prefs[$id]['type']; } else { $type = 'string'; } } elseif ($type != 'boolean' && $type != 'integer' && $type != 'float') { $type = 'string'; } # We don't change label if ($label == null) { if (!$global && $this->prefExists($id,false)) { $label = $this->local_prefs[$id]['label']; } elseif ($this->prefExists($id,true)) { $label = $this->global_prefs[$id]['label']; } } settype($value,$type); $cur = $this->con->openCursor($this->table); $cur->pref_value = ($type == 'boolean') ? (string) (integer) $value : (string) $value; $cur->pref_type = $type; $cur->pref_label = $label; #If we are local, compare to global value if (!$global && $this->prefExists($id,true)) { $g = $this->global_prefs[$id]; $same_pref = $g['ws'] == $this->ws && $g['value'] == $value && $g['type'] == $type && $g['label'] == $label; # Drop pref if same value as global if ($same_pref && $this->prefExists($id,false)) { $this->drop($id); } elseif ($same_pref) { return; } } if ($this->prefExists($id,$global) && $this->ws == $this->prefs[$id]['ws']) { if ($global) { $where = 'WHERE user_id IS NULL '; } else { $where = "WHERE user_id = '".$this->con->escape($this->user_id)."' "; } $cur->update($where."AND pref_id = '".$this->con->escape($id)."' AND pref_ws = '".$this->con->escape($this->ws)."' "); } else { $cur->pref_id = $id; $cur->user_id = $global ? null : $this->user_id; $cur->pref_ws = $this->ws; $cur->insert(); } } /** Rename an existing pref in a Workspace @param $oldId string Current pref name @param $newId string New pref name @return boolean */ public function rename($oldId,$newId) { if (!$this->ws) { throw new Exception(__('No workspace specified')); } if (!array_key_exists($oldId,$this->prefs) || array_key_exists($newId,$this->prefs)) { return false; } // Rename the pref in the prefs array $this->prefs[$newId] = $this->prefs[$oldId]; unset($this->prefs[$oldId]); // Rename the pref in the database $strReq = 'UPDATE '.$this->table. " SET pref_id = '".$this->con->escape($newId)."' ". " WHERE pref_ws = '".$this->con->escape($this->ws)."' ". " AND pref_id = '".$this->con->escape($oldId)."' "; $this->con->execute($strReq); return true; } /** Removes an existing pref. Workspace @param id string Pref ID @param force_global boolean Force global pref drop */ public function drop($id,$force_global=false) { if (!$this->ws) { throw new Exception(__('No workspace specified')); } $strReq = 'DELETE FROM '.$this->table.' '; if (($force_global) || ($this->user_id === null)) { $strReq .= 'WHERE user_id IS NULL '; $global = true; } else { $strReq .= "WHERE user_id = '".$this->con->escape($this->user_id)."' "; $global = false; } $strReq .= "AND pref_id = '".$this->con->escape($id)."' "; $strReq .= "AND pref_ws = '".$this->con->escape($this->ws)."' "; $this->con->execute($strReq); if ($this->prefExists($id,$global)) { $array = $global ? 'global' : 'local'; unset($this->{$array.'_prefs'}[$id]); } $this->prefs = $this->global_prefs; foreach ($this->local_prefs as $id => $v) { $this->prefs[$id] = $v; } } /** Removes all existing pref. in a Workspace @param force_global boolean Force global pref drop */ public function dropAll($force_global=false) { if (!$this->ws) { throw new Exception(__('No workspace specified')); } $strReq = 'DELETE FROM '.$this->table.' '; if (($force_global) || ($this->user_id === null)) { $strReq .= 'WHERE user_id IS NULL '; $global = true; } else { $strReq .= "WHERE user_id = '".$this->con->escape($this->user_id)."' "; $global = false; } $strReq .= "AND pref_ws = '".$this->con->escape($this->ws)."' "; $this->con->execute($strReq); $array = $global ? 'global' : 'local'; unset($this->{$array.'_prefs'}); $this->{$array.'_prefs'} = array(); $array = $global ? 'local' : 'global'; $this->prefs = $this->{$array.'_prefs'}; } /** Returns $prefs property content. @return array */ public function dumpPrefs() { return $this->prefs; } /** Returns $local_prefs property content. @return array */ public function dumpLocalPrefs() { return $this->local_prefs; } /** Returns $global_prefs property content. @return array */ public function dumpGlobalPrefs() { return $this->global_prefs; } } dotclear-2.6.2+dfsg/inc/core/class.dc.xmlrpc.php000066400000000000000000001314371230033266200214530ustar00rootroot00000000000000core =& $core; $this->blog_id = $blog_id; # Blogger methods $this->addCallback('blogger.newPost',array($this,'blogger_newPost'), array('string','string','string','string','string','string','integer'), 'New post'); $this->addCallback('blogger.editPost',array($this,'blogger_editPost'), array('boolean','string','string','string','string','string','integer'), 'Edit a post'); $this->addCallback('blogger.getPost',array($this,'blogger_getPost'), array('struct','string','integer','string','string'), 'Return a posts by ID'); $this->addCallback('blogger.deletePost',array($this,'blogger_deletePost'), array('string','string','string','string','string','integer'), 'Delete a post'); $this->addCallback('blogger.getRecentPosts',array($this,'blogger_getRecentPosts'), array('array','string','string','string','string','integer'), 'Return a list of recent posts'); $this->addCallback('blogger.getUsersBlogs',array($this,'blogger_getUserBlogs'), array('struct','string','string','string'), "Return user's blog"); $this->addCallback('blogger.getUserInfo',array($this,'blogger_getUserInfo'), array('struct','string','string','string'), 'Return User Info'); # Metaweblog methods $this->addCallback('metaWeblog.newPost',array($this,'mw_newPost'), array('string','string','string','string','struct','boolean'), 'Creates a new post, and optionnaly publishes it.'); $this->addCallback('metaWeblog.editPost',array($this,'mw_editPost'), array('boolean','string','string','string','struct','boolean'), 'Updates information about an existing entry'); $this->addCallback('metaWeblog.getPost',array($this,'mw_getPost'), array('struct','string','string','string'), 'Returns information about a specific post'); $this->addCallback('metaWeblog.getRecentPosts',array($this,'mw_getRecentPosts'), array('array','string','string','string','integer'), 'List of most recent posts in the system'); $this->addCallback('metaWeblog.getCategories',array($this,'mw_getCategories'), array('array','string','string','string'), 'List of all categories defined in the weblog'); $this->addCallback('metaWeblog.newMediaObject',array($this,'mw_newMediaObject'), array('struct','string','string','string','struct'), 'Upload a file on the web server'); # MovableType methods $this->addCallback('mt.getRecentPostTitles',array($this,'mt_getRecentPostTitles'), array('array','string','string','string','integer'), 'List of most recent posts in the system'); $this->addCallback('mt.getCategoryList',array($this,'mt_getCategoryList'), array('array','string','string','string'), 'List of all categories defined in the weblog'); $this->addCallback('mt.getPostCategories',array($this,'mt_getPostCategories'), array('array','string','string','string'), 'List of all categories to which the post is assigned'); $this->addCallback('mt.setPostCategories',array($this,'mt_setPostCategories'), array('boolean','string','string','string','array'), 'Sets the categories for a post'); $this->addCallback('mt.publishPost',array($this,'mt_publishPost'), array('boolean','string','string','string'), 'Retrieve pings list for a post'); $this->addCallback('mt.supportedMethods',array($this,'listMethods'), array(),'Retrieve information about the XML-RPC methods supported by the server.'); $this->addCallback('mt.supportedTextFilters',array($this,'mt_supportedTextFilters'), array(),'Retrieve information about supported text filters.'); # WordPress methods $this->addCallback('wp.getUsersBlogs',array($this,'wp_getUsersBlogs'), array('array','string','string'), 'Retrieve the blogs of the user.'); $this->addCallback('wp.getPage',array($this,'wp_getPage'), array('struct','integer','integer','string','string'), 'Get the page identified by the page ID.'); $this->addCallback('wp.getPages',array($this,'wp_getPages'), array('array','integer','string','string','integer'), 'Get an array of all the pages on a blog.'); $this->addCallback('wp.newPage',array($this,'wp_newPage'), array('integer','integer','string','string','struct','boolean'), 'Create a new page.'); $this->addCallback('wp.deletePage',array($this,'wp_deletePage'), array('boolean','integer','string','string','integer'), 'Removes a page from the blog.'); $this->addCallback('wp.editPage',array($this,'wp_editPage'), array('boolean','integer','integer','string','string','struct','boolean'), 'Make changes to a blog page.'); $this->addCallback('wp.getPageList',array($this,'wp_getPageList'), array('array','integer','string','string'), 'Get an array of all the pages on a blog. Just the minimum details, lighter than wp.getPages.'); $this->addCallback('wp.getAuthors',array($this,'wp_getAuthors'), array('array','integer','string','string'), 'Get an array of users for the blog.'); $this->addCallback('wp.getCategories',array($this,'wp_getCategories'), array('array','integer','string','string'), 'Get an array of available categories on a blog.'); $this->addCallback('wp.getTags',array($this,'wp_getTags'), array('array','integer','string','string'), 'Get list of all tags for the blog.'); $this->addCallback('wp.newCategory',array($this,'wp_newCategory'), array('integer','integer','string','string','struct'), 'Create a new category.'); $this->addCallback('wp.deleteCategory',array($this,'wp_deleteCategory'), array('boolean','integer','string','string','integer'), 'Delete a category with a given ID.'); $this->addCallback('wp.suggestCategories',array($this,'wp_suggestCategories'), array('array','integer','string','string','string','integer'), 'Get an array of categories that start with a given string.'); $this->addCallback('wp.uploadFile',array($this,'wp_uploadFile'), array('struct','integer','string','string','struct'), 'Upload a file'); $this->addCallback('wp.getPostStatusList',array($this,'wp_getPostStatusList'), array('array','integer','string','string'), 'Retrieve all of the post statuses.'); $this->addCallback('wp.getPageStatusList',array($this,'wp_getPageStatusList'), array('array','integer','string','string'), 'Retrieve all of the pages statuses.'); $this->addCallback('wp.getPageTemplates',array($this,'wp_getPageTemplates'), array('struct','integer','string','string'), 'Retrieve page templates.'); $this->addCallback('wp.getOptions',array($this,'wp_getOptions'), array('struct','integer','string','string','array'), 'Retrieve blog options'); $this->addCallback('wp.setOptions',array($this,'wp_setOptions'), array('struct','integer','string','string','struct'), 'Update blog options'); $this->addCallback('wp.getComment',array($this,'wp_getComment'), array('struct','integer','string','string','integer'), "Gets a comment, given it's comment ID."); $this->addCallback('wp.getCommentCount',array($this,'wp_getCommentCount'), array('array','integer','string','string','integer'), 'Retrieve comment count.'); $this->addCallback('wp.getComments',array($this,'wp_getComments'), array('array','integer','string','string','struct'), 'Gets a set of comments for a given post.'); $this->addCallback('wp.deleteComment',array($this,'wp_deleteComment'), array('boolean','integer','string','string','integer'), 'Delete a comment with given ID.'); $this->addCallback('wp.editComment',array($this,'wp_editComment'), array('boolean','integer','string','string','integer','struct'), 'Edit a comment with given ID.'); $this->addCallback('wp.newComment',array($this,'wp_newComment'), array('integer','integer','string','string','integer','struct'), 'Create a new comment for a given post ID.'); $this->addCallback('wp.getCommentStatusList',array($this,'wp_getCommentStatusList'), array('array','integer','string','string'), 'Retrieve all of the comment statuses.'); # Pingback support $this->addCallback('pingback.ping',array($this,'pingback_ping'), array('string', 'string', 'string'), 'Notify a link to a post.'); } public function serve($data=false,$encoding='UTF-8') { parent::serve(false,$encoding); } public function call($methodname,$args) { try { $rsp = @parent::call($methodname,$args); $this->debugTrace($methodname,$args,$rsp); return $rsp; } catch (Exception $e) { $this->debugTrace($methodname,$args,array($e->getMessage(),$e->getCode())); throw $e; } } private function debugTrace($methodname,$args,$rsp) { if (!$this->debug) { return; } if (($fp = @fopen($this->debug_file,'a')) !== false) { fwrite($fp,'['.date('r').']'.' '.$methodname); if ($this->trace_args) { fwrite($fp,"\n- args ---\n".var_export($args,1)); } if ($this->trace_response) { fwrite($fp,"\n- response ---\n".var_export($rsp,1)); } fwrite($fp,"\n"); fclose($fp); } } /* Internal methods --------------------------------------------------- */ private function setUser($user_id,$pwd) { if ($this->core->auth->userID() == $user_id) { return true; } if ($this->core->auth->checkUser($user_id,$pwd) !== true) { throw new Exception('Login error'); } return true; } private function setBlog($bypass = false) { if (!$this->blog_id) { throw new Exception('No blog ID given.'); } if ($this->blog_loaded) { return true; } $this->core->setBlog($this->blog_id); $this->blog_loaded = true; if (!$this->core->blog->id) { $this->core->blog = null; throw new Exception('Blog does not exist.'); } if (!$bypass && (!$this->core->blog->settings->system->enable_xmlrpc || !$this->core->auth->check('usage,contentadmin',$this->core->blog->id))) { $this->core->blog = null; throw new Exception('Not enough permissions on this blog.'); } foreach ($this->core->plugins->getModules() as $id => $m) { $this->core->plugins->loadNsFile($id,'xmlrpc'); } return true; } private function getPostRS($post_id,$user,$pwd,$post_type='post') { $this->setUser($user,$pwd); $this->setBlog(); $rs = $this->core->blog->getPosts(array( 'post_id' => (integer) $post_id, 'post_type' => $post_type )); if ($rs->isEmpty()) { throw new Exception('This entry does not exist'); } return $rs; } private function getCatID($cat_url) { $rs = $this->core->blog->getCategories(array('cat_url' => $cat_url)); return $rs->isEmpty() ? null : $rs->cat_id; } /* Generic methods --------------------------------------------------- */ private function newPost($blog_id,$user,$pwd,$content,$struct=array(),$publish=true) { $this->setUser($user,$pwd); $this->setBlog(); $title = !empty($struct['title']) ? $struct['title'] : ''; $excerpt = !empty($struct['mt_excerpt']) ? $struct['mt_excerpt'] : ''; $description = !empty($struct['description']) ? $struct['description'] : null; $dateCreated = !empty($struct['dateCreated']) ? $struct['dateCreated'] : null; $open_comment = isset($struct['mt_allow_comments']) ? $struct['mt_allow_comments'] : 1; $open_tb = isset($struct['mt_allow_pings']) ? $struct['mt_allow_pings'] : 1; if ($description !== null) { $content = $description; } if (!$title) { $title = text::cutString(html::clean($content),25).'...'; } $excerpt_xhtml = $this->core->callFormater('xhtml',$excerpt); $content_xhtml = $this->core->callFormater('xhtml',$content); if (empty($content)) { throw new Exception('Cannot create an empty entry'); } $cur = $this->core->con->openCursor($this->core->prefix.'post'); $cur->user_id = $this->core->auth->userID(); $cur->post_lang = $this->core->auth->getInfo('user_lang'); $cur->post_title = trim($title); $cur->post_content = $content; $cur->post_excerpt = $excerpt; $cur->post_content_xhtml = $content_xhtml; $cur->post_excerpt_xhtml = $excerpt_xhtml; $cur->post_open_comment = (integer) ($open_comment == 1); $cur->post_open_tb = (integer) ($open_tb == 1); $cur->post_status = (integer) $publish; $cur->post_format = 'xhtml'; if ($dateCreated) { if ($dateCreated instanceof xmlrpcDate) { $cur->post_dt = date('Y-m-d H:i:00',$dateCreated->getTimestamp()); } elseif (is_string($dateCreated) && @strtotime($dateCreated)) { $cur->post_dt = date('Y-m-d H:i:00',strtotime($dateCreated)); } } # Categories in an array if (isset($struct['categories']) && is_array($struct['categories'])) { $categories = $struct['categories']; $cat_id = !empty($categories[0]) ? $categories[0] : null; $cur->cat_id = $this->getCatID($cat_id); } if (isset($struct['wp_slug'])) { $cur->post_url = $struct['wp_slug']; } if (isset($struct['wp_password'])) { $cur->post_password = $struct['wp_password']; } $cur->post_type = 'post'; if (!empty($struct['post_type'])) { $cur->post_type = $struct['post_type']; } if ($cur->post_type == 'post') { # --BEHAVIOR-- xmlrpcBeforeNewPost $this->core->callBehavior('xmlrpcBeforeNewPost',$this,$cur,$content,$struct,$publish); $post_id = $this->core->blog->addPost($cur); # --BEHAVIOR-- xmlrpcAfterNewPost $this->core->callBehavior('xmlrpcAfterNewPost',$this,$post_id,$cur,$content,$struct,$publish); } elseif ($cur->post_type == 'page') { if (isset($struct['wp_page_order'])) { $cur->post_position = (integer) $struct['wp_page_order']; } $this->core->blog->settings->system->post_url_format = '{t}'; $post_id = $this->core->blog->addPost($cur); } else { throw new Exception('Invalid post type',401); } return (string) $post_id; } private function editPost($post_id,$user,$pwd,$content,$struct=array(),$publish=true) { $post_id = (integer) $post_id; $post_type = 'post'; if (!empty($struct['post_type'])) { $post_type = $struct['post_type']; } $post = $this->getPostRS($post_id,$user,$pwd,$post_type); $title = (!empty($struct['title'])) ? $struct['title'] : ''; $excerpt = (!empty($struct['mt_excerpt'])) ? $struct['mt_excerpt'] : ''; $description = (!empty($struct['description'])) ? $struct['description'] : null; $dateCreated = !empty($struct['dateCreated']) ? $struct['dateCreated'] : null; $open_comment = (isset($struct['mt_allow_comments'])) ? $struct['mt_allow_comments'] : 1; $open_tb = (isset($struct['mt_allow_pings'])) ? $struct['mt_allow_pings'] : 1; if ($description !== null) { $content = $description; } if (!$title) { $title = text::cutString(html::clean($content),25).'...'; } $excerpt_xhtml = $this->core->callFormater('xhtml',$excerpt); $content_xhtml = $this->core->callFormater('xhtml',$content); if (empty($content)) { throw new Exception('Cannot create an empty entry'); } $cur = $this->core->con->openCursor($this->core->prefix.'post'); $cur->post_type = $post_type; $cur->post_title = trim($title); $cur->post_content = $content; $cur->post_excerpt = $excerpt; $cur->post_content_xhtml = $content_xhtml; $cur->post_excerpt_xhtml = $excerpt_xhtml; $cur->post_open_comment = (integer) ($open_comment == 1); $cur->post_open_tb = (integer) ($open_tb == 1); $cur->post_status = (integer) $publish; $cur->post_format = 'xhtml'; $cur->post_url = $post->post_url; if ($dateCreated) { if ($dateCreated instanceof xmlrpcDate) { $cur->post_dt = date('Y-m-d H:i:00',$dateCreated->getTimestamp()); } elseif (is_string($dateCreated) && @strtotime($dateCreated)) { $cur->post_dt = date('Y-m-d H:i:00',strtotime($dateCreated)); } } else { $cur->post_dt = $post->post_dt; } # Categories in an array if (isset($struct['categories']) && is_array($struct['categories'])) { $categories = $struct['categories']; $cat_id = !empty($categories[0]) ? $categories[0] : null; $cur->cat_id = $this->getCatID($cat_id); } if (isset($struct['wp_slug'])) { $cur->post_url = $struct['wp_slug']; } if (isset($struct['wp_password'])) { $cur->post_password = $struct['wp_password']; } if ($cur->post_type == 'post') { # --BEHAVIOR-- xmlrpcBeforeEditPost $this->core->callBehavior('xmlrpcBeforeEditPost',$this,$post_id,$cur,$content,$struct,$publish); $this->core->blog->updPost($post_id,$cur); # --BEHAVIOR-- xmlrpcAfterEditPost $this->core->callBehavior('xmlrpcAfterEditPost',$this,$post_id,$cur,$content,$struct,$publish); } elseif ($cur->post_type == 'page') { if (isset($struct['wp_page_order'])) { $cur->post_position = (integer) $struct['wp_page_order']; } $this->core->blog->settings->system->post_url_format = '{t}'; $this->core->blog->updPost($post_id,$cur); } else { throw new Exception('Invalid post type',401); } return true; } private function getPost($post_id,$user,$pwd,$type='mw') { $post_id = (integer) $post_id; $post = $this->getPostRS($post_id,$user,$pwd); $res = new ArrayObject(); $res['dateCreated'] = new xmlrpcDate($post->getTS()); $res['userid'] = $post->user_id; $res['postid'] = $post->post_id; if ($post->cat_id) { $res['categories'] = array($post->cat_url); } if ($type == 'blogger') { $res['content'] = $post->post_content_xhtml; } if ($type == 'mt' || $type == 'mw') { $res['title'] = $post->post_title; } if ($type == 'mw') { $res['description'] = $post->post_content_xhtml; $res['link'] = $res['permaLink'] = $post->getURL(); $res['mt_excerpt'] = $post->post_excerpt_xhtml; $res['mt_text_more'] = ''; $res['mt_allow_comments'] = (integer) $post->post_open_comment; $res['mt_allow_pings'] = (integer) $post->post_open_tb; $res['mt_convert_breaks'] = ''; $res['mt_keywords'] = ''; } # --BEHAVIOR-- xmlrpcGetPostInfo $this->core->callBehavior('xmlrpcGetPostInfo',$this,$type,array(&$res)); return $res; } private function deletePost($post_id,$user,$pwd) { $post_id = (integer) $post_id; $this->getPostRS($post_id,$user,$pwd); $this->core->blog->delPost($post_id); return true; } private function getRecentPosts($blog_id,$user,$pwd,$nb_post,$type='mw') { $this->setUser($user,$pwd); $this->setBlog(); $nb_post = (integer) $nb_post; if ($nb_post > 50) { throw new Exception('Cannot retrieve more than 50 entries'); } $params = array(); $params['limit'] = $nb_post; $posts = $this->core->blog->getPosts($params); $res = array(); while ($posts->fetch()) { $tres = array(); $tres['dateCreated'] = new xmlrpcDate($posts->getTS()); $tres['userid'] = $posts->user_id; $tres['postid'] = $posts->post_id; if ($posts->cat_id) { $tres['categories'] = array($posts->cat_url); } if ($type == 'blogger') { $tres['content'] = $posts->post_content_xhtml; } if ($type == 'mt' || $type == 'mw') { $tres['title'] = $posts->post_title; } if ($type == 'mw') { $tres['description'] = $posts->post_content_xhtml; $tres['link'] = $tres['permaLink'] = $posts->getURL(); $tres['mt_excerpt'] = $posts->post_excerpt_xhtml; $tres['mt_text_more'] = ''; $tres['mt_allow_comments'] = (integer) $posts->post_open_comment; $tres['mt_allow_pings'] = (integer) $posts->post_open_tb; $tres['mt_convert_breaks'] = ''; $tres['mt_keywords'] = ''; } # --BEHAVIOR-- xmlrpcGetPostInfo $this->core->callBehavior('xmlrpcGetPostInfo',$this,$type,array(&$tres)); $res[] = $tres; } return $res; } private function getUserBlogs($user,$pwd) { $this->setUser($user,$pwd); $this->setBlog(); return array(array( 'url' => $this->core->blog->url, 'blogid' => '1', 'blogName' => $this->core->blog->name )); } private function getUserInfo($user,$pwd) { $this->setUser($user,$pwd); return array( 'userid' => $this->core->auth->userID(), 'firstname' => $this->core->auth->getInfo('user_firstname'), 'lastname' => $this->core->auth->getInfo('user_name'), 'nickname' => $this->core->auth->getInfo('user_displayname'), 'email' => $this->core->auth->getInfo('user_email'), 'url' => $this->core->auth->getInfo('user_url') ); } private function getCategories($blog_id,$user,$pwd) { $this->setUser($user,$pwd); $this->setBlog(); $rs = $this->core->blog->getCategories(); $res = array(); $l = $rs->level; $stack = array('',$rs->cat_url); while ($rs->fetch()) { $d = $rs->level - $l; if ($d == 0) { array_pop($stack); $parent = end($stack); } elseif ($d > 0) { $parent = end($stack); } elseif ($d < 0) { $D = abs($d); for ($i=0; $i<=$D; $i++) { array_pop($stack); } $parent = end($stack); } $res[] = array( 'categoryId' => $rs->cat_url, 'parentId' => $parent, 'description' => $rs->cat_title, 'categoryName' => $rs->cat_url, 'htmlUrl' => $this->core->blog->url. $this->core->url->getURLFor('category',$rs->cat_url), 'rssUrl' => $this->core->blog->url. $this->core->url->getURLFor('feed','category/'.$rs->cat_url.'/rss2') ); $stack[] = $rs->cat_url; $l = $rs->level; } return $res; } private function getPostCategories($post_id,$user,$pwd) { $post_id = (integer) $post_id; $post = $this->getPostRS($post_id,$user,$pwd); return array( array( 'categoryName' => $post->cat_url, 'categoryId' => (string) $post->cat_url, 'isPrimary' => true ) ); } private function setPostCategories($post_id,$user,$pwd,$categories) { $post_id = (integer) $post_id; $post = $this->getPostRS($post_id,$user,$pwd); $cat_id = (!empty($categories[0]['categoryId'])) ? $categories[0]['categoryId'] : null; foreach($categories as $v) { if (isset($v['isPrimary']) && $v['isPrimary']) { $cat_id = $v['categoryId']; break; } } # w.bloggar sends -1 for no category. if ($cat_id == -1) { $cat_id = null; } if ($cat_id) { $cat_id = $this->getCatID($cat_id); } $this->core->blog->updPostCategory($post_id,(integer) $cat_id); return true; } private function publishPost($post_id,$user,$pwd) { $post_id = (integer) $post_id; $this->getPostRS($post_id,$user,$pwd); # --BEHAVIOR-- xmlrpcBeforePublishPost $this->core->callBehavior('xmlrpcBeforePublishPost',$this,$post_id); $this->core->blog->updPostStatus($post_id,1); # --BEHAVIOR-- xmlrpcAfterPublishPost $this->core->callBehavior('xmlrpcAfterPublishPost',$this,$post_id); return true; } private function newMediaObject($blog_id,$user,$pwd,$file) { if (empty($file['name'])) { throw new Exception('No file name'); } if (empty($file['bits'])) { throw new Exception('No file content'); } $file_name = $file['name']; $file_bits = base64_decode($file['bits']); $this->setUser($user,$pwd); $this->setBlog(); $media = new dcMedia($this->core); $dir_name = path::clean(dirname($file_name)); $file_name = basename($file_name); $dir_name = preg_replace('!^/!','',$dir_name); if ($dir_name != '') { $dir = explode('/',$dir_name); $cwd = './'; foreach ($dir as $v) { $v = files::tidyFileName($v); $cwd .= $v.'/'; $media->makeDir($v); $media->chdir($cwd); } } $media_id = $media->uploadBits($file_name,$file_bits); $f = $media->getFile($media_id); return array( 'file' => $file_name, 'url' => $f->file_url, 'type' => files::getMimeType($file_name) ); } private function translateWpStatus($s) { $status = array( 'draft' => -2, 'pending' => -2, 'private' => 0, 'publish' => 1, 'scheduled' => -1 ); if (is_int($s)) { $status = array_flip($status); return isset($status[$s]) ? $status[$s] : $status[-2]; } else { return isset($status[$s]) ? $status[$s] : $status['pending']; } } private function translateWpCommentstatus($s) { $status = array( 'hold' => -1, 'approve' => 0, 'spam' => -2 ); if (is_int($s)) { $status = array_flip($status); return isset($status[$s]) ? $status[$s] : $status[0]; } else { return isset($status[$s]) ? $status[$s] : $status['approve']; } } private function translateWpOptions($options=array()) { $timezone = 0; if ($this->core->blog->settings->system->blog_timezone) { $timezone = dt::getTimeOffset($this->core->blog->settings->system->blog_timezone)/3600; } $res = array ( 'software_name' => array ( 'desc' => 'Software Name', 'readonly' => true, 'value' => 'Dotclear' ), 'software_version' => array ( 'desc' => 'Software Version', 'readonly' => true, 'value' => DC_VERSION ), 'blog_url' => array ( 'desc' => 'Blog URL', 'readonly' => true, 'value' => $this->core->blog->url ), 'time_zone' => array ( 'desc' => 'Time Zone', 'readonly' => true, 'value' => (string) $timezone ), 'blog_title' => array ( 'desc' => 'Blog Title', 'readonly' => false, 'value' => $this->core->blog->name ), 'blog_tagline' => array ( 'desc' => 'Blog Tagline', 'readonly' => false, 'value' => $this->core->blog->desc ), 'date_format' => array ( 'desc' => 'Date Format', 'readonly' => false, 'value' => $this->core->blog->settings->system->date_format ), 'time_format' => array ( 'desc' => 'Time Format', 'readonly' => false, 'value' => $this->core->blog->settings->system->time_format ) ); if (!empty($options)) { $r = array(); foreach ($options as $v) { if (isset($res[$v])) { $r[$v] = $res[$v]; } } return $r; } return $res; } private function getPostStatusList($blog_id,$user,$pwd) { $this->setUser($user,$pwd); $this->setBlog(); return array( 'draft' => 'Draft', 'pending' => 'Pending Review', 'private' => 'Private', 'publish' => 'Published', 'scheduled' => 'Scheduled' ); } private function getPageStatusList($blog_id,$user,$pwd) { $this->setUser($user,$pwd); $this->setBlog(); $this->checkPagesPermission(); return array( 'draft' => 'Draft', 'private' => 'Private', 'published' => 'Published', 'scheduled' => 'Scheduled' ); } private function checkPagesPermission() { if (!$this->core->plugins->moduleExists('pages')) { throw new Exception('Pages management is not available on this blog.'); } if (!$this->core->auth->check('pages,contentadmin',$this->core->blog->id)) { throw new Exception('Not enough permissions to edit pages.',401); } } private function getPages($blog_id,$user,$pwd,$limit=null,$id=null) { $this->setUser($user,$pwd); $this->setBlog(); $this->checkPagesPermission(); $params = array( 'post_type' => 'page', 'order' => 'post_position ASC, post_title ASC' ); if ($id) { $params['post_id'] = (integer) $id; } if ($limit) { $params['limit'] = $limit; } $posts = $this->core->blog->getPosts($params); $res = array(); while ($posts->fetch()) { $tres = array( "dateCreated" => new xmlrpcDate($posts->getTS()), "userid" => $posts->user_id, "page_id" => $posts->post_id, "page_status" => $this->translateWpStatus((integer) $posts->post_status), "description" => $posts->post_content_xhtml, "title" => $posts->post_title, "link" => $posts->getURL(), "permaLink" => $posts->getURL(), "categories" => array(), "excerpt" => $posts->post_excerpt_xhtml, "text_more" => '', "mt_allow_comments" => (integer) $posts->post_open_comment, "mt_allow_pings" => (integer) $posts->post_open_tb, "wp_slug" => $posts->post_url, "wp_password" => $posts->post_password, "wp_author" => $posts->getAuthorCN(), "wp_page_parent_id" => 0, "wp_page_parent_title" => '', "wp_page_order" => $posts->post_position, "wp_author_id" => $posts->user_id, "wp_author_display_name" => $posts->getAuthorCN(), "date_created_gmt" => new xmlrpcDate(dt::iso8601($posts->getTS(),$posts->post_tz)), "custom_fields" => array(), "wp_page_template" => 'default' ); # --BEHAVIOR-- xmlrpcGetPageInfo $this->core->callBehavior('xmlrpcGetPageInfo',$this,array(&$tres)); $res[] = $tres; } return $res; } private function newPage($blog_id,$user,$pwd,$struct,$publish) { $this->setUser($user,$pwd); $this->setBlog(); $this->checkPagesPermission(); $struct['post_type'] = 'page'; return $this->newPost($blog_id,$user,$pwd,null,$struct,$publish); } private function editPage($page_id,$user,$pwd,$struct,$publish) { $this->setUser($user,$pwd); $this->setBlog(); $this->checkPagesPermission(); $struct['post_type'] = 'page'; return $this->editPost($page_id,$user,$pwd,null,$struct,$publish); } private function deletePage($page_id,$user,$pwd) { $this->setUser($user,$pwd); $this->setBlog(); $this->checkPagesPermission(); $page_id = (integer) $page_id; $this->getPostRS($page_id,$user,$pwd,'page'); $this->core->blog->delPost($page_id); return true; } private function getAuthors($user,$pwd) { $this->setUser($user,$pwd); $this->setBlog(); $rs = $this->core->getBlogPermissions($this->core->blog->id); $res = array(); foreach($rs as $k => $v) { $res[] = array( 'user_id' => $k, 'user_login' => $k, 'display_name' => dcUtils::getUserCN($k,$v['name'],$v['firstname'],$v['displayname']) ); } return $res; } private function getTags($user,$pwd) { $this->setUser($user,$pwd); $this->setBlog(); $tags = $this->core->meta->getMeta('tag'); $tags->sort('meta_id_lower','asc'); $res = array(); $url = $this->core->blog->url. $this->core->url->getURLFor('tag','%s'); $f_url = $this->core->blog->url. $this->core->url->getURLFor('tag_feed','%s'); while ($tags->fetch()) { $res[] = array( 'tag_id' => $tags->meta_id, 'name' => $tags->meta_id, 'count' => $tags->count, 'slug' => $tags->meta_id, 'html_url' => sprintf($url,$tags->meta_id), 'rss_url' => sprintf($f_url,$tags->meta_id) ); } return $res; } private function newCategory($user,$pwd,$struct) { $this->setUser($user,$pwd); $this->setBlog(); if (empty($struct['name'])) { throw new Exception('You mus give a category name.'); } $cur = $this->core->con->openCursor($this->core->prefix.'category'); $cur->cat_title = $struct['name']; if (!empty($struct['slug'])) { $cur->cat_url = $struct['slug']; } if (!empty($struct['category_description'])) { $cur->cat_desc = $struct['category_description']; if (html::clean($cur->cat_desc) == $cur->cat_desc) { $cur->cat_desc = '

    '.$cur->cat_desc.'

    '; } } $parent = !empty($struct['category_parent']) ? (integer) $struct['category_parent'] : 0; $id = $this->core->blog->addCategory($cur,$parent); $rs = $this->core->blog->getCategory($id); return $rs->cat_url; } private function deleteCategory($user,$pwd,$cat_id) { $this->setUser($user,$pwd); $this->setBlog(); $c = $this->core->blog->getCategories(array('cat_url' => $cat_id)); if ($c->isEmpty()) { throw new Exception(__('This category does not exist.')); } $cat_id = $c->cat_id; unset($c); $this->core->blog->delCategory((integer) $cat_id); return true; } private function searchCategories($user,$pwd,$category,$limit) { $this->setUser($user,$pwd); $this->setBlog(); $strReq = 'SELECT cat_id, cat_title, cat_url '. 'FROM '.$this->core->prefix.'category '. "WHERE blog_id = '".$this->core->con->escape($this->core->blog->id)."' ". "AND LOWER(cat_title) LIKE LOWER('%".$this->core->con->escape($category)."%') ". ($limit > 0 ? $this->core->con->limit($limit) : ''); $rs = $this->core->con->select($strReq); $res = array(); while ($rs->fetch()) { $res[] = array( 'category_id' => $rs->cat_url, 'category_name' => $rs->cat_url ); } return $res; } private function countComments($user,$pwd,$post_id) { $this->setUser($user,$pwd); $this->setBlog(); $res = array( 'approved' => 0, 'awaiting_moderation' => 0, 'spam' => 0, 'total' => 0 ); $rs = $this->core->blog->getComments(array('post_id' => $post_id)); while ($rs->fetch()) { $res['total']++; if ($rs->comment_status == 1) { $res['approved']++; } elseif ($rs->comment_status == -2) { $res['spam']++; } else { $res['awaiting_moderation']++; } } return $res; } private function getComments($user,$pwd,$struct,$id=null) { $this->setUser($user,$pwd); $this->setBlog(); $params = array(); if (!empty($struct['status'])) { $params['comment_status'] = $this->translateWpCommentstatus($struct['status']); } if (!empty($struct['post_id'])) { $params['post_id'] = (integer) $struct['post_id']; } if (isset($id)) { $params['comment_id'] = $id; } $offset = !empty($struct['offset']) ? (integer) $struct['offset'] : 0; $limit = !empty($struct['number']) ? (integer) $struct['number'] : 10; $params['limit'] = array($offset,$limit); $rs = $this->core->blog->getComments($params); $res = array(); while ($rs->fetch()) { $res[] = array( 'date_created_gmt' => new xmlrpcDate($rs->getTS()), 'user_id' => $rs->user_id, 'comment_id' => $rs->comment_id, 'parent' => 0, 'status' => $this->translateWpCommentstatus((integer) $rs->comment_status), 'content' => $rs->comment_content, 'link' => $rs->getPostURL().'#c'.$rs->comment_id, 'post_id' => $rs->post_id, 'post_title' => $rs->post_title, 'author' => $rs->comment_author, 'author_url' => $rs->comment_site, 'author_email' => $rs->comment_email, 'author_ip' => $rs->comment_ip ); } return $res; } private function addComment($user,$pwd,$post_id,$struct) { $this->setUser($user,$pwd); $this->setBlog(); if (empty($struct['content'])) { throw new Exception('Sorry, you cannot post an empty comment',401); } if (is_numeric($post_id)) { $p['post_id'] = $post_id; } else { $p['post_url'] = $post_id; } $rs = $this->core->blog->getPosts($p); if ($rs->isEmpty()) { throw new Exception('Sorry, no such post.',404); } $cur = $this->core->con->openCursor($this->core->prefix.'comment'); $cur->comment_author = $this->core->auth->getInfo('user_cn'); $cur->comment_email = $this->core->auth->getInfo('user_email'); $cur->comment_site = $this->core->auth->getInfo('user_url'); $cur->comment_content = $struct['content']; $cur->post_id = (integer) $post_id; $id = $this->core->blog->addComment($cur); return $id; } private function updComment($user,$pwd,$comment_id,$struct) { $this->setUser($user,$pwd); $this->setBlog(); $cur = $this->core->con->openCursor($this->core->prefix.'comment'); if (isset($struct['status'])) { $cur->comment_status = $this->translateWpCommentstatus($struct['status']); } if (isset($struct['date_created_gmt'])) { if ($struct['date_created_gmt'] instanceof xmlrpcDate) { $cur->comment_dt = date('Y-m-d H:i:00',$struct['date_created_gmt']->getTimestamp()); } elseif (is_string($struct['date_created_gmt']) && @strtotime($struct['date_created_gmt'])) { $cur->comment_dt = date('Y-m-d H:i:00',strtotime($struct['date_created_gmt'])); } $cur->comment_dt = $struct['date_created_gmt']; } if (isset($struct['content'])) { $cur->comment_content = $struct['content']; } if (isset($struct['author'])) { $cur->comment_author = $struct['author']; } if (isset($struct['author_url'])) { $cur->comment_site = $struct['author_url']; } if (isset($struct['author_email'])) { $cur->comment_email = $struct['author_email']; } $this->core->blog->updComment($comment_id,$cur); return true; } private function delComment($user,$pwd,$comment_id) { $this->setUser($user,$pwd); $this->setBlog(); $this->core->blog->delComment($comment_id); return true; } /* Blogger methods --------------------------------------------------- */ public function blogger_newPost($appkey,$blogid,$username,$password,$content,$publish) { return $this->newPost($blogid,$username,$password,$content,array(),$publish); } public function blogger_editPost($appkey,$postid,$username,$password,$content,$publish) { return $this->editPost($postid,$username,$password,$content,array(),$publish); } public function blogger_getPost($appkey,$postid,$username,$password) { return $this->getPost($postid,$username,$password,'blogger'); } public function blogger_deletePost($appkey,$postid,$username,$password,$publish) { return $this->deletePost($postid,$username,$password); } public function blogger_getRecentPosts($appkey,$blogid,$username,$password,$numberOfPosts) { return $this->getRecentPosts($blogid,$username,$password,$numberOfPosts,'blogger'); } public function blogger_getUserBlogs($appkey,$username,$password) { return $this->getUserBlogs($username,$password); } public function blogger_getUserInfo($appkey,$username,$password) { return $this->getUserInfo($username,$password); } /* Metaweblog methods ------------------------------------------------------- */ public function mw_newPost($blogid,$username,$password,$content,$publish) { return $this->newPost($blogid,$username,$password,'',$content,$publish); } public function mw_editPost($postid,$username,$password,$content,$publish) { return $this->editPost($postid,$username,$password,'',$content,$publish); } public function mw_getPost($postid,$username,$password) { return $this->getPost($postid,$username,$password,'mw'); } public function mw_getRecentPosts($blogid,$username,$password,$numberOfPosts) { return $this->getRecentPosts($blogid,$username,$password,$numberOfPosts,'mw'); } public function mw_getCategories($blogid,$username,$password) { return $this->getCategories($blogid,$username,$password); } public function mw_newMediaObject($blogid,$username,$password,$file) { return $this->newMediaObject($blogid,$username,$password,$file); } /* MovableType methods --------------------------------------------------- */ public function mt_getRecentPostTitles($blogid,$username,$password,$numberOfPosts) { return $this->getRecentPosts($blogid,$username,$password,$numberOfPosts,'mt'); } public function mt_getCategoryList($blogid,$username,$password) { return $this->getCategories($blogid,$username,$password); } public function mt_getPostCategories($postid,$username,$password) { return $this->getPostCategories($postid,$username,$password); } public function mt_setPostCategories($postid,$username,$password,$categories) { return $this->setPostCategories($postid,$username,$password,$categories); } public function mt_publishPost($postid,$username,$password) { return $this->publishPost($postid,$username,$password); } public function mt_supportedTextFilters() { return array(); } /* WordPress methods --------------------------------------------------- */ public function wp_getUsersBlogs($username,$password) { return $this->getUserBlogs($username,$password); } public function wp_getPage($blogid,$pageid,$username,$password) { $res = $this->getPages($blogid,$username,$password,null,$pageid); if (empty($res)) { throw new Exception('Sorry, no such page',404); } return $res[0]; } public function wp_getPages($blogid,$username,$password,$num=10) { return $this->getPages($blogid,$username,$password,$num); } public function wp_newPage($blogid,$username,$password,$content,$publish) { return $this->newPage($blogid,$username,$password,$content,$publish); } public function wp_deletePage($blogid,$username,$password,$pageid) { return $this->deletePage($pageid,$username,$password); } public function wp_editPage($blogid,$pageid,$username,$password,$content,$publish) { return $this->editPage($pageid,$username,$password,$content,$publish); } public function wp_getPageList($blogid,$username,$password) { $A = $this->getPages($blogid,$username,$password); $res = array(); foreach ($A as $v) { $res[] = array( 'page_id' => $v['page_id'], 'page_title' => $v['title'], 'page_parent_id' => $v['wp_page_parent_id'], 'dateCreated' => $v['dateCreated'], 'date_created_gmt' => $v['date_created_gmt'] ); } return $res; } public function wp_getAuthors($blogid,$username,$password) { return $this->getAuthors($username,$password); } public function wp_getCategories($blogid,$username,$password) { return $this->getCategories($blogid,$username,$password); } public function wp_getTags($blogid,$username,$password) { return $this->getTags($username,$password); } public function wp_newCategory($blogid,$username,$password,$content) { return $this->newCategory($username,$password,$content); } public function wp_deleteCategory($blogid,$username,$password,$categoryid) { return $this->deleteCategory($username,$password,$categoryid); } public function wp_suggestCategories($blogid,$username,$password,$category,$max_results=0) { return $this->searchCategories($username,$password,$category,$max_results); } public function wp_uploadFile($blogid,$username,$password,$file) { return $this->newMediaObject($blogid,$username,$password,$file); } public function wp_getPostStatusList($blogid,$username,$password) { return $this->getPostStatusList($blogid,$username,$password); } public function wp_getPageStatusList($blogid,$username,$password) { return $this->getPostStatusList($blogid,$username,$password); } public function wp_getPageTemplates($blogid,$username,$password) { return array('Default' => 'default'); } public function wp_getOptions($blogid,$username,$password,$options=array()) { $this->setUser($username,$password); $this->setBlog(); return $this->translateWpOptions($options); } public function wp_setOptions($blogid,$username,$password,$options) { $this->setUser($username,$password); $this->setBlog(); if (!$this->core->auth->check('admin',$this->core->blog->id)) { throw new Exception('Not enough permissions to edit options.',401); } $opt = $this->translateWpOptions(); $done = array(); $blog_changes = false; $cur = $this->core->con->openCursor($this->core->prefix.'blog'); $this->core->blog->settings->addNamespace('system'); foreach ($options as $name => $value) { if (!isset($opt[$name]) || $opt[$name]['readonly']) { continue; } switch ($name) { case 'blog_title': $blog_changes = true; $cur->blog_name = $value; $done[] = $name; break; case 'blog_tagline': $blog_changes = true; $cur->blog_desc = $value; $done[] = $name; break; case 'date_format': $this->core->blog->settings->system->put('date_format',$value); $done[] = $name; break; case 'time_format': $this->core->blog->settings->system->put('time_format',$value); $done[] = $name; break; } } if ($blog_changes) { $this->core->updBlog($this->core->blog->id,$cur); $this->core->setBlog($this->core->blog->id); } return $this->translateWpOptions($done); } public function wp_getComment($blogid,$username,$password,$commentid) { $res = $this->getComments($username,$password,array(),$commentid); if (empty($res)) { throw new Exception('Sorry, no such comment',404); } return $res[0]; } public function wp_getCommentCount($blogid,$username,$password,$postid) { return $this->countComments($username,$password,$postid); } public function wp_getComments($blogid,$username,$password,$struct) { return $this->getComments($username,$password,$struct); } public function wp_deleteComment($blogid,$username,$password,$commentid) { return $this->delComment($username,$password,$commentid); } public function wp_editComment($blogid,$username,$password,$commentid,$content) { return $this->updComment($username,$password,$commentid,$content); } public function wp_newComment($blogid,$username,$password,$postid,$content) { return $this->addComment($username,$password,$postid,$content); } public function wp_getCommentStatusList($blogid,$username,$password) { $this->setUser($username,$password); $this->setBlog(); return array( 'hold' => 'Unapproved', 'approve' => 'Approved', 'spam' => 'Spam' ); } /* Pingback support --------------------------------------------------- */ public function pingback_ping($from_url, $to_url) { # Come on, buddy! Don't make me waste time with this kind of silliness... if (!(filter_var($from_url, FILTER_VALIDATE_URL) && preg_match('!^https?://!',$from_url))) { throw new Exception(__('No valid source URL provided? Try again!'), 0); } if (!(filter_var($to_url, FILTER_VALIDATE_URL) && preg_match('!^https?://!',$to_url))) { throw new Exception(__('No valid target URL provided? Try again!'), 0); } if (html::sanitizeURL(urldecode($from_url)) == html::sanitizeURL(urldecode($to_url))) { throw new Exception(__('LOL!'), 0); } # Time to get things done... $this->setBlog(true); $tb = new dcTrackback($this->core); return $tb->receive_pb($from_url, $to_url); } } dotclear-2.6.2+dfsg/inc/core_error.php000066400000000000000000000030551230033266200176600ustar00rootroot00000000000000 Dotclear - Error

    Dotclear

    dotclear-2.6.2+dfsg/inc/dbschema/000077500000000000000000000000001230033266200165515ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/dbschema/db-schema.php000066400000000000000000000243571230033266200211200ustar00rootroot00000000000000blog ->blog_id ('varchar', 32, false) ->blog_uid ('varchar', 32, false) ->blog_creadt ('timestamp', 0, false, 'now()') ->blog_upddt ('timestamp', 0, false, 'now()') ->blog_url ('varchar', 255, false) ->blog_name ('varchar', 255, false) ->blog_desc ('text', 0, true) ->blog_status ('smallint', 0, false, 1) ->primary('pk_blog','blog_id') ; $_s->category ->cat_id ('bigint', 0, false) ->blog_id ('varchar', 32, false) ->cat_title ('varchar', 255, false) ->cat_url ('varchar', 255, false) ->cat_desc ('text', 0, true) ->cat_position ('integer', 0, true, 0) ->cat_lft ('integer', 0, true) ->cat_rgt ('integer', 0, true) ->primary('pk_category','cat_id') ->unique('uk_cat_url','cat_url','blog_id') ; $_s->session ->ses_id ('varchar', 40, false) ->ses_time ('integer', 0, false, 0) ->ses_start ('integer', 0, false, 0) ->ses_value ('text', 0, false) ->primary('pk_session','ses_id') ; $_s->setting ->setting_id ('varchar', 255, false) ->blog_id ('varchar', 32, true) ->setting_ns ('varchar', 32, false, "'system'") ->setting_value ('text', 0, true, null) ->setting_type ('varchar', 8, false, "'string'") ->setting_label ('text', 0, true) ->unique('uk_setting','setting_ns','setting_id','blog_id') ; $_s->user ->user_id ('varchar', 32, false) ->user_super ('smallint', 0, true) ->user_status ('smallint', 0, false, 1) ->user_pwd ('varchar', 40, false) ->user_change_pwd ('smallint', 0, false, 0) ->user_recover_key ('varchar', 32, true, null) ->user_name ('varchar', 255, true, null) ->user_firstname ('varchar', 255, true, null) ->user_displayname ('varchar', 255, true, null) ->user_email ('varchar', 255, true, null) ->user_url ('varchar', 255, true, null) ->user_desc ('text', 0, true) ->user_default_blog ('varchar', 32, true, null) ->user_options ('text', 0, true) ->user_lang ('varchar', 5, true, null) ->user_tz ('varchar', 128, false, "'UTC'") ->user_post_status ('smallint', 0, false, -2) ->user_creadt ('timestamp', 0, false, 'now()') ->user_upddt ('timestamp', 0, false, 'now()') ->primary('pk_user','user_id') ; $_s->permissions ->user_id ('varchar', 32, false) ->blog_id ('varchar', 32, false) ->permissions ('text', 0, true) ->primary('pk_permissions','user_id','blog_id') ; $_s->post ->post_id ('bigint', 0, false) ->blog_id ('varchar', 32, false) ->user_id ('varchar', 32, false) ->cat_id ('bigint', 0, true) ->post_dt ('timestamp', 0, false, 'now()') ->post_tz ('varchar', 128, false, "'UTC'") ->post_creadt ('timestamp', 0, false, 'now()') ->post_upddt ('timestamp', 0, false, 'now()') ->post_password ('varchar', 32, true, null) ->post_type ('varchar', 32, false, "'post'") ->post_format ('varchar', 32, false, "'xhtml'") ->post_url ('varchar', 255, false) ->post_lang ('varchar', 5, true, null) ->post_title ('varchar', 255, true, null) ->post_excerpt ('text', 0, true, null) ->post_excerpt_xhtml ('text', 0, true, null) ->post_content ('text', 0, true, null) ->post_content_xhtml ('text', 0, false) ->post_notes ('text', 0, true, null) ->post_meta ('text', 0, true, null) ->post_words ('text', 0, true, null) ->post_status ('smallint', 0, false, 0) ->post_selected ('smallint', 0, false, 0) ->post_position ('integer', 0, false, 0) ->post_open_comment ('smallint', 0, false, 0) ->post_open_tb ('smallint', 0, false, 0) ->nb_comment ('integer', 0, false, 0) ->nb_trackback ('integer', 0, false, 0) ->primary('pk_post','post_id') ->unique('uk_post_url','post_url','post_type','blog_id') ; $_s->media ->media_id ('bigint', 0, false) ->user_id ('varchar', 32, false) ->media_path ('varchar', 255, false) ->media_title ('varchar', 255, false) ->media_file ('varchar', 255, false) ->media_dir ('varchar', 255, false, "'.'") ->media_meta ('text', 0, true, null) ->media_dt ('timestamp', 0, false, 'now()') ->media_creadt ('timestamp', 0, false, 'now()') ->media_upddt ('timestamp', 0, false, 'now()') ->media_private ('smallint', 0, false, 0) ->primary('pk_media','media_id') ; $_s->post_media ->media_id ('bigint', 0, false) ->post_id ('bigint', 0, false) ->link_type ('varchar', 32, false, "'attachment'") ->primary('pk_post_media','media_id','post_id','link_type') ; $_s->log ->log_id ('bigint', 0, false) ->user_id ('varchar', 32, true) ->blog_id ('varchar', 32, true) ->log_table ('varchar', 255, false) ->log_dt ('timestamp', 0, false, 'now()') ->log_ip ('varchar', 39, false) ->log_msg ('text', 0, true, null) ->primary('pk_log','log_id') ; $_s->version ->module ('varchar', 64, false) ->version ('varchar', 32, false) ->primary('pk_version','module') ; $_s->ping ->post_id ('bigint', 0, false) ->ping_url ('varchar', 255, false) ->ping_dt ('timestamp', 0, false, 'now()') ->primary('pk_ping','post_id','ping_url') ; $_s->comment ->comment_id ('bigint', 0, false) ->post_id ('bigint', 0, false) ->comment_dt ('timestamp', 0, false, 'now()') ->comment_tz ('varchar', 128, false, "'UTC'") ->comment_upddt ('timestamp', 0, false, 'now()') ->comment_author ('varchar', 255, true, null) ->comment_email ('varchar', 255, true, null) ->comment_site ('varchar', 255, true, null) ->comment_content ('text', 0, true) ->comment_words ('text', 0, true, null) ->comment_ip ('varchar', 39, true, null) ->comment_status ('smallint', 0, true, 0) ->comment_spam_status ('varchar', 128, true, 0) ->comment_spam_filter ('varchar', 32, true, null) ->comment_trackback ('smallint', 0, false, 0) ->primary('pk_comment','comment_id') ; $_s->meta ->meta_id ('varchar', 255, false) ->meta_type ('varchar', 64, false) ->post_id ('bigint', 0, false) ->primary('pk_meta','meta_id','meta_type','post_id') ; $_s->pref ->pref_id ('varchar', 255, false) ->user_id ('varchar', 32, true) ->pref_ws ('varchar', 32, false, "'system'") ->pref_value ('text', 0, true, null) ->pref_type ('varchar', 8, false, "'string'") ->pref_label ('text', 0, true) ->unique('uk_pref','pref_ws','pref_id','user_id') ; /* References indexes -------------------------------------------------------- */ $_s->category->index ('idx_category_blog_id', 'btree', 'blog_id'); $_s->category->index ('idx_category_cat_lft_blog_id', 'btree', 'blog_id', 'cat_lft'); $_s->category->index ('idx_category_cat_rgt_blog_id', 'btree', 'blog_id', 'cat_rgt'); $_s->setting->index ('idx_setting_blog_id', 'btree', 'blog_id'); $_s->user->index ('idx_user_user_default_blog', 'btree', 'user_default_blog'); $_s->permissions->index ('idx_permissions_blog_id', 'btree', 'blog_id'); $_s->post->index ('idx_post_cat_id', 'btree', 'cat_id'); $_s->post->index ('idx_post_user_id', 'btree', 'user_id'); $_s->post->index ('idx_post_blog_id', 'btree', 'blog_id'); $_s->media->index ('idx_media_user_id', 'btree', 'user_id'); $_s->post_media->index ('idx_post_media_post_id', 'btree', 'post_id'); $_s->post_media->index ('idx_post_media_media_id', 'btree', 'media_id'); $_s->log->index ('idx_log_user_id', 'btree', 'user_id'); $_s->comment->index ('idx_comment_post_id', 'btree', 'post_id'); $_s->meta->index ('idx_meta_post_id', 'btree','post_id'); $_s->meta->index ('idx_meta_meta_type', 'btree','meta_type'); $_s->pref->index ('idx_pref_user_id', 'btree', 'user_id'); /* Performance indexes -------------------------------------------------------- */ $_s->comment->index ('idx_comment_post_id_dt_status', 'btree', 'post_id', 'comment_dt', 'comment_status'); $_s->post->index ('idx_post_post_dt', 'btree', 'post_dt'); $_s->post->index ('idx_post_post_dt_post_id', 'btree', 'post_dt','post_id'); $_s->post->index ('idx_blog_post_post_dt_post_id', 'btree', 'blog_id','post_dt','post_id'); $_s->post->index ('idx_blog_post_post_status', 'btree', 'blog_id','post_status'); $_s->blog->index ('idx_blog_blog_upddt', 'btree', 'blog_upddt'); $_s->user->index ('idx_user_user_super', 'btree', 'user_super'); /* Foreign keys -------------------------------------------------------- */ $_s->category->reference('fk_category_blog','blog_id','blog','blog_id','cascade','cascade'); $_s->setting->reference('fk_setting_blog','blog_id','blog','blog_id','cascade','cascade'); $_s->user->reference('fk_user_default_blog','user_default_blog','blog','blog_id','cascade','set null'); $_s->permissions->reference('fk_permissions_blog','blog_id','blog','blog_id','cascade','cascade'); $_s->permissions->reference('fk_permissions_user','user_id','user','user_id','cascade','cascade'); $_s->post->reference('fk_post_category','cat_id','category','cat_id','cascade','set null'); $_s->post->reference('fk_post_user','user_id','user','user_id','cascade','cascade'); $_s->post->reference('fk_post_blog','blog_id','blog','blog_id','cascade','cascade'); $_s->media->reference('fk_media_user','user_id','user','user_id','cascade','cascade'); $_s->post_media->reference('fk_media','media_id','media','media_id','cascade','cascade'); $_s->post_media->reference('fk_media_post','post_id','post','post_id','cascade','cascade'); $_s->ping->reference('fk_ping_post','post_id','post','post_id','cascade','cascade'); $_s->comment->reference('fk_comment_post','post_id','post','post_id','cascade','cascade'); $_s->log->reference('fk_log_blog','blog_id','blog','blog_id','cascade','set null'); $_s->meta->reference('fk_meta_post','post_id','post','post_id','cascade','cascade'); $_s->pref->reference('fk_pref_user','user_id','user','user_id','cascade','cascade'); /* PostgreSQL specific indexes -------------------------------------------------------- */ if ($_s->driver() == 'pgsql') { $_s->setting->index ('idx_setting_blog_id_null', 'btree', '(blog_id IS NULL)'); $_s->media->index ('idx_media_media_path', 'btree', 'media_path', 'media_dir'); $_s->pref->index ('idx_pref_user_id_null', 'btree', '(user_id IS NULL)'); } dotclear-2.6.2+dfsg/inc/dbschema/upgrade-cli.php000066400000000000000000000023161230033266200214600ustar00rootroot00000000000000#!/usr/bin/env php con->begin(); try { $changes = dotclearUpgrade($core); } catch (Exception $e) { $core->con->rollback(); throw $e; } $core->con->commit(); echo 'Upgrade process successfully completed ('.$changes."). \n"; exit(0); } catch (Exception $e) { echo $e->getMessage()."\n"; exit(1); } ?> dotclear-2.6.2+dfsg/inc/dbschema/upgrade.php000066400000000000000000000350531230033266200207170ustar00rootroot00000000000000getVersion('core'); if ($version === null) { return false; } if (version_compare($version,DC_VERSION,'<') == 1 || strpos(DC_VERSION,'dev')) { try { if ($core->con->driver() == 'sqlite') { throw new Exception(__('SQLite Database Schema cannot be upgraded.')); } # Database upgrade $_s = new dbStruct($core->con,$core->prefix); require dirname(__FILE__).'/db-schema.php'; $si = new dbStruct($core->con,$core->prefix); $changes = $si->synchronize($_s); /* Some other upgrades ------------------------------------ */ # Populate media_dir field (since 2.0-beta3.3) if (version_compare($version,'2.0-beta3.3','<')) { $strReq = 'SELECT media_id, media_file FROM '.$core->prefix.'media '; $rs_m = $core->con->select($strReq); while($rs_m->fetch()) { $cur = $core->con->openCursor($core->prefix.'media'); $cur->media_dir = dirname($rs_m->media_file); $cur->update('WHERE media_id = '.(integer) $rs_m->media_id); } } if (version_compare($version,'2.0-beta7.3','<')) { # Blowup becomes default theme $strReq = 'UPDATE '.$core->prefix.'setting '. "SET setting_value = '%s' ". "WHERE setting_id = 'theme' ". "AND setting_value = '%s' ". 'AND blog_id IS NOT NULL '; $core->con->execute(sprintf($strReq,'blueSilence','default')); $core->con->execute(sprintf($strReq,'default','blowup')); } if (version_compare($version,'2.1-alpha2-r2383','<')) { $schema = dbSchema::init($core->con); $schema->dropUnique($core->prefix.'category',$core->prefix.'uk_cat_title'); # Reindex categories $rs = $core->con->select( 'SELECT cat_id, cat_title, blog_id '. 'FROM '.$core->prefix.'category '. 'ORDER BY blog_id ASC , cat_position ASC ' ); $cat_blog = $rs->blog_id; $i = 2; while ($rs->fetch()) { if ($cat_blog != $rs->blog_id) { $i = 2; } $core->con->execute( 'UPDATE '.$core->prefix.'category SET ' .'cat_lft = '.($i++).', cat_rgt = '.($i++).' '. 'WHERE cat_id = '.(integer) $rs->cat_id ); $cat_blog = $rs->blog_id; } } if (version_compare($version,'2.1.6','<=')) { # ie7js has been upgraded $ie7files = array ( 'ie7-base64.php ', 'ie7-content.htc', 'ie7-core.js', 'ie7-css2-selectors.js', 'ie7-css3-selectors.js', 'ie7-css-strict.js', 'ie7-dhtml.js', 'ie7-dynamic-attributes.js', 'ie7-fixed.js', 'ie7-graphics.js', 'ie7-html4.js', 'ie7-ie5.js', 'ie7-layout.js', 'ie7-load.htc', 'ie7-object.htc', 'ie7-overflow.js', 'ie7-quirks.js', 'ie7-server.css', 'ie7-standard-p.js', 'ie7-xml-extras.js' ); foreach ($ie7files as $f) { @unlink(DC_ROOT.'/admin/js/ie7/'.$f); } } if (version_compare($version,'2.2-alpha1-r3043','<')) { # metadata has been integrated to the core. $core->plugins->loadModules(DC_PLUGINS_ROOT); if ($core->plugins->moduleExists('metadata')) { $core->plugins->deleteModule('metadata'); } # Tags template class has been renamed $sqlstr = 'SELECT blog_id, setting_id, setting_value '. 'FROM '.$core->prefix.'setting '. 'WHERE (setting_id = \'widgets_nav\' OR setting_id = \'widgets_extra\') '. 'AND setting_ns = \'widgets\';'; $rs = $core->con->select($sqlstr); while ($rs->fetch()) { $widgetsettings = base64_decode($rs->setting_value); $widgetsettings = str_replace ('s:11:"tplMetadata"','s:7:"tplTags"',$widgetsettings); $cur = $core->con->openCursor($core->prefix.'setting'); $cur->setting_value = base64_encode($widgetsettings); $sqlstr = 'WHERE setting_id = \''.$rs->setting_id.'\' AND setting_ns = \'widgets\' '. 'AND blog_id ' . ($rs->blog_id == NULL ? 'is NULL' : '= \''.$core->con->escape($rs->blog_id).'\''); $cur->update($sqlstr); } } if (version_compare($version,'2.3','<')) { # Add global favorites $init_fav = array(); $init_fav['new_post'] = array('new_post','New entry','post.php', 'images/menu/edit.png','images/menu/edit-b.png', 'usage,contentadmin',null,null); $init_fav['newpage'] = array('newpage','New page','plugin.php?p=pages&act=page', 'index.php?pf=pages/icon-np.png','index.php?pf=pages/icon-np-big.png', 'contentadmin,pages',null,null); $init_fav['media'] = array('media','Media manager','media.php', 'images/menu/media.png','images/menu/media-b.png', 'media,media_admin',null,null); $init_fav['widgets'] = array('widgets','Presentation widgets','plugin.php?p=widgets', 'index.php?pf=widgets/icon.png','index.php?pf=widgets/icon-big.png', 'admin',null,null); $init_fav['blog_theme'] = array('blog_theme','Blog appearance','blog_theme.php', 'images/menu/themes.png','images/menu/blog-theme-b.png', 'admin',null,null); $count = 0; foreach ($init_fav as $k => $f) { $t = array('name' => $f[0],'title' => $f[1],'url' => $f[2], 'small-icon' => $f[3], 'large-icon' => $f[4],'permissions' => $f[5],'id' => $f[6],'class' => $f[7]); $sqlstr = 'INSERT INTO '.$core->prefix.'pref (pref_id, user_id, pref_ws, pref_value, pref_type, pref_label) VALUES ('. '\''.sprintf("g%03s",$count).'\',NULL,\'favorites\',\''.serialize($t).'\',\'string\',NULL);'; $core->con->execute($sqlstr); $count++; } # A bit of housecleaning for no longer needed files $remfiles = array ( 'admin/style/cat-bg.png', 'admin/style/footer-bg.png', 'admin/style/head-logo.png', 'admin/style/tab-bg.png', 'admin/style/tab-c-l.png', 'admin/style/tab-c-r.png', 'admin/style/tab-l-l.png', 'admin/style/tab-l-r.png', 'admin/style/tab-n-l.png', 'admin/style/tab-n-r.png', 'inc/clearbricks/_common.php', 'inc/clearbricks/common/lib.crypt.php', 'inc/clearbricks/common/lib.date.php', 'inc/clearbricks/common/lib.files.php', 'inc/clearbricks/common/lib.form.php', 'inc/clearbricks/common/lib.html.php', 'inc/clearbricks/common/lib.http.php', 'inc/clearbricks/common/lib.l10n.php', 'inc/clearbricks/common/lib.text.php', 'inc/clearbricks/common/tz.dat', 'inc/clearbricks/common/_main.php', 'inc/clearbricks/dblayer/class.cursor.php', 'inc/clearbricks/dblayer/class.mysql.php', 'inc/clearbricks/dblayer/class.pgsql.php', 'inc/clearbricks/dblayer/class.sqlite.php', 'inc/clearbricks/dblayer/dblayer.php', 'inc/clearbricks/dbschema/class.dbschema.php', 'inc/clearbricks/dbschema/class.dbstruct.php', 'inc/clearbricks/dbschema/class.mysql.dbschema.php', 'inc/clearbricks/dbschema/class.pgsql.dbschema.php', 'inc/clearbricks/dbschema/class.sqlite.dbschema.php', 'inc/clearbricks/diff/lib.diff.php', 'inc/clearbricks/diff/lib.unified.diff.php', 'inc/clearbricks/filemanager/class.filemanager.php', 'inc/clearbricks/html.filter/class.html.filter.php', 'inc/clearbricks/html.validator/class.html.validator.php', 'inc/clearbricks/image/class.image.meta.php', 'inc/clearbricks/image/class.image.tools.php', 'inc/clearbricks/mail/class.mail.php', 'inc/clearbricks/mail/class.socket.mail.php', 'inc/clearbricks/net/class.net.socket.php', 'inc/clearbricks/net.http/class.net.http.php', 'inc/clearbricks/net.http.feed/class.feed.parser.php', 'inc/clearbricks/net.http.feed/class.feed.reader.php', 'inc/clearbricks/net.xmlrpc/class.net.xmlrpc.php', 'inc/clearbricks/pager/class.pager.php', 'inc/clearbricks/rest/class.rest.php', 'inc/clearbricks/session.db/class.session.db.php', 'inc/clearbricks/template/class.template.php', 'inc/clearbricks/text.wiki2xhtml/class.wiki2xhtml.php', 'inc/clearbricks/url.handler/class.url.handler.php', 'inc/clearbricks/zip/class.unzip.php', 'inc/clearbricks/zip/class.zip.php', 'themes/default/tpl/.htaccess', 'themes/default/tpl/404.html', 'themes/default/tpl/archive.html', 'themes/default/tpl/archive_month.html', 'themes/default/tpl/category.html', 'themes/default/tpl/home.html', 'themes/default/tpl/post.html', 'themes/default/tpl/search.html', 'themes/default/tpl/tag.html', 'themes/default/tpl/tags.html', 'themes/default/tpl/user_head.html', 'themes/default/tpl/_flv_player.html', 'themes/default/tpl/_footer.html', 'themes/default/tpl/_head.html', 'themes/default/tpl/_mp3_player.html', 'themes/default/tpl/_top.html' ); $remfolders = array ( 'inc/clearbricks/common', 'inc/clearbricks/dblayer', 'inc/clearbricks/dbschema', 'inc/clearbricks/diff', 'inc/clearbricks/filemanager', 'inc/clearbricks/html.filter', 'inc/clearbricks/html.validator', 'inc/clearbricks/image', 'inc/clearbricks/mail', 'inc/clearbricks/net', 'inc/clearbricks/net.http', 'inc/clearbricks/net.http.feed', 'inc/clearbricks/net.xmlrpc', 'inc/clearbricks/pager', 'inc/clearbricks/rest', 'inc/clearbricks/session.db', 'inc/clearbricks/template', 'inc/clearbricks/text.wiki2xhtml', 'inc/clearbricks/url.handler', 'inc/clearbricks/zip', 'inc/clearbricks', 'themes/default/tpl' ); foreach ($remfiles as $f) { @unlink(DC_ROOT.'/'.$f); } foreach ($remfolders as $f) { @rmdir(DC_ROOT.'/'.$f); } } if (version_compare($version,'2.3.1','<')) { # Remove unecessary file @unlink(DC_ROOT.'/'.'inc/libs/clearbricks/.hgignore'); } if (version_compare($version,'2.4.0','<=')) { # setup media_exclusion $strReq = 'UPDATE '.$core->prefix.'setting '. "SET setting_value = '/\\.php\$/i' ". "WHERE setting_id = 'media_exclusion' ". "AND setting_value = '' "; $core->con->execute($strReq); } if (version_compare($version,'2.5','<=')) { # Try to disable daInstaller plugin if it has been installed outside the default plugins directory $path = explode(PATH_SEPARATOR,DC_PLUGINS_ROOT); $default = path::real(dirname(__FILE__).'/../../plugins/'); foreach ($path as $root) { if (!is_dir($root) || !is_readable($root)) { continue; } if (substr($root,-1) != '/') { $root .= '/'; } if (($p = @dir($root)) === false) { continue; } if(path::real($root) == $default) { continue; } if (($d = @dir($root.'daInstaller')) === false) { continue; } $f = $root.'/daInstaller/_disabled'; if (!file_exists($f)) { @file_put_contents($f,''); } } } if (version_compare($version,'2.5.1','<=')) { // Flash enhanced upload no longer needed @unlink(DC_ROOT.'/'.'inc/swf/swfupload.swf'); } if (version_compare($version,'2.6','<=')) { // README has been replaced by README.md and CONTRIBUTING.md @unlink(DC_ROOT.'/'.'README'); // trackbacks are now merged into posts @unlink(DC_ROOT.'/'.'admin/trackbacks.php'); # daInstaller has been integrated to the core. # Try to remove it $path = explode(PATH_SEPARATOR,DC_PLUGINS_ROOT); foreach ($path as $root) { if (!is_dir($root) || !is_readable($root)) { continue; } if (substr($root,-1) != '/') { $root .= '/'; } if (($p = @dir($root)) === false) { continue; } if (($d = @dir($root.'daInstaller')) === false) { continue; } files::deltree($root.'/daInstaller'); } # Some settings change, prepare db queries $strReqFormat = 'INSERT INTO '.$core->prefix.'setting'; $strReqFormat .= ' (setting_id,setting_ns,setting_value,setting_type,setting_label)'; $strReqFormat .= ' VALUES(\'%s\',\'system\',\'%s\',\'string\',\'%s\')'; $strReqSelect = 'SELECT count(1) FROM '.$core->prefix.'setting'; $strReqSelect .= ' WHERE setting_id = \'%s\''; $strReqSelect .= ' AND setting_ns = \'system\''; $strReqSelect .= ' AND blog_id IS NULL'; # Add date and time formats $date_formats = array('%Y-%m-%d','%m/%d/%Y','%d/%m/%Y','%Y/%m/%d','%d.%m.%Y','%b %e %Y','%e %b %Y','%Y %b %e', '%a, %Y-%m-%d','%a, %m/%d/%Y','%a, %d/%m/%Y','%a, %Y/%m/%d','%B %e, %Y','%e %B, %Y','%Y, %B %e','%e. %B %Y', '%A, %B %e, %Y','%A, %e %B, %Y','%A, %Y, %B %e','%A, %Y, %B %e','%A, %e. %B %Y'); $time_formats = array('%H:%M','%I:%M','%l:%M','%Hh%M','%Ih%M','%lh%M'); if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') { $date_formats = array_map(create_function('$f', 'return str_replace(\'%e\',\'%#d\',$f);' ),$date_formats); } $rs = $core->con->select(sprintf($strReqSelect,'date_formats')); if ($rs->f(0)==0) { $strReq = sprintf($strReqFormat,'date_formats',serialize($date_formats),'Date formats examples'); $core->con->execute($strReq); } $rs = $core->con->select(sprintf($strReqSelect,'time_formats')); if ($rs->f(0)==0) { $strReq = sprintf($strReqFormat,'time_formats',serialize($time_formats),'Time formats examples'); $core->con->execute($strReq); } # Add repository URL for themes and plugins as daInstaller move to core $rs = $core->con->select(sprintf($strReqSelect,'store_plugin_url')); if ($rs->f(0)==0) { $strReq = sprintf($strReqFormat,'store_plugin_url','http://update.dotaddict.org/dc2/plugins.xml','Plugins XML feed location'); $core->con->execute($strReq); } $rs = $core->con->select(sprintf($strReqSelect,'store_theme_url')); if ($rs->f(0)==0) { $strReq = sprintf($strReqFormat,'store_theme_url','http://update.dotaddict.org/dc2/themes.xml','Themes XML feed location'); $core->con->execute($strReq); } } $core->setVersion('core',DC_VERSION); $core->blogDefaults(); # Drop content from session table if changes or if needed if ($changes != 0 || $cleanup_sessions) { $core->con->execute('DELETE FROM '.$core->prefix.'session '); } # Empty templates cache directory try { $core->emptyTemplatesCache(); } catch (Exception $e) {} return $changes; } catch (Exception $e) { throw new Exception(__('Something went wrong with auto upgrade:'). ' '.$e->getMessage()); } } # No upgrade? return false; } dotclear-2.6.2+dfsg/inc/digests000066400000000000000000001655641230033266200164110ustar00rootroot00000000000000751419260aa954499f7abaabaa882bbe ./LICENSE b4525abab7651e5fe82146fa17ea8a96 ./plugins/widgets/_public.php 29c1974b1d06d9f32e1d81e4a7ba1cec ./plugins/widgets/style.css 27ed01fed7c7f070e4bc3bf577ab8dfb ./plugins/widgets/_default_widgets.php 206c01a0805b38a54e6fcb1fc928fa2d ./plugins/widgets/icon.png ff8440f95760146770b42d81321b4b3d ./plugins/widgets/locales/fr/help/help.html 6f4bb0ef7754a52857b0cfa4c09e97e7 ./plugins/widgets/locales/fr/resources.php 20287ff3a185d28154cda2ebb2000706 ./plugins/widgets/locales/en/help/help.html 6f4bb0ef7754a52857b0cfa4c09e97e7 ./plugins/widgets/locales/en/resources.php 349d4867a6aee11fe349cfea70915a14 ./plugins/widgets/_install.php 1734c2a1c8d7822f4041943a586241b4 ./plugins/widgets/icon-big.png 86182cb03df33ade07672d45bd24a807 ./plugins/widgets/widgets.js 992e1640df867323d5ccb10ed31b1968 ./plugins/widgets/_define.php 2e6c1d3ef8571e9805ac5ae799302313 ./plugins/widgets/_widgets_functions.php e3538bd82f7ae6133028acae65488153 ./plugins/widgets/_admin.php 146a353c3e100fe977600ac91f65bd12 ./plugins/widgets/index.php b3157df656200971fa48cf51755dfbc5 ./plugins/widgets/class.widgets.php 9c80fbb36e404ae910b96b7a50d3d467 ./plugins/widgets/dragdrop.js 88ab9dd4de903f5f93f584bb09a91eec ./plugins/themeEditor/style.css 46243129f3a0837a58248190ee4e25a2 ./plugins/themeEditor/locales/fr/help/help.html 9720da95f19d966488985315d7201a75 ./plugins/themeEditor/locales/fr/resources.php 9c0c88580248e17dd755429ebe02b082 ./plugins/themeEditor/locales/en/help/help.html 9720da95f19d966488985315d7201a75 ./plugins/themeEditor/locales/en/resources.php 2f395eec26eab4fb17eb7d82ad87ec60 ./plugins/themeEditor/_define.php c483271db1aff3798db1beb136549a40 ./plugins/themeEditor/codemirror.css 57e338e1eee06a71e385b796bf70dd08 ./plugins/themeEditor/_admin.php e56eb792c3988c7f37e9faae9ceb3f9c ./plugins/themeEditor/class.themeEditor.php 5a6500e632a5b8054e82d2fd7bcf76a9 ./plugins/themeEditor/index.php eb655aa6d550e753ff03ca3231872545 ./plugins/themeEditor/codemirror/LICENSE 15f206ec1300d3927b830428fcc42376 ./plugins/themeEditor/codemirror/htmlmixed.js f9f5ed856e309721296e93b8b52a1d85 ./plugins/themeEditor/codemirror/php.js 53680e0e9236d67a98901ef689b6385a ./plugins/themeEditor/codemirror/multiplex.js d70a71331c5c25afec86d3bdbe69fbf5 ./plugins/themeEditor/codemirror/css.js af74db666f780b161d5cbaedc0c9017b ./plugins/themeEditor/codemirror/codemirror.js 8d94cae16285f447c66dc09ff98c6ed9 ./plugins/themeEditor/codemirror/javascript.js 9c6f1fa7c50dac65665e8f81a11fd56f ./plugins/themeEditor/codemirror/codemirror.css 135004e1e2db2a23e4e3b8efad530f9b ./plugins/themeEditor/codemirror/xml.js db6250386ccfe025d0a1e8976bc7576a ./plugins/themeEditor/script.js 1af16473c1092e212489545b041a5699 ./plugins/blogroll/icon-small.png 6be226daaf8756d22cecaa0624d1bddd ./plugins/blogroll/_public.php f080173dd44368a5c826d87bb19d6e65 ./plugins/blogroll/icon.png 0b9a70b3d8ff59e6be5e5f53278738f7 ./plugins/blogroll/_users_actions.js 75d07719247a38c321b5266200255c3f ./plugins/blogroll/locales/fr/help/blogroll.html eb6733a287f16c5e7da13c5e6059ec24 ./plugins/blogroll/locales/fr/resources.php 05a240d5af2cc639ce85a7af9eb282f6 ./plugins/blogroll/locales/en/help/blogroll.html eb6733a287f16c5e7da13c5e6059ec24 ./plugins/blogroll/locales/en/resources.php b102b8bc6f23841b58c6cd1c6eb8b64c ./plugins/blogroll/_install.php 42302ac3d8472409d716db1802622d57 ./plugins/blogroll/class.dc.blogroll.php dd042d025c32aa3157198e356b15d99d ./plugins/blogroll/_widgets.php 28258a09622ac52246a446962f5e6a80 ./plugins/blogroll/_define.php 8ac55872251f0fb1861bc879eb763a4c ./plugins/blogroll/_admin.php 076a03e8d3c178913282d10992d8a5dd ./plugins/blogroll/_prepend.php bc3ef9f9b1f7f414517597077a481a22 ./plugins/blogroll/class.dc.importblogroll.php b74b82fd30438cb07c17f133119d91ef ./plugins/blogroll/blogroll.js 0b16147781cf57aa37246d8b14897b46 ./plugins/blogroll/index.php bcb82986c4b2ce8b22458993203f51fb ./plugins/blogroll/edit.php fdbbf07f97820fbf134ba535ba15e8c4 ./plugins/blowupConfig/_public.php c94aca1844d01bf52b7a48cb504cb6cf ./plugins/blowupConfig/lib/class.blowup.config.php 8c59e58368075905716f40b6b04d164f ./plugins/blowupConfig/locales/fr/help/help.html 31e8827dab1000fda8599fca09e36e08 ./plugins/blowupConfig/locales/fr/resources.php f8adb98ead8d028c20b3aff6faf6b562 ./plugins/blowupConfig/locales/en/help/help.html 31e8827dab1000fda8599fca09e36e08 ./plugins/blowupConfig/locales/en/resources.php 1ad069db22041de4abd03570b530e41c ./plugins/blowupConfig/_install.php 83bb46600df6d2de911ca01ab33f58df ./plugins/blowupConfig/_define.php 378d688ebeab7b72476468aed22a9bb5 ./plugins/blowupConfig/_admin.php 14c7849d24ca66e0835f478a551aa7fa ./plugins/blowupConfig/config.js f1d8773e1c36a54758d85e0d38e21b3b ./plugins/blowupConfig/index.php 52db59a23ae5743c614bf9457de0167a ./plugins/blowupConfig/alpha-img/gradient-d.png bd908640438b6cc2088e81df0894c864 ./plugins/blowupConfig/alpha-img/gradient-l.png 78e0f7cf458db47eef8b8ff7a241ac8e ./plugins/blowupConfig/alpha-img/comment-t.png d1e0bdff64011042f02910c6518b1d00 ./plugins/blowupConfig/alpha-img/gradient-m.png f3b1ebaf5a27959228b736f87db11776 ./plugins/blowupConfig/alpha-img/page-bg.png 652d06f1c3f7057cd7ab6a01d22b72ba ./plugins/blowupConfig/alpha-img/page-b.png 4e391773b51ea336fb0f647cb15379ef ./plugins/blowupConfig/alpha-img/comment-b.png 508813560e6465f057c07287ad40dd88 ./plugins/blowupConfig/alpha-img/page-t/flourish-1.png 1c7448246376dc8cecee8f0479723099 ./plugins/blowupConfig/alpha-img/page-t/flamingo.png ca76fc93ebbce051feb507869165ab6d ./plugins/blowupConfig/alpha-img/page-t/light-trails-4.png f4c8777ac3a935e7b9f171a948a78280 ./plugins/blowupConfig/alpha-img/page-t/blank.png ea54394f46d21bb055e442b75031a655 ./plugins/blowupConfig/alpha-img/page-t/plumetis.png ffacd6551c2bd0c863740e7c2fcc29e4 ./plugins/blowupConfig/alpha-img/page-t/butterflies.png c48b1a888ebd601e610a425c733367fa ./plugins/blowupConfig/alpha-img/page-t/rabbit.png 3f9e394ed187b401c4446b77490944b6 ./plugins/blowupConfig/alpha-img/page-t/light-trails-3.png 7b79aa5c11177401d7b2cac032d09038 ./plugins/blowupConfig/alpha-img/page-t/flourish-2.png a33e8d4310696d64bb065cddd23b5292 ./plugins/blowupConfig/alpha-img/page-t/roadrunner-2.png a13d367c5520f17ee7b3a2dd6cd8068f ./plugins/blowupConfig/alpha-img/page-t/roadrunner-1.png 4b3117cca2f73c47d5892684443c74fb ./plugins/blowupConfig/alpha-img/page-t/image-mask.png 722ad2b43138abc067ade1c4ed6d0297 ./plugins/blowupConfig/alpha-img/page-t/light-trails-1.png c1582964ea8ac500d8f1358cbc11b472 ./plugins/blowupConfig/alpha-img/page-t/typo.png 68daa93bbe1ed00ff190cf851033fe93 ./plugins/blowupConfig/alpha-img/page-t/animals.png ee440de20028785d2c0a4fd7b25ae060 ./plugins/blowupConfig/alpha-img/page-t/light-trails-2.png a140e3ae9bf5dcc8c3152a315bd17cd3 ./plugins/blowupConfig/alpha-img/page-t/default.png 51a586082ea0ccc39f260fa2eb3baa0a ./plugins/aboutConfig/icon.png 6fc99dc80cac7cea2f3c8c73b159507d ./plugins/aboutConfig/locales/fr/help/help.html 1fba07f875a19fc70edbdb82125e11ef ./plugins/aboutConfig/locales/fr/resources.php f6068c4c4cef79527896d30687c81fe9 ./plugins/aboutConfig/locales/en/help/help.html 1fba07f875a19fc70edbdb82125e11ef ./plugins/aboutConfig/locales/en/resources.php 56bb86f83cf9bedef3f4429731644b62 ./plugins/aboutConfig/icon-big.png 625e502c36579835400b9e6ccb3b5fe9 ./plugins/aboutConfig/_define.php 4c3b1dd61e3d6806e99635a21d69ff38 ./plugins/aboutConfig/_admin.php 6cf302bb6f8b68dac77feca70665bc4b ./plugins/aboutConfig/index.php e2f558faf2cb7461397fd45c0531b2ab ./plugins/akismet/class.dc.filter.akismet.php 1b962db1cfec413d1557715ae9979270 ./plugins/akismet/locales/fr/help/help.html 5f50f5085cbad76f90831894d497335e ./plugins/akismet/locales/fr/resources.php 62b02c9f8b654727b69ee2bd170e7eb2 ./plugins/akismet/locales/en/help/help.html 5f50f5085cbad76f90831894d497335e ./plugins/akismet/locales/en/resources.php a80cc99aed439655137414afa876c2f8 ./plugins/akismet/_define.php 461d5a75207b3b1f921f60755139e4ee ./plugins/akismet/_prepend.php b6bdd7cfd9754ad6d6343bff5d149e72 ./plugins/tags/tags.php deb5c791e787615f52941227f045b37e ./plugins/tags/img/loader.gif 561046f89487fc607c4e2b470ec774f2 ./plugins/tags/img/tag-add.png 79f97e6aaa34a5ad418b47b9c4b2fa6a ./plugins/tags/tag_posts.php c9fb0ae7751dc864bf031ce6498f7438 ./plugins/tags/_public.php 17530549a1a5fcb8738df619eab6854d ./plugins/tags/style.css 8927e32d76871942bc0a4c1caf05654c ./plugins/tags/icon.png 26e4c7e4a92ec10abe0838d9dba5d717 ./plugins/tags/locales/fr/help/tags.html ea883cd4f15cd5d669cc97668267e5f7 ./plugins/tags/locales/fr/help/tag_posts.html a043f36cb393104ed7b9966e171adc27 ./plugins/tags/locales/fr/help/tag_post.html fc215b0b1b0e9744a37de210b8dccf25 ./plugins/tags/locales/fr/resources.php f5561c6fb7c3ff1e5d2b21d7f76236a0 ./plugins/tags/locales/en/help/tags.html adc980843279027fb43e365e7ef237b0 ./plugins/tags/locales/en/help/tag_posts.html d54ed64baf27d07a13208cdd5049327d ./plugins/tags/locales/en/help/tag_post.html fc215b0b1b0e9744a37de210b8dccf25 ./plugins/tags/locales/en/resources.php f89eaa94aa33533673e2817ac540ee16 ./plugins/tags/icon-big.png 1d96196372cc3bd545ec8ef85dcf4b1f ./plugins/tags/_widgets.php b32953e2ddd3efe24b8703897ce89ea8 ./plugins/tags/_define.php 01a6151e52054458628e9ced7b4df126 ./plugins/tags/_admin.php 765bffa90c7cab6307d5abb8f6962214 ./plugins/tags/_prepend.php f78a7ca65b311eef2972bb6f731da1e0 ./plugins/tags/js/post.js 5c6b25c9a514a085dbfd3ef3cba42e08 ./plugins/tags/js/jquery.autocomplete.js 39e3161b7f455c2f668a4f4caf1155d4 ./plugins/tags/js/posts_actions.js cf2f6213187aa9b623201f87c0f79d55 ./plugins/tags/index.php 7d1eac627c5fa7cf708af1a9a2441ab9 ./plugins/tags/_xmlrpc.php 48b043a1bcc101ab6ce18165fff489df ./plugins/tags/default-templates/tags.html d7d4b8c52ee2aa241a864c6273835897 ./plugins/tags/default-templates/tag.html 44295d4b421884fa79ef9a5699c16861 ./plugins/pings/icon.png 11fdcfa2f232a4fe3c084e95d84fc201 ./plugins/pings/locales/fr/help/pings_post.html 96925a11786ad1eec466c2d70382f492 ./plugins/pings/locales/fr/help/pings.html bc206299b2fa4e1ca380867624217ddf ./plugins/pings/locales/fr/resources.php 9f1890538a94ac20c2959cc8ce5ac291 ./plugins/pings/locales/en/help/pings_post.html 187f31ad1aeaf7dd61eebedd12d9c59a ./plugins/pings/locales/en/help/pings.html bc206299b2fa4e1ca380867624217ddf ./plugins/pings/locales/en/resources.php 00257fad1ef07bb317d16f9a0954abf2 ./plugins/pings/post.js af17947f06e9bcb1d9a7a840258b4cd7 ./plugins/pings/icon-big.png 4ba677c998ae3e884b008db819bba0ce ./plugins/pings/lib.pings.php 8507368bc5a988fd2bbcdfdeba11237e ./plugins/pings/_define.php 2cd7a349623d8f74ae5da997122d8c6d ./plugins/pings/_admin.php 6dbf675096784bb7ce4665b59c5b85c4 ./plugins/pings/index.php d13b8319feb6286dfe3cdf8222e7d980 ./plugins/fairTrackbacks/_public.php 0b47f61c2cd2fd4ab9b686d30e014307 ./plugins/fairTrackbacks/class.dc.filter.fairtrackbacks.php 0238b344a0552838eb8697deb5407fa3 ./plugins/fairTrackbacks/_define.php 4409db74a18c637295b819a84757c026 ./plugins/fairTrackbacks/_prepend.php 5d0eb53b9c1c28af7f873e687e8101e2 ./plugins/pages/page.php 35c08086a80db71dcc46afbe02447700 ./plugins/pages/list.js 779ce89a87d17275c326c03703796c7f ./plugins/pages/class.listpage.php e19a8266614f2ae0d687cd5a9170e21b ./plugins/pages/_public.php 50f314c0c4daccf1d5d98b65ae467f18 ./plugins/pages/class.actionpage.php 6bf3bf062e9c2a775f539f81a75beea4 ./plugins/pages/icon.png d75709f21658da83b63363023696eec9 ./plugins/pages/_users_actions.js 225a82d6ac873c521688d02ab686d96d ./plugins/pages/locales/fr/help/page.html bd4ad96c73cb93dca6c2459b5f605994 ./plugins/pages/locales/fr/help/pages.html f24a3b33aa87a8d0cb5b6cba4728328f ./plugins/pages/locales/fr/resources.php dc8040aece6d2e57d434434dce627232 ./plugins/pages/locales/en/help/page.html 1c0b11c9b602707408f67be6a1c72a5d ./plugins/pages/locales/en/help/pages.html f24a3b33aa87a8d0cb5b6cba4728328f ./plugins/pages/locales/en/resources.php 8ce969227c7d248f4deec282491c8dae ./plugins/pages/_install.php 141aeeaaca0124a34e800c40930156ed ./plugins/pages/icon-big.png 904978bdde9f268c4b191d2c01d4e995 ./plugins/pages/icon-np.png 1cca120d2632b5f75b31457c72be2e31 ./plugins/pages/icon-np-big.png 40ab5a929076c5d862ba61c680f6bc93 ./plugins/pages/_widgets.php 682697762f46dc027f66dcfad2974e7f ./plugins/pages/_define.php 6776474b9fba7e2d65ac1e66f3289f65 ./plugins/pages/_admin.php 42f4a29bd3bd689c70619418e810f14b ./plugins/pages/_prepend.php 1f6d862b48a5838b9d9107e7619312f1 ./plugins/pages/index.php 1a2dc4e0dc4fb502e0d9eeb7cbe787fe ./plugins/pages/list.php 085b0f1d207194560f1a61042cca70b4 ./plugins/pages/default-templates/page.html 355fbab6dc8dc6c779ba687bcc187fd7 ./plugins/maintenance/icon-small.png c282cea4b3188aca3680c92fc099cd71 ./plugins/maintenance/icon.png 08572b2a1fe3c26c83dedf784ef33a90 ./plugins/maintenance/locales/fr/help/maintenance.html 6bac13c49ab159d229e3e7654dc39528 ./plugins/maintenance/locales/fr/resources.php cc949f181cb15274b1f6c3f626975496 ./plugins/maintenance/locales/en/help/maintenance.html 6bac13c49ab159d229e3e7654dc39528 ./plugins/maintenance/locales/en/resources.php e0aa1004a11b0d9a289851bd2b4e8608 ./plugins/maintenance/icon-big.png aeb5a5245e50f80aba0b9ec3c8a3ae48 ./plugins/maintenance/inc/class.dc.maintenance.descriptor.php c72d70e9f677a46960698fcd6dbc1a72 ./plugins/maintenance/inc/class.dc.maintenance.php f0eb4d49826ddbc94e117db2f93f7623 ./plugins/maintenance/inc/tasks/class.dc.maintenance.synchpostsmeta.php 67cce079a0da2e5dd31e2680c050bf8e ./plugins/maintenance/inc/tasks/class.dc.maintenance.countcomments.php 398028ef59ad6ddb1b421f29cce9d205 ./plugins/maintenance/inc/tasks/class.dc.maintenance.zipmedia.php d0892beeabf28baffd080efcbe3ae26d ./plugins/maintenance/inc/tasks/class.dc.maintenance.logs.php ef43d3efe466b2421989ba1e9b88c162 ./plugins/maintenance/inc/tasks/class.dc.maintenance.cache.php 5680143d9581c6cb2b8e70118582b1d4 ./plugins/maintenance/inc/tasks/class.dc.maintenance.ziptheme.php 161509f643807edfe07f20ce676bdcfe ./plugins/maintenance/inc/tasks/class.dc.maintenance.vacuum.php d59030c134aec3122016e8abe6e0df92 ./plugins/maintenance/inc/tasks/class.dc.maintenance.indexposts.php b4ccfcd4f95deaec7ec41fc3fae796aa ./plugins/maintenance/inc/tasks/class.dc.maintenance.indexcomments.php fce32155bd73c264ae8fa01f8a0f070b ./plugins/maintenance/inc/class.dc.maintenance.task.php 7fcb6b824abc10fee0810dd60eccb77f ./plugins/maintenance/_define.php bfe93af37fc3a7d2f3bb4cfd48fa82ca ./plugins/maintenance/_admin.php c39bf50af79108ce881bc75c0628af11 ./plugins/maintenance/_prepend.php 472c602d9e61616af3e3113d04335564 ./plugins/maintenance/js/settings.js 13f4f7b26f32d3fee19a3d9ad55ea412 ./plugins/maintenance/js/dc.maintenance.js 8979239a7400abdf0c3e9bb70583dbad ./plugins/maintenance/index.php fc83432d6f03f60a58fc53655d2be4bb ./plugins/maintenance/_services.php 44299f2641d06613b96bbda09e263db3 ./plugins/maintenance/icon-big-update.png 209634bb0238704c4874c35d615ae59e ./plugins/.htaccess 011f269232567c8f1e4a66f0e58b1652 ./plugins/antispam/_public.php 6acee4be1fa3d5cf56326de16d819b22 ./plugins/antispam/style.css b42ed4dbd284d0d8b76c29af1bcee940 ./plugins/antispam/icon.png 665c098a8f78a44c8ca49c8fd6bb8123 ./plugins/antispam/locales/fr/help/help.html 6c2ee29cad819d25817d2481e001a68b ./plugins/antispam/locales/fr/help/ip.html 11b822f36d82dc57c11b15e07e3dae4f ./plugins/antispam/locales/fr/help/filters.html d66473e1943b9d3269ee5c12f10872b6 ./plugins/antispam/locales/fr/help/iplookup.html fcfaa58281ed152fd0eed604456a65b5 ./plugins/antispam/locales/fr/help/comments.html 1b1a33e0900e12253a3937da04296f52 ./plugins/antispam/locales/fr/help/words.html 8918253e9e810336f41fbac6cde338c7 ./plugins/antispam/locales/fr/resources.php 076deb7b241e9a2478fe02a091f315fb ./plugins/antispam/locales/en/help/help.html c0f4632077fa578a614ed95f37b592e4 ./plugins/antispam/locales/en/help/ip.html 1c3076d9a02cf85c2f3ba070d76fe239 ./plugins/antispam/locales/en/help/filters.html 16239e397d633e70524fa8548e7d6a4e ./plugins/antispam/locales/en/help/iplookup.html 84f8a64dc45214672c824b6c4ba07c6e ./plugins/antispam/locales/en/help/comments.html 95167a14842fd0086f982aa04923e4ad ./plugins/antispam/locales/en/help/words.html 8918253e9e810336f41fbac6cde338c7 ./plugins/antispam/locales/en/resources.php f9fed13bd3c9f7a01f3198d3a8b2bc63 ./plugins/antispam/_install.php f48723a027359ff58e57deb9411ee5dc ./plugins/antispam/icon-big.png 506a533c992657894457907e5ebae816 ./plugins/antispam/filters/class.dc.filter.words.php 4b79d8cf38e00ceb5d820451d0a00bb7 ./plugins/antispam/filters/class.dc.filter.ip.php 66c3c98a08caeb621570c29692d62ca4 ./plugins/antispam/filters/class.dc.filter.iplookup.php 0850342575aef98321b03450a28bb2c3 ./plugins/antispam/filters/class.dc.filter.linkslookup.php ed59b78bd6ab7c17623a9e8b0ad3e7d7 ./plugins/antispam/antispam.js e5ae6bcac9771a4ecc19a997b587b9f6 ./plugins/antispam/inc/class.dc.spamfilters.php b0d1c33d486c187ab91077e32a1fa5fa ./plugins/antispam/inc/lib.dc.antispam.url.php cb14a0cbe06d6de4b652553755f9e476 ./plugins/antispam/inc/class.dc.spamfilter.php 7f87fb9b3f169592b8dd955fd8961f69 ./plugins/antispam/inc/lib.dc.antispam.php 013d3be61a26ab2146466cf52ce66ad0 ./plugins/antispam/_define.php c690424e17e641e17beeaffe4de03422 ./plugins/antispam/_admin.php b6f7e7d8cd1714cbe6e231588339b2da ./plugins/antispam/_prepend.php 95e78775e4d2a56e0304535c5a174e7c ./plugins/antispam/index.php b82da4aa0a7b272ae5e2de8dd7359b3a ./plugins/antispam/feed.png 81b4361048553a91fe6b660d2bc182c7 ./plugins/importExport/style.css ce5c9e777bf9fa07fbeff16e41984637 ./plugins/importExport/icon.png fd76d4a3bec2ec45c18d8a88d5748730 ./plugins/importExport/locales/fr/help/import.html bf39d81d78e1319b9150a5188c105ff6 ./plugins/importExport/locales/fr/resources.php 0ce2e0c3a5f31517b37c67a24a4e218e ./plugins/importExport/locales/en/help/import.html bf39d81d78e1319b9150a5188c105ff6 ./plugins/importExport/locales/en/resources.php 9e3c7fde8b29fdfa60dcb610d9493080 ./plugins/importExport/icon-big.png caa11e523e5a3ed38d90480bed5d5a73 ./plugins/importExport/inc/img/progress.png 3edd110567d1a5896ea06340a9589a72 ./plugins/importExport/inc/lib.ie.maintenance.php 18005529cdaab8d54977bb0cf0782a45 ./plugins/importExport/inc/class.dc.import.wp.php 1825d3aee2637f36d448f512d980426b ./plugins/importExport/inc/flat/class.flat.import.php 97b38eee5eb11029f9226bcb8d58163d ./plugins/importExport/inc/flat/class.flat.backup.php 1a8d62773b4c3dcb4f22c63da0af010a ./plugins/importExport/inc/flat/class.flat.export.php f2ca9f37d14362a8ddb4590759a0387b ./plugins/importExport/inc/class.dc.export.flat.php 2a8154ecbbe4fb2bb5ca288fb79157f2 ./plugins/importExport/inc/class.dc.import.flat.php c46c048173fbac17e27a9bbc103374d0 ./plugins/importExport/inc/class.dc.import.feed.php 462d823313596a7a9e24bcfe452400bf ./plugins/importExport/inc/class.dc.import.dc1.php 94995d65741829c1d080dcb776ac2de4 ./plugins/importExport/inc/class.dc.ieModule.php 4c6b73d67bae44869a86a450ba26560b ./plugins/importExport/_define.php 5e00f794f3342c89b4951f45ac193b3a ./plugins/importExport/_admin.php 1bcf5480fe99f50e22ab81117ed40473 ./plugins/importExport/_prepend.php a15c2486f1721cc49ec6a37e20fb0cac ./plugins/importExport/js/script.js 6340d95d137b2eff35f114f9b2e3d7ed ./plugins/importExport/index.php 6d5df9f01c2258c30b32defcc1a25c2d ./README.md d4ff299dabd4b8334cc7259d0eb65b6e ./locales/README 474f4c793cb49cad774c5b925945e62e ./locales/fr/main.lang.php 630c9a3aa06741d436e57a6ddfff48be ./locales/fr/date.lang.php 24c3146afb9326923bc05933cc6e9955 ./locales/fr/date.po 2c2a800c1b78926831824ce7a9c8dc7e ./locales/fr/help/core_blog_theme.html e7abfbfbd02d8c987534e15cefc51fd1 ./locales/fr/help/core_wiki.html df920b9398aff02cb9709db98352d72e ./locales/fr/help/core_blog_pref.html 9d86256ea165cde98862556cbced7b65 ./locales/fr/help/core_blog_new.html 9d5e6dc23d240bdbf985b44d00705d28 ./locales/fr/help/core_categories.html 360c413eba0aae043081423f756aa516 ./locales/fr/help/core_category.html ab81c0c8b16a8f5187202f1f5b7c2911 ./locales/fr/help/core_trackbacks.html 00aa186c1da351bf4be30cc635b87838 ./locales/fr/help/core_plugins.html b2f73dfe6808da65efce4c4a8e0e2668 ./locales/fr/help/core_blogs.html 749be3307f585751e09891fcc1000712 ./locales/fr/help/core_dashboard.html b743cd44d6547361a21b7676773d1e39 ./locales/fr/help/core_comments.html bb428bec9f8b0f9c7a25a4f6c6ed18a0 ./locales/fr/help/core_posts.html 424df6bba408606466ef0b4cfee9ab95 ./locales/fr/help/core_langs.html 035a633c221875ed3d2d4256a34fd0f5 ./locales/fr/help/core_post.html 14489266b7f8a3d627ec601a23d0e589 ./locales/fr/help/core_media.html 8b170f37d610c3ef6d59177619eb8f34 ./locales/fr/help/core_users.html 989953ea33ca4e8d9f71084f7913a2b0 ./locales/fr/help/core_user_pref.html eda65b72fc15d3282779a132c9ed7f26 ./locales/fr/help/core_search.html 8b370c9edf675e2b7452a9736ff59df7 ./locales/fr/help/core_user.html 485b56e17dc15a90e316be7a613e5956 ./locales/fr/help/core_update.html 4c515c3ac66a22b84390610474d58621 ./locales/fr/help/index.html 63185cf9ce857880f77675997f9a11a6 ./locales/fr/main.po eba301565cf4f933ff9b9ae55e616465 ./locales/fr/public.po b9e44f10214625bcb6f6f98f7d6ec71a ./locales/fr/plugins.lang.php 99886f32187909810be42999169ee6f7 ./locales/fr/plugins.po 5765ed19fb7e90cb6ba809ddbcb9c7f9 ./locales/fr/public.lang.php d8f9a8df72b61b651a18d9fc3525765a ./locales/fr/resources.php 005f1e9564ebf71f6e9a5940a23635b7 ./locales/en/main.lang.php c2b2b126df013d5caae87da160559076 ./locales/en/date.lang.php 47186f1296045358bac228a4d5db8544 ./locales/en/date.po aa01f4d2f7ecab8a7ff9a1acd7549e57 ./locales/en/help/core_blog_theme.html 001d99c61c1231abbf0395c89b7476f2 ./locales/en/help/core_wiki.html ebf8e6bf5a9b14a9b920c0a229df73e7 ./locales/en/help/core_blog_pref.html d6c2ff782d89034a9fbd1651852c707a ./locales/en/help/core_blog_new.html efb53390937d332b7b5a432ddc9f6f0a ./locales/en/help/core_categories.html ae1a19c8ae1e9515ce2b51336d00fad0 ./locales/en/help/core_category.html bd05b25bc7b3003881b97b4e86058601 ./locales/en/help/core_trackbacks.html b51ac83ef53104b7795aece322dd0226 ./locales/en/help/core_plugins.html 53534ba5d3928ff1debcf0080c98e674 ./locales/en/help/core_blogs.html 494a4b8ba0937a543d0efb1c55253d5e ./locales/en/help/core_dashboard.html fc51ec4fe28cadc83913b369fc77d65a ./locales/en/help/core_comments.html 41b29e23d3038964aee7a3101b77d2cd ./locales/en/help/core_posts.html 5138f3667cc0e41f84a513ab05fc5cdd ./locales/en/help/core_langs.html 36c74e1954086984e8b40f09eb7f0638 ./locales/en/help/core_post.html 23b61dd0b458b57353670a20eb619545 ./locales/en/help/core_media.html 54c4c30196dfd7716eb82f26b48abe04 ./locales/en/help/core_users.html 132e5da3bf3c2691177a325b5cf04364 ./locales/en/help/core_user_pref.html 37f9967bf336a33fd0a84a85212c66f9 ./locales/en/help/core_search.html 1c368099d0cd9360eabc2d7bbb970986 ./locales/en/help/core_user.html f1708dd3c4440fa9936aa7eee3267d88 ./locales/en/help/core_update.html a6cb895d9d19b58668940463a7a8a3fe ./locales/en/help/index.html 868f1ee53707501ababa40b2526b36d8 ./locales/en/main.po 27661783e49b48a32050276d99777330 ./locales/en/public.po e6bb0ea671c6e776965bd40d4f46e6e1 ./locales/en/plugins.lang.php 4d7f84cf55cc1376495411bda1164a74 ./locales/en/plugins.po 7bd7869bdea94f6a9de7cc8fcd1c3212 ./locales/en/public.lang.php 115d2aa81b7cf7ccf2e98be4a667209b ./locales/en/resources.php bee4e7d0bb61aff059f7ad15e532e09e ./inc/config.php.in a1f7a9743dd8b7c3a1b3f434821f48f2 ./inc/public/class.dc.template.php 96a15910ebd59b9081442a30af2cf267 ./inc/public/lib.urlhandlers.php aacca643f0a7ff5235c0264bade19453 ./inc/public/prepend.php c94f5ceb56616420ee77c4a9f6837d6b ./inc/public/rs.extension.php 6b5050f181675e334064367d7e3af87c ./inc/public/lib.tpl.context.php 164e56edd8021630e970bd62927561aa ./inc/public/default-templates/category.html 057c4584ab74a5106cc920e1a7113123 ./inc/public/default-templates/search.html 8212c042ba01c9d2aab58d8158758471 ./inc/public/default-templates/user_head.html b1f497d13082c765698e6144ea8d1a9e ./inc/public/default-templates/post.html a600ee42c35f0760d2dd33d76783cb7c ./inc/public/default-templates/home.html 6f082ddf908aaa5df0605e55b8de0fe0 ./inc/public/default-templates/rss2.xml 6e9d686366d27d95a1f042f2e71117b0 ./inc/public/default-templates/_footer.html 75209f1efdb00c29bb24fb8685d5a42e ./inc/public/default-templates/archive.html edb3fba1659de409b47d746a4b7f069d ./inc/public/default-templates/_head.html 92937ce4ec166a37db798b1cfac2b640 ./inc/public/default-templates/rss2.xsl bbdf92fb8bed784954e3a4a7aa84f037 ./inc/public/default-templates/_flv_player.html 78ba303ae1e629665c79c0c66095eb5e ./inc/public/default-templates/atom.xml c0dd1ece9c8919d217d97d817a27cf75 ./inc/public/default-templates/_mp3_player.html 0b65ae6e9d4039f6bc7cf081d1484848 ./inc/public/default-templates/_top.html 7fcf620821d573f57203773df588843d ./inc/public/default-templates/rss2-comments.xml dd8b54d0787bae2eda0abc296d375295 ./inc/public/default-templates/password-form.html 6b7781e1c958c946fb6a728c93db1f4e ./inc/public/default-templates/atom-comments.xml 2567b0be9c1e6ec40709dae81fd4b80d ./inc/public/default-templates/404.html de7665fe85bfd665793abe9e7db3a102 ./inc/public/default-templates/archive_month.html 413a2f6e764cd5628a415e9ea54bd5c9 ./inc/dbschema/upgrade-cli.php 5e90770b980925575ce3bfe247f4cde8 ./inc/dbschema/db-schema.php 04a0f41971635bd68590d63218e72671 ./inc/dbschema/upgrade.php c186c55ea29247afeddee844ad7fa00d ./inc/prepend.php 42b2112b6f8adb6d3588cfb13d6b15c3 ./inc/core_error.php ed2119b43054fd6068922b84b145a8c3 ./inc/libs/clearbricks/mail.convert/class.mail.convert.php c19a0ccbd398e08879ab4ea64174a2cc ./inc/libs/clearbricks/url.handler/class.url.handler.php 2529e72aaf6a0f2abde6cd844318a48c ./inc/libs/clearbricks/dblayer/class.pgsql.php e7b55e965efccd72eeddb344c085156c ./inc/libs/clearbricks/dblayer/class.mysqli.php 1fa19c44e4d21e22d6e7f63f47ef9683 ./inc/libs/clearbricks/dblayer/class.cursor.php ec2e9bfdb0e9b1f4f0f3bd8c4ccd89f5 ./inc/libs/clearbricks/dblayer/class.mysql.php a5571d68de58b645418af0493bc23d39 ./inc/libs/clearbricks/dblayer/dblayer.php 36091aa2588335dcc1580c0690f6bb6c ./inc/libs/clearbricks/dblayer/class.sqlite.php 48a24b70a0b376535542b996af517398 ./inc/libs/clearbricks/debian/compat b0bd77efcf7f3ba705ca57fccd3479f7 ./inc/libs/clearbricks/debian/control 771304f18d0aca7eb424be239480264e ./inc/libs/clearbricks/debian/changelog 33c1cd6baec7ef84b905dd6fb463b871 ./inc/libs/clearbricks/debian/copyright 09741ea306c67f178df496044fd7d3bf ./inc/libs/clearbricks/debian/mkdcl.php 30ecf234a276835fe14c19f5a54dcbf8 ./inc/libs/clearbricks/debian/rules e969237c3afdcbd0524bfb67ff186c2d ./inc/libs/clearbricks/debian/dirs a165b0c48efd38c3c2725a282922c6f1 ./inc/libs/clearbricks/debian/docs 786f080ef721788674ebf693a53052a7 ./inc/libs/clearbricks/composer.lock 02cf3914737bed9be6fa2967ff6784ab ./inc/libs/clearbricks/session.db/class.session.db.php c50e96e87fdd2e5d6c93d1e11d66b0b5 ./inc/libs/clearbricks/README.md cb95b315558ebcb254249210637abe4b ./inc/libs/clearbricks/ext/incutio.ixr_library.php 8d959e3f086b5966da4768c7329c7381 ./inc/libs/clearbricks/dbschema/class.dbstruct.php e99fb6c8a8f5560e29a0cf09467d9925 ./inc/libs/clearbricks/dbschema/class.sqlite.dbschema.php 4b220dcc615988a99c45b76afa8c9266 ./inc/libs/clearbricks/dbschema/class.dbschema.php 31be4fc6b83a8b4b68808a1b9826480b ./inc/libs/clearbricks/dbschema/class.mysql.dbschema.php 19a7b770183e06433645ba6a572a6675 ./inc/libs/clearbricks/dbschema/class.mysqli.dbschema.php 6b996db6efec7f63255551f1a23eb83a ./inc/libs/clearbricks/dbschema/class.pgsql.dbschema.php 2313bc9ac883ce2b11c60ef98046288a ./inc/libs/clearbricks/diff/lib.diff.php c69972af34e0f4fc8aa53b2e48a4230a ./inc/libs/clearbricks/diff/lib.tidy.diff.php da7de452beaa13a3cf4505ce441d8032 ./inc/libs/clearbricks/text.wiki2xhtml/class.wiki2xhtml.php 92d87a9321a7e20f047e80eb5f8995c8 ./inc/libs/clearbricks/pager/class.pager.php c68d98c261c47e6153ebb94374aa8ad2 ./inc/libs/clearbricks/_common.php a6a733706397145fcd689a6d58a39d6e ./inc/libs/clearbricks/template/class.template.php d63b7e8334c31fe71eb97f921c0cb237 ./inc/libs/clearbricks/html.validator/class.html.validator.php a148271073e9fa4f6c32d20429e53dc0 ./inc/libs/clearbricks/net.http.feed/class.feed.parser.php dac1bea7a0ad0ec9cdd73d2db513389d ./inc/libs/clearbricks/net.http.feed/class.feed.reader.php ea2f866ec069aa3f6c89a3f16f5ac1f2 ./inc/libs/clearbricks/net.nntp/class.nntp.message.php 46abb07b69efa8e1588400262cd79878 ./inc/libs/clearbricks/net.nntp/class.net.nntp.php e2cb3f17922deebc7b0f1dd8b49e879d ./inc/libs/clearbricks/net/class.net.socket.php 2a352554bfefc4fb1a1b4e2ee8367e86 ./inc/libs/clearbricks/net.http/class.net.http.php f56edabd2965220f6347ce11dc66cbe2 ./inc/libs/clearbricks/tests/unit/text.wiki2xhtml/class.wiki2xhtml.php cbfa4421914bf9c0f437f8f2e52e870e ./inc/libs/clearbricks/tests/unit/bootstrap.php 24341b912d314be4f17fe3f07c271e4d ./inc/libs/clearbricks/tests/unit/fixtures/l10n/es/main.lang.php 838b63991372835120b7b24a59cb80ef ./inc/libs/clearbricks/tests/unit/fixtures/l10n/es/main.po 632d1b5e5e026be64e076faa8ee061a5 ./inc/libs/clearbricks/tests/unit/fixtures/l10n/es/core.lang.php deb89495d10e7d4c08af41975479246b ./inc/libs/clearbricks/tests/unit/fixtures/l10n/es/core.po 956cabee5f597b7f2dd52d3a492c1f69 ./inc/libs/clearbricks/tests/unit/fixtures/l10n/fr/simple.po 8188615bf6dd795745c2f6fe3aca7afa ./inc/libs/clearbricks/tests/unit/fixtures/l10n/fr/plurals.po 1d69dc27cbf7171ee252c771f8d3beb3 ./inc/libs/clearbricks/tests/unit/fixtures/l10n/fr/plurals.lang.php 979826d22e2fc3d87c4960b1e94e9db2 ./inc/libs/clearbricks/tests/unit/fixtures/l10n/fr/simple.lang.php 8b5c503ab19d6db061761247e79e6508 ./inc/libs/clearbricks/tests/unit/fixtures/l10n/fr/php-format.po 4419f6f8767835eaeb5334c6565344c7 ./inc/libs/clearbricks/tests/unit/fixtures/l10n/fr/main.lang.php 4894146f9148be129965ca15eac711ee ./inc/libs/clearbricks/tests/unit/fixtures/l10n/fr/main.po ac3b7d938d104b2a6f82d05dbf24bf3d ./inc/libs/clearbricks/tests/unit/fixtures/l10n/fr/core.lang.php 30a14dc7f74e80ea7bfcba26cfedc568 ./inc/libs/clearbricks/tests/unit/fixtures/l10n/fr/php-format.lang.php fb9c0b3b350778d1c27460c50eda87c6 ./inc/libs/clearbricks/tests/unit/fixtures/l10n/fr/core.po 8782c74ea08fa636be6d088293920e91 ./inc/libs/clearbricks/tests/unit/common/lib.l10n.php f4775b7e5b2c57f57a6ecebf9e5b2565 ./inc/libs/clearbricks/filemanager/class.filemanager.php 0add791718ef76e2193daab8b955c8af ./inc/libs/clearbricks/rest/class.rest.php 7769ece7fc10a16ccd767bbd0c844b08 ./inc/libs/clearbricks/mail.mime/class.mime.message.php 5bd42fa982225d20336880bdc4649549 ./inc/libs/clearbricks/html.filter/class.html.filter.php 5f6a8f9131081c1170262a4e5b89cdf6 ./inc/libs/clearbricks/image/class.image.tools.php db951a08c2a6f2d8ba5493dba0d02e68 ./inc/libs/clearbricks/image/class.image.meta.php f6fa42b75f85f4b11a59b0f6b0e2ba77 ./inc/libs/clearbricks/xmlsql/class.xmlsql.php 6af80e49cb72c745396eaa62b3e7035e ./inc/libs/clearbricks/Makefile 0a5d4c86630546044c510daf7604e127 ./inc/libs/clearbricks/.atoum.coverage.php c80ce86c414794e8d6f3d4443084dbe0 ./inc/libs/clearbricks/.atoum.php 5e62bbc503bea7910f93db6d03cda5b1 ./inc/libs/clearbricks/mail/class.mail.php 6b7314bed4e54c0f613eaf0db77508d7 ./inc/libs/clearbricks/mail/class.socket.mail.php 6662d436235cd5ce059f895962e2f6e4 ./inc/libs/clearbricks/common/lib.date.php 8c1a1270e0cd09b7e0142cfe2101152a ./inc/libs/clearbricks/common/lib.files.php 53f8e535da21c1f1ec0246a643d01993 ./inc/libs/clearbricks/common/tz.dat a35a93609961aecdb34f9d89fac8e775 ./inc/libs/clearbricks/common/lib.html.php bda72c83f806042af57792c9a9e682ec ./inc/libs/clearbricks/common/lib.l10n.php 33a2ca5a516dedbbb6bc1902e7351b42 ./inc/libs/clearbricks/common/lib.json.php 1c034cd6288ea9ff9171a529d670b531 ./inc/libs/clearbricks/common/lib.http.php 5c8e14eeca5bd8755644341e6e5bcf28 ./inc/libs/clearbricks/common/lib.text.php 8bc7e12900887efa329161c18fceb8d4 ./inc/libs/clearbricks/common/lib.crypt.php 646219707940924d43c0543b50a46a99 ./inc/libs/clearbricks/common/lib.form.php 38b7ed2163e75d2d05dab7eda4e3d8d9 ./inc/libs/clearbricks/common/_main.php d67f0202af893838de610f83904ec825 ./inc/libs/clearbricks/zip/class.zip.php d4b3a9442003a1cd0a7e0a14fea32c4c ./inc/libs/clearbricks/zip/class.unzip.php d71f33f5f9712ce5e6de9ce2a990290d ./inc/libs/clearbricks/net.xmlrpc/class.net.xmlrpc.php 9d804ec6c7ca12fee96bf609bfa39a15 ./inc/libs/clearbricks/composer.json 209634bb0238704c4874c35d615ae59e ./inc/.htaccess a0d9e7445c6835e0c07c962530fa042b ./inc/load_plugin_file.php cca10bb7b50467aa373abfef2e628dec ./inc/core/class.dc.update.php 217f60df4a2c1f4b85c5551fafe7ec8b ./inc/core/class.dc.core.php b248761c07e07a503a20e0d5fa424a02 ./inc/core/class.dc.categories.php 33a4b04011faaad5d754f110c4446b5b ./inc/core/class.dc.themes.php 5a0e82a74bbf2f6f62604e601a4d2079 ./inc/core/class.dc.store.parser.php 089a2ef178d62c9907e24a8ca54efa51 ./inc/core/class.dc.trackback.php 14a5ce6e5ecf8bc5766cdcca7951daa4 ./inc/core/class.dc.settings.php d4b27ee4688c67632ce0d4a199500d1d ./inc/core/class.dc.auth.php 1e87bce2b722a7cb3bbc34e2357b5958 ./inc/core/class.dc.modules.php c87b7d5185080fe56ced1c94f86ea2d7 ./inc/core/class.dc.postmedia.php 587a6cb8e5ed465e4e545e0bfad84393 ./inc/core/class.dc.error.php 4fbe8b85c4769d8e398970ead76c7945 ./inc/core/class.dc.rs.extensions.php e354e0c14bd0a9e3dcff7a293a5b42f4 ./inc/core/class.dc.meta.php ab5d5307b625cf9a8032baf018c75fb4 ./inc/core/class.dc.xmlrpc.php dec05f2ea60c70b7c8a88bb70b40747d ./inc/core/class.dc.blog.php b8783e429776ed9875eba34fce3fb6e1 ./inc/core/class.dc.media.php e2a6d316d3d723a96c73cfb4a8a25df4 ./inc/core/class.dc.rest.php 66eebc93a8cce3d1f49c556be42c277e ./inc/core/class.dc.plugins.php 92ddf19a175c06bd2ccaead21e9df80a ./inc/core/class.dc.store.reader.php 8c4e0f84866a08a5ab371f84ac97bdd1 ./inc/core/class.dc.log.php 8b6b620144f431af60dde55f6b07be4b ./inc/core/class.dc.prefs.php 02f9da563308887d2479edb5b986b43d ./inc/core/class.dc.utils.php 0d944faed1baf32850a04436024d1bd0 ./inc/core/class.dc.namespace.php 49860353b7e1ba02bfa0a254900cb908 ./inc/core/class.dc.workspace.php b77fbc23139fafc33e42746c9321418d ./inc/core/class.dc.store.php 94a4e65294ce8d91c89f55c4503b15c1 ./inc/admin/class.dc.menu.php c1814302916fa11fdffc0601620c004c ./inc/admin/lib.pager.php b7d8d37366f0d86737bc36bf9ec50005 ./inc/admin/prepend.php a44fe2e9c1f46a242fda584ba3a7d4b8 ./inc/admin/actions/class.dcactionposts.php 32490883f6fe4f52bc718b5b965d9a64 ./inc/admin/actions/class.dcactioncomments.php 55711a1d9abd2248c7ad83f6e70a5e0a ./inc/admin/actions/class.dcaction.php c00e52fc21d76669b0c0709cda2dfd43 ./inc/admin/lib.moduleslist.php 5b1232ce605732839291d16c1bef443c ./inc/admin/class.dc.favorites.php 497ac3ed5a432dcdcead651ee6b2e10f ./inc/admin/lib.admincombos.php 69a1364451cf15c8e37a6e1810747aad ./inc/admin/lib.dc.page.php 25077adba3fb75295d3b5b049f9b9233 ./index.php 4d7e858a5dd84e976290f4fc473edd3a ./themes/customCSS/_config.php 1e311c7d517ec65eac66d18117aa3fd8 ./themes/customCSS/_public.php d41d8cd98f00b204e9800998ecf8427e ./themes/customCSS/style.css 1d1cef4e501e315791cbcbc226fb17dc ./themes/customCSS/locales/fr/main.lang.php 0ae6c4071ad7aa567927e5c98d5e9709 ./themes/customCSS/locales/fr/main.po f1cad90b4f1f587185b545eb50bc78ee ./themes/customCSS/_define.php 8ebf5666d9d8bac9fdeedbd17daaa348 ./themes/blueSilence/img/report.png a56d97cb87cfd1970760fff3345af5d8 ./themes/blueSilence/img/tag.png 986f44c4d95f0b4d30defec242f0f76d ./themes/blueSilence/img/retrolien.png f7a34b6d7c3641b7afa0132a9723ece3 ./themes/blueSilence/img/top.jpg 28e5e068b8b973e3d1997ba7c24205f2 ./themes/blueSilence/img/background.png c1dda264fa5d4120717ba558f01fe652 ./themes/blueSilence/img/footer.png 851317b61d8b6b08d6bb58c06896df21 ./themes/blueSilence/img/attach.png f9e699b16c85dd103e725d70efdacd2f ./themes/blueSilence/img/li.png a58dc745b52f9bb33a44fb9ccd5a776d ./themes/blueSilence/img/rss.png e8bb6589fe0e7bc810acc4c350f2a54d ./themes/blueSilence/img/commentaire_bulle.png e40bfe45e815e751015bf122e16fb1f2 ./themes/blueSilence/img/sidebar_li.png 4c8c6a8fe121912b6cf6a8edaa920aec ./themes/blueSilence/img/tags.png ab2a5e87e0c395d12a221485be1ff821 ./themes/blueSilence/img/commentaire.png 4c99f9d0bd6843a5484740269dd72770 ./themes/blueSilence/style.css 6c0c644258713357329a5bcac1f44768 ./themes/blueSilence/screenshot.jpg 1a106588aeed7918ce1817a2f3fa8a49 ./themes/blueSilence/_define.php 7d612ce1bc6b429baadf62b3934c1c24 ./themes/ductile/rebase.css 92a0b4dc9acabfc6dd505bc323637298 ./themes/ductile/_config.php 3830f6d401c112da3fec2d49598c110a ./themes/ductile/img/info-co.png d5979fa0d9b2f8be5e1426d10ab324b0 ./themes/ductile/img/sticker-about.png 45d00287e10a0f80755df82486fe5d9c ./themes/ductile/img/menu.png f5a4ca7d53980b9f3599f44f1ee056dc ./themes/ductile/img/404.png 6b66cc73ab482165f05fa3681c3117fd ./themes/ductile/img/hline.png 208f72649c79433f373bc2f345e31b1e ./themes/ductile/img/logo.png a0015087cd48c18743ec0abe82093fe3 ./themes/ductile/img/sticker-contact.png 94d5758aa91ec3378e0cd48de4f3d479 ./themes/ductile/img/last-hline.png ee625571fee87ee28771814a7d990533 ./themes/ductile/img/download.png 6490586470558c14c3bbeb50b7aba76e ./themes/ductile/img/post-info.png a9ba633e8a0c38c7799fddb21386bf1b ./themes/ductile/img/squares.png f6d76b2ec5d0cc2f1fa0d7959e654659 ./themes/ductile/img/feed.png 1b0f8f994562ca42560fcd2ada72c409 ./themes/ductile/img/filet.png 9ea7bc2b06c8b9835fca914e45c3e9fd ./themes/ductile/img/menumobile.png 3addb79a8269aa09f6a481faed784cb3 ./themes/ductile/img/minus-plus.png 54e2985a49ef5d1eafd019c7890d6c75 ./themes/ductile/img/sticker-feed.png 2558233ed307b504ee5cec813ed37c9f ./themes/ductile/img/vline.png dbe3fab53a9cc43eece3d59209a87418 ./themes/ductile/_public.php db86ff192b9a6075f37c4ddf1d7c6d9d ./themes/ductile/style.css 77715e7998c3cc76ce825792b2f02bbe ./themes/ductile/mediaqueries.css 6c2b3e77d80b98ac05919672358721bd ./themes/ductile/locales/es/main.lang.php 60cd3466769a335e11f4ea6b6db00b32 ./themes/ductile/locales/es/main.po 4adf562fae0359bd4aa36e1aadb89c22 ./themes/ductile/locales/fr/admin.po d66ff6b9a62937fafb41da71ed5d81fa ./themes/ductile/locales/fr/main.lang.php 6c51801104f237b6412ab46e5ee40df2 ./themes/ductile/locales/fr/help/help.html 857d1d736b0cb9f9ff45f3d4648bb6ab ./themes/ductile/locales/fr/main.po f8066645d51b9e497ff8c4865e31f03b ./themes/ductile/locales/fr/admin.lang.php 41e81a96b9347bb7a5c7926558672005 ./themes/ductile/locales/fr/resources.php 7ae7b77cb1ee2c4fbe40a3280ab47b4e ./themes/ductile/locales/en/main.lang.php 917671c8a29b46c280ecadc16b0c3aac ./themes/ductile/locales/en/help/help.html 464d1bec47c94bd1318a1d0b7591d69d ./themes/ductile/locales/en/main.po 41e81a96b9347bb7a5c7926558672005 ./themes/ductile/locales/en/resources.php 41268b2c9f4e7a588033689d7ff9f89c ./themes/ductile/screenshot.jpg 4159af50efcea03aaba07f9f58235468 ./themes/ductile/ie.css 0dfe98cbc21218a2daff7a07151ccd66 ./themes/ductile/_define.php 86850dc066395abf0744e64d95b2d5e3 ./themes/ductile/ductile.js 62edd4fb3406322296bd66c3c2081070 ./themes/ductile/_prepend.php c90ba66947b711bfee33658fe3025c96 ./themes/ductile/tpl/category.html a5e976790b758994ad969ea3e94d3a01 ./themes/ductile/tpl/search.html 63c792f7acb8dfe5e3eed29ac007b0ee ./themes/ductile/tpl/post.html 1b6b18ef19258f34c5431f359dea0404 ./themes/ductile/tpl/home.html 95b7d209303f23671467f87e4e29807e ./themes/ductile/tpl/_footer.html 47596a4f14bceb700a109b3458ef73e2 ./themes/ductile/tpl/tags.html 5e42a78636e6d115fb79e61ff69bc984 ./themes/ductile/tpl/tag.html a5ee5747e5637b45a607f0120e687b16 ./themes/ductile/tpl/archive.html bcb7e44244165171fac52a21eabb52a0 ./themes/ductile/tpl/_head.html 34649812a2bebcce674b9ed30323c358 ./themes/ductile/tpl/page.html 46dc353bd0c51772de4a22c0859615a1 ./themes/ductile/tpl/_entry-short.html 4daaa93d292732a8c68d131277d42b76 ./themes/ductile/tpl/_simple-entry.html e6e6026081ca871aea27cc12ee542d53 ./themes/ductile/tpl/_pagination.html 9771748371441d110b83d08f72401b5d ./themes/ductile/tpl/_sidebar.html e87b87728be6ba92f9a7a90034fac890 ./themes/ductile/tpl/_entry-title.html 505d80483c1fb86aa066b9692b2633a7 ./themes/ductile/tpl/_top.html 721ad5c59fbf12a1e8902a166d9039eb ./themes/ductile/tpl/_entry-full.html ef6362486283c1307147bd87054a9fca ./themes/ductile/tpl/404.html fc350d1e02fc18fbfba96a7e0e64bd7b ./themes/ductile/tpl/archive_month.html a1650e5c1ff8e9f40ef90828011f91fa ./themes/default/smilies/normal.png 5b36ab1e0f2c2dde883a6e32cc3feebf ./themes/default/smilies/smile.png 51b2f454563975cc4b2fcc07d31ce12d ./themes/default/smilies/alien.png 57a457e1818d6e9419ced9366d2e33dc ./themes/default/smilies/razz.png 5933cf36a8be5147933b6499d589eb01 ./themes/default/smilies/idea.png 1808a6c8affe37c094a038dc983b0ffc ./themes/default/smilies/mrgreen.png 93d6fed1604e9e479f65940e52884ac3 ./themes/default/smilies/lol.png 062fe26eb6105ce6bbc0d133b50c4fcc ./themes/default/smilies/confused.png c1fa8d897b82f938e2abada9bfa7c2c1 ./themes/default/smilies/redface.png 18f5ac3609425f10e910e64d5620edda ./themes/default/smilies/cool.png 25adf8de879b3e83c12ab668bc3c983f ./themes/default/smilies/question.png e8cfd3101dc2a0cdb7a343e1b873a38f ./themes/default/smilies/cry.png c8372d57625893f1c06a409cf1fb84d5 ./themes/default/smilies/sad.png 987742e347ef66bbc2b6b9546a0aa360 ./themes/default/smilies/angry.png 0d16e0502c576f32662ad14dfde3cf53 ./themes/default/smilies/rolleyes.png 32f2a33008491d7c070d70cfc64585c0 ./themes/default/smilies/surprised.png 9ae025a44deba07f3e3fe2c3992e5d9c ./themes/default/smilies/arrow.png 919a6951304ce994203f86edd3f5d359 ./themes/default/smilies/dizzy.png d3671aa8ccb54bbc9b89a83ba202b626 ./themes/default/smilies/smilies.txt 83362893d53db01b5595a7e8021fcdac ./themes/default/smilies/wink.png efe8138e2d0b366a9dcdbe1c6ab75eee ./themes/default/smilies/evil.png d2855d2d68f6467db69219534638f4bb ./themes/default/smilies/exclam.png f97fc26a57559afec46806aa42083d9c ./themes/default/smilies/eek.png acdc336f9249b84310c6bc541d6e66ed ./themes/default/smilies/laugh.png 29dd77d453dbfb1741c8da3ba6ba249a ./themes/default/img/comment.png 27cd823da930f75093736da182b4ac4b ./themes/default/img/tag.png 3f7ae2737f49605199554ccac96dc748 ./themes/default/img/comment-t.png 42fa213bf2a5b110afeb7552767700c6 ./themes/default/img/page-t.png 74eb29efade1edeff692446b5e6f8258 ./themes/default/img/commentmy-b.png 00c87216514466071b4b66c80817e022 ./themes/default/img/attach.png dbd68bffd648954c736e23aa735f0cb6 ./themes/default/img/feed.png f3b1ebaf5a27959228b736f87db11776 ./themes/default/img/page-bg.png c85f9d3ea9319236e67db78be1707478 ./themes/default/img/page-b.png ef130b60877aad5a4cc8d4c5ead17317 ./themes/default/img/commentmy-t.png dff6f47c5dcfce7c1a909f015f43a91b ./themes/default/img/body-bg.png a4dfe9b53d28af14ebf2e87e2f039cef ./themes/default/img/trackback.png e199613e6ec2cead05b92a6f2c76e2ec ./themes/default/img/comment-b.png 398e75326101e8b7918ea39e86b5ac2d ./themes/default/style.css 59a37691a0ae546a67369bba244aa738 ./themes/default/screenshot.jpg 0e0f8449145df6a1959255d4951d3138 ./themes/default/print.css 15c96b177ded4598dffb1b0f58baa425 ./themes/default/_define.php 384772142d1907d7d3aea3ac11fad9d0 ./themes/default/js/jquery.cookie.js fc7799252317d3362365674b327645ee ./themes/default/js/post.js 15875d99749bf85fddca26e1cafcf1a3 ./themes/default/js/jquery.js 2a51fc0ab79d4fea84ce28d118dcfb8e ./CREDITS 3aabddb1f6e4044a7202d46cc45931b7 ./admin/install/wizard.php 3cedd579885e8fb942c1f82f74e214ad ./admin/install/check.php 95912df82c77a392759594a48e3e270a ./admin/install/index.php cd804e4b6a6cb9dc98d32ce3b7048542 ./admin/categories.php 9911c7ad0242c9c458ce36645fe8e18f ./admin/media_item.php 4cccbfe649cafc331fa45cdbc7e996fd ./admin/blogs.php a0ecf3ec8057ca1303eb561d84cb7b7e ./admin/plugins.php adff7d59ec5ef244a168ff3fee6ffbb4 ./admin/post_media.php c31f72f0371563d36ad3d6157457f401 ./admin/users.php 55cda0573b2ecb33e5e678c85ccb54ea ./admin/popup_posts.php 7c34c91500807d9c7eee205ed107dd7c ./admin/search.php d81b074a25f15af5cb535d6f8746fd9a ./admin/plugin.php 4ecdc428040e05c4f44faa42c3c1005c ./admin/style/install/w-logo.png 2e316080e3a95db68273b2cf8b25192d ./admin/style/install/note.png 9a40711a621e5c3fccb4cc1e3fbfcc05 ./admin/style/install/process_warning.png 190e1c5f28112951fc96b1de5b301a25 ./admin/style/install/important.png a9d4db4f30e21559acf9fd825d72db27 ./admin/style/bg_menu.png deaa63b84ee6ef48bc98d12d94fd7b7c ./admin/style/msg-info.png ad11b34241d8c2918c8ca01629da8c5b ./admin/style/msg-success.png c406745bb9fef0c29a5bc66665b3ed07 ./admin/style/bg_wrapper.png deb5c791e787615f52941227f045b37e ./admin/style/loader.gif 3685bd9a4d8f63f2c0ff3dd9065bdc25 ./admin/style/bg_h2.png d94b9055e8a48cdc761f7bc32ca43da6 ./admin/style/dashboard.png 9a40711a621e5c3fccb4cc1e3fbfcc05 ./admin/style/msg-error.png 2e316080e3a95db68273b2cf8b25192d ./admin/style/msg-std.png 2700a162bd941205bff4ad584a01c45f ./admin/style/user.png 91638951de8a0310504f5c1a8e075a63 ./admin/style/dc_logos/w-dotclear240.png 0030969abd550cd0ab92c44116660bc1 ./admin/style/dc_logos/dc_logo_footer.png a936e3760fdecdf6d418191434ebe8f4 ./admin/style/dc_logos/w-dotclear90.png 937c023f1f75980d28f8b09fc2a00af9 ./admin/style/dc_logos/w-dotclear180.png 721d2f53c7ff3d66dfa9afd71ea2539c ./admin/style/dc_logos/b-dotclear120.png 706c7e340cbc130ecabce2b40d465eb0 ./admin/style/dc_logos/sq-logo-32.png 590c285cbd9b49ad8a825113f2bde379 ./admin/style/dashboard-alt.png 74d1b897ea4814c96224cf373707ead3 ./admin/style/texture.png 0b3afe1ae500de3efce2e2d40ccd4022 ./admin/style/settings.png 0f4c059f8aceadfb2dd932e7a02ce22a ./admin/style/cancel.png 3a639a71e87278d85eae7e2b8b3b5768 ./admin/style/search.png 150b740b4124f1bc25ca10da922fd546 ./admin/style/default-rtl.css f279ea7ff96ed28d83b7124959c0b4fd ./admin/style/date-picker.css bf5279398c8f0ad685e2435dd47fa3b6 ./admin/style/install.css 82244e6c9f6b8f3cefa0545468f40d65 ./admin/style/drag.png 190e1c5f28112951fc96b1de5b301a25 ./admin/style/msg-warning.png 901a04bfe5f2565034635cf32ecab0f2 ./admin/style/jsToolBar/bt_ol.png 828adda895735a8624fd819506078af7 ./admin/style/jsToolBar/bt_br.png 47c71f6ee3cf31296ff1f18348748754 ./admin/style/jsToolBar/bt_ins.png db5bb30061ba939ac949e8f4d943806c ./admin/style/jsToolBar/bt_bquote.png e5aae58c14ca63c366fe02acec03d928 ./admin/style/jsToolBar/bt_em.png 94a2fd910832b31e18b4bb4e63f9aa79 ./admin/style/jsToolBar/bt_strong.png e7e674fbd3612010f154475c449b3b79 ./admin/style/jsToolBar/bt_del.png 45f8b4121b4c54f370de17c503572d32 ./admin/style/jsToolBar/bt_img_select.png e9f233c1c309337911b5b03fb9e1dbc4 ./admin/style/jsToolBar/bt_pre.png f96ec6b377358d3f8cd8c10a326dc8d9 ./admin/style/jsToolBar/bt_link.png 16f4bc5f08caa83c9ae4e9254bcfeba0 ./admin/style/jsToolBar/bt_post.png 2ca06c1c3e80079ea378fe061e4cfdc3 ./admin/style/jsToolBar/bt_code.png c3e17ee13b772fd7b679cab16ebf38dd ./admin/style/jsToolBar/bt_img.png bec39e1b92f7729a04342f7f0c38d92d ./admin/style/jsToolBar/bt_clean.png 22ad5189d9d94f9a24af5311ad06805b ./admin/style/jsToolBar/bt_paragraph.png 64cdd7af332808399e65fa0538761c2d ./admin/style/jsToolBar/resize.png 92794e7cb66e02b9a4ab4700fc4fd66e ./admin/style/jsToolBar/jsToolBar.css a3a4c43798d387734737ed81a65eb7f9 ./admin/style/jsToolBar/bt_quote.png 1d8471b427b516adc3362dcd146b4370 ./admin/style/jsToolBar/bt_ul.png d127a4f66abfc4feaa10a10c912128ce ./admin/style/help-mini.png 8bd6b6e03c2b25e0dc1689818d7fa06f ./admin/style/default.css caa11e523e5a3ed38d90480bed5d5a73 ./admin/style/loader.png b1fd1e1ab07181c3932aa4b850639219 ./admin/style/modal/modal.css 14a0936bd54fd18c22b5e7fb86ba26a3 ./admin/style/modal/loader.gif 4134330cedefac4a9075a7756ca496bd ./admin/style/modal/close.png f867b3d528c8fadbd4ca1368b9decac6 ./admin/style/help12.png ae8b1eebaf7bc144e2bdba06917f34b3 ./admin/style/iesucks.css f6461f239f68fca689ea44c090039b81 ./admin/style/farbtastic/farbtastic.css 2b6d304868ff398c17252b7b0a0414c4 ./admin/style/farbtastic/wheel.png c6dc921c0d6f2197793d9174b4267ca0 ./admin/style/farbtastic/mask.png 5a7ae1d8c8b2343a9e5a4aebf4234392 ./admin/style/farbtastic/marker.png 9c3e7b71f42e2d6c64b52fe7d46d5f16 ./admin/style/grid.png b001109542000a150fc8b636907074b3 ./admin/posts_actions.php 8f7da530415013a69c583512058e902a ./admin/update.php 613484c8467637e05d615d496d00187a ./admin/auth.php a57c19d1725b055607051a86bbffe5b7 ./admin/preferences.php eb7909a2ebf80b906fce7d357f1e210b ./admin/comment.php 54126a25b2333bead3320202455b4a26 ./admin/user.php 1b8f719d2ef46aa34750f71a29bace13 ./admin/services.php 5ae4229e7a1c2e48a921482ff75ee9b5 ./admin/_charte.php 398dc6b244ea677e1078baa27e27065e ./admin/posts.php 4c4b3b34f634030f6cdaec7030004f40 ./admin/blog_del.php 840897d17a40aabf5e0e64892c5a2cda ./admin/blog_pref.php 76c13e9799e599fb65eadac75b4ae9c9 ./admin/category.php 77c2c75f8349a0f1ffac1303f028d139 ./admin/comments_actions.php 67118cd36c17ce24e6ce3a6cce6ba549 ./admin/popup_link.php ca10b147e17424e34e327795cfeb1ca9 ./admin/js/_update.js 8ec6bae3c2cbd8877b72367eb04bb05e ./admin/js/_plugins.js fbc2b75ff3359d72d80468fe0eb91ffb ./admin/js/_preferences-dragdrop.js dade7086289a397f147faaed67464840 ./admin/js/meta-editor.js 099314766a593b2f873c6876ebd35d70 ./admin/js/confirm-close.js 189611cfd4bbc118071e270fa28cd733 ./admin/js/_blog_theme.js dedfb45fa1c15e025d9694fb5f1a6115 ./admin/js/common.js 5e8347a6a4ff7124abd6ff9b4c37de80 ./admin/js/_users_actions.js a8db0a23181462d5b07f32c916041d0f ./admin/js/jsUpload/load-image.js c9f68301b2d66f9f059526c3dddc44d0 ./admin/js/jsUpload/template-upload.js 7bdae1bd964ad08b801fab708691b1cb ./admin/js/jsUpload/template-download.js 09711acd9d2efba64f5a4270ec72cb57 ./admin/js/jsUpload/jquery.fileupload.js 487d5e5434beb03193861df573f01a93 ./admin/js/jsUpload/jquery.iframe-transport.js 23a8f0c0a8e9febbf563aef9fb28f2b0 ./admin/js/jsUpload/jquery.fileupload-resize.js d27b6960a94c451af5330eafd81daf3c ./admin/js/jsUpload/jquery.fileupload-ui.js 5e2855f4f4a4fd07ac343c9f0823d67f ./admin/js/jsUpload/tmpl.js 0da6f8ef76956f6ce7842dcf8941d1fa ./admin/js/jsUpload/jquery.fileupload-process.js f479494e3c298af1be1f4b1164cf484f ./admin/js/jsUpload/vendor/jquery.ui.widget.js e27e3f45d6bc44525c305a7176ea7361 ./admin/js/_posts_actions.js 456bb086662a6d62f90dab7e2fd8dc4b ./admin/js/_categories.js c1b4cb5380ff28b380be5bc4e2229632 ./admin/js/_comment.js 9939d601494745436e1578ce4869da8e ./admin/js/_index.js 6bf01fb372181da6b889b0493f6b9b09 ./admin/js/_trackbacks.js 51b466789ff6ab052f1daab8849f998f ./admin/js/filter-controls.js 9e1a7b115659ff366e27f47e132ce3eb ./admin/js/date-picker.js 98d7fa03e3ec2bf1cc1b262c48eff4c0 ./admin/js/tool-man/cookies.js 3a02c80f9a50a80c2a1dba3d3e5a0822 ./admin/js/tool-man/css.js a229d56a22fa113a7e7af7a6c7bf4f38 ./admin/js/tool-man/drag.js f5db311fe3221c2118805ecb71a4562e ./admin/js/tool-man/events.js e0561effb0c88d8c59d99b178b9c7f9a ./admin/js/tool-man/core.js a7d2fda57130169943be97e1c2136c0a ./admin/js/tool-man/dragsort.js 0aa93e05b5dc312b033a0e633e4a06d6 ./admin/js/tool-man/coordinates.js 887ed9e671d5ffb4986e836136335d87 ./admin/js/color-picker.js 309b6faed48bc419e59ec0c374539c61 ./admin/js/jquery/jquery.modal.js 60a3cdb18105b18be567761aca1052bb ./admin/js/jquery/jquery.biscuit.js 946d83fa633503271865d8308d82eaf5 ./admin/js/jquery/jquery.mjs.nestedSortable.js c17889482c149bfa6699178243ea0fd4 ./admin/js/jquery/jquery.pageTabs.js 39830dca802451300876ea85dde0d1c3 ./admin/js/jquery/jquery.bgFade.js 95e31299258ec02b10528737489cfcbe ./admin/js/jquery/jquery-ui.custom.js 5c6b25c9a514a085dbfd3ef3cba42e08 ./admin/js/jquery/jquery.autocomplete.js 7d87ce904ab76326bff3147c72a45b2a ./admin/js/jquery/jquery-migrate-1.2.1.js 73c8f2428f94f9d366775c0dca1cd37b ./admin/js/jquery/jquery.farbtastic.js 91515770ce8c55de23b306444d8ea998 ./admin/js/jquery/jquery.js ef0d24ca6a99aab62aa3af89d068544d ./admin/js/jquery/jquery.pwstrength.js 628d9cf567b3218473f10e1b0dd1a54d ./admin/js/_post.js 109f08c9f3d3e7acf763838281b3580b ./admin/js/_langs.js 12780c953f2f378e0ded93cabbeafdd3 ./admin/js/_blog_pref.js 76b6bb5e90b5dcd0a2f6f68a8813e7a9 ./admin/js/_comments.js 0bab19565f23b2187e0dfed046935ba7 ./admin/js/_category.js a858489863d312e5b5e02a89885cc3ae ./admin/js/ie7/IE8.js 45becbb1ba3486fa9961b9c47614d2a0 ./admin/js/ie7/blank.gif 0fab28bbd69e603dd60cf8676fe2e091 ./admin/js/ie7/IE7.js e94e0c941ea37d090c39ef10c06a02f5 ./admin/js/ie7/ie7-squish.js ac0bc06ec87e877e09a5b687ba05257e ./admin/js/ie7/ie7-recalc.js 6bab88f0923e32b6f7af848c600e1f0f ./admin/js/ie7/IE9.js 8d677fb86fecbc3573f20b291898f5e9 ./admin/js/ie7/ie7-hashchange.js 9867b35bca58ce0779d70e2a4a424162 ./admin/js/dragsort-tablerows.js dec30499869e40909455d1c89c15a116 ./admin/js/_users.js 5bd077096eeb2e8a93ea2d0e4b093e5a ./admin/js/_media_item.js edd60f896d6105461b228a71ff935ea9 ./admin/js/jsToolBar/popup_link.js 8bec025b6cde2ae4e839a353e3a029f7 ./admin/js/jsToolBar/jsToolBar.wysiwyg.js 0ae22e9667ab70af95826abc53997610 ./admin/js/jsToolBar/jsToolBar.dotclear.js 1e3ea0653f749e1178f7c809a391db31 ./admin/js/jsToolBar/popup_media.js 104c44094886b958f9b9602d2219a00b ./admin/js/jsToolBar/jsToolBar.js bba9a0f6c6f4e32ed1793a87f0636d9f ./admin/js/jsToolBar/popup_posts.js 9bd28a654b3c39d8105bba4478ba75c6 ./admin/js/prelude.js 27e07380f3ee59d8748e0d8d54d7c36f ./admin/js/_preferences.js 444926995c95b69e00679a87292ea049 ./admin/js/_posts_list.js 8be5a89e325dda4ba8438ee31e03dd3a ./admin/js/_media.js 9863132f5fac82a695f4f109318e9e81 ./admin/langs.php 636cdc599de131a52e3e1354efb82d6e ./admin/index.php fc6f578037554fd953bd2d0b9af31611 ./admin/post.php 6e235954c5046c66b23ca80d13149859 ./admin/images/favicon.ico 4e1401645c408f6cf561425287c091b4 ./admin/images/check-off.png f86e9d6679d8b27334bbb8df82b1c7d9 ./admin/images/expand.png 1eaa6675e93550119cfee871b3fc5746 ./admin/images/logout.png 0aeae74759e4646335a6c080b10cd0e1 ./admin/images/check-wrn.png 6dddf7eeedf6bf18d6e985277ce75150 ./admin/images/check-on.png f68879a48fd05891001de3bb29397a7c ./admin/images/collapser-hide.png 459d9ee1fdd745538cd8b1307b73a250 ./admin/images/outgoing.png 7db58824233570e6483fb274893999a3 ./admin/images/superadmin.png 5b44d1ff090eec776b78a94110d720b0 ./admin/images/dotclear_pw.png 7e9c0f46ae195ca0e56c98eeb3bf0b8c ./admin/images/media/video.png de48add46e7e0de6d1f7f584670e24f8 ./admin/images/media/text.png e834d454494e938a5e760b60635d247d ./admin/images/media/executable.png b631652de9f1a68c445bac885b5d9426 ./admin/images/media/document.png d34d7a3425948afd2ebfb964cc512c02 ./admin/images/media/blank.png 60ec5e861e9522e846507069f8665a96 ./admin/images/media/folder.png 4ee1ce3a589af3810272bfd6a5713fbb ./admin/images/media/folder-up.png f6d84ab70c75533ade804c7572fbe041 ./admin/images/media/package.png a1fb6ecd73a0f304fe6c3a896910f4c1 ./admin/images/media/spreadsheet.png 5c374eae81e3d2862f6e0dc4075e290b ./admin/images/media/presentation.png d2d013ea21ed51ac7ff3ddbda74d9fee ./admin/images/media/image.png 31af2ad591e64ca45c5f82a70c2726ab ./admin/images/media/audio.png 80031e4ac1c6d299e9f579d5527f333e ./admin/images/media/html.png d631711cd6b1c8e9d05a16afe487fda4 ./admin/images/up.png fb1efaa99356968adf4768c8e453314b ./admin/images/favicon96-logout.png f6e83db1b4889f382279abb7ad7c9076 ./admin/images/junk.png e70ccff668fabd8748939f7c59687fc6 ./admin/images/disabled_up.png 4ce93257a1db2a2f8221038c4dde521e ./admin/images/trash.png 800e5dbf8da00dd30e4e2605cc5740e0 ./admin/images/hidden.png 4342ed56b14ebbd0a83743fd84d907dd ./admin/images/noscreenshot.png 21d31ef6dad45bbdd32bbe358169952b ./admin/images/selected.png b8b98f55d1fdc6a1d42b258b0d44e19c ./admin/images/trackbacks.png 02437c955382fa358b357632557a6f4e ./admin/images/attach.png e3eded47fe75f0c4a016d4c33599f381 ./admin/images/down.png 87e970056de2a4736a7fcf9f57ed1559 ./admin/images/minus-theme.png e7899b60a125f15b9a6260ef46f12b10 ./admin/images/hide.png 51d7908f0c2b88ac57d72a484cef9267 ./admin/images/date-picker.png 6916f39ce1ce090205afe59079a649ac ./admin/images/plus.png 4fe8a12e5ddb38dabfaa0aa645b13b40 ./admin/images/pagination/no-previous.png 9cf67eb4a07c26deef7e93535f637484 ./admin/images/pagination/no-next.png 59de9b50f57e2bce9682bb405a27378f ./admin/images/pagination/last.png e2a99e0422a5e2aa0acbbcdaf02ee3ec ./admin/images/pagination/first.png 48cc8d4b79df9263401ce310334d91d1 ./admin/images/pagination/no-last.png 79c8a535a9c514d68a9c1c68cf82640d ./admin/images/pagination/previous.png 06603b08efad7f326b95a2263a996c71 ./admin/images/pagination/no-first.png e1c7bb63e4606356a673d44903fd212c ./admin/images/pagination/next.png e15ba83ae56066bb66fa01f44bfb9630 ./admin/images/comments.png 1e4d8ca4bf4312cf420f8dfbbde085e6 ./admin/images/edit-mini.png f86e9d6679d8b27334bbb8df82b1c7d9 ./admin/images/menu_off.png 81c065f487dce8fdc90227afccf6ffab ./admin/images/menu_on.png fa537ec189e79fc680c0ab4013f58345 ./admin/images/disabled_down.png 90dfe5cf55ac8b907f4b5f68a346292a ./admin/images/outgoing-blue.png 086e1391dae0016e2debd914b14652c3 ./admin/images/admin.png 7897b304c3b84dd88c84b4faf2bf22c3 ./admin/images/palette-traviata.png 39b5ab7c22a6cb7da6df412fc9fea091 ./admin/images/page_help.png 9040d188e4c62378cef4430c107c40a6 ./admin/images/picker.png 67771042873a5363d0cdbed0712e8273 ./admin/images/scheduled.png 67b1b41254a04878389609d4dcdfb519 ./admin/images/favicon96-login.png 95b484bb06d7f7b49a31cef537436178 ./admin/images/locker.png c8f1679e034fc73287020efc7c678b00 ./admin/images/module.png 36481e956d2963f9c0fbf5ae4c3280c6 ./admin/images/collapser-show.png 406e8ef04d7c12fe3a5a0aa4825db9c0 ./admin/images/plus-theme.png 0dc9eff2237ac5db8ab4f965afda5e5b ./admin/images/menu/media.png 8c28969fb7aaa86edb4090138d04e5cb ./admin/images/menu/update.png f5fb2209d01f637ec42337055c55daf6 ./admin/images/menu/blog-pref.png f7f647e7e52c93f6e5857ebd3317e105 ./admin/images/menu/users.png bd2884a9ccabcc2925082fdba3d46cdb ./admin/images/menu/blog-pref-b.png 7f41c02f3fe2b65ca4d43bfff025ec22 ./admin/images/menu/user-pref.png 0842073f612bafec3ae7de9d4370d8e6 ./admin/images/menu/comments-b.png 163fc691011e2645f6be23910721319d ./admin/images/menu/themes.png ce5d0dc5a6791146fe132abc853894d8 ./admin/images/menu/entries.png 258104057fd4194c8ade47b0dfe1f9e1 ./admin/images/menu/edit.png b8b0c7511e8576871b5c3fee957c2125 ./admin/images/menu/langs-b.png 843a818845c0880ab97a998d103fde92 ./admin/images/menu/users-b.png 2f570397229aab7dd24eba6098f8b133 ./admin/images/menu/user-pref-b.png d993338667aaedbe5c0880104d956cab ./admin/images/menu/edit-b.png 217b0933c61725bd748113919c0c7542 ./admin/images/menu/categories.png f975d8c6ca104cf4ea6f549fe6f18bc1 ./admin/images/menu/help-b.png 5950b499c393b8a412286f54b36351aa ./admin/images/menu/search.png ff4d2c96c531cadc74c659930eb9236b ./admin/images/menu/media-b.png 605fc9151fca5c7459794f66ae4dec11 ./admin/images/menu/plugins.png 720bf81125a9d8fc9f05c78b48349ee2 ./admin/images/menu/search-b.png 065b3b5ba91a415878cba1e65321d1bd ./admin/images/menu/categories-b.png 424101f448a7c8d320cb2faca51d8cd1 ./admin/images/menu/plugins-b-update.png 693c9595c7c0f901597f925484958d6c ./admin/images/menu/plugins-b.png 0f2464c20cdd12bf5ddbbf30076c439f ./admin/images/menu/comments.png af8750696db8e4ad024a6559cf0eeaa4 ./admin/images/menu/help.png 255650d2b383249d6779da0c59d7f164 ./admin/images/menu/blog-theme-b.png cc74cb34712a6e99ef817fc0d3d1b5d7 ./admin/images/menu/blog-theme-b-update.png 018a188108346f7bb098a48a7bb45d3d ./admin/images/menu/entries-b.png fd676c3e77266d2359843151a41cc711 ./admin/images/menu/blogs.png a85a2f2d1bd79c8f822fad0b93f95d0c ./admin/images/menu/blogs-b.png 84f20c709e92f600742a55cea6e7d788 ./admin/images/menu/langs.png ab038522ae5a81316b99104138f11802 ./admin/blog.php b808b97185ec759ec18caadb74bb43d1 ./admin/users_actions.php 45d9de599999e55783e2b0888b4eaa9b ./admin/comments.php 8be9d25d0f6c5f172c4bac91348eb210 ./admin/xmlrpc.php de0a703540f0ae1e2cee71329d69e0ac ./admin/blog_theme.php 5fe998d7c12682ad35fe63d64fdc6c2d ./admin/media.php 0651861e5a4c69cf0ca71e58bbb474de ./admin/help.php dotclear-2.6.2+dfsg/inc/libs/000077500000000000000000000000001230033266200157345ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/000077500000000000000000000000001230033266200202205ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/.atoum.coverage.php000066400000000000000000000007331230033266200237310ustar00rootroot00000000000000addWriter($stdOutWriter); // Coverage $coverageField = new atoum\report\fields\runner\coverage\html('Clearbricks', '/var/www/coverage/clearbricks'); $coverageField->setRootUrl('http://localhost/coverage/clearbricks'); $cliReport->addField($coverageField); $runner->addReport($cliReport); dotclear-2.6.2+dfsg/inc/libs/clearbricks/.atoum.php000066400000000000000000000004431230033266200221350ustar00rootroot00000000000000addWriter($stdOutWriter); $runner->addTestsFromPattern('tests/unit/*');; $runner->addReport($cliReport); dotclear-2.6.2+dfsg/inc/libs/clearbricks/Makefile000066400000000000000000000017711230033266200216660ustar00rootroot00000000000000SHELL=/bin/sh DIST=_dist CB=$(DIST)/clearbricks default: @echo "make config or make dist" config: mkdir -p ./$(CB) ## Copy needed files and folders find ./ -mindepth 1 -maxdepth 1 -type d \ -not -regex '.*svn.*' \ -not -name '_dist' \ -not -name 'debian' \ -not -name 'tests' \ -exec cp -r \{\} ./$(CB) \; ## Copy _common.php and README files cp _common.php README.md ./$(CB)/ ## Remove .svn folders find ./$(CB)/ -type d -name '.svn' -print0 | xargs -0 rm -rf touch config-stamp dist: config dist-tgz dist-zip deb: cp ./README.md debian/README dpkg-buildpackage -rfakeroot dist-tgz: [ -f config-stamp ] cd $(DIST) && tar cfz clearbricks-$$(grep CLEARBRICKS_VERSION clearbricks/common/_main.php | cut -d"'" -f4).tar.gz ./clearbricks dist-zip: [ -f config-stamp ] cd $(DIST) && zip -r9 clearbricks-$$(grep CLEARBRICKS_VERSION clearbricks/common/_main.php | cut -d"'" -f4).zip ./clearbricks clean: [ -f config-stamp ] rm -rf $(DIST) rm -f config-stamp build-stamp configure-stamp dotclear-2.6.2+dfsg/inc/libs/clearbricks/README.md000066400000000000000000000043311230033266200215000ustar00rootroot00000000000000# Clearbricks ## What is this? No, Clearbricks is not yet another framework. Clearbricks is not cool at all and does not even have a nice website. It won't make you smart neither have great ideas for you. Clearbricks is only about code and efficiency, consider it as a toolbox. And please, do me a favor, don't call it a framework :-) ## How do I use it? Clearbricks is about "using what we need when we need it". Pick the module(s) you need and add it to your code. The only thing you'll always need is the "common" directory. Once you're ready, you have to create a _common.php file on top of your Clearbricks path (or wherever you want) and add `$__autoload` entries for your modules. Take a look at the _common.php file. Of course, you're encouraged to use the `$__autoload` magic for your own classes. ## Use it with Mercurial You may think that all this subdirectories is a mess. You're quite right. But one day, you'll find it cool to use Clearbricks modules in your mercurial repository as [a subrepository][1]. This day, you'll love me :-) Here is an example of using Clearbricks and dbLayer in your own repository as an external property, using [subrepositories documentation][2]: :::sh $ hg clone https://hg.clearbricks.org/hg path/to/clearbricks $ echo 'path/to/clearbricks https://hg.clearbricks.org/hg' >> .hgsub Save and push. Then, you can create a _common.php file wich will contain: :::php dotclear-2.6.2+dfsg/inc/libs/clearbricks/bin/000077500000000000000000000000001230033266200207705ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/bin/atoum000077700000000000000000000000001230033266200276352../vendor/atoum/atoum/bin/atoumustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/common/000077500000000000000000000000001230033266200215105ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/common/_main.php000066400000000000000000000032621230033266200233070ustar00rootroot00000000000000 dirname(__FILE__).'/lib.crypt.php', 'dt' => dirname(__FILE__).'/lib.date.php', 'files' => dirname(__FILE__).'/lib.files.php', 'path' => dirname(__FILE__).'/lib.files.php', 'form' => dirname(__FILE__).'/lib.form.php', 'formSelectOption' => dirname(__FILE__).'/lib.form.php', 'html' => dirname(__FILE__).'/lib.html.php', 'http' => dirname(__FILE__).'/lib.http.php', 'text' => dirname(__FILE__).'/lib.text.php' ); # autoload for clearbricks function cb_autoload($name) { global $__autoload; if (isset($__autoload[$name])) { require_once $__autoload[$name]; } } # if php version >= 5.1.2, we can benefit from spl_autoload_register, # so other libraries can define their own independent autoload too if (function_exists("spl_autoload_register")) { spl_autoload_register("cb_autoload"); } else { # otherwise we define a classic autoload function for older php... function __autoload($name) { cb_autoload($name); } } # We only need l10n __() function require_once dirname(__FILE__).'/lib.l10n.php'; # We set default timezone to avoid warning dt::setTZ('UTC'); # JSON functions for PHP < 5.2 or PHP > 5.2 compiling without json require_once dirname(__FILE__).'/lib.json.php'; ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/common/lib.crypt.php000066400000000000000000000036371230033266200241400ustar00rootroot00000000000000$data, using the said $key * and $hashfunc as hash method (sha1 or md5 are accepted.) * * @param string $key Hash key * @param string $data Data * @param string $hashfunc Hash function (md5 or sha1) * @return string */ public static function hmac($key,$data,$hashfunc='sha1') { if ($hashfunc != 'sha1') { $hashfunc = 'md5'; } if (function_exists('hash_hmac')) { return hash_hmac($hashfunc,$data,$key); } $blocksize=64; if (strlen($key)>$blocksize) { $key=pack('H*', $hashfunc($key)); } $key=str_pad($key,$blocksize,chr(0x00)); $ipad=str_repeat(chr(0x36),$blocksize); $opad=str_repeat(chr(0x5c),$blocksize); $hmac = pack('H*',$hashfunc(($key^$opad).pack('H*',$hashfunc(($key^$ipad).$data)))); return bin2hex($hmac); } /** * Password generator * * Returns an 8 characters random password. * * @todo Add a length param * * @return string */ public static function createPassword() { $pwd = array(); $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'; $chars2 = '$!@'; foreach (range(0,7) as $i) { $pwd[] = $chars[rand(0,strlen($chars)-1)]; } $pos1 = array_rand(array(0,1,2,3)); $pos2 = array_rand(array(4,5,6,7)); $pwd[$pos1] = $chars2[rand(0,strlen($chars2)-1)]; $pwd[$pos2] = $chars2[rand(0,strlen($chars2)-1)]; return implode('',$pwd); } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/common/lib.date.php000066400000000000000000000125441230033266200237110ustar00rootroot00000000000000 $v) { $g = explode('/',$k); $tmp[$g[0]][$k] = $v; } $res = $tmp; } } return $res; } private static function _callback($args) { $b = array(1=>'_Jan',2=>'_Feb',3=>'_Mar',4=>'_Apr',5=>'_May',6=>'_Jun', 7=>'_Jul',8=>'_Aug',9=>'_Sep',10=>'_Oct',11=>'_Nov',12=>'_Dec'); $B = array(1=>'January',2=>'February',3=>'March',4=>'April', 5=>'May',6=>'June',7=>'July',8=>'August',9=>'September', 10=>'October',11=>'November',12=>'December'); $a = array(1=>'_Mon',2=>'_Tue',3=>'_Wed',4=>'_Thu',5=>'_Fri', 6=>'_Sat',0=>'_Sun'); $A = array(1=>'Monday',2=>'Tuesday',3=>'Wednesday',4=>'Thursday', 5=>'Friday',6=>'Saturday',0=>'Sunday'); return __(${$args[1]}[(integer) $args[2]]); } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/common/lib.files.php000066400000000000000000000323331230033266200240740ustar00rootroot00000000000000 'application/vnd.oasis.opendocument.text', 'odp' => 'application/vnd.oasis.opendocument.presentation', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', 'sxw' => 'application/vnd.sun.xml.writer', 'sxc' => 'application/vnd.sun.xml.calc', 'sxi' => 'application/vnd.sun.xml.impress', 'ppt' => 'application/mspowerpoint', 'doc' => 'application/msword', 'xls' => 'application/msexcel', 'rtf' => 'application/rtf', 'pdf' => 'application/pdf', 'ps' => 'application/postscript', 'ai' => 'application/postscript', 'eps' => 'application/postscript', 'json' => 'application/json', 'xml' => 'application/xml', 'bin' => 'application/octet-stream', 'exe' => 'application/octet-stream', 'bz2' => 'application/x-bzip', 'deb' => 'application/x-debian-package', 'gz' => 'application/x-gzip', 'jar' => 'application/x-java-archive', 'rar' => 'application/rar', 'rpm' => 'application/x-redhat-package-manager', 'tar' => 'application/x-tar', 'tgz' => 'application/x-gtar', 'zip' => 'application/zip', 'aiff' => 'audio/x-aiff', 'ua' => 'audio/basic', 'mp3' => 'audio/mpeg3', 'mid' => 'audio/x-midi', 'midi' => 'audio/x-midi', 'ogg' => 'application/ogg', 'ra' => 'audio/x-pn-realaudio', 'ram' => 'audio/x-pn-realaudio', 'wav' => 'audio/x-wav', 'wma' => 'audio/x-ms-wma', 'swf' => 'application/x-shockwave-flash', 'swfl' => 'application/x-shockwave-flash', 'bmp' => 'image/bmp', 'gif' => 'image/gif', 'ico' => 'image/vnd.microsoft.icon', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'jpe' => 'image/jpeg', 'png' => 'image/png', 'svg' => 'image/svg+xml', 'tiff' => 'image/tiff', 'tif' => 'image/tiff', 'xbm' => 'image/x-xbitmap', 'css' => 'text/css', 'csv' => 'text/csv', 'js' => 'text/javascript', 'html' => 'text/html', 'htm' => 'text/html', 'txt' => 'text/plain', 'rtf' => 'text/richtext', 'rtx' => 'text/richtext', 'mpg' => 'video/mpeg', 'mpeg' => 'video/mpeg', 'mpe' => 'video/mpeg', 'ogv' => 'video/ogg', 'viv' => 'video/vnd.vivo', 'vivo' => 'video/vnd.vivo', 'qt' => 'video/quicktime', 'mov' => 'video/quicktime', 'mp4' => 'video/mp4', 'm4v' => 'video/x-m4v', 'flv' => 'video/x-flv', 'avi' => 'video/x-msvideo', 'wmv' => 'video/x-ms-wmv' ); /** * Directory scanning * * Returns a directory child files and directories. * * @param string $d Path to scan * @param boolean $order Order results * @return array */ public static function scandir($d,$order=false) { $res = array(); $dh = @opendir($d); if ($dh === false) { throw new Exception(__('Unable to open directory.')); } while (($f = readdir($dh)) !== false) { $res[] = $f; } closedir($dh); sort($res); if ($order) { rsort($res); } return $res; } /** * File extension * * Returns a file extension. * * @param string $f File name * @return string */ public static function getExtension($f) { $f = explode('.',basename($f)); if (count($f) <= 1) { return ''; } return strtolower($f[count($f)-1]); } /** * MIME type * * Returns a file MIME type, based on static var {@link $mimeType} * * @param string $f File name * @return string */ public static function getMimeType($f) { $ext = self::getExtension($f); $types = self::mimeTypes(); if (isset($types[$ext])) { return $types[$ext]; } else { return 'text/plain'; } } /** * MIME types * * Returns all defined MIME types. * * @return array */ public static function mimeTypes() { return self::$mimeType; } /** * New MIME types * * Append new MIME types to defined MIME types. * * @param array $tab New MIME types. */ public static function registerMimeTypes($tab) { self::$mimeType = array_merge(self::$mimeType, $tab); } /** * Is a file or directory deletable. * * Returns true if $f is a file or directory and is deletable. * * @param string $f File or directory * @return boolean */ public static function isDeletable($f) { if (is_file($f)) { return is_writable(dirname($f)); } elseif (is_dir($f)) { return (is_writable(dirname($f)) && count(files::scandir($f)) <= 2); } } /** * Recursive removal * * Remove recursively a directory. * * @param string $dir Directory patch * @return boolean */ public static function deltree($dir) { $current_dir = opendir($dir); while($entryname = readdir($current_dir)) { if (is_dir($dir.'/'.$entryname) and ($entryname != '.' and $entryname!='..')) { if (!files::deltree($dir.'/'.$entryname)) { return false; } } elseif ($entryname != '.' and $entryname!='..') { if (!@unlink($dir.'/'.$entryname)) { return false; } } } closedir($current_dir); return @rmdir($dir); } /** * Touch file * * Set file modification time to now. * * @param string $f File to change */ public static function touch($f) { if (is_writable($f)) { if (function_exists('touch')) { @touch($f); } else { # Very bad hack @file_put_contents($f,file_get_contents($f)); } } } /** * Directory creation. * * Creates directory $f. If $r is true, attempts to create needed parents * directories. * * @param string $f Directory to create * @param boolean $r Create parent directories */ public static function makeDir($f,$r=false) { if (empty($f)) { return; } if (DIRECTORY_SEPARATOR == '\\') { $f = str_replace('/','\\',$f); } if (is_dir($f)) { return; } if ($r) { $dir = path::real($f,false); $dirs = array(); while (!is_dir($dir)) { array_unshift($dirs,basename($dir)); $dir = dirname($dir); } foreach ($dirs as $d) { $dir .= DIRECTORY_SEPARATOR.$d; if ($d != '' && !is_dir($dir)) { self::makeDir($dir); } } } else { if (@mkdir($f) === false) { throw new Exception(__('Unable to create directory.')); } self::inheritChmod($f); } } /** * Mode inheritage * * Sets file or directory mode according to its parent. * * @param string $file File to change */ public static function inheritChmod($file) { if (!function_exists('fileperms') || !function_exists('chmod')) { return false; } if (self::$dir_mode != null) { return @chmod($file,self::$dir_mode); } else { return @chmod($file,fileperms(dirname($file))); } } /** * Changes file content. * * Writes $f_content into $f file. * * @param string $f File to edit * @param string $f_content Content to write */ public static function putContent($f, $f_content) { if (file_exists($f) && !is_writable($f)) { throw new Exception(__('File is not writable.')); } $fp = @fopen($f, 'w'); if ($fp === false) { throw new Exception(__('Unable to open file.')); } fwrite($fp,$f_content,strlen($f_content)); fclose($fp); return true; } /** * Human readable file size. * * @param integer $size Bytes * @return string */ public static function size($size) { $kb = 1024; $mb = 1024 * $kb; $gb = 1024 * $mb; $tb = 1024 * $gb; if($size < $kb) { return $size." B"; } else if($size < $mb) { return round($size/$kb,2)." KB"; } else if($size < $gb) { return round($size/$mb,2)." MB"; } else if($size < $tb) { return round($size/$gb,2)." GB"; } else { return round($size/$tb,2)." TB"; } } /** * Converts a human readable file size to bytes. * * @param string $v Size * @return integer */ public static function str2bytes($v) { $v = trim($v); $last = strtolower(substr($v,-1,1)); switch($last) { case 'g': $v *= 1024; case 'm': $v *= 1024; case 'k': $v *= 1024; } return $v; } /** * Upload status * * Returns true if upload status is ok, throws an exception instead. * * @param array $file File array as found in $_FILES * @return boolean */ public static function uploadStatus($file) { if (!isset($file['error'])) { throw new Exception(__('Not an uploaded file.')); } switch ($file['error']) { case UPLOAD_ERR_OK: return true; case UPLOAD_ERR_INI_SIZE: case UPLOAD_ERR_FORM_SIZE: throw new Exception(__('The uploaded file exceeds the maximum file size allowed.')); return false; case UPLOAD_ERR_PARTIAL: throw new Exception(__('The uploaded file was only partially uploaded.')); return false; case UPLOAD_ERR_NO_FILE: throw new Exception(__('No file was uploaded.')); return false; case UPLOAD_ERR_NO_TMP_DIR: throw new Exception(__('Missing a temporary folder.')); return false; case UPLOAD_ERR_CANT_WRITE: throw new Exception(__('Failed to write file to disk.')); return false; default: return true; } } # Packages generation methods # /** * Recursive directory scanning * * Returns an array of a given directory's content. The array contains * two arrays: dirs and files. Directory's content is fetched recursively. * * @param string $dirName Directory name * @param array $contents Contents array. Leave it empty * @return array */ public static function getDirList($dirName, &$contents = null) { if (!$contents) { $contents = array('dirs'=> array(),'files' => array()); } $exclude_list=array('.','..','.svn'); if (empty($res)) { $res = array(); } $dirName = preg_replace('|/$|','',$dirName); if (!is_dir($dirName)) { throw new Exception(sprintf(__('%s is not a directory.'),$dirName)); } $contents['dirs'][] = $dirName; $d = @dir($dirName); if ($d === false) { throw new Exception(__('Unable to open directory.')); } while($entry = $d->read()) { if (!in_array($entry,$exclude_list)) { if (is_dir($dirName.'/'.$entry)) { files::getDirList($dirName.'/'.$entry, $contents); } else { $contents['files'][] = $dirName.'/'.$entry; } } } $d->close(); return $contents; } /** * Filename cleanup * * Removes unwanted characters in a filename. * * @param string $n Filename * @return string */ public static function tidyFileName($n) { $n = text::deaccent($n); $n = preg_replace('/^[.]/u','',$n); return preg_replace('/[^A-Za-z0-9._-]/u','_',$n); } } /** * Path manipulation utilities * * @package Clearbricks * @subpackage Common */ class path { /** * Returns the real path of a file. * * If parameter $strict is true, file should exist. Returns false if * file does not exist. * * @param string $p Filename * @param boolean $strict File should exists * @return string */ public static function real($p,$strict=true) { $os = (DIRECTORY_SEPARATOR == '\\') ? 'win' : 'nix'; # Absolute path? if ($os == 'win') { $_abs = preg_match('/^\w+:/',$p); } else { $_abs = substr($p,0,1) == '/'; } # Standard path form if ($os == 'win') { $p = str_replace('\\','/',$p); } # Adding root if !$_abs if (!$_abs) { $p = dirname($_SERVER['SCRIPT_FILENAME']).'/'.$p; } # Clean up $p = preg_replace('|/+|','/',$p); if (strlen($p) > 1) { $p = preg_replace('|/$|','',$p); } $_start = ''; if ($os == 'win') { list($_start,$p) = explode(':',$p); $_start .= ':/'; } else { $_start = '/'; } $p = substr($p,1); # Go through $P = explode('/',$p); $res = array(); for ($i=0;$i 0) { array_pop($res); } } else { array_push($res,$P[$i]); } } $p = $_start.implode('/',$res); if ($strict && !@file_exists($p)) { return false; } return $p; } /** * Returns a clean file path * * @param string $p File path * @return string */ public static function clean($p) { $p = str_replace('..','',$p); $p = preg_replace('|/{2,}|','/',$p); $p = preg_replace('|/$|','',$p); return $p; } /** * Path information * * Returns an array of information: * - dirname * - basename * - extension * - base (basename without extension) * * @param string $f File path */ public static function info($f) { $p = pathinfo($f); $res = array(); $res['dirname'] = $p['dirname']; $res['basename'] = $p['basename']; $res['extension'] = isset($p['extension']) ? $p['extension'] : ''; $res['base'] = preg_replace('/\.'.preg_quote($res['extension'],'/').'$/','',$res['basename']); return $res; } /** * Full path with root * * Returns a path with root concatenation unless path begins with a slash * * @param string $p File path * @param string $root Root path * @return string */ public static function fullFromRoot($p,$root) { if (substr($p,0,1) == '/') { return $p; } return $root.'/'.$p; } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/common/lib.form.php000066400000000000000000000221241230033266200237320ustar00rootroot00000000000000'."\n"; $res .= self::comboOptions($data,$default); $res .= ''."\n"; return $res; } private static function comboOptions($data,$default) { $res = ''; $option = ''."\n"; $optgroup = ''."\n".'%2$s'."\n"; foreach($data as $k => $v) { if (is_array($v)) { $res .= sprintf($optgroup,$k,self::comboOptions($v,$default)); } elseif ($v instanceof formSelectOption) { $res .= $v->render($default); } else { $s = ((string) $v == (string) $default) ? ' selected="selected"' : ''; $res .= sprintf($option,$v,$k,$s); } } return $res; } /** * Radio button * * Returns HTML code for a radio button. $nid could be a string or an array of * name and ID. * * @param string|array $nid Element ID and name * @param string $value Element value * @param boolean $checked True if checked * @param string $class Element class name * @param string $tabindex Element tabindex * @param boolean $disabled True if disabled * @param string $extra_html Extra HTML attributes * * @return string */ public static function radio($nid, $value, $checked='', $class='', $tabindex='', $disabled=false, $extra_html='') { self::getNameAndId($nid,$name,$id); $res = ''; $res .= $default; $res .= ''; return $res; } /** * Hidden field * * Returns HTML code for an hidden field. $nid could be a string or an array of * name and ID. * * @param string|array $nid Element ID and name * @param string $value Element value * * @return string */ public static function hidden($nid,$value) { self::getNameAndId($nid,$name,$id); $res = 'name = $name; $this->value = $value; $this->class_name = $class_name; $this->html = $html; } /** * Option renderer * * Returns option HTML code * * @param boolean $default Option is selected * @return string */ public function render($default) { $attr = $this->html; $attr .= $this->class_name ? ' class="'.$this->class_name.'"' : ''; if ($this->value == $default) { $attr .= ' selected="selected"'; } return sprintf($this->option,$this->value,$this->name,$attr)."\n"; } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/common/lib.html.php000066400000000000000000000077721230033266200237470ustar00rootroot00000000000000 "'" ); $str = str_replace(array_keys($extra),array_values($extra),$str); return html_entity_decode($str,ENT_QUOTES,'UTF-8'); } /** * Remove markup * * Removes every tags, comments, cdata from string * * @param string $str String to clean * @return string */ public static function clean($str) { $str = strip_tags($str); return $str; } /** * Javascript escape * * Returns a protected JavaScript string * * @param string $str String to protect * @return string */ public static function escapeJS($str) { $str = htmlspecialchars($str,ENT_NOQUOTES,'UTF-8'); $str = str_replace("'","\'",$str); $str = str_replace('"','\"',$str); return $str; } /** * URL escape * * Returns an escaped URL string for HTML content * * @param string $str String to escape * @return string */ public static function escapeURL($str) { return str_replace('&','&',$str); } /** * URL sanitize * * Encode every parts between / in url * * @param string $str String to satinyze * @return string */ public static function sanitizeURL($str) { return str_replace('%2F','/',rawurlencode($str)); } /** * Remove host in URL * * Removes host part in URL * * @param string $str URL to transform * @return string */ public static function stripHostURL($url) { return preg_replace('|^[a-z]{3,}://.*?(/.*$)|','$1',$url); } /** * Set links to absolute ones * * Appends $root URL to URIs attributes in $str. * * @param string $str HTML to transform * @param string $root Base URL * @return string */ public static function absoluteURLs($str,$root) { self::$url_root = $root; $attr = 'action|background|cite|classid|codebase|data|href|longdesc|profile|src|usemap'; $str = preg_replace_callback('/((?:'.$attr.')=")(.*?)(")/msu',array('self','absoluteURLHandler'),$str); foreach (self::$absolute_regs as $r) { $str = preg_replace_callback($r,array('self','absoluteURLHandler'),$str); } self::$url_root = null; return $str; } private static function absoluteURLHandler($m) { $url = $m[2]; $link = str_replace('%','%%',$m[1]).'%s'.str_replace('%','%%',$m[3]); $host = preg_replace('|^([a-z]{3,}://)(.*?)/(.*)$|','$1$2',self::$url_root); $parse = parse_url($m[2]); if (empty($parse['scheme'])) { if (strpos($url,'//') === 0 ) { // Nothing to do. Already an absolute URL. } elseif (strpos($url,'/') === 0) { $url = $host.$url; } elseif (strpos($url,'#') === 0) { $url = self::$url_root.$url; } elseif (preg_match('|/$|',self::$url_root)) { $url = self::$url_root.$url; } else { $url = dirname(self::$url_root).'/'.$url; } } return sprintf($link,$url); } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/common/lib.http.php000066400000000000000000000241031230033266200237450ustar00rootroot00000000000000[a-z]{2}(?:-[a-z]{2})?)(?:;q=(?P[.0-9]*))?/'; if (preg_match_all($pattern,$_SERVER['HTTP_ACCEPT_LANGUAGE'],$acclang) !== false) { foreach($acclang['priority'] as $i => $p) { if ($p == '') $acclang['priority'][$i]=1; } array_multisort($acclang['priority'], SORT_DESC,$acclang['lang']); } return $acclang['lang']; } else { return $acclang; } } /** * HTTP Cache * * Sends HTTP cache headers (304) according to a list of files and an optionnal. * list of timestamps. * * @param array $files Files on which check mtime * @param array $mod_ts List of timestamps */ public static function cache($files,$mod_ts=array()) { if (empty($files) || !is_array($files)) { return; } array_walk($files,create_function('&$v','$v = filemtime($v);')); $array_ts = array_merge($mod_ts,$files); rsort($array_ts); $now = time(); $ts = min($array_ts[0],$now); $since = null; if (!empty($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { $since = $_SERVER['HTTP_IF_MODIFIED_SINCE']; $since = preg_replace ('/^(.*)(Mon|Tue|Wed|Thu|Fri|Sat|Sun)(.*)(GMT)(.*)/', '$2$3 GMT', $since); $since = strtotime($since); $since = ($since <= $now) ? $since : null; } # Common headers list $headers[] = 'Last-Modified: '.gmdate('D, d M Y H:i:s',$ts).' GMT'; $headers[] = 'Cache-Control: must-revalidate, max-age='.abs((integer) self::$cache_max_age); $headers[] = 'Pragma:'; if ($since >= $ts) { self::head(304,'Not Modified'); foreach ($headers as $v) { header($v); } exit; } else { header('Date: '.gmdate('D, d M Y H:i:s',$now).' GMT'); foreach ($headers as $v) { header($v); } } } /** * HTTP Etag * * Sends HTTP cache headers (304) according to a list of etags in client request. * * @param string $p_content Response page content */ public static function etag() { # We create an etag from all arguments $args = func_get_args(); if (empty($args)) { return; } $etag = '"'.md5(implode('',$args)).'"'; unset($args); header('ETag: '.$etag); # Do we have a previously sent content? if (!empty($_SERVER['HTTP_IF_NONE_MATCH'])) { foreach (explode(',',$_SERVER['HTTP_IF_NONE_MATCH']) as $i) { if (stripslashes(trim($i)) == $etag) { self::head(304,'Not Modified'); exit; } } } } /** * HTTP Header * * Sends an HTTP code and message to client. * * @param string $code HTTP code * @param string $msg Message */ public static function head($code,$msg=null) { $status_mode = preg_match('/cgi/',PHP_SAPI); if (!$msg) { $msg_codes = array( 100 => 'Continue', 101 => 'Switching Protocols', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 307 => 'Temporary Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported' ); $msg = isset($msg_codes[$code]) ? $msg_codes[$code] : '-'; } if ($status_mode) { header('Status: '.$code.' '.$msg); } else { header($msg, true, $code); } } /** * Trim request * * Trims every value in GET, POST, REQUEST and COOKIE vars. * Removes magic quotes if magic_quote_gpc is on. */ public static function trimRequest() { if(!empty($_GET)) { array_walk($_GET,array('self','trimRequestInVar')); } if(!empty($_POST)) { array_walk($_POST,array('self','trimRequestInVar')); } if(!empty($_REQUEST)) { array_walk($_REQUEST,array('self','trimRequestInVar')); } if(!empty($_COOKIE)) { array_walk($_COOKIE,array('self','trimRequestInVar')); } } /* * * To be deleted? * -- saymonz, 29.04.2011 * //* private static function trimRequestHandler(&$v,$key) { $v = self::trimRequestInVar($v); } //*/ private static function trimRequestInVar(&$value,$key) { if (is_array($value)) { foreach ($value as $k => &$v) { if (is_array($v)) { self::trimRequestInVar($v,$k); } else { if (get_magic_quotes_gpc()) { $v = stripslashes($v); } $v = trim($v); } } } else { if (get_magic_quotes_gpc()) { $value = stripslashes($value); } $value = trim($value); } } /** * Unset global variables * * If register_globals is on, removes every GET, POST, COOKIE, REQUEST, SERVER, * ENV, FILES vars from GLOBALS. */ public static function unsetGlobals() { if (!ini_get('register_globals')) { return; } if (isset($_REQUEST['GLOBALS'])) { throw new Exception('GLOBALS overwrite attempt detected'); } # Variables that shouldn't be unset $no_unset = array('GLOBALS','_GET','_POST','_COOKIE','_REQUEST', '_SERVER','_ENV','_FILES'); $input = array_merge($_GET,$_POST,$_COOKIE,$_SERVER,$_ENV,$_FILES, (isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array())); foreach ($input as $k => $v) { if (!in_array($k,$no_unset) && isset($GLOBALS[$k]) ) { $GLOBALS[$k] = null; unset($GLOBALS[$k]); } } } } ?> dotclear-2.6.2+dfsg/inc/libs/clearbricks/common/lib.json.php000066400000000000000000000566341230033266200237550ustar00rootroot00000000000000encode($str); } catch(Exception $e) { $GLOBALS['json_last_error'] = $e->getMessage(); return null; } } function json_decode($str) { try { $GLOBALS['json_last_error'] = 0; $json = new Services_JSON(); return $json->decode($str); } catch(Exception $e) { $GLOBALS['json_last_error'] = $e->getMessage(); return null; } } function json_last_error() { return empty($GLOBALS['json_last_error']) ? 0 : $GLOBALS['json_last_error']; } } if (!class_exists('Services_JSON')) { /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('SERVICES_JSON_SLICE', 1); /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('SERVICES_JSON_IN_STR', 2); /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('SERVICES_JSON_IN_ARR', 3); /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('SERVICES_JSON_IN_OBJ', 4); /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('SERVICES_JSON_IN_CMT', 5); /** * Behavior switch for Services_JSON::decode() */ define('SERVICES_JSON_LOOSE_TYPE', 16); /** * Behavior switch for Services_JSON::decode() */ define('SERVICES_JSON_SUPPRESS_ERRORS', 32); /** * Converts to and from JSON format. * * This class library is from Michal Migurski's Services_JSON library. * {@link http://pear.php.net/pepr/pepr-proposal-show.php?id=198} * {@license http://www.opensource.org/licenses/bsd-license.php} * * @package Clearbricks * @subpackage Common */ class Services_JSON { /** * constructs a new JSON instance * * @param int $use object behavior flags; combine with boolean-OR * * possible values: * - SERVICES_JSON_LOOSE_TYPE: loose typing. * "{...}" syntax creates associative arrays * instead of objects in decode(). * - SERVICES_JSON_SUPPRESS_ERRORS: error suppression. * Values which can't be encoded (e.g. resources) * appear as NULL instead of throwing errors. * By default, a deeply-nested resource will * bubble up with an error, so all return values * from encode() should be checked with isError() */ function Services_JSON($use = 0) { $this->use = $use; } /** * convert a string from one UTF-16 char to one UTF-8 char * * Normally should be handled by mb_convert_encoding, but * provides a slower PHP-only method for installations * that lack the multibye string extension. * * @param string $utf16 UTF-16 character * @return string UTF-8 character * @access private */ function utf162utf8($utf16) { // oh please oh please oh please oh please oh please if(function_exists('mb_convert_encoding')) { return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); } $bytes = (ord($utf16{0}) << 8) | ord($utf16{1}); switch(true) { case ((0x7F & $bytes) == $bytes): // this case should never be reached, because we are in ASCII range // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0x7F & $bytes); case (0x07FF & $bytes) == $bytes: // return a 2-byte UTF-8 character // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0xC0 | (($bytes >> 6) & 0x1F)) . chr(0x80 | ($bytes & 0x3F)); case (0xFFFF & $bytes) == $bytes: // return a 3-byte UTF-8 character // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0xE0 | (($bytes >> 12) & 0x0F)) . chr(0x80 | (($bytes >> 6) & 0x3F)) . chr(0x80 | ($bytes & 0x3F)); } // ignoring UTF-32 for now, sorry return ''; } /** * convert a string from one UTF-8 char to one UTF-16 char * * Normally should be handled by mb_convert_encoding, but * provides a slower PHP-only method for installations * that lack the multibye string extension. * * @param string $utf8 UTF-8 character * @return string UTF-16 character * @access private */ function utf82utf16($utf8) { // oh please oh please oh please oh please oh please if(function_exists('mb_convert_encoding')) { return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); } switch(strlen($utf8)) { case 1: // this case should never be reached, because we are in ASCII range // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return $utf8; case 2: // return a UTF-16 character from a 2-byte UTF-8 char // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0x07 & (ord($utf8{0}) >> 2)) . chr((0xC0 & (ord($utf8{0}) << 6)) | (0x3F & ord($utf8{1}))); case 3: // return a UTF-16 character from a 3-byte UTF-8 char // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr((0xF0 & (ord($utf8{0}) << 4)) | (0x0F & (ord($utf8{1}) >> 2))) . chr((0xC0 & (ord($utf8{1}) << 6)) | (0x7F & ord($utf8{2}))); } // ignoring UTF-32 for now, sorry return ''; } /** * encodes an arbitrary variable into JSON format * * @param mixed $var any number, boolean, string, array, or object to be encoded. * see argument 1 to Services_JSON() above for array-parsing behavior. * if var is a strng, note that encode() always expects it * to be in ASCII or UTF-8 format! * * @return mixed JSON string representation of input var or an error if a problem occurs * @access public */ function encode($var) { switch (gettype($var)) { case 'boolean': return $var ? 'true' : 'false'; case 'NULL': return 'null'; case 'integer': return (int) $var; case 'double': case 'float': return (float) $var; case 'string': // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT $ascii = ''; $strlen_var = strlen($var); /* * Iterate over every character in the string, * escaping with a slash or encoding to UTF-8 where necessary */ for ($c = 0; $c < $strlen_var; ++$c) { $ord_var_c = ord($var{$c}); switch (true) { case $ord_var_c == 0x08: $ascii .= '\b'; break; case $ord_var_c == 0x09: $ascii .= '\t'; break; case $ord_var_c == 0x0A: $ascii .= '\n'; break; case $ord_var_c == 0x0C: $ascii .= '\f'; break; case $ord_var_c == 0x0D: $ascii .= '\r'; break; case $ord_var_c == 0x22: case $ord_var_c == 0x2F: case $ord_var_c == 0x5C: // double quote, slash, slosh $ascii .= '\\'.$var{$c}; break; case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): // characters U-00000000 - U-0000007F (same as ASCII) $ascii .= $var{$c}; break; case (($ord_var_c & 0xE0) == 0xC0): // characters U-00000080 - U-000007FF, mask 110XXXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, ord($var{$c + 1})); $c += 1; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xF0) == 0xE0): // characters U-00000800 - U-0000FFFF, mask 1110XXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, ord($var{$c + 1}), ord($var{$c + 2})); $c += 2; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xF8) == 0xF0): // characters U-00010000 - U-001FFFFF, mask 11110XXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, ord($var{$c + 1}), ord($var{$c + 2}), ord($var{$c + 3})); $c += 3; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xFC) == 0xF8): // characters U-00200000 - U-03FFFFFF, mask 111110XX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, ord($var{$c + 1}), ord($var{$c + 2}), ord($var{$c + 3}), ord($var{$c + 4})); $c += 4; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xFE) == 0xFC): // characters U-04000000 - U-7FFFFFFF, mask 1111110X // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, ord($var{$c + 1}), ord($var{$c + 2}), ord($var{$c + 3}), ord($var{$c + 4}), ord($var{$c + 5})); $c += 5; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; } } return '"'.$ascii.'"'; case 'array': /* * As per JSON spec if any array key is not an integer * we must treat the the whole array as an object. We * also try to catch a sparsely populated associative * array with numeric keys here because some JS engines * will create an array with empty indexes up to * max_index which can cause memory issues and because * the keys, which may be relevant, will be remapped * otherwise. * * As per the ECMA and JSON specification an object may * have any string as a property. Unfortunately due to * a hole in the ECMA specification if the key is a * ECMA reserved word or starts with a digit the * parameter is only accessible using ECMAScript's * bracket notation. */ // treat as a JSON object if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { $properties = array_map(array($this, 'name_value'), array_keys($var), array_values($var)); foreach($properties as $property) { if(Services_JSON::isError($property)) { return $property; } } return '{' . join(',', $properties) . '}'; } // treat it like a regular array $elements = array_map(array($this, 'encode'), $var); foreach($elements as $element) { if(Services_JSON::isError($element)) { return $element; } } return '[' . join(',', $elements) . ']'; case 'object': $vars = get_object_vars($var); $properties = array_map(array($this, 'name_value'), array_keys($vars), array_values($vars)); foreach($properties as $property) { if(Services_JSON::isError($property)) { return $property; } } return '{' . join(',', $properties) . '}'; default: return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) ? 'null' : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string"); } } /** * array-walking function for use in generating JSON-formatted name-value pairs * * @param string $name name of key to use * @param mixed $value reference to an array element to be encoded * * @return string JSON-formatted name-value pair, like '"name":value' * @access private */ function name_value($name, $value) { $encoded_value = $this->encode($value); if(Services_JSON::isError($encoded_value)) { return $encoded_value; } return $this->encode(strval($name)) . ':' . $encoded_value; } /** * reduce a string by removing leading and trailing comments and whitespace * * @param $str string string value to strip of comments and whitespace * * @return string string value stripped of comments and whitespace * @access private */ function reduce_string($str) { $str = preg_replace(array( // eliminate single line comments in '// ...' form '#^\s*//(.+)$#m', // eliminate multi-line comments in '/* ... */' form, at start of string '#^\s*/\*(.+)\*/#Us', // eliminate multi-line comments in '/* ... */' form, at end of string '#/\*(.+)\*/\s*$#Us' ), '', $str); // eliminate extraneous space return trim($str); } /** * decodes a JSON string into appropriate variable * * @param string $str JSON-formatted string * * @return mixed number, boolean, string, array, or object * corresponding to given JSON input string. * See argument 1 to Services_JSON() above for object-output behavior. * Note that decode() always returns strings * in ASCII or UTF-8 format! * @access public */ function decode($str) { $str = $this->reduce_string($str); switch (strtolower($str)) { case 'true': return true; case 'false': return false; case 'null': return null; default: $m = array(); if (is_numeric($str)) { // Lookie-loo, it's a number // This would work on its own, but I'm trying to be // good about returning integers where appropriate: // return (float)$str; // Return float or int, as appropriate return ((float)$str == (integer)$str) ? (integer)$str : (float)$str; } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) { // STRINGS RETURNED IN UTF-8 FORMAT $delim = substr($str, 0, 1); $chrs = substr($str, 1, -1); $utf8 = ''; $strlen_chrs = strlen($chrs); for ($c = 0; $c < $strlen_chrs; ++$c) { $substr_chrs_c_2 = substr($chrs, $c, 2); $ord_chrs_c = ord($chrs{$c}); switch (true) { case $substr_chrs_c_2 == '\b': $utf8 .= chr(0x08); ++$c; break; case $substr_chrs_c_2 == '\t': $utf8 .= chr(0x09); ++$c; break; case $substr_chrs_c_2 == '\n': $utf8 .= chr(0x0A); ++$c; break; case $substr_chrs_c_2 == '\f': $utf8 .= chr(0x0C); ++$c; break; case $substr_chrs_c_2 == '\r': $utf8 .= chr(0x0D); ++$c; break; case $substr_chrs_c_2 == '\\"': case $substr_chrs_c_2 == '\\\'': case $substr_chrs_c_2 == '\\\\': case $substr_chrs_c_2 == '\\/': if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || ($delim == "'" && $substr_chrs_c_2 != '\\"')) { $utf8 .= $chrs{++$c}; } break; case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)): // single, escaped unicode character $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2))) . chr(hexdec(substr($chrs, ($c + 4), 2))); $utf8 .= $this->utf162utf8($utf16); $c += 5; break; case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): $utf8 .= $chrs{$c}; break; case ($ord_chrs_c & 0xE0) == 0xC0: // characters U-00000080 - U-000007FF, mask 110XXXXX //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= substr($chrs, $c, 2); ++$c; break; case ($ord_chrs_c & 0xF0) == 0xE0: // characters U-00000800 - U-0000FFFF, mask 1110XXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= substr($chrs, $c, 3); $c += 2; break; case ($ord_chrs_c & 0xF8) == 0xF0: // characters U-00010000 - U-001FFFFF, mask 11110XXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= substr($chrs, $c, 4); $c += 3; break; case ($ord_chrs_c & 0xFC) == 0xF8: // characters U-00200000 - U-03FFFFFF, mask 111110XX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= substr($chrs, $c, 5); $c += 4; break; case ($ord_chrs_c & 0xFE) == 0xFC: // characters U-04000000 - U-7FFFFFFF, mask 1111110X // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= substr($chrs, $c, 6); $c += 5; break; } } return $utf8; } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { // array, or object notation if ($str{0} == '[') { $stk = array(SERVICES_JSON_IN_ARR); $arr = array(); } else { if ($this->use & SERVICES_JSON_LOOSE_TYPE) { $stk = array(SERVICES_JSON_IN_OBJ); $obj = array(); } else { $stk = array(SERVICES_JSON_IN_OBJ); $obj = new stdClass(); } } array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => 0, 'delim' => false)); $chrs = substr($str, 1, -1); $chrs = $this->reduce_string($chrs); if ($chrs == '') { if (reset($stk) == SERVICES_JSON_IN_ARR) { return $arr; } else { return $obj; } } //print("\nparsing {$chrs}\n"); $strlen_chrs = strlen($chrs); for ($c = 0; $c <= $strlen_chrs; ++$c) { $top = end($stk); $substr_chrs_c_2 = substr($chrs, $c, 2); if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { // found a comma that is not inside a string, array, etc., // OR we've reached the end of the character list $slice = substr($chrs, $top['where'], ($c - $top['where'])); array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); if (reset($stk) == SERVICES_JSON_IN_ARR) { // we are in an array, so just push an element onto the stack array_push($arr, $this->decode($slice)); } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { // we are in an object, so figure // out the property name and set an // element in an associative array, // for now $parts = array(); if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { // "name":value pair $key = $this->decode($parts[1]); $val = $this->decode($parts[2]); if ($this->use & SERVICES_JSON_LOOSE_TYPE) { $obj[$key] = $val; } else { $obj->$key = $val; } } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { // name:value pair, where name is unquoted $key = $parts[1]; $val = $this->decode($parts[2]); if ($this->use & SERVICES_JSON_LOOSE_TYPE) { $obj[$key] = $val; } else { $obj->$key = $val; } } } } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { // found a quote, and we are not inside a string array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c})); //print("Found start of string at {$c}\n"); } elseif (($chrs{$c} == $top['delim']) && ($top['what'] == SERVICES_JSON_IN_STR) && ((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1)) { // found a quote, we're in a string, and it's not escaped // we know that it's not escaped becase there is _not_ an // odd number of backslashes at the end of the string so far array_pop($stk); //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); } elseif (($chrs{$c} == '[') && in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { // found a left-bracket, and we are in an array, object, or slice array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); //print("Found start of array at {$c}\n"); } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { // found a right-bracket, and we're in an array array_pop($stk); //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); } elseif (($chrs{$c} == '{') && in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { // found a left-brace, and we are in an array, object, or slice array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); //print("Found start of object at {$c}\n"); } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { // found a right-brace, and we're in an object array_pop($stk); //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); } elseif (($substr_chrs_c_2 == '/*') && in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { // found a comment start, and we are in an array, object, or slice array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); $c++; //print("Found start of comment at {$c}\n"); } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) { // found a comment end, and we're in one now array_pop($stk); $c++; for ($i = $top['where']; $i <= $c; ++$i) $chrs = substr_replace($chrs, ' ', $i, 1); //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); } } if (reset($stk) == SERVICES_JSON_IN_ARR) { return $arr; } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { return $obj; } } } } /** * @todo Ultimately, this should just call PEAR::isError() */ function isError($data, $code = null) { if (class_exists('pear')) { return PEAR::isError($data, $code); } elseif (is_object($data) && (get_class($data) == 'services_json_error' || is_subclass_of($data, 'services_json_error'))) { return true; } return false; } } if (class_exists('PEAR_Error')) { class Services_JSON_Error extends PEAR_Error { function Services_JSON_Error($message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null) { parent::PEAR_Error($message, $code, $mode, $options, $userinfo); } } } else { /** * @todo Ultimately, this class shall be descended from PEAR_Error */ class Services_JSON_Error { function Services_JSON_Error($message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null) { } } } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/common/lib.l10n.php000066400000000000000000001101201230033266200235330ustar00rootroot00000000000000 0 && !empty($GLOBALS['__l10n'][$plural])) { $t = $GLOBALS['__l10n'][$plural]; return is_array($t) ? $t[0] : $t; // If it is plural and index exists in plurals translations } elseif (!empty($GLOBALS['__l10n'][$singular]) && is_array($GLOBALS['__l10n'][$singular]) && array_key_exists($i,$GLOBALS['__l10n'][$singular]) && !empty($GLOBALS['__l10n'][$singular][$i])) { return $GLOBALS['__l10n'][$singular][$i]; // Else return input string according to "en" plural form } else { return $i > 0 ? $plural : $singular; } } } /** * Retrieve plural index from input number * * @param integer $count Number to take account * @return integer Index of plural form */ public static function index($count) { return call_user_func(self::$language_pluralfunction, $count); } /** * Add a file * * Adds a l10n file in translation strings. $file should be given without * extension. This method will look for $file.lang.php and $file.po (in this * order) and retrieve the first one found. * We not care about language (and plurals forms) of the file. * * @param string $file Filename (without extension) * @return boolean True on success */ public static function set($file) { $lang_file = $file.'.lang'; $po_file = $file.'.po'; $php_file = $file.'.lang.php'; if (file_exists($php_file)) { require $php_file; } elseif (($tmp = self::getPoFile($po_file)) !== false) { $GLOBALS['__l10n_files'][] = $po_file; $GLOBALS['__l10n'] = $tmp + $GLOBALS['__l10n']; // "+" erase numeric keys unlike array_merge } elseif (($tmp = self::getLangFile($lang_file)) !== false) { $GLOBALS['__l10n_files'][] = $lang_file; $GLOBALS['__l10n'] = $tmp + $GLOBALS['__l10n']; // "+" erase numeric keys unlike array_merge } else { return false; } return true; } /** * L10N file * * Returns a file path for a file, a directory and a language. * If $dir/$lang/$file is not found, it will check if $dir/en/$file * exists and returns the result. Returns false if no file were found. * * @param string $dir Directory * @param string $file File * @param string $lang Language * @return string|false File path or false */ public static function getFilePath($dir, $file, $lang) { $f = $dir.'/'.$lang.'/'.$file; if (!file_exists($f)) { $f = $dir.'/en/'.$file; } return file_exists($f) ? $f : false; } /** @ignore @deprecated */ public static function getLangFile($file) { if (!file_exists($file)) { return false; } $fp = @fopen($file,'r'); if ($fp === false) { return false; } $res = array(); while ($l = fgets($fp)) { $l = trim($l); # Comment if (substr($l,0,1) == '#') { continue; } # Original text if (substr($l,0,1) == ';' && ($t = fgets($fp)) !== false && trim($t) != '') { $res[$l] = trim($t); } } fclose($fp); return $res; } /// @name Gettext PO methods //@{ /** * Load gettext file * * Returns an array of strings found in a given gettext (.po) file * * @param string $file Filename * @return array|false */ public static function getPoFile($file) { if (($m = self::parsePoFile($file)) === false) { return false; } if (empty($m[1])) { return array(); } // Keep singular id and translations, remove headers and comments $r = array(); foreach($m[1] as $v) { if (isset($v['msgid']) && isset($v['msgstr'])) { $r[$v['msgid']] = $v['msgstr']; } } return $r; } /** * Generates a PHP file from a po file * * Return a boolean depending on success or failure * * @param string $file File * @return boolean true on success */ public static function generatePhpFileFromPo($file,$license_block='') { $po_file = $file.'.po'; $php_file = $file.'.lang.php'; $strings = self::getPoFile($po_file); $fcontent = " $tr) { $vo = str_replace("'", "\\'", $vo); if (is_array($tr)) { foreach ($tr as $i => $t) { $t = str_replace("'", "\\'", $t); $fcontent .= '$GLOBALS[\'__l10n\'][\''.$vo.'\']['.$i.'] = \''.$t.'\';'."\n"; } } else { $tr = str_replace("'", "\\'", $tr); $fcontent .= '$GLOBALS[\'__l10n\'][\''.$vo.'\'] = \''.$tr.'\';'."\n"; } } if (($fp = fopen($php_file, 'w')) !== false) { fwrite($fp, $fcontent, strlen($fcontent)); fclose($fp); return true; } else { return false; } } /** * Parse Po File * * Return an array of po headers and translations from a po file * * @param string $file File path * @return array Parsed file */ public static function parsePoFile($file) { // stop if file not exists if (!file_exists($file)) { return false; } // read file per line in array (without ending new line) if (false === ($lines = file($file, FILE_IGNORE_NEW_LINES))) { return false; } // prepare variables $headers = array( 'Project-Id-Version' => '', 'Report-Msgid-Bugs-To' => '', 'POT-Creation-Date' => '', 'PO-Revision-Date' => '', 'Last-Translator' => '', 'Language-Team' => '', 'Content-Type' => '', 'Content-Transfer-Encoding' => '', 'Plural-Forms' => '' // there are more headers but these ones are default ); $headers_searched = $headers_found = false; $h_line = $h_val = $h_key = ''; $entries = $entry = $desc = array(); $i = 0; // read through lines for($i = 0; $i < count($lines); $i++) { // some people like mirovinben add white space at the end of line $line = trim($lines[$i]); // jump to next line on blank one or empty comment (#) if (strlen($line) < 2) { continue; } // headers if (!$headers_searched && preg_match('/^msgid\s+""$/', trim($line))) { // headers start wih empty msgid and msgstr follow be multine if (!preg_match('/^msgstr\s+""$/', trim($lines[$i + 1])) || !preg_match('/^"(.*)"$/', trim($lines[$i + 2]))) { $headers_searched = true; } else { $l = $i + 2; while(false !== ($def = self::cleanPoLine('multi',$lines[$l++]))) { $h_line = self::cleanPoString($def[1]); // an header has key:val if (false === ($h_index = strpos($h_line, ':'))) { // multiline value if (!empty($h_key) && !empty($headers[$h_key])) { $headers[$h_key] = trim($headers[$h_key].$h_line); continue; // your .po file is so bad } else { $headers_searched = true; break; } } // extract key and value $h_key = substr($h_line, 0, $h_index); $h_val = substr($h_line, $h_index + 1); // unknow header if (!isset($headers[$h_key])) { //continue; } // ok it's an header, add it $headers[$h_key] = trim($h_val); $headers_found = true; } // headers found so stop search and clean previous comments if ($headers_found) { $headers_searched = true; $entry = $desc = array(); $i = $l - 1; continue; } } } // comments if (false !== ($def = self::cleanPoLine('comment',$line))) { $str = self::cleanPoString($def[2]); switch ($def[1]) { // translator comments case ' ': if (!isset($desc['translator-comments'])) { $desc['translator-comments'] = $str; } else { $desc['translator-comments'] .= "\n" . $str; } break; // extracted comments case '.': if (!isset($desc['extracted-comments'])) { $desc['extracted-comments'] = $str; } else { $desc['extracted-comments'] .= "\n" . $str; } break; // reference case ':': if (!isset($desc['references'])) { $desc['references'] = array(); } $desc['references'][] = $str; break; // flag case ',': if (!isset($desc['flags'])) { $desc['flags'] = array(); } $desc['flags'][] = $str; break; // previous msgid, msgctxt case '|': // msgid if (strpos($def[2], 'msgid') === 0) { $desc['previous-msgid'] = $str; // msgcxt } else { $desc['previous-msgctxt'] = $str; } break; } } // msgid elseif (false !== ($def = self::cleanPoLine('msgid',$line))) { // add last translation and start new one if ((isset($entry['msgid']) || isset($entry['msgid_plural'])) && isset($entry['msgstr'])) { // save last translation and start new one $entries[] = $entry; $entry = array(); // add comments to new translation if (!empty($desc)) { $entry = array_merge($entry, $desc); $desc = array(); } // stop searching headers $headers_searched = true; } $str = self::cleanPoString($def[2]); // msgid_plural if (!empty($def[1])) { $entry['msgid_plural'] = $str; } else { $entry['msgid'] = $str; } } // msgstr elseif (false !== ($def = self::cleanPoLine('msgstr',$line))) { $str = self::cleanPoString($def[2]); // plural forms if (!empty($def[1])) { if (!isset($entry['msgstr'])) { $entry['msgstr'] = array(); } $entry['msgstr'][] = $str; } else { $entry['msgstr'] = $str; } } // multiline elseif (false !== ($def = self::cleanPoLine('multi',$line))) { $str = self::cleanPoString($def[1]); // msgid if (!isset($entry['msgstr'])) { //msgid plural if (isset($entry['msgid_plural'])) { if (!is_array($entry['msgid_plural'])) { $entry['msgid_plural'] .= $str; } else { $entry['msgid_plural'][count($entry['msgid_plural']) - 1] .= $str; } } else { if (!is_array($entry['msgid'])) { $entry['msgid'] .= $str; } else { $entry['msgid'][count($entry['msgid']) - 1] .= $str; } } // msgstr } else { if (!is_array($entry['msgstr'])) { $entry['msgstr'] .= $str; } else { $entry['msgstr'][count($entry['msgstr']) - 1] .= $str; } } } } // Add last translation if (!empty($entry)) { if (!empty($desc)) { $entry = array_merge($entry, $desc); } $entries[] = $entry; } return array($headers, $entries); } /* @ignore */ protected static function cleanPoLine($type,$_) { $patterns = array( 'msgid' => 'msgid(_plural|)\s+"(.*)"', 'msgstr' => 'msgstr(\[.*?\]|)\s+"(.*)"', 'multi' => '"(.*)"', 'comment' => '#\s*(\s|\.|:|\,|\|)\s*(.*)' ); if (array_key_exists($type,$patterns) && preg_match('/^'.$patterns[$type].'$/i', trim($_), $m)) { return $m; } return false; } /* @ignore */ protected static function cleanPoString($_) { return stripslashes(str_replace(array('\n','\r\n'),"\n",$_)); } /** * Extract nplurals and plural from po expression * * @param string $expression Plural form as of gettext Plural-form param * @return array Number of plurals and cleaned plural expression */ public static function parsePluralExpression($expression) { return preg_match('/^\s*nplurals\s*=\s*(\d+)\s*;\s+plural\s*=\s*(.+)$/', $expression, $m) ? array((integer) $m[1], trim(self::cleanPluralExpression($m[2]))) : array(self::$language_pluralsnumber, self::$language_pluralexpression); } /** * Create function to find plural msgstr index from gettext expression * * @param integer $nplurals Plurals number * @param string $expression Plural expression * @return function Function to extract right plural index */ public static function createPluralFunction($nplurals, $expression) { return create_function('$n', '$i = (integer) ('.str_replace('n', '$n', $expression).'); return ($i < '.$nplurals.') ? $i : '.$nplurals.' - 1;'); } /* @ignore */ protected static function cleanPluralExpression($_) { $_ .= ';'; $r = ''; $l = 0; for ($i = 0; $i < strlen($_); ++$i) { switch ($_[$i]) { case '?': $r .= ' ? ('; $l++; break; case ':': $r .= ') : ('; break; case ';': $r .= str_repeat(')', $l) . ';'; $l= 0; break; default: $r .= $_[$i]; } } return rtrim($r, ';'); } //@} /// @name Languages definitions methods //@{ /** * Check if a language code exists * * @param string $code Language code * @return boolean True if code exists */ public static function isCode($code) { return array_key_exists($code,self::getLanguagesName()); } /** * Get a language code according to a language name * * @param string $code Language name * @return string Language code */ public static function getCode($code) { $_ = self::getLanguagesName(); return (($index = array_search($code,$_)) !== false) ? $index : self::$language_code; } /** * ISO Codes * * @param boolean $flip Flip resulting array * @param boolean $name_with_code Prefix (code) to names * @return array */ public static function getISOcodes($flip=false,$name_with_code=false) { $langs = self::getLanguagesName(); if ($name_with_code) { foreach ($langs as $k => &$v) { $v = $k.' - '.$v; } } if ($flip) { return array_flip($langs); } return $langs; } /** * Get a language name according to a lang code * * @param string $code Language code * @return string Language name */ public static function getLanguageName($code) { $_ = self::getLanguagesName(); return array_key_exists($code,$_) ? $_[$code] : self::$language_name; } /** * Get languages names * * @return array List of languages names by languages codes */ public static function getLanguagesName() { if (empty(self::$languages_name)) { self::$languages_name = self::getLanguagesDefinitions(3); // Backwards compatibility self::$langs = self::$languages_name; } return self::$languages_name; } /** * Get a text direction according to a language code * * @param string $code Language code * @return string Text direction (rtl or ltr) */ public static function getLanguageTextDirection($code) { $_ = self::getLanguagesTextDirection(); return array_key_exists($code,$_) ? $_[$code] : self::$language_textdirection; } /** * Get languages text directions * * @return array List of text directions by languages codes */ public static function getLanguagesTextDirection() { if (empty(self::$languages_textdirection)) { self::$languages_textdirection = self::getLanguagesDefinitions(4); } return self::$languages_textdirection; } /** * Text direction * * @deprecated * @see l10n::getLanguageTextDirection() * * @param string $lang Language code * @return string ltr or rtl */ public static function getTextDirection($lang) { return self::getLanguageTextDirection($lang); } /** * Get a number of plurals according to a language code * * @param string $code Language code * @return integer Number of plurals */ public static function getLanguagePluralsNumber($code) { $_ = self::getLanguagesPluralsNumber(); return !empty($_[$code]) ? $_[$code] : self::$language_pluralsnumber; } /** * Get languages numbers of plurals * * @return array List of numbers of plurals by languages codes */ public static function getLanguagesPluralsNumber() { if (empty(self::$languages_pluralsnumber)) { self::$languages_pluralsnumber = self::getLanguagesDefinitions(5); } return self::$languages_pluralsnumber; } /** * Get a plural expression according to a language code * * @param string $code Language code * @return string Plural expression */ public static function getLanguagePluralExpression($code) { $_ = self::getLanguagesPluralExpression(); return !empty($_[$code]) ? $_[$code] : self::$language_pluralexpression; } /** * Get languages plural expressions * * @return array List of plural expressions by languages codes */ public static function getLanguagesPluralExpression() { if (empty(self::$languages_pluralexpression)) { self::$languages_pluralexpression = self::getLanguagesDefinitions(6); } return self::$languages_pluralexpression; } /** * Get languages definitions of a given type * * The list follows ISO 639.1 norm with additionnal IETF codes as pt-br * * Countries codes and names from * {@link http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes} * {@link http://www.gnu.org/software/gettext/manual/gettext.html#Language-Codes} * {@link http://www.loc.gov/standards/iso639-2/php/English_list.php} * * Text direction from * {@link http://translate.sourceforge.net/wiki/l10n/displaysettings} * {@link http://meta.wikimedia.org/wiki/Template:List_of_language_names_ordered_by_code} * * Plural-forms taken from * {@link http://translate.sourceforge.net/wiki/l10n/pluralforms} * * $languages_definitions types look like this: * 0 = code ISO 639.1 (2 digit) + IETF add * 1 = code ISO 639.2 (english 3 digit) * 2 = English name * 3 = natal name * 4 = text direction (ltr or rtl) * 5 = number of plurals (1 means no plural form) * 6 = plural expression (as of gettext .po plural form) * * null values represent missing values * * @param integer $type Type of definition * @param string $default Default value if definition is empty * @return array List of requested definition by languages codes */ protected static function getLanguagesDefinitions($type, $default='') { if ($type < 0 || $type > 6) { return array(); } if (empty(self::$languages_definitions)) { self::$languages_definitions = array( array('aa', 'aar', 'Afar', 'Afaraf', 'ltr', null, null), array('ab', 'abk', 'Abkhazian', 'Аҧсуа', 'ltr', null, null), array('ae', 'ave', 'Avestan', 'Avesta', 'ltr', null, null), array('af', 'afr', 'Afrikaans', 'Afrikaans', 'ltr', 2, 'n != 1'), array('ak', 'aka', 'Akan', 'Akan', 'ltr', 2, 'n > 1)'), array('am', 'amh', 'Amharic', 'አማርኛ', 'ltr', 2, 'n > 1'), array('an', 'arg', 'Aragonese', 'Aragonés', 'ltr', 2, 'n != 1'), array('ar', 'ara', 'Arabic', '‫العربية', 'rtl', 6, 'n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5'), array('as', 'asm', 'Assamese', 'অসমীয়া', 'ltr', null, null), array('av', 'ava', 'Avaric', 'авар мацӀ', 'ltr', null, null), array('ay', 'aym', 'Aymara', 'Aymar aru', 'ltr', 1, '0'), array('az', 'aze', 'Azerbaijani', 'Azərbaycan dili', 'ltr', 2, 'n != 1'), array('ba', 'bak', 'Bashkir', 'башҡорт теле', 'ltr', null, null), array('be', 'bel', 'Belarusian', 'Беларуская', 'ltr', 3, 'n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2'), array('bg', 'bul', 'Bulgarian', 'български език', 'ltr', 2, 'n != 1'), array('bh', 'bih', 'Bihari languages', 'भोजपुरी', 'ltr', null, null), array('bi', 'bis', 'Bislama', 'Bislama', 'ltr', null, null), array('bm', 'bam', 'Bambara', 'Bamanankan', 'ltr', null, null), array('bn', 'ben', 'Bengali', 'বাংলা', 'ltr', 2, 'n != 1'), array('bo', 'tib', 'Tibetan', 'བོད་ཡིག', 'ltr', 1, '0'), array('br', 'bre', 'Breton', 'Brezhoneg', 'ltr', 2, 'n > 1'), array('bs', 'bos', 'Bosnian', 'Bosanski jezik', 'ltr', 3, 'n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2'), array('ca', 'cat', 'Catalan', 'Català', 'ltr', 2, 'n != 1'), array('ce', 'che', 'Chechen', 'нохчийн мотт', 'ltr', null, null), array('ch', 'cha', 'Chamorro', 'Chamoru', 'ltr', 3, 'n==1 ? 0 : (n>=2 && n<=4) ? 1 : 2'), array('co', 'cos', 'Corsican', 'Corsu', 'ltr', null, null), array('cr', 'cre', 'Cree', 'ᓀᐦᐃᔭᐍᐏᐣ', 'ltr', null, null), array('cs', 'cze', 'Czech', 'Česky', 'ltr', null, null), array('cu', 'chu', 'Church Slavonic', 'ѩзыкъ Словѣньскъ', 'ltr', null, null), array('cv', 'chv', 'Chuvash', 'чӑваш чӗлхи', 'ltr', null, null), array('cy', 'wel', 'Welsh', 'Cymraeg', 'ltr', 4, 'n==1 ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3'), array('da', 'dan', 'Danish', 'Dansk', 'ltr', 2, 'n != 1'), array('de', 'ger', 'German', 'Deutsch', 'ltr', 2, 'n != 1'), array('dv', 'div', 'Maldivian', 'ދިވެހި', 'rtl', null, null), array('dz', 'dzo', 'Dzongkha', 'རྫོང་ཁ', 'ltr', 1, '0'), array('ee', 'ewe', 'Ewe', 'Ɛʋɛgbɛ', 'ltr', null, null), array('el', 'gre', 'Greek', 'Ελληνικά', 'ltr', 2, 'n != 1'), array('en', 'eng', 'English', 'English', 'ltr', 2, 'n != 1'), array('eo', 'epo', 'Esperanto', 'Esperanto', 'ltr', 2, 'n != 1'), array('es', 'spa', 'Spanish', 'español', 'ltr', 2, 'n != 1'), array('es-ar', null, 'Argentinean Spanish', 'Argentinean Spanish', 'ltr', 2, 'n != 1'), array('et', 'est', 'Estonian', 'Eesti keel', 'ltr', 2, 'n != 1'), array('eu', 'baq', 'Basque', 'Euskara', 'ltr', 2, 'n != 1'), array('fa', 'per', 'Persian', '‫فارسی', 'rtl', 1, '0'), array('ff', 'ful', 'Fulah', 'Fulfulde', 'ltr', 2, 'n != 1'), array('fi', 'fin', 'Finnish', 'Suomen kieli', 'ltr', 2, 'n != 1'), array('fj', 'fij', 'Fijian', 'Vosa Vakaviti', 'ltr', null, null), array('fo', 'fao', 'Faroese', 'Føroyskt', 'ltr', 2, 'n != 1'), array('fr', 'fre', 'French', 'Français', 'ltr', 2, 'n > 1'), array('fy', 'fry', 'Western Frisian', 'Frysk', 'ltr', 2, 'n != 1'), array('ga', 'gle', 'Irish', 'Gaeilge', 'ltr', 5, 'n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4'), array('gd', 'gla', 'Gaelic', 'Gàidhlig', 'ltr', 4, '(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3'), array('gl', 'glg', 'Galician', 'Galego', 'ltr', 2, 'n != 1'), array('gn', 'grn', 'Guarani', "Avañe'ẽ", 'ltr', null, null), array('gu', 'guj', 'Gujarati', 'ગુજરાતી', 'ltr', 2, 'n != 1'), array('gv', 'glv', 'Manx', 'Ghaelg', 'ltr', null, null), array('ha', 'hau', 'Hausa', '‫هَوُسَ', 'rtl', 2, 'n != 1'), array('he', 'heb', 'Hebrew', '‫עברית', 'rtl', 2, 'n != 1'), array('hi', 'hin', 'Hindi', 'हिन्दी', 'ltr', 2, 'n != 1'), array('ho', 'hmo', 'Hiri Motu', 'Hiri Motu', 'ltr', null, null), array('hr', 'hrv', 'Croatian', 'Hrvatski', 'ltr', 3, 'n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2'), array('ht', 'hat', 'Haitian', 'Kreyòl ayisyen', 'ltr', null, null), array('hu', 'hun', 'Hungarian', 'Magyar', 'ltr', 2, 'n != 1'), array('hy', 'arm', 'Armenian', 'Հայերեն', 'ltr', 2, 'n != 1'), array('hz', 'her', 'Herero', 'Otjiherero', 'ltr', null, null), array('ia', 'ina', 'Interlingua', 'Interlingua', 'ltr', 2, 'n != 1'), array('id', 'ind', 'Indonesian', 'Bahasa Indonesia', 'ltr', 1, '0'), array('ie', 'ile', 'Interlingue', 'Interlingue', 'ltr', null, null), array('ig', 'ibo', 'Igbo', 'Igbo', 'ltr', null, null), array('ii', 'iii', 'Sichuan Yi', 'ꆇꉙ', 'ltr', null, null), array('ik', 'ipk', 'Inupiaq', 'Iñupiaq', 'ltr', null, null), array('io', 'ido', 'Ido', 'Ido', 'ltr', null, null), array('is', 'ice', 'Icelandic', 'Íslenska', 'ltr', 2, '(n%10!=1 || n%100==11) ? 1 : 0'), array('it', 'ita', 'Italian', 'Italiano', 'ltr', 2, 'n != 1'), array('iu', 'iku', 'Inuktitut', 'ᐃᓄᒃᑎᑐᑦ', 'ltr', null, null), array('ja', 'jpn', 'Japanese', '日本語', 'ltr', 1, '0'), array('jv', 'jav', 'Javanese', 'Basa Jawa', 'ltr', 2, 'n != 0'), array('ka', 'geo', 'Georgian', 'ქართული', 'ltr', 1, '0'), array('kg', 'kon', 'Kongo', 'KiKongo', 'ltr', null, null), array('ki', 'kik', 'Kikuyu', 'Gĩkũyũ', 'ltr', null, null), array('kj', 'kua', 'Kuanyama', 'Kuanyama', 'ltr', null, null), array('kk', 'kaz', 'Kazakh', 'Қазақ тілі', 'ltr', 1, '0'), array('kl', 'kal', 'Greenlandic', 'Kalaallisut', 'ltr', null, null), array('km', 'khm', 'Central Khmer', 'ភាសាខ្មែរ', 'ltr', 1, '0'), array('kn', 'kan', 'Kannada', 'ಕನ್ನಡ', 'ltr', 2, 'n != 1'), array('ko', 'kor', 'Korean', '한국어', 'ltr', 1, '0'), array('kr', 'kau', 'Kanuri', 'Kanuri', 'ltr', null, null), array('ks', 'kas', 'Kashmiri', 'कश्मीरी', 'rtl', null, null), array('ku', 'kur', 'Kurdish', 'Kurdî', 'ltr', 2, 'n!= 1'), array('kv', 'kom', 'Komi', 'коми кыв', 'ltr', null, null), array('kw', 'cor', 'Cornish', 'Kernewek', 'ltr', 4, 'n==1 ? 0 : (n==2) ? 1 : (n == 3) ? 2 : 3'), array('ky', 'kir', 'Kirghiz', 'кыргыз тили', 'ltr', 1, '0'), array('la', 'lat', 'Latin', 'Latine', 'ltr', null, null), array('lb', 'ltz', 'Luxembourgish', 'Lëtzebuergesch', 'ltr', 2, 'n != 1'), array('lg', 'lug', 'Ganda', 'Luganda', 'ltr', null, null), array('li', 'lim', 'Limburgan', 'Limburgs', 'ltr', null, null), array('ln', 'lin', 'Lingala', 'Lingála', 'ltr', 2, 'n>1'), array('lo', 'lao', 'Lao', 'ພາສາລາວ', 'ltr', 1, '0'), array('lt', 'lit', 'Lithuanian', 'Lietuvių kalba', 'ltr', 3, 'n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 or n%100>=20) ? 1 : 2'), array('lu', 'lub', 'Luba-Katanga', 'Luba-Katanga', 'ltr', null, null), array('lv', 'lav', 'Latvian', 'Latviešu valoda', 'ltr', 3, 'n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2'), array('mg', 'mlg', 'Malagasy', 'Malagasy fiteny', 'ltr', 2, 'n > 1'), array('mh', 'mah', 'Marshallese', 'Kajin M̧ajeļ', 'ltr', null, null), array('mi', 'mao', 'Maori', 'Te reo Māori', 'ltr', 2, 'n > 1'), array('mk', 'mac', 'Macedonian', 'македонски јазик', 'ltr', 2, 'n==1 || n%10==1 ? 0 : 1'), array('ml', 'mal', 'Malayalam', 'മലയാളം', 'ltr', 2, 'n != 1'), array('mn', 'mon', 'Mongolian', 'Монгол', 'ltr', 2, 'n != 1'), array('mo', null, 'Moldavian', 'Limba moldovenească', 'ltr', 3, 'n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2'), //cf: ro array('mr', 'mar', 'Marathi', 'मराठी', 'ltr', 2, 'n != 1'), array('ms', 'may', 'Malay', 'Bahasa Melayu', 'ltr', 1, '0'), array('mt', 'mlt', 'Maltese', 'Malti', 'ltr', 4, 'n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3'), array('my', 'bur', 'Burmese', 'ဗမာစာ', 'ltr', 1, '0'), array('na', 'nau', 'Nauru', 'Ekakairũ Naoero', 'ltr', null, null), array('nb', 'nob', 'Norwegian Bokmål', 'Norsk bokmål', 'ltr', 2, 'n != 1'), array('nd', 'nde', 'North Ndebele', 'isiNdebele', 'ltr', null, null), array('ne', 'nep', 'Nepali', 'नेपाली', 'ltr', 2, 'n != 1'), array('ng', 'ndo', 'Ndonga', 'Owambo', 'ltr', null, null), array('nl', 'dut', 'Flemish', 'Nederlands', 'ltr', 2, 'n != 1'), array('nl-be', null, 'Flemish', 'Nederlands (Belgium)', 'ltr', 2, 'n != 1'), array('nn', 'nno', 'Norwegian Nynorsk', 'Norsk nynorsk', 'ltr', 2, 'n != 1'), array('no', 'nor', 'Norwegian', 'Norsk', 'ltr', 2, 'n != 1'), array('nr', 'nbl', 'South Ndebele', 'Ndébélé', 'ltr', null, null), array('nv', 'nav', 'Navajo', 'Diné bizaad', 'ltr', null, null), array('ny', 'nya', 'Chichewa', 'ChiCheŵa', 'ltr', null, null), array('oc', 'oci', 'Occitan', 'Occitan', 'ltr', 2, 'n > 1'), array('oj', 'oji', 'Ojibwa', 'ᐊᓂᔑᓈᐯᒧᐎᓐ', 'ltr', null, null), array('om', 'orm', 'Oromo', 'Afaan Oromoo', 'ltr', null, null), array('or', 'ori', 'Oriya', 'ଓଡ଼ିଆ', 'ltr', 2, 'n != 1'), array('os', 'oss', 'Ossetian', 'Ирон æвзаг', 'ltr', null, null), array('pa', 'pan', 'Panjabi', 'ਪੰਜਾਬੀ', 'ltr', 2, 'n != 1'), array('pi', 'pli', 'Pali', 'पाऴि', 'ltr', null, null), array('pl', 'pol', 'Polish', 'Polski', 'ltr', 3, 'n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2'), array('ps', 'pus', 'Pushto', '‫پښتو', 'rtl', 2, 'n != 1'), array('pt', 'por', 'Portuguese', 'Português', 'ltr', 2, 'n != 1'), array('pt-br', null, 'Brazilian Portuguese', 'Português do Brasil', 'ltr', 2, 'n > 1'), array('qu', 'que', 'Quechua', 'Runa Simi', 'ltr', null, null), array('rm', 'roh', 'Romansh', 'Rumantsch grischun', 'ltr', 2, 'n != 1'), array('rn', 'run', 'Rundi', 'kiRundi', 'ltr', null, null), array('ro', 'rum', 'Romanian', 'Română', 'ltr', 3, 'n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2'), array('ru', 'rus', 'Russian', 'Русский', 'ltr', 3, 'n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2'), array('rw', 'kin', 'Kinyarwanda', 'IKinyarwanda', 'ltr', 2, 'n != 1'), array('sa', 'san', 'Sanskrit', 'संस्कृतम्', 'ltr', null, null), array('sc', 'srd', 'Sardinian', 'sardu', 'ltr', null, null), array('sd', 'snd', 'Sindhi', 'सिन्धी', 'ltr', 2, 'n != 1'), array('se', 'sme', 'Northern Sami', 'Davvisámegiella', 'ltr', null, null), array('sg', 'sag', 'Sango', 'Yângâ tî sängö', 'ltr', null, null), array('sh', null, null, 'SrpskoHrvatski', 'ltr', null, null), //! array('si', 'sin', 'Sinhalese', 'සිංහල', 'ltr', 2, 'n != 1'), array('sk', 'slo', 'Slovak', 'Slovenčina', 'ltr', 3, '(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2'), array('sl', 'slv', 'Slovenian', 'Slovenščina', 'ltr', 4, 'n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0'), array('sm', 'smo', 'Samoan', "Gagana fa'a Samoa", 'ltr', null, null), array('sn', 'sna', 'Shona', 'chiShona', 'ltr', null, null), array('so', 'som', 'Somali', 'Soomaaliga', 'ltr', 2, 'n != 1'), array('sq', 'alb', 'Albanian', 'Shqip', 'ltr', 2, 'n != 1'), array('sr', 'srp', 'Serbian', 'српски језик', 'ltr', 3, 'n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2'), array('ss', 'ssw', 'Swati', 'SiSwati', 'ltr', null, null), array('st', 'sot', 'Southern Sotho', 'seSotho', 'ltr', null, null), array('su', 'sun', 'Sundanese', 'Basa Sunda', 'ltr', 1, '0'), array('sv', 'swe', 'Swedish', 'Svenska', 'ltr', 2, 'n != 1'), array('sw', 'swa', 'Swahili', 'Kiswahili', 'ltr', 2, 'n != 1'), array('ta', 'tam', 'Tamil', 'தமிழ்', 'ltr', 2, 'n != 1'), array('te', 'tel', 'Telugu', 'తెలుగు', 'ltr', 2, 'n != 1'), array('tg', 'tgk', 'Tajik', 'тоҷикӣ', 'ltr', 2, 'n > 1'), array('th', 'tha', 'Thai', 'ไทย', 'ltr', 1, '0'), array('ti', 'tir', 'Tigrinya', 'ትግርኛ', 'ltr', 2, 'n > 1'), array('tk', 'tuk', 'Turkmen', 'Türkmen', 'ltr', 2, 'n != 1'), array('tl', 'tlg', 'Tagalog', 'Tagalog', 'ltr', null, null), array('tn', 'tsn', 'Tswana', 'seTswana', 'ltr', null, null), array('to', 'ton', 'Tonga', 'faka Tonga', 'ltr', null, null), array('tr', 'tur', 'Turkish', 'Türkçe', 'ltr', 2, 'n > 1'), array('ts', 'tso', 'Tsonga', 'xiTsonga', 'ltr', null, null), array('tt', 'tat', 'Tatar', 'татарча', 'ltr', 1, '0'), array('tw', 'twi', 'Twi', 'Twi', 'ltr', null, null), array('ty', 'tah', 'Tahitian', 'Reo Mā`ohi', 'ltr', null, null), array('ug', 'uig', 'Uighur', 'Uyƣurqə', 'ltr', 1, '0'), array('uk', 'ukr', 'Ukrainian', 'Українська', 'ltr', 3, 'n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2'), array('ur', 'urd', 'Urdu', '‫اردو', 'rtl', 2, 'n != 1'), array('uz', 'uzb', 'Uzbek', "O'zbek", 'ltr', 2, 'n > 1'), array('ve', 'ven', 'Venda', 'tshiVenḓa', 'ltr', null, null), array('vi', 'vie', 'Vietnamese', 'Tiếng Việt', 'ltr', 1, '0'), array('vo', 'vol', 'Volapük', 'Volapük', 'ltr', null, null), array('wa', 'wln', 'Walloon', 'Walon', 'ltr', 2, 'n > 1'), array('wo', 'wol', 'Wolof', 'Wollof', 'ltr', 1, '0'), array('xh', 'xho', 'Xhosa', 'isiXhosa', 'ltr', null, null), array('yi', 'yid', 'Yiddish', '‫ייִדיש', 'rtl', null, null), array('yo', 'yor', 'Yoruba', 'Yorùbá', 'ltr', 2, 'n != 1'), array('za', 'zha', 'Chuang', 'Saɯ cueŋƅ', 'ltr', null, null), array('zh', 'zhi', 'Chinese', '中文', 'ltr', 1, '0'), array('zh-hk', null, 'Honk Kong Chinese', '中文 (香港)', 'ltr', 1, '0'), array('zh-tw', null, 'Taiwan Chinese', '中文 (臺灣)', 'ltr', 1, '0'), array('zu', 'zul', 'Zulu', 'isiZulu', 'ltr', null, null), ); } $r = array(); foreach(self::$languages_definitions as $_) { $r[$_[0]] = empty($_[$type]) ? $default : $_[$type]; } return $r; } //@} } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/common/lib.text.php000066400000000000000000000204761230033266200237630ustar00rootroot00000000000000 $p) { $str = preg_replace('/['.$p.']/u',$r,$str); } return $str; } /** * String to URL * * Transforms a string to a proper URL. * * @param string $str String to transform * @param boolean $with_slashes Keep slashes in URL * @return string */ public static function str2URL($str,$with_slashes=true) { $str = self::deaccent($str); $str = preg_replace('/[^A-Za-z0-9_\s\'\:\/[\]-]/','',$str); return self::tidyURL($str,$with_slashes); } /** * URL cleanup * * @param string $str URL to tidy * @param boolean $keep_slashes Keep slashes in URL * @param boolean $keep_spaces Keep spaces in URL * @return string */ public static function tidyURL($str,$keep_slashes=true,$keep_spaces=false) { $str = strip_tags($str); $str = str_replace(array('?','&','#','=','+','<','>','"','%'),'',$str); $str = str_replace("'",' ',$str); $str = preg_replace('/[\s]+/u',' ',trim($str)); if (!$keep_slashes) { $str = str_replace('/','-',$str); } if (!$keep_spaces) { $str = str_replace(' ','-',$str); } $str = preg_replace('/[-]+/','-',$str); # Remove path changes in URL $str = preg_replace('%^/%','',$str); $str = preg_replace('%\.+/%','',$str); return $str; } /** * Cut string * * Returns a cuted string on spaced at given length $l. * * @param string $str String to cut * @param integer $l Length to keep * @return string */ public static function cutString($str,$l) { $s = preg_split('/([\s]+)/u',$str,-1,PREG_SPLIT_DELIM_CAPTURE); $res = ''; $L = 0; if (mb_strlen($s[0]) >= $l) { return mb_substr($s[0],0,$l); } foreach ($s as $v) { $L = $L+mb_strlen($v); if ($L > $l) { break; } else { $res .= $v; } } return trim($res); } /** * Split words * * Returns an array of words from a given string. * * @param string $str Words to split * @return array */ public static function splitWords($str) { $non_word = '\x{0000}-\x{002F}\x{003A}-\x{0040}\x{005b}-\x{0060}\x{007B}-\x{007E}\x{00A0}-\x{00BF}\s'; if (preg_match_all('/([^'.$non_word.']{3,})/msu',html::clean($str),$match)) { foreach ($match[1] as $i => $v) { $match[1][$i] = mb_strtolower($v); } return $match[1]; } return array(); } /** * Encoding detection * * Returns the encoding (in lowercase) of given $str. * * @param string $str String * @return string */ public static function detectEncoding($str) { return strtolower(mb_detect_encoding($str.' ', 'UTF-8,ISO-8859-1,ISO-8859-2,ISO-8859-3,'. 'ISO-8859-4,ISO-8859-5,ISO-8859-6,ISO-8859-7,ISO-8859-8,'. 'ISO-8859-9,ISO-8859-10,ISO-8859-13,ISO-8859-14,ISO-8859-15')); } /** * UTF8 conversions * * Returns an UTF-8 converted string. If $encoding is not specified, the * function will try to detect encoding. * * @param string $str String to convert * @param string $encoding Optionnal "from" encoding * @return string */ public static function toUTF8($str,$encoding=null) { if (!$encoding) { $encoding = self::detectEncoding($str); } if ($encoding != 'utf-8') { $str = iconv($encoding,'UTF-8',$str); } return $str; } /** * Find bad UTF8 tokens * * Locates the first bad byte in a UTF-8 string returning it's * byte index in the string * PCRE Pattern to locate bad bytes in a UTF-8 string * Comes from W3 FAQ: Multilingual Forms * Note: modified to include full ASCII range including control chars * * @copyright Harry Fuecks * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html GNU LGPL 2.1 * @link http://phputf8.sourceforge.net * * @param string $str String to search * @return integer|false */ public static function utf8badFind($str) { $UTF8_BAD = '([\x00-\x7F]'. # ASCII (including control chars) '|[\xC2-\xDF][\x80-\xBF]'. # non-overlong 2-byte '|\xE0[\xA0-\xBF][\x80-\xBF]'. # excluding overlongs '|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}'. # straight 3-byte '|\xED[\x80-\x9F][\x80-\xBF]'. # excluding surrogates '|\xF0[\x90-\xBF][\x80-\xBF]{2}'. # planes 1-3 '|[\xF1-\xF3][\x80-\xBF]{3}'. # planes 4-15 '|\xF4[\x80-\x8F][\x80-\xBF]{2}'. # plane 16 '|(.{1}))'; # invalid byte $pos = 0; $badList = array(); while (preg_match('/'.$UTF8_BAD.'/S', $str, $matches)) { $bytes = strlen($matches[0]); if ( isset($matches[2])) { return $pos; } $pos += $bytes; $str = substr($str,$bytes); } return false; } /** * UTF8 cleanup * * Replaces non utf8 bytes in $str by $repl. * * @copyright Harry Fuecks * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html GNU LGPL 2.1 * @link http://phputf8.sourceforge.net * * @param string $str String to clean * @param string $repl Replacement string * @return string */ public static function cleanUTF8($str,$repl='?') { while (($bad_index = self::utf8badFind($str)) !== false) { $str = substr_replace($str,$repl,$bad_index,1); } return $str; } /** * BOM removal * * Removes BOM from the begining of a string if present. * * @param string $str String to clean * @return string */ public static function removeBOM($str) { if (substr_count($str,'')) { return str_replace('','',$str); } return $str; } /** * Quoted printable conversion * * Encodes given str to quoted printable * * @param string $str String to encode * @return string */ public static function QPEncode($str) { $res = ''; foreach (preg_split("/\r?\n/msu", $str) as $line) { $l = ''; preg_match_all('/./',$line,$m); foreach ($m[0] as $c) { $a = ord($c); if ($a < 32 || $a == 61 || $a > 126) { $c = sprintf('=%02X',$a); } $l .= $c; } $res .= $l."\r\n"; } return $res; } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/common/tz.dat000066400000000000000000000143301230033266200226400ustar00rootroot00000000000000Africa/Abidjan Africa/Accra Africa/Addis_Ababa Africa/Algiers Africa/Asmera Africa/Bamako Africa/Bangui Africa/Banjul Africa/Bissau Africa/Blantyre Africa/Brazzaville Africa/Bujumbura Africa/Cairo Africa/Casablanca Africa/Ceuta Africa/Conakry Africa/Dakar Africa/Dar_es_Salaam Africa/Djibouti Africa/Douala Africa/El_Aaiun Africa/Freetown Africa/Gaborone Africa/Harare Africa/Johannesburg Africa/Kampala Africa/Khartoum Africa/Kigali Africa/Kinshasa Africa/Lagos Africa/Libreville Africa/Lome Africa/Luanda Africa/Lubumbashi Africa/Lusaka Africa/Malabo Africa/Maputo Africa/Maseru Africa/Mbabane Africa/Mogadishu Africa/Monrovia Africa/Nairobi Africa/Ndjamena Africa/Niamey Africa/Nouakchott Africa/Ouagadougou Africa/Porto-Novo Africa/Sao_Tome Africa/Timbuktu Africa/Tripoli Africa/Tunis Africa/Windhoek America/Adak America/Anchorage America/Anguilla America/Antigua America/Araguaina America/Argentina/Buenos_Aires America/Argentina/Catamarca America/Argentina/ComodRivadavia America/Argentina/Cordoba America/Argentina/Jujuy America/Argentina/La_Rioja America/Argentina/Mendoza America/Argentina/Rio_Gallegos America/Argentina/San_Juan America/Argentina/Tucuman America/Argentina/Ushuaia America/Aruba America/Asuncion America/Bahia America/Barbados America/Belem America/Belize America/Boa_Vista America/Bogota America/Boise America/Cambridge_Bay America/Campo_Grande America/Cancun America/Caracas America/Cayenne America/Cayman America/Chicago America/Chihuahua America/Costa_Rica America/Cuiaba America/Curacao America/Danmarkshavn America/Dawson America/Dawson_Creek America/Denver America/Detroit America/Dominica America/Edmonton America/Eirunepe America/El_Salvador America/Fortaleza America/Glace_Bay America/Godthab America/Goose_Bay America/Grand_Turk America/Grenada America/Guadeloupe America/Guatemala America/Guayaquil America/Guyana America/Halifax America/Havana America/Hermosillo America/Indiana/Indianapolis America/Indiana/Knox America/Indiana/Marengo America/Indiana/Vevay America/Indianapolis America/Inuvik America/Iqaluit America/Jamaica America/Juneau America/Kentucky/Louisville America/Kentucky/Monticello America/La_Paz America/Lima America/Los_Angeles America/Louisville America/Maceio America/Managua America/Manaus America/Martinique America/Mazatlan America/Menominee America/Merida America/Mexico_City America/Miquelon America/Monterrey America/Montevideo America/Montreal America/Montserrat America/Nassau America/New_York America/Nipigon America/Nome America/Noronha America/North_Dakota/Center America/Panama America/Pangnirtung America/Paramaribo America/Phoenix America/Port-au-Prince America/Port_of_Spain America/Porto_Velho America/Puerto_Rico America/Rainy_River America/Rankin_Inlet America/Recife America/Regina America/Rio_Branco America/Santiago America/Santo_Domingo America/Sao_Paulo America/Scoresbysund America/Shiprock America/St_Johns America/St_Kitts America/St_Lucia America/St_Thomas America/St_Vincent America/Swift_Current America/Tegucigalpa America/Thule America/Thunder_Bay America/Tijuana America/Toronto America/Tortola America/Vancouver America/Whitehorse America/Winnipeg America/Yakutat America/Yellowknife Antarctica/Casey Antarctica/Davis Antarctica/DumontDUrville Antarctica/Mawson Antarctica/McMurdo Antarctica/Palmer Antarctica/Rothera Antarctica/South_Pole Antarctica/Syowa Antarctica/Vostok Arctic/Longyearbyen Asia/Aden Asia/Almaty Asia/Amman Asia/Anadyr Asia/Aqtau Asia/Aqtobe Asia/Ashgabat Asia/Baghdad Asia/Bahrain Asia/Baku Asia/Bangkok Asia/Beirut Asia/Bishkek Asia/Brunei Asia/Calcutta Asia/Choibalsan Asia/Chongqing Asia/Colombo Asia/Damascus Asia/Dhaka Asia/Dili Asia/Dubai Asia/Dushanbe Asia/Gaza Asia/Harbin Asia/Hong_Kong Asia/Hovd Asia/Irkutsk Asia/Istanbul Asia/Jakarta Asia/Jayapura Asia/Jerusalem Asia/Kabul Asia/Kamchatka Asia/Karachi Asia/Kashgar Asia/Katmandu Asia/Krasnoyarsk Asia/Kuala_Lumpur Asia/Kuching Asia/Kuwait Asia/Macau Asia/Magadan Asia/Makassar Asia/Manila Asia/Muscat Asia/Nicosia Asia/Novosibirsk Asia/Omsk Asia/Oral Asia/Phnom_Penh Asia/Pontianak Asia/Pyongyang Asia/Qatar Asia/Qyzylorda Asia/Rangoon Asia/Riyadh Asia/Saigon Asia/Sakhalin Asia/Samarkand Asia/Seoul Asia/Shanghai Asia/Singapore Asia/Taipei Asia/Tashkent Asia/Tbilisi Asia/Tehran Asia/Thimphu Asia/Tokyo Asia/Ulaanbaatar Asia/Urumqi Asia/Vientiane Asia/Vladivostok Asia/Yakutsk Asia/Yekaterinburg Asia/Yerevan Atlantic/Azores Atlantic/Bermuda Atlantic/Canary Atlantic/Cape_Verde Atlantic/Faeroe Atlantic/Jan_Mayen Atlantic/Madeira Atlantic/Reykjavik Atlantic/South_Georgia Atlantic/St_Helena Atlantic/Stanley Australia/Adelaide Australia/Brisbane Australia/Broken_Hill Australia/Darwin Australia/Hobart Australia/Lindeman Australia/Lord_Howe Australia/Melbourne Australia/Perth Australia/Sydney Europe/Amsterdam Europe/Andorra Europe/Athens Europe/Belfast Europe/Belgrade Europe/Berlin Europe/Bratislava Europe/Brussels Europe/Bucharest Europe/Budapest Europe/Chisinau Europe/Copenhagen Europe/Dublin Europe/Gibraltar Europe/Helsinki Europe/Istanbul Europe/Kaliningrad Europe/Kiev Europe/Lisbon Europe/Ljubljana Europe/London Europe/Luxembourg Europe/Madrid Europe/Malta Europe/Mariehamn Europe/Minsk Europe/Monaco Europe/Moscow Europe/Nicosia Europe/Oslo Europe/Paris Europe/Prague Europe/Riga Europe/Rome Europe/Samara Europe/San_Marino Europe/Sarajevo Europe/Simferopol Europe/Skopje Europe/Sofia Europe/Stockholm Europe/Tallinn Europe/Tirane Europe/Uzhgorod Europe/Vaduz Europe/Vatican Europe/Vienna Europe/Vilnius Europe/Warsaw Europe/Zagreb Europe/Zaporozhye Europe/Zurich Indian/Antananarivo Indian/Chagos Indian/Christmas Indian/Cocos Indian/Comoro Indian/Kerguelen Indian/Mahe Indian/Maldives Indian/Mauritius Indian/Mayotte Indian/Reunion Pacific/Apia Pacific/Auckland Pacific/Chatham Pacific/Easter Pacific/Efate Pacific/Enderbury Pacific/Fakaofo Pacific/Fiji Pacific/Funafuti Pacific/Galapagos Pacific/Gambier Pacific/Guadalcanal Pacific/Guam Pacific/Honolulu Pacific/Johnston Pacific/Kiritimati Pacific/Kosrae Pacific/Kwajalein Pacific/Majuro Pacific/Marquesas Pacific/Midway Pacific/Nauru Pacific/Niue Pacific/Norfolk Pacific/Noumea Pacific/Pago_Pago Pacific/Palau Pacific/Pitcairn Pacific/Ponape Pacific/Port_Moresby Pacific/Rarotonga Pacific/Saipan Pacific/Tahiti Pacific/Tarawa Pacific/Tongatapu Pacific/Truk Pacific/Wake Pacific/Wallis Pacific/Yapdotclear-2.6.2+dfsg/inc/libs/clearbricks/composer.json000066400000000000000000000010311230033266200227350ustar00rootroot00000000000000{ "name": "dotclear/clearbricks", "description": "Clearbricks is not yet another framework.", "license": "GPL-V2", "authors": [ { "name": "Dotclear Team", "email": "dev@dotclear.org" } ], "minimum-stability": "dev", "require": { "php": ">5.3.0" }, "require-dev": { "atoum/atoum": "dev-master", "fzaninotto/faker": "dev-master" }, "config": { "bin-dir": "bin/" }, "autoload": { "psr-0": { "": "" } } } dotclear-2.6.2+dfsg/inc/libs/clearbricks/composer.lock000066400000000000000000000106641230033266200227300ustar00rootroot00000000000000{ "_readme": [ "This file locks the dependencies of your project to a known state", "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" ], "hash": "9d804ec6c7ca12fee96bf609bfa39a15", "packages": [ ], "packages-dev": [ { "name": "atoum/atoum", "version": "dev-master", "source": { "type": "git", "url": "https://github.com/atoum/atoum.git", "reference": "fd5e6b8468e6fa1c3808e759e46a8956785088a3" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/atoum/atoum/zipball/fd5e6b8468e6fa1c3808e759e46a8956785088a3", "reference": "fd5e6b8468e6fa1c3808e759e46a8956785088a3", "shasum": "" }, "require": { "ext-hash": "*", "ext-json": "*", "ext-session": "*", "ext-tokenizer": "*", "ext-xml": "*", "php": ">=5.3.3" }, "replace": { "mageekguy/atoum": "*" }, "suggest": { "ext-mbstring": "Provides support for UTF-8 strings" }, "bin": [ "bin/atoum" ], "type": "library", "autoload": { "classmap": [ "classes/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD" ], "authors": [ { "name": "Frédéric Hardy", "email": "frederic.hardy@atoum.org", "homepage": "http://blog.mageekbox.net" }, { "name": "François Dussert", "email": "francois.dussert@atoum.org" }, { "name": "Gérald Croes", "email": "gerald.croes@atoum.org" }, { "name": "Julien Bianchi", "email": "julien.bianchi@atoum.org" }, { "name": "Ludovic Fleury", "email": "ludovic.fleury@atoum.org" } ], "description": "Simple modern and intuitive unit testing framework for PHP 5.3+", "homepage": "http://www.atoum.org", "keywords": [ "TDD", "atoum", "test", "unit testing" ], "time": "2013-10-12 14:00:32" }, { "name": "fzaninotto/faker", "version": "dev-master", "source": { "type": "git", "url": "https://github.com/fzaninotto/Faker.git", "reference": "2355fcf8d19de6eaa562f809150e4ddace90d985" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/2355fcf8d19de6eaa562f809150e4ddace90d985", "reference": "2355fcf8d19de6eaa562f809150e4ddace90d985", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.2.x-dev" } }, "autoload": { "psr-0": { "Faker": "src/", "Faker\\PHPUnit": "test/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "François Zaninotto" } ], "description": "Faker is a PHP library that generates fake data for you.", "keywords": [ "data", "faker", "fixtures" ], "time": "2013-10-10 13:40:29" } ], "aliases": [ ], "minimum-stability": "dev", "stability-flags": { "atoum/atoum": 20, "fzaninotto/faker": 20 }, "platform": { "php": ">5.3.0" }, "platform-dev": [ ] } dotclear-2.6.2+dfsg/inc/libs/clearbricks/dblayer/000077500000000000000000000000001230033266200216425ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/dblayer/class.cursor.php000066400000000000000000000111501230033266200247720ustar00rootroot00000000000000 * openCursor('table'); * $cur->field1 = 1; * $cur->field2 = 'foo'; * $cur->insert(); // Insert field ... * * $cur->update('WHERE field3 = 4'); // ... or update field * ?> * * * @see dbLayer::openCursor() * @param dbLayer &$con Connection object * @param string $table Table name */ public function __construct($con,$table) { $this->__con =& $con; $this->setTable($table); } /** * Set table * * Changes working table and resets data * * @param string $table Table name */ public function setTable($table) { $this->__table = $table; $this->__data = array(); } /** * Set field * * Set value $v to a field named $n. Value could be * an string, an integer, a float, a null value or an array. * * If value is an array, its first value will be interpreted as a SQL * command. String values will be automatically escaped. * * @see __set() * @param string $n Field name * @param mixed $v Field value */ public function setField($n,$v) { $this->__data[$n] = $v; } /** * Unset field * * Remove a field from data set. * * @param string $n Field name */ public function unsetField($n) { unset($this->__data[$n]); } /** * Field exists * * @return boolean true if field named $n exists */ public function isField($n) { return isset($this->__data[$n]); } /** * Field value * * @see __get() * @return mixed value for a field named $n */ public function getField($n) { if (isset($this->__data[$n])) { return $this->__data[$n]; } return null; } /** * Set Field * * Magic alias for {@link setField()} */ public function __set($n,$v) { $this->setField($n,$v); } /** * Field value * * Magic alias for {@link getField()} * * @return mixed value for a field named $n */ public function __get($n) { return $this->getField($n); } /** * Empty data set * * Removes all data from data set */ public function clean() { $this->__data = array(); } private function formatFields() { $data = array(); foreach ($this->__data as $k => $v) { $k = $this->__con->escapeSystem($k); if (is_null($v)) { $data[$k] = 'NULL'; } elseif (is_string($v)) { $data[$k] = "'".$this->__con->escape($v)."'"; } elseif (is_array($v)) { $data[$k] = is_string($v[0]) ? "'".$this->__con->escape($v[0])."'" : $v[0]; } else { $data[$k] = $v; } } return $data; } /** * Get insert query * * Returns the generated INSERT query * * @return string */ public function getInsert() { $data = $this->formatFields(); $insReq = 'INSERT INTO '.$this->__con->escapeSystem($this->__table)." (\n". implode(",\n",array_keys($data))."\n) VALUES (\n". implode(",\n",array_values($data))."\n) "; return $insReq; } /** * Get update query * * Returns the generated UPDATE query * * @param string $where WHERE condition * @return string */ public function getUpdate($where) { $data = $this->formatFields(); $fields = array(); $updReq = 'UPDATE '.$this->__con->escapeSystem($this->__table)." SET \n"; foreach ($data as $k => $v) { $fields[] = $k.' = '.$v.""; } $updReq .= implode(",\n",$fields); $updReq .= "\n".$where; return $updReq; } /** * Execute insert query * * Executes the generated INSERT query */ public function insert() { if (!$this->__table) { throw new Exception('No table name.'); } $insReq = $this->getInsert(); $this->__con->execute($insReq); return true; } /** * Execute update query * * Executes the generated UPDATE query * * @param string $where WHERE condition */ public function update($where) { if (!$this->__table) { throw new Exception('No table name.'); } $updReq = $this->getUpdate($where); $this->__con->execute($updReq); return true; } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/dblayer/class.mysql.php000066400000000000000000000124651230033266200246340ustar00rootroot00000000000000db_post_connect($link,$database); return $link; } /** @ignore */ public function db_pconnect($host,$user,$password,$database) { if (!function_exists('mysql_pconnect')) { throw new Exception('PHP MySQL functions are not available'); } if (($link = @mysql_pconnect($host,$user,$password)) === false) { throw new Exception('Unable to connect to database'); } $this->db_post_connect($link,$database); return $link; } /** @ignore */ private function db_post_connect($link,$database) { if (@mysql_select_db($database,$link) === false) { throw new Exception('Unable to use database '.$database); } if (version_compare($this->db_version($link),'4.1','>=')) { $this->db_query($link,'SET NAMES utf8'); $this->db_query($link,'SET CHARACTER SET utf8'); $this->db_query($link,"SET COLLATION_CONNECTION = 'utf8_general_ci'"); $this->db_query($link,"SET COLLATION_SERVER = 'utf8_general_ci'"); $this->db_query($link,"SET CHARACTER_SET_SERVER = 'utf8'"); $this->db_query($link,"SET CHARACTER_SET_DATABASE = 'utf8'"); } } /** @ignore */ public function db_close($handle) { if (is_resource($handle)) { mysql_close($handle); } } /** @ignore */ public function db_version($handle) { if (is_resource($handle)) { return mysql_get_server_info(); } return null; } /** @ignore */ public function db_query($handle,$query) { if (is_resource($handle)) { $res = @mysql_query($query,$handle); if ($res === false) { $e = new Exception($this->db_last_error($handle)); $e->sql = $query; throw $e; } return $res; } } /** @ignore */ public function db_exec($handle,$query) { return $this->db_query($handle,$query); } /** @ignore */ public function db_num_fields($res) { if (is_resource($res)) { return mysql_num_fields($res); } return 0; } /** @ignore */ public function db_num_rows($res) { if (is_resource($res)) { return mysql_num_rows($res); } return 0; } /** @ignore */ public function db_field_name($res,$position) { if (is_resource($res)) { return mysql_field_name($res,$position); } } /** @ignore */ public function db_field_type($res,$position) { if (is_resource($res)) { return mysql_field_type($res,$position); } } /** @ignore */ public function db_fetch_assoc($res) { if (is_resource($res)) { return mysql_fetch_assoc($res); } } /** @ignore */ public function db_result_seek($res,$row) { if (is_resource($res)) { return mysql_data_seek($res,$row); } } /** @ignore */ public function db_changes($handle,$res) { if (is_resource($handle)) { return mysql_affected_rows($handle); } } /** @ignore */ public function db_last_error($handle) { if (is_resource($handle)) { $e = mysql_error($handle); if ($e) { return $e.' ('.mysql_errno($handle).')'; } } return false; } /** @ignore */ public function db_escape_string($str,$handle=null) { if (is_resource($handle)) { return mysql_real_escape_string($str,$handle); } else { return mysql_escape_string($str); } } /** @ignore */ public function db_write_lock($table) { try { $this->execute('LOCK TABLES '.$this->escapeSystem($table).' WRITE'); } catch (Exception $e) { # As lock is a privilege in MySQL, we can avoid errors with weak_locks static var if (!self::$weak_locks) { throw $e; } } } /** @ignore */ public function db_unlock() { try { $this->execute('UNLOCK TABLES'); } catch (Exception $e) { if (!self::$weak_locks) { throw $e; } } } /** @ignore */ public function vacuum($table) { $this->execute('OPTIMIZE TABLE '.$this->escapeSystem($table)); } /** @ignore */ public function dateFormat($field,$pattern) { $pattern = str_replace('%M','%i',$pattern); return 'DATE_FORMAT('.$field.','."'".$this->escape($pattern)."') "; } /** @ignore */ public function concat() { $args = func_get_args(); return 'CONCAT('.implode(',',$args).')'; } /** @ignore */ public function escapeSystem($str) { return '`'.$str.'`'; } } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/dblayer/class.mysqli.php000066400000000000000000000135471230033266200250070ustar00rootroot00000000000000db_post_connect($link,$database); return $link; } /** @ignore */ public function db_pconnect($host,$user,$password,$database) { // No pconnect wtih mysqli, below code is for comatibility return $this->db_connect($host,$user,$password,$database); } /** @ignore */ private function db_post_connect($link,$database) { if (version_compare($this->db_version($link),'4.1','>=')) { $this->db_query($link,'SET NAMES utf8'); $this->db_query($link,'SET CHARACTER SET utf8'); $this->db_query($link,"SET COLLATION_CONNECTION = 'utf8_general_ci'"); $this->db_query($link,"SET COLLATION_SERVER = 'utf8_general_ci'"); $this->db_query($link,"SET CHARACTER_SET_SERVER = 'utf8'"); $this->db_query($link,"SET CHARACTER_SET_DATABASE = 'utf8'"); $link->set_charset("utf8"); } } /** @ignore */ public function db_close($handle) { if ($handle instanceof MySQLi) { mysqli_close($handle); } } /** @ignore */ public function db_version($handle) { if ($handle instanceof MySQLi) { return mysqli_get_server_info($handle); } return null; } /** @ignore */ public function db_query($handle,$query) { if ($handle instanceof MySQLi) { $res = @mysqli_query($handle, $query); if ($res === false) { $e = new Exception($this->db_last_error($handle)); $e->sql = $query; throw $e; } return $res; } } /** @ignore */ public function db_exec($handle,$query) { return $this->db_query($handle,$query); } /** @ignore */ public function db_num_fields($res) { if ($res instanceof MySQLi_Result) { //return mysql_num_fields($res); return $res->field_count; } return 0; } /** @ignore */ public function db_num_rows($res) { if ($res instanceof MySQLi_Result) { return $res->num_rows; } return 0; } /** @ignore */ public function db_field_name($res,$position) { if ($res instanceof MySQLi_Result) { $res->field_seek($position); $finfo = $res->fetch_field(); return $finfo->name; } } /** @ignore */ public function db_field_type($res,$position) { if ($res instanceof MySQLi_Result) { $res->field_seek($position); $finfo = $res->fetch_field(); return $this->_convert_types($finfo->type); } } /** @ignore */ public function db_fetch_assoc($res) { if ($res instanceof MySQLi_Result) { $v = $res->fetch_assoc(); return($v === NULL) ? false : $v; } } /** @ignore */ public function db_result_seek($res,$row) { if ($res instanceof MySQLi_Result) { return $res->data_seek($row); } } /** @ignore */ public function db_changes($handle,$res) { if ($handle instanceof MySQLi) { return mysqli_affected_rows($handle); } } /** @ignore */ public function db_last_error($handle) { if ($handle instanceof MySQLi) { $e = mysqli_error($handle); if ($e) { return $e.' ('.mysqli_errno($handle).')'; } } return false; } /** @ignore */ public function db_escape_string($str,$handle=null) { if ($handle instanceof MySQLi) { return mysqli_real_escape_string($handle, $str); } return addslashes($str); } /** @ignore */ public function db_write_lock($table) { try { $this->execute('LOCK TABLES '.$this->escapeSystem($table).' WRITE'); } catch (Exception $e) { # As lock is a privilege in MySQL, we can avoid errors with weak_locks static var if (!self::$weak_locks) { throw $e; } } } /** @ignore */ public function db_unlock() { try { $this->execute('UNLOCK TABLES'); } catch (Exception $e) { if (!self::$weak_locks) { throw $e; } } } /** @ignore */ public function vacuum($table) { $this->execute('OPTIMIZE TABLE '.$this->escapeSystem($table)); } /** @ignore */ public function dateFormat($field,$pattern) { $pattern = str_replace('%M','%i',$pattern); return 'DATE_FORMAT('.$field.','."'".$this->escape($pattern)."') "; } /** @ignore */ public function concat() { $args = func_get_args(); return 'CONCAT('.implode(',',$args).')'; } /** @ignore */ public function escapeSystem($str) { return '`'.$str.'`'; } protected function _convert_types($id) { $id2type = array( '1'=>'int', '2'=>'int', '3'=>'int', '8'=>'int', '9'=>'int', '16'=>'int', //BIT type recognized as unknown with mysql adapter '4'=>'real', '5'=>'real', '246'=>'real', '253'=>'string', '254'=>'string', '10'=>'date', '11'=>'time', '12'=>'datetime', '13'=>'year', '7'=>'timestamp', '252'=>'blob' ); $type = 'unknown'; if(isset($id2type[$id])) $type = $id2type[$id]; return $type; } } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/dblayer/class.pgsql.php000066400000000000000000000133061230033266200246100ustar00rootroot00000000000000get_connection_string($host,$user,$password,$database); if (($link = @pg_connect($str)) === false) { throw new Exception('Unable to connect to database'); } return $link; } /** @ignore */ public function db_pconnect($host,$user,$password,$database) { if (!function_exists('pg_pconnect')) { throw new Exception('PHP PostgreSQL functions are not available'); } $str = $this->get_connection_string($host,$user,$password,$database); if (($link = @pg_pconnect($str)) === false) { throw new Exception('Unable to connect to database'); } return $link; } /** @ignore */ public function db_close($handle) { if (is_resource($handle)) { pg_close($handle); } } /** @ignore */ public function db_version($handle) { if (is_resource($handle)) { return pg_parameter_status($handle,'server_version'); } return null; } /** @ignore */ public function db_query($handle,$query) { if (is_resource($handle)) { $res = @pg_query($handle,$query); if ($res === false) { $e = new Exception($this->db_last_error($handle)); $e->sql = $query; throw $e; } return $res; } } /** @ignore */ public function db_exec($handle,$query) { return $this->db_query($handle,$query); } /** @ignore */ public function db_num_fields($res) { if (is_resource($res)) { return pg_num_fields($res); } return 0; } /** @ignore */ public function db_num_rows($res) { if (is_resource($res)) { return pg_num_rows($res); } return 0; } /** @ignore */ public function db_field_name($res,$position) { if (is_resource($res)) { return pg_field_name($res,$position); } } /** @ignore */ public function db_field_type($res,$position) { if (is_resource($res)) { return pg_field_type($res,$position); } } /** @ignore */ public function db_fetch_assoc($res) { if (is_resource($res)) { return pg_fetch_assoc($res); } } /** @ignore */ public function db_result_seek($res,$row) { if (is_resource($res)) { return pg_result_seek($res,(int) $row); } return false; } /** @ignore */ public function db_changes($handle,$res) { if (is_resource($handle) && is_resource($res)) { return pg_affected_rows($res); } } /** @ignore */ public function db_last_error($handle) { if (is_resource($handle)) { return pg_last_error($handle); } return false; } /** @ignore */ public function db_escape_string($str,$handle=null) { return pg_escape_string($str); } /** @ignore */ public function db_write_lock($table) { $this->execute('BEGIN'); $this->execute('LOCK TABLE '.$this->escapeSystem($table).' IN EXCLUSIVE MODE'); } /** @ignore */ public function db_unlock() { $this->execute('END'); } /** @ignore */ public function vacuum($table) { $this->execute('VACUUM FULL '.$this->escapeSystem($table)); } /** @ignore */ public function dateFormat($field,$pattern) { $rep = array( '%d' => 'DD', '%H' => 'HH24', '%M' => 'MI', '%m' => 'MM', '%S' => 'SS', '%Y' => 'YYYY' ); $pattern = str_replace(array_keys($rep),array_values($rep),$pattern); return 'TO_CHAR('.$field.','."'".$this->escape($pattern)."') "; } /** * Function call * * Calls a PostgreSQL function an returns the result as a {@link record}. * After $name, you can add any parameters you want to append * them to the PostgreSQL function. You don't need to escape string in * arguments. * * @param string $name Function name * @return record */ public function callFunction($name) { $data = func_get_args(); array_shift($data); foreach ($data as $k => $v) { if (is_null($v)) { $data[$k] = 'NULL'; } elseif (is_string($v)) { $data[$k] = "'".$this->escape($v)."'"; } elseif (is_array($v)) { $data[$k] = $v[0]; } else { $data[$k] = $v; } } $req = 'SELECT '.$name."(\n". implode(",\n",array_values($data)). "\n) "; return $this->select($req); } } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/dblayer/class.sqlite.php000066400000000000000000000134161230033266200247650ustar00rootroot00000000000000db_post_connect($link,$database); return $link; } /** @ignore */ public function db_pconnect($host,$user,$password,$database) { if (!class_exists('PDO') || !in_array('sqlite',PDO::getAvailableDrivers())) { throw new Exception('PDO SQLite class is not available'); } $link = new PDO('sqlite:'.$database,null,null,array(PDO::ATTR_PERSISTENT => true)); $this->db_post_connect($link,$database); return $link; } /** @ignore */ private function db_post_connect($handle,$database) { if ($handle instanceof PDO) { $this->db_exec($handle,'PRAGMA short_column_names = 1'); $this->db_exec($handle,'PRAGMA encoding = "UTF-8"'); $handle->sqliteCreateFunction('now',array($this,'now'),0); } } /** @ignore */ public function db_close($handle) { if ($handle instanceof PDO) { $handle = null; $this->__link = null; } } /** @ignore */ public function db_version($handle) { if ($handle instanceof PDO) { return $handle->getAttribute(PDO::ATTR_SERVER_VERSION); } } # There is no other way than get all selected data in a staticRecord /** @ignore */ public function select($sql) { $result = $this->db_query($this->__link,$sql); $this->__last_result =& $result; $info = array(); $info['con'] =& $this; $info['cols'] = $this->db_num_fields($result); $info['info'] = array(); for ($i=0; $i<$info['cols']; $i++) { $info['info']['name'][] = $this->db_field_name($result,$i); $info['info']['type'][] = $this->db_field_type($result,$i); } $data = array(); while ($r = $result->fetch(PDO::FETCH_ASSOC)) { $R = array(); foreach ($r as $k => $v) { $k = preg_replace('/^(.*)\./','',$k); $R[$k] = $v; $R[] =& $R[$k]; } $data[] = $R; } $info['rows'] = count($data); $result->closeCursor(); return new staticRecord($data,$info); } /** @ignore */ public function db_query($handle,$query) { if ($handle instanceof PDO) { $res = $handle->query($query); if ($res === false) { $e = new Exception($this->db_last_error($handle)); $e->sql = $query; throw $e; } return $res; } } /** @ignore */ public function db_exec($handle,$query) { return $this->db_query($handle,$query); } /** @ignore */ public function db_num_fields($res) { if ($res instanceof PDOStatement) { return $res->columnCount(); } return 0; } /** @ignore */ public function db_num_rows($res) { } /** @ignore */ public function db_field_name($res,$position) { if ($res instanceof PDOStatement) { $m = $res->getColumnMeta($position); return preg_replace('/^.+\./','',$m['name']); # we said short_column_names = 1 } } /** @ignore */ public function db_field_type($res,$position) { if ($res instanceof PDOStatement) { $m = $res->getColumnMeta($position); switch ($m['pdo_type']) { case PDO::PARAM_BOOL: return 'boolean'; case PDO::PARAM_NULL: return 'null'; case PDO::PARAM_INT: return 'integer'; default: return 'varchar'; } } } /** @ignore */ public function db_fetch_assoc($res) { } /** @ignore */ public function db_result_seek($res,$row) { } /** @ignore */ public function db_changes($handle,$res) { if ($res instanceof PDOStatement) { return $res->rowCount(); } } /** @ignore */ public function db_last_error($handle) { if ($handle instanceof PDO) { $err = $handle->errorInfo(); return $err[2].' ('.$err[1].')'; } return false; } /** @ignore */ public function db_escape_string($str,$handle=null) { if ($handle instanceof PDO) { return trim($handle->quote($str),"'"); } return $str; } /** @ignore */ public function escapeSystem($str) { return "'".$this->escape($str)."'"; } /** @ignore */ public function begin() { if ($this->__link instanceof PDO) { $this->__link->beginTransaction(); } } /** @ignore */ public function commit() { if ($this->__link instanceof PDO) { $this->__link->commit(); } } /** @ignore */ public function rollback() { if ($this->__link instanceof PDO) { $this->__link->rollBack(); } } /** @ignore */ public function db_write_lock($table) { $this->execute('BEGIN EXCLUSIVE TRANSACTION'); } /** @ignore */ public function db_unlock() { $this->execute('END'); } /** @ignore */ public function vacuum($table) { $this->execute('VACUUM '.$this->escapeSystem($table)); } /** @ignore */ public function dateFormat($field,$pattern) { return "strftime('".$this->escape($pattern)."',".$field.') '; } # Internal SQLite function that adds NOW() SQL function. /** @ignore */ public function now() { return date('Y-m-d H:i:s'); } } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/dblayer/dblayer.php000066400000000000000000000551011230033266200237770ustar00rootroot00000000000000$position. * * @param resource $res Resource result * @param integer $position Field position * @return string */ function db_field_name($res,$position); /** * Field type * * This method should return the field type a the given position * $position. * * @param resource $res Resource result * @param integer $position Field position * @return string */ function db_field_type($res,$position); /** * Fetch result * * This method should fetch one line of result and return an associative array * with field name as key and field value as value. * * @param resource $res Resource result * @return array */ function db_fetch_assoc($res); /** * Move result cursor * * This method should move result cursor on given row position $row * and return true on success. * * @param resource $res Resource result * @param integer $position Row position * @return boolean */ function db_result_seek($res,$row); /** * Affected rows * * This method should return number of rows affected by INSERT, UPDATE or * DELETE queries. * * @param resource $handle Resource link * @param resource $res Resource result * @return integer */ function db_changes($handle,$res); /** * Last error * * This method should return the last error string for the current connection. * * @param resource $handle Resource link * @return string */ function db_last_error($handle); /** * Escape string * * This method should return an escaped string for the current connection. * * @param string $str String to escape * @param resource $handle Resource link * @return string */ function db_escape_string($str,$handle=null); /** * Acquiere Write lock * * This method should lock the given table in write access. * * @param string $table Table name */ function db_write_lock($table); /** * Release lock * * This method should releases an acquiered lock. */ function db_unlock(); } /** * Database Abstraction Layer class * * Base class for database abstraction. Each driver extends this class and * implements {@link i_dbLayer} interface. * * @package Clearbricks * @subpackage DBLayer */ class dbLayer { /** @var string Driver name */ protected $__driver = null; /** @var string Database version */ protected $__version = null; /** @var resource Database resource link */ protected $__link; /** @var resource Last result resource link */ protected $__last_result; /** * Start connection * * Static function to use to init database layer. Returns a object extending * dbLayer. * * @param string $driver Driver name * @param string $host Database hostname * @param string $database Database name * @param string $user User ID * @param string $password Password * @param string $persistent Persistent connection * @return object */ public static function init($driver,$host,$database,$user='',$password='',$persistent=false) { if (file_exists(dirname(__FILE__).'/class.'.$driver.'.php')) { require_once dirname(__FILE__).'/class.'.$driver.'.php'; $driver_class = $driver.'Connection'; } else { trigger_error('Unable to load DB layer for '.$driver,E_USER_ERROR); exit(1); } return new $driver_class($host,$database,$user,$password,$persistent); } /** * @param string $host Database hostname * @param string $database Database name * @param string $user User ID * @param string $password Password * @param string $persistent Persistent connection */ public function __construct($host,$database,$user='',$password='',$persistent=false) { if ($persistent) { $this->__link = $this->db_pconnect($host,$user,$password,$database); } else { $this->__link = $this->db_connect($host,$user,$password,$database); } $this->__version = $this->db_version($this->__link); $this->__database = $database; } /** * Closes database connection. */ public function close() { $this->db_close($this->__link); } /** * Returns database driver name * * @return string */ public function driver() { return $this->__driver; } /** * Returns database driver version * * @return string */ public function version() { return $this->__version; } /** * Returns current database name * * @return string */ public function database() { return $this->__database; } /** * Returns link resource * * @return resource */ public function link() { return $this->__link; } /** * Run query and get results * * Executes a query and return a {@link record} object. * * @param string $sql SQL query * @return record */ public function select($sql) { $result = $this->db_query($this->__link,$sql); $this->__last_result =& $result; $info = array(); $info['con'] =& $this; $info['cols'] = $this->db_num_fields($result); $info['rows'] = $this->db_num_rows($result); $info['info'] = array(); for ($i=0; $i<$info['cols']; $i++) { $info['info']['name'][] = $this->db_field_name($result,$i); $info['info']['type'][] = $this->db_field_type($result,$i); } return new record($result,$info); } /** * Run query * * Executes a query and return true if succeed * * @param string $sql SQL query * @return true */ public function execute($sql) { $result = $this->db_exec($this->__link,$sql); $this->__last_result =& $result; return true; } /** * Begin transaction * * Begins a transaction. Transaction should be {@link commit() commited} * or {@link rollback() rollbacked}. */ public function begin() { $this->execute('BEGIN'); } /** * Commit transaction * * Commits a previoulsy started transaction. */ public function commit() { $this->execute('COMMIT'); } /** * Rollback transaction * * Rollbacks a previously started transaction. */ public function rollback() { $this->execute('ROLLBACK'); } /** * Aquiere write lock * * This method lock the given table in write access. * * @param string $table Table name */ public function writeLock($table) { $this->db_write_lock($table); } /** * Release lock * * This method releases an acquiered lock. */ public function unlock() { $this->db_unlock(); } /** * Vacuum the table given in argument. * * @param string $table Table name */ public function vacuum($table) { } /** * Changed rows * * Returns the number of lines affected by the last DELETE, INSERT or UPDATE * query. * * @return integer */ public function changes() { return $this->db_changes($this->__link,$this->__last_result); } /** * Last error * * Returns the last database error or false if no error. * * @return string|false */ public function error() { $err = $this->db_last_error($this->__link); if (!$err) { return false; } return $err; } /** * Date formatting * * Returns a query fragment with date formater. * * The following modifiers are accepted: * * - %d : Day of the month, numeric * - %H : Hour 24 (00..23) * - %M : Minute (00..59) * - %m : Month numeric (01..12) * - %S : Seconds (00..59) * - %Y : Year, numeric, four digits * * @param string $field Field name * @param string $pattern Date format * @return string */ public function dateFormat($field,$pattern) { return 'TO_CHAR('.$field.','."'".$this->escape($pattern)."') "; } /** * Query Limit * * Returns a LIMIT query fragment. $arg1 could be an array of * offset and limit or an integer which is only limit. If $arg2 * is given and $arg1 is an integer, it would become limit. * * @param array|integer $arg1 array or integer with limit intervals * @param array|null $arg2 integer or null * @return string */ public function limit($arg1, $arg2=null) { if (is_array($arg1)) { $arg1 = array_values($arg1); $arg2 = isset($arg1[1]) ? $arg1[1] : null; $arg1 = $arg1[0]; } if ($arg2 === null) { $sql = ' LIMIT '.(integer) $arg1.' '; } else { $sql = ' LIMIT '.(integer) $arg2.' OFFSET '.(integer) $arg1.' '; } return $sql; } /** * IN fragment * * Returns a IN query fragment where $in could be an array, a string, * an integer or null * * @param array|string|integer|null $in "IN" values * @return string */ public function in($in) { if (is_null($in)) { return ' IN (NULL) '; } elseif (is_string($in)) { return " IN ('".$this->escape($in)."') "; } elseif (is_array($in)) { foreach ($in as $i => $v) { if (is_null($v)) { $in[$i] = 'NULL'; } elseif (is_string($v)) { $in[$i] = "'".$this->escape($v)."'"; } } return ' IN ('.implode(',',$in).') '; } else { return ' IN ( '.(integer) $in.') '; } } /** * Concat strings * * Returns SQL concatenation of methods arguments. Theses arguments * should be properly escaped when needed. * * @return string */ public function concat() { $args = func_get_args(); return implode(' || ',$args); } /** * Escape string * * Returns SQL protected string or array values. * * @param string|array $i String or array to protect * @return string|array */ public function escape($i) { if (is_array($i)) { foreach ($i as $k => $s) { $i[$k] = $this->db_escape_string($s,$this->__link); } return $i; } return $this->db_escape_string($i,$this->__link); } /** * System escape string * * Returns SQL system protected string. * * @param string $str String to protect * @return string */ public function escapeSystem($str) { return '"'.$str.'"'; } /** * Cursor object * * Returns a new instance of {@link cursor} class on $table for * the current connection. * * @param string $table Target table * @return cursor */ public function openCursor($table) { return new cursor($this,$table); } } /** * Query Result Record Class * * This class acts as an iterator over database query result. It does not fetch * all results on instantiation and thus, depending on database engine, should not * fill PHP process memory. * * @package Clearbricks * @subpackage DBLayer */ class record implements Iterator, Countable { /** @var resource Database resource link */ protected $__link; /** @var resource Query result resource */ protected $__result; /** @var array Result information array */ protected $__info; /** @var array List of static functions that extend record */ protected $__extend = array(); /** @var integer Current result position */ protected $__index = 0; /** @var array Current result row content */ protected $__row = false; private $__fetch = false; /** * Constructor * * Creates class instance from result link and some informations. * $info is an array with the following content: * * - con => database object instance * - cols => number of columns * - rows => number of rows * - info[name] => an array with columns names * - info[type] => an array with columns types * * @param resource $result Resource result * @param array $info Information array */ public function __construct($result,$info) { $this->__result = $result; $this->__info = $info; $this->__link = $info['con']->link(); $this->index(0); } /** * To staticRecord * * Converts this record to a {@link staticRecord} instance. */ public function toStatic() { if ($this instanceof staticRecord) { return $this; } return new staticRecord($this->__result,$this->__info); } /** * Magic call * * Magic call function. Calls function added by {@link extend()} if exists, passing it * self object and arguments. * * @return mixed */ public function __call($f,$args) { if (isset($this->__extend[$f])) { array_unshift($args,$this); return call_user_func_array($this->__extend[$f],$args); } trigger_error('Call to undefined method record::'.$f.'()',E_USER_ERROR); } /** * Magic get * * Alias for {@link field()}. * * @param string|integer $n Field name * @return string */ public function __get($n) { return $this->field($n); } /** * Get field * * Alias for {@link field()}. * * @param string|integer $n Field name * @return string */ public function f($n) { return $this->field($n); } /** * Get field * * Retrieve field value by its name or column position. * * @param string|integer $n Field name * @return string */ public function field($n) { return $this->__row[$n]; } /** * Field exists * * Returns true if a field exists. * * @param string $n Field name * @return string */ public function exists($n) { return isset($this->__row[$n]); } /** * Field isset * * Returns true if a field exists (magic method from PHP 5.1). * * @param string $n Field name * @return string */ public function __isset($n) { return isset($this->__row[$n]); } /** * Extend record * * Extends this instance capabilities by adding all public static methods of * $class to current instance. Class methods should take at least * this record as first parameter. * * @see __call() * * @param string $class Class name */ public function extend($class) { if (!class_exists($class)) { return; } $c = new ReflectionClass($class); foreach ($c->getMethods() as $m) { if ($m->isStatic() && $m->isPublic()) { $this->__extend[$m->name] = array($class,$m->name); } } } /** * Returns record extensions. * * @return array */ public function extensions() { return $this->__extend; } private function setRow() { $this->__row = $this->__info['con']->db_fetch_assoc($this->__result); if ($this->__row !== false) { foreach ($this->__row as $k => $v) { $this->__row[] =& $this->__row[$k]; } return true; } else { return false; } } /** * Returns the current index position (0 is first) or move to $row if * specified. * * @param integer $row Row number to move * @return integer */ public function index($row=null) { if ($row === null) { return $this->__index === null ? 0 : $this->__index; } if ($row < 0 || $row+1 > $this->__info['rows']) { return false; } if ($this->__info['con']->db_result_seek($this->__result,(integer) $row)) { $this->__index = $row; $this->setRow(); $this->__info['con']->db_result_seek($this->__result,(integer) $row); return true; } return false; } /** * One step move index * * This method moves index forward and return true until index is not * the last one. You can use it to loop over record. Example: * * fetch()) { * echo $rs->field1; * } * ?> * * * @return boolean */ public function fetch() { if (!$this->__fetch) { $this->__fetch = true; $i = -1; } else { $i = $this->__index; } if (!$this->index($i+1)) { $this->__fetch = false; $this->__index = 0; return false; } return true; } /** * Moves index to first position. * * @return boolean */ public function moveStart() { $this->__fetch = false; return $this->index(0); } /** * Moves index to last position. * * @return boolean */ public function moveEnd() { return $this->index($this->__info['rows']-1); } /** * Moves index to next position. * * @return boolean */ public function moveNext() { return $this->index($this->__index+1); } /** * Moves index to previous position. * * @return boolean */ public function movePrev() { return $this->index($this->__index-1); } /** * @return boolean true if index is at last position */ public function isEnd() { return $this->__index+1 == $this->count(); } /** * @return boolean true if index is at first position. */ public function isStart() { return $this->__index <= 0; } /** * @return boolean true if record contains no result. */ public function isEmpty() { return $this->count() == 0; } /** * @return integer number of rows in record */ public function count() { return $this->__info['rows']; } /** * @return array array of columns, with name as key and type as value. */ public function columns() { return $this->__info['info']['name']; } /** * @return array all rows in record. */ public function rows() { return $this->getData(); } /** * All data * * Returns an array of all rows in record. This method is called by rows(). * * @return array */ protected function getData() { $res = array(); if ($this->count() == 0) { return $res; } $this->__info['con']->db_result_seek($this->__result,0); while (($r = $this->__info['con']->db_fetch_assoc($this->__result)) !== false) { foreach ($r as $k => $v) { $r[] =& $r[$k]; } $res[] = $r; } $this->__info['con']->db_result_seek($this->__result,$this->__index); return $res; } /** * @return array current rows. */ public function row() { return $this->__row; } /* Iterator methods */ /** * @see Iterator::current */ public function current() { return $this; } /** * @see Iterator::key */ public function key() { return $this->index(); } /** * @see Iterator::next */ public function next() { $this->fetch(); } /** * @see Iterator::rewind */ public function rewind() { $this->moveStart(); $this->fetch(); } /** * @see Iterator::valid */ public function valid () { return $this->__fetch; } } /** * Query Result Static Record Class * * Unlike record class, this one contains all results in an associative array. * * @package Clearbricks * @subpackage DBLayer */ class staticRecord extends record { /** @var array Data array */ public $__data = array(); private $__sortfield; private $__sortsign; /** @ignore */ public function __construct($result,$info) { if (is_array($result)) { $this->__info = $info; $this->__data = $result; } else { parent::__construct($result,$info); $this->__data = parent::getData(); } unset($this->__link); unset($this->__result); } /** * Static record from array * * Returns a new instance of object from an associative array. * * @param array $data Data array * @return staticRecord */ public static function newFromArray($data) { if (!is_array($data)) { $data = array(); } $data = array_values($data); if (empty($data) || !is_array($data[0])) { $cols = 0; } else { $cols = count($data[0]); } $info = array( 'con' => null, 'info' => null, 'cols' => $cols, 'rows' => count($data) ); return new self($data,$info); } /** @ignore */ public function field($n) { return $this->__data[$this->__index][$n]; } /** @ignore */ public function exists($n) { return isset($this->__data[$this->__index][$n]); } /** @ignore */ public function index($row=null) { if ($row === null) { return $this->__index; } if ($row < 0 || $row+1 > $this->__info['rows']) { return false; } $this->__index = $row; return true; } /** @ignore */ public function rows() { return $this->__data; } /** * Changes value of a given field in the current row. * * @param string $n Field name * @param string $v Field value */ public function set($n,$v) { if ($this->__index === null) { return false; } $this->__data[$this->__index][$n] = $v; } /** * Sorts values by a field in a given order. * * @param string $field Field name * @param string $order Sort type (asc or desc) */ public function sort($field,$order='asc') { if (!isset($this->__data[0][$field])) { return false; } $this->__sortfield = $field; $this->__sortsign = strtolower($order) == 'asc' ? 1 : -1; usort($this->__data,array($this,'sortCallback')); $this->__sortfield = null; $this->__sortsign = null; } private function sortCallback($a,$b) { $a = $a[$this->__sortfield]; $b = $b[$this->__sortfield]; # Integer values if ($a == (string) (integer) $a && $b == (string) (integer) $b) { $a = (integer) $a; $b = (integer) $b; return ($a - $b) * $this->__sortsign; } return strcmp($a,$b) * $this->__sortsign; } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/dbschema/000077500000000000000000000000001230033266200217665ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/dbschema/class.dbschema.php000066400000000000000000000171051230033266200253550ustar00rootroot00000000000000array */ function db_get_tables(); /** This method should return an associative array of columns in given table $table with column names in keys. Each line value is an array with following values: - [type] data type (string) - [len] data length (integer or null) - [null] is null? (boolean) - [default] default value (string) @param table string Table name @return array */ function db_get_columns($table); /** This method should return an array of keys in given table $table. Each line value is an array with following values: - [name] index name (string) - [primary] primary key (boolean) - [unique] unique key (boolean) - [cols] columns (array) @param table string Table name @return array */ function db_get_keys($table); /** This method should return an array of indexes in given table $table. Each line value is an array with following values: - [name] index name (string) - [type] index type (string) - [cols] columns (array) @param table string Table name @return array */ function db_get_indexes($table); /** This method should return an array of foreign keys in given table $table. Each line value is an array with following values: - [name] key name (string) - [c_cols] child columns (array) - [p_table] parent table (string) - [p_cols] parent columns (array) - [update] on update statement (string) - [delete] on delete statement (string) @param table string Table name @return array */ function db_get_references($table); function db_create_table($name,$fields); function db_create_field($table,$name,$type,$len,$null,$default); function db_create_primary($table,$name,$cols); function db_create_unique($table,$name,$cols); function db_create_index($table,$name,$type,$cols); function db_create_reference($name,$c_table,$c_cols,$p_table,$p_cols,$update,$delete); function db_alter_field($table,$name,$type,$len,$null,$default); function db_alter_primary($table,$name,$newname,$cols); function db_alter_unique($table,$name,$newname,$cols); function db_alter_index($table,$name,$newname,$type,$cols); function db_alter_reference($name,$newname,$c_table,$c_cols,$p_table,$p_cols,$update,$delete); function db_drop_unique($table,$name); } class dbSchema { protected $con; public function __construct($con) { $this->con =& $con; } public static function init($con) { $driver = $con->driver(); $driver_class = $driver.'Schema'; if (!class_exists($driver_class)) { if (file_exists(dirname(__FILE__).'/class.'.$driver.'.dbschema.php')) { require dirname(__FILE__).'/class.'.$driver.'.dbschema.php'; } else { trigger_error('Unable to load DB schema layer for '.$driver,E_USER_ERROR); exit(1); } } return new $driver_class($con); } /** Database data type to universal data type conversion. @param type string Type name @param leng integer Field length (in/out) @param default string Default field value (in/out) @return string */ public function dbt2udt($type,&$len,&$default) { $c = array( 'bool' => 'boolean', 'int2' => 'smallint', 'int' => 'integer', 'int4' => 'integer', 'int8' => 'bigint', 'float4' => 'real', 'double precision' => 'float', 'float8' => 'float', 'decimal' => 'numeric', 'character varying' => 'varchar', 'character' => 'char' ); if (isset($c[$type])) { return $c[$type]; } return $type; } /** Universal data type to database data tye conversion. @param type string Type name @param leng integer Field length (in/out) @param default string Default field value (in/out) @return string */ public function udt2dbt($type,&$len,&$default) { return $type; } /** Returns an array of all table names. @see i_dbSchema::db_get_tables @return array */ public function getTables() { return $this->db_get_tables(); } /** Returns an array of columns (name and type) of a given table. @see i_dbSchema::db_get_columns @param table string Table name @return array */ public function getColumns($table) { return $this->db_get_columns($table); } /** Returns an array of index of a given table. @see i_dbSchema::db_get_keys @param table string Table name @return array */ public function getKeys($table) { return $this->db_get_keys($table); } /** Returns an array of indexes of a given table. @see i_dbSchema::db_get_index @param table string Table name @return array */ public function getIndexes($table) { return $this->db_get_indexes($table); } /** Returns an array of foreign keys of a given table. @see i_dbSchema::db_get_references @param table string Table name @return array */ public function getReferences($table) { return $this->db_get_references($table); } public function createTable($name,$fields) { return $this->db_create_table($name,$fields); } public function createField($table,$name,$type,$len,$null,$default) { return $this->db_create_field($table,$name,$type,$len,$null,$default); } public function createPrimary($table,$name,$cols) { return $this->db_create_primary($table,$name,$cols); } public function createUnique($table,$name,$cols) { return $this->db_create_unique($table,$name,$cols); } public function createIndex($table,$name,$type,$cols) { return $this->db_create_index($table,$name,$type,$cols); } public function createReference($name,$c_table,$c_cols,$p_table,$p_cols,$update,$delete) { return $this->db_create_reference($name,$c_table,$c_cols,$p_table,$p_cols,$update,$delete); } public function alterField($table,$name,$type,$len,$null,$default) { return $this->db_alter_field($table,$name,$type,$len,$null,$default); } public function alterPrimary($table,$name,$newname,$cols) { return $this->db_alter_primary($table,$name,$newname,$cols); } public function alterUnique($table,$name,$newname,$cols) { return $this->db_alter_unique($table,$name,$newname,$cols); } public function alterIndex($table,$name,$newname,$type,$cols) { return $this->db_alter_index($table,$name,$newname,$type,$cols); } public function alterReference($name,$newname,$c_table,$c_cols,$p_table,$p_cols,$update,$delete) { return $this->db_alter_reference($name,$newname,$c_table,$c_cols,$p_table,$p_cols,$update,$delete); } public function dropUnique($table,$name) { return $this->db_drop_unique($table,$name); } public function flushStack() { } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/dbschema/class.dbstruct.php000066400000000000000000000354701230033266200254460ustar00rootroot00000000000000con =& $con; $this->prefix = $prefix; } public function driver() { return $this->con->driver(); } public function table($name) { $this->tables[$name] = new dbStructTable($name); return $this->tables[$name]; } public function __get($name) { if (!isset($this->tables[$name])) { return $this->table($name); } return $this->tables[$name]; } public function reverse() { $schema = dbSchema::init($this->con); # Get tables $tables = $schema->getTables(); foreach ($tables as $t_name) { if ($this->prefix && strpos($t_name,$this->prefix) !== 0) { continue; } $t = $this->table($t_name); # Get columns $cols = $schema->getColumns($t_name); foreach ($cols as $c_name => $col) { $type = $schema->dbt2udt($col['type'],$col['len'],$col['default']); $t->field($c_name,$type,$col['len'],$col['null'],$col['default'],true); } # Get keys $keys = $schema->getKeys($t_name); foreach ($keys as $k) { $args = $k['cols']; array_unshift($args,$k['name']); if ($k['primary']) { call_user_func_array(array($t,'primary'),$args); } elseif ($k['unique']) { call_user_func_array(array($t,'unique'),$args); } } # Get indexes $idx = $schema->getIndexes($t_name); foreach ($idx as $i) { $args = array($i['name'],$i['type']); $args = array_merge($args,$i['cols']); call_user_func_array(array($t,'index'),$args); } # Get foreign keys $ref = $schema->getReferences($t_name); foreach ($ref as $r) { $t->reference($r['name'],$r['c_cols'],$r['p_table'],$r['p_cols'],$r['update'],$r['delete']); } } } /** Synchronize this schema taken from database with $schema. @param s dbStruct Structure to synchronize with */ public function synchronize($s) { $this->tables = array(); $this->reverse(); if (!($s instanceof self)) { throw new Exception('Invalid database schema'); } $tables = $s->getTables(); $table_create = array(); $key_create = array(); $index_create = array(); $reference_create = array(); $field_create = array(); $field_update = array(); $key_update = array(); $index_update = array(); $reference_update = array(); $got_work = false; $schema = dbSchema::init($this->con); foreach ($tables as $tname => $t) { if (!$this->tableExists($tname)) { # Table does not exist, create table $table_create[$tname] = $t->getFields(); # Add keys, indexes and references $keys = $t->getKeys(); $indexes = $t->getIndexes(); $references = $t->getReferences(); foreach ($keys as $k => $v) { $key_create[$tname][$this->prefix.$k] = $v; } foreach ($indexes as $k => $v) { $index_create[$tname][$this->prefix.$k] = $v; } foreach ($references as $k => $v) { $v['p_table'] = $this->prefix.$v['p_table']; $reference_create[$tname][$this->prefix.$k] = $v; } $got_work = true; } else # Table exists { # Check new fields to create $fields = $t->getFields(); $db_fields = $this->tables[$tname]->getFields(); foreach ($fields as $fname => $f) { if (!$this->tables[$tname]->fieldExists($fname)) { # Field doest not exist, create it $field_create[$tname][$fname] = $f; $got_work = true; } elseif ($this->fieldsDiffer($db_fields[$fname],$f)) { # Field exists and differs from db version $field_update[$tname][$fname] = $f; $got_work = true; } } # Check keys to add or upgrade $keys = $t->getKeys(); $db_keys = $this->tables[$tname]->getKeys(); foreach ($keys as $kname => $k) { if ($k['type'] == 'primary' && ($this->con->driver() == 'mysql' || $this->con->driver() == 'mysqli')) { $kname = 'PRIMARY'; } else { $kname = $this->prefix.$kname; } $db_kname = $this->tables[$tname]->keyExists($kname,$k['type'],$k['cols']); if (!$db_kname) { # Key does not exist, create it $key_create[$tname][$kname] = $k; $got_work = true; } elseif ($this->keysDiffer($db_kname,$db_keys[$db_kname]['cols'],$kname,$k['cols'])) { # Key exists and differs from db version $key_update[$tname][$db_kname] = array_merge(array('name'=>$kname),$k); $got_work = true; } } # Check index to add or upgrade $idx = $t->getIndexes(); $db_idx = $this->tables[$tname]->getIndexes(); foreach ($idx as $iname => $i) { $iname = $this->prefix.$iname; $db_iname = $this->tables[$tname]->indexExists($iname,$i['type'],$i['cols']); if (!$db_iname) { # Index does not exist, create it $index_create[$tname][$iname] = $i; $got_work = true; } elseif ($this->indexesDiffer($db_iname,$db_idx[$db_iname],$iname,$i)) { # Index exists and differs from db version $index_update[$tname][$db_iname] = array_merge(array('name'=>$iname),$i); $got_work = true; } } # Check references to add or upgrade $ref = $t->getReferences(); $db_ref = $this->tables[$tname]->getReferences(); foreach ($ref as $rname => $r) { $rname = $this->prefix.$rname; $r['p_table'] = $this->prefix.$r['p_table']; $db_rname = $this->tables[$tname]->referenceExists($rname,$r['c_cols'],$r['p_table'],$r['p_cols']); if (!$db_rname) { # Reference does not exist, create it $reference_create[$tname][$rname] = $r; $got_work = true; } elseif ($this->referencesDiffer($db_rname,$db_ref[$db_rname],$rname,$r)) { $reference_update[$tname][$db_rname] = array_merge(array('name'=>$rname),$r); $got_work = true; } } } } if (!$got_work) { return; } # Create tables foreach ($table_create as $table => $fields) { $schema->createTable($table,$fields); } # Create new fields foreach ($field_create as $tname => $fields) { foreach ($fields as $fname => $f) { $schema->createField($tname,$fname,$f['type'],$f['len'],$f['null'],$f['default']); } } # Update fields foreach ($field_update as $tname => $fields) { foreach ($fields as $fname => $f) { $schema->alterField($tname,$fname,$f['type'],$f['len'],$f['null'],$f['default']); } } # Create new keys foreach ($key_create as $tname => $keys) { foreach ($keys as $kname => $k) { if ($k['type'] == 'primary') { $schema->createPrimary($tname,$kname,$k['cols']); } elseif ($k['type'] == 'unique') { $schema->createUnique($tname,$kname,$k['cols']); } } } # Update keys foreach ($key_update as $tname => $keys) { foreach ($keys as $kname => $k) { if ($k['type'] == 'primary') { $schema->alterPrimary($tname,$kname,$k['name'],$k['cols']); } elseif ($k['type'] == 'unique') { $schema->alterUnique($tname,$kname,$k['name'],$k['cols']); } } } # Create indexes foreach ($index_create as $tname => $index) { foreach ($index as $iname => $i) { $schema->createIndex($tname,$iname,$i['type'],$i['cols']); } } # Update indexes foreach ($index_update as $tname => $index) { foreach ($index as $iname => $i) { $schema->alterIndex($tname,$iname,$i['name'],$i['type'],$i['cols']); } } # Create references foreach ($reference_create as $tname => $ref) { foreach ($ref as $rname => $r) { $schema->createReference($rname,$tname,$r['c_cols'],$r['p_table'],$r['p_cols'],$r['update'],$r['delete']); } } # Update references foreach ($reference_update as $tname => $ref) { foreach ($ref as $rname => $r) { $schema->alterReference($rname,$r['name'],$tname,$r['c_cols'],$r['p_table'],$r['p_cols'],$r['update'],$r['delete']); } } # Flush execution stack $schema->flushStack(); return count($table_create) + count($key_create) + count($index_create) + count($reference_create) + count($field_create) + count($field_update) + count($key_update) + count($index_update) + count($reference_update); } public function getTables() { $res = array(); foreach ($this->tables as $t => $v) { $res[$this->prefix.$t] = $v; } return $res; } public function tableExists($name) { return isset($this->tables[$name]); } private function fieldsDiffer($db_field,$schema_field) { $d_type = $db_field['type']; $d_len = (integer) $db_field['len']; $d_default = $db_field['default']; $d_null = $db_field['null']; $s_type = $schema_field['type']; $s_len = (integer) $schema_field['len']; $s_default = $schema_field['default']; $s_null = $schema_field['null']; return $d_type != $s_type || $d_len != $s_len || $d_default != $s_default || $d_null != $s_null; } private function keysDiffer($d_name,$d_cols,$s_name,$s_cols) { return $d_name != $s_name || $d_cols != $s_cols; } private function indexesDiffer($d_name,$d_i,$s_name,$s_i) { return $d_name != $s_name || $d_i['cols'] != $s_i['cols'] || $d_i['type'] != $s_i['type']; } private function referencesDiffer($d_name,$d_r,$s_name,$s_r) { return $d_name != $s_name || $d_r['c_cols'] != $s_r['c_cols'] || $d_r['p_table'] != $s_r['p_table'] || $d_r['p_cols'] != $s_r['p_cols'] || $d_r['update'] != $s_r['update'] || $d_r['delete'] != $s_r['delete']; } } class dbStructTable { protected $name; protected $has_primary = false; protected $fields = array(); protected $keys = array(); protected $indexes = array(); protected $references = array(); /** Universal data types supported by dbSchema SMALLINT : signed 2 bytes integer INTEGER : signed 4 bytes integer BIGINT : signed 8 bytes integer REAL : signed 4 bytes floating point number FLOAT : signed 8 bytes floating point number NUMERIC : exact numeric type DATE : Calendar date (day, month and year) TIME : Time of day TIMESTAMP : Date and time CHAR : A fixed n-length character string VARCHAR : A variable length character string TEXT : A variable length of text */ protected $allowed_types = array( 'smallint','integer','bigint','real','float','numeric', 'date','time','timestamp', 'char','varchar','text' ); public function __construct($name) { $this->name = $name; return $this; } public function getFields() { return $this->fields; } public function getKeys($primary=null) { return $this->keys; } public function getIndexes() { return $this->indexes; } public function getReferences() { return $this->references; } public function fieldExists($name) { return isset($this->fields[$name]); } public function keyExists($name,$type,$cols) { # Look for key with the same name if (isset($this->keys[$name])) { return $name; } # Look for key with the same columns list and type foreach ($this->keys as $n => $k) { if ($k['cols'] == $cols && $k['type'] == $type) { # Same columns and type, return new name return $n; } } return false; } public function indexExists($name,$type,$cols) { # Look for key with the same name if (isset($this->indexes[$name])) { return $name; } # Look for index with the same columns list and type foreach ($this->indexes as $n => $i) { if ($i['cols'] == $cols && $i['type'] == $type) { # Same columns and type, return new name return $n; } } return false; } public function referenceExists($name,$c_cols,$p_table,$p_cols) { if (isset($this->references[$name])) { return $name; } # Look for reference with same chil columns, parent table and columns foreach ($this->references as $n => $r) { if ($c_cols == $r['c_cols'] && $p_table == $r['p_table'] && $p_cols == $r['p_cols']) { # Only name differs, return new name return $n; } } return false; } public function field($name,$type,$len,$null=true,$default=false,$to_null=false) { $type = strtolower($type); if (!in_array($type,$this->allowed_types)) { if ($to_null) { $type = null; } else { throw new Exception('Invalid data type '.$type.' in schema'); } } $this->fields[$name] = array( 'type' => $type, 'len' => (integer) $len, 'default' => $default, 'null' => (boolean) $null ); return $this; } public function __call($name,$args) { array_unshift($args,$name); return call_user_func_array(array($this,'field'),$args); } public function primary($name,$col) { if ($this->has_primary) { throw new Exception(sprintf('Table %s already has a primary key',$this->name)); } $cols = func_get_args(); array_shift($cols); return $this->newKey('primary',$name,$cols); } public function unique($name,$col) { $cols = func_get_args(); array_shift($cols); return $this->newKey('unique',$name,$cols); } public function index($name,$type,$col) { $cols = func_get_args(); array_shift($cols); array_shift($cols); $this->checkCols($cols); $this->indexes[$name] = array( 'type' => strtolower($type), 'cols' => $cols ); return $this; } public function reference($name,$c_cols,$p_table,$p_cols,$update=false,$delete=false) { if (!is_array($p_cols)) { $p_cols = array($p_cols); } if (!is_array($c_cols)) { $c_cols = array($c_cols); } $this->checkCols($c_cols); $this->references[$name] = array( 'c_cols' => $c_cols, 'p_table' => $p_table, 'p_cols' => $p_cols, 'update' => $update, 'delete' => $delete ); } protected function newKey($type,$name,$cols) { $this->checkCols($cols); $this->keys[$name] = array( 'type' => $type, 'cols' => $cols ); if ($type == 'primary') { $this->has_primary = true; } return $this; } protected function checkCols($cols) { foreach ($cols as $v) { if (!preg_match('/^\(.*?\)$/',$v) && !isset($this->fields[$v])) { throw new Exception(sprintf('Field %s does not exist in table %s',$v,$this->name)); } } } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/dbschema/class.mysql.dbschema.php000066400000000000000000000263471230033266200265310ustar00rootroot00000000000000con->select($sql); $res = array(); while ($rs->fetch()) { $res[] = $rs->f(0); } return $res; } public function db_get_columns($table) { $sql = 'SHOW COLUMNS FROM '.$this->con->escapeSystem($table); $rs = $this->con->select($sql); $res = array(); while ($rs->fetch()) { $field = trim($rs->f('Field')); $type = trim($rs->f('Type')); $null = strtolower($rs->f('Null')) == 'yes'; $default = $rs->f('Default'); $len = null; if (preg_match('/^(.+?)\(([\d,]+)\)$/si',$type,$m)) { $type = $m[1]; $len = (integer) $m[2]; } if ($default != '' && !is_numeric($default)) { $default = "'".$default."'"; } $res[$field] = array( 'type' => $type, 'len' => $len, 'null' => $null, 'default' => $default ); } return $res; } public function db_get_keys($table) { $sql = 'SHOW INDEX FROM '.$this->con->escapeSystem($table); $rs = $this->con->select($sql); $t = array(); $res = array(); while ($rs->fetch()) { $key_name = $rs->f('Key_name'); $unique = $rs->f('Non_unique') == 0; $seq = $rs->f('Seq_in_index'); $col_name = $rs->f('Column_name'); if ($key_name == 'PRIMARY' || $unique) { $t[$key_name]['cols'][$seq] = $col_name; $t[$key_name]['unique'] = $unique; } } foreach ($t as $name => $idx) { ksort($idx['cols']); $res[] = array( 'name' => $name, 'primary' => $name == 'PRIMARY', 'unique' => $idx['unique'], 'cols' => array_values($idx['cols']) ); } return $res; } public function db_get_indexes($table) { $sql = 'SHOW INDEX FROM '.$this->con->escapeSystem($table); $rs = $this->con->select($sql); $t = array(); $res = array(); while ($rs->fetch()) { $key_name = $rs->f('Key_name'); $unique = $rs->f('Non_unique') == 0; $seq = $rs->f('Seq_in_index'); $col_name = $rs->f('Column_name'); $type = $rs->f('Index_type'); if ($key_name != 'PRIMARY' && !$unique) { $t[$key_name]['cols'][$seq] = $col_name; $t[$key_name]['type'] = $type; } } foreach ($t as $name => $idx) { ksort($idx['cols']); $res[] = array( 'name' => $name, 'type' => $idx['type'], 'cols' => $idx['cols'] ); } return $res; } public function db_get_references($table) { $sql = 'SHOW CREATE TABLE '.$this->con->escapeSystem($table); $rs = $this->con->select($sql); $s = $rs->f(1); $res = array(); $n = preg_match_all('/^\s*CONSTRAINT\s+`(.+?)`\s+FOREIGN\s+KEY\s+\((.+?)\)\s+REFERENCES\s+`(.+?)`\s+\((.+?)\)(.*?)$/msi',$s,$match); if ($n > 0) { foreach ($match[1] as $i => $name) { # Columns transformation $t_cols = str_replace('`','',$match[2][$i]); $t_cols = explode(',',$t_cols); $r_cols = str_replace('`','',$match[4][$i]); $r_cols = explode(',',$r_cols); # ON UPDATE|DELETE $on = trim($match[5][$i],', '); $on_delete = null; $on_update = null; if ($on != '') { if (preg_match('/ON DELETE (.+?)(?:\s+ON|$)/msi',$on,$m)) { $on_delete = strtolower(trim($m[1])); } if (preg_match('/ON UPDATE (.+?)(?:\s+ON|$)/msi',$on,$m)) { $on_update = strtolower(trim($m[1])); } } $res[] = array ( 'name' => $name, 'c_cols' => $t_cols, 'p_table' => $match[3][$i], 'p_cols' => $r_cols, 'update' => $on_update, 'delete' => $on_delete ); } } return $res; } public function db_create_table($name,$fields) { $a = array(); foreach ($fields as $n => $f) { $type = $f['type']; $len = (integer) $f['len']; $default = $f['default']; $null = $f['null']; $type = $this->udt2dbt($type,$len,$default); $len = $len > 0 ? '('.$len.')' : ''; $null = $null ? 'NULL' : 'NOT NULL'; if ($default === null) { $default = 'DEFAULT NULL'; } elseif ($default !== false) { $default = 'DEFAULT '.$default.' '; } else { $default = ''; } $a[] = $this->con->escapeSystem($n).' '. $type.$len.' '.$null.' '.$default; } $sql = 'CREATE TABLE '.$this->con->escapeSystem($name)." (\n". implode(",\n",$a). "\n) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin "; $this->con->execute($sql); } public function db_create_field($table,$name,$type,$len,$null,$default) { $type = $this->udt2dbt($type,$len,$default); $len = (integer) $len > 0 ? '('.(integer) $len.')' : ''; $null = $null ? 'NULL' : 'NOT NULL'; if ($default === null) { $default = 'DEFAULT NULL'; } elseif ($default !== false) { $default = 'DEFAULT '.$default; } else { $default = ''; } $sql = 'ALTER TABLE '.$this->con->escapeSystem($table).' '. 'ADD COLUMN '.$this->con->escapeSystem($name).' '. $type.$len.' '.$null.' '.$default; $this->con->execute($sql); } public function db_create_primary($table,$name,$cols) { $c = array(); foreach ($cols as $v) { $c[] = $this->con->escapeSystem($v); } $sql = 'ALTER TABLE '.$this->con->escapeSystem($table).' '. 'ADD CONSTRAINT PRIMARY KEY ('.implode(',',$c).') '; $this->con->execute($sql); } public function db_create_unique($table,$name,$cols) { $c = array(); foreach ($cols as $v) { $c[] = $this->con->escapeSystem($v); } $sql = 'ALTER TABLE '.$this->con->escapeSystem($table).' '. 'ADD CONSTRAINT UNIQUE KEY '.$this->con->escapeSystem($name).' '. '('.implode(',',$c).') '; $this->con->execute($sql); } public function db_create_index($table,$name,$type,$cols) { $c = array(); foreach ($cols as $v) { $c[] = $this->con->escapeSystem($v); } $sql = 'ALTER TABLE '.$this->con->escapeSystem($table).' '. 'ADD INDEX '.$this->con->escapeSystem($name).' USING '.$type.' '. '('.implode(',',$c).') '; $this->con->execute($sql); } public function db_create_reference($name,$c_table,$c_cols,$p_table,$p_cols,$update,$delete) { $c = array(); $p = array(); foreach ($c_cols as $v) { $c[] = $this->con->escapeSystem($v); } foreach ($p_cols as $v) { $p[] = $this->con->escapeSystem($v); } $sql = 'ALTER TABLE '.$this->con->escapeSystem($c_table).' '. 'ADD CONSTRAINT '.$name.' FOREIGN KEY '. '('.implode(',',$c).') '. 'REFERENCES '.$this->con->escapeSystem($p_table).' '. '('.implode(',',$p).') '; if ($update) { $sql .= 'ON UPDATE '.$update.' '; } if ($delete) { $sql .= 'ON DELETE '.$delete.' '; } $this->con->execute($sql); } public function db_alter_field($table,$name,$type,$len,$null,$default) { $type = $this->udt2dbt($type,$len,$default); $len = (integer) $len > 0 ? '('.(integer) $len.')' : ''; $null = $null ? 'NULL' : 'NOT NULL'; if ($default === null) { $default = 'DEFAULT NULL'; } elseif ($default !== false) { $default = 'DEFAULT '.$default; } else { $default = ''; } $sql = 'ALTER TABLE '.$this->con->escapeSystem($table).' '. 'CHANGE COLUMN '.$this->con->escapeSystem($name).' '.$this->con->escapeSystem($name).' '. $type.$len.' '.$null.' '.$default; $this->con->execute($sql); } public function db_alter_primary($table,$name,$newname,$cols) { $c = array(); foreach ($cols as $v) { $c[] = $this->con->escapeSystem($v); } $sql = 'ALTER TABLE '.$this->con->escapeSystem($table).' '. 'DROP PRIMARY KEY, ADD PRIMARY KEY '. '('.implode(',',$c).') '; $this->con->execute($sql); } public function db_alter_unique($table,$name,$newname,$cols) { $c = array(); foreach ($cols as $v) { $c[] = $this->con->escapeSystem($v); } $sql = 'ALTER TABLE '.$this->con->escapeSystem($table).' '. 'DROP INDEX '.$this->con->escapeSystem($name).', '. 'ADD UNIQUE '.$this->con->escapeSystem($newname).' '. '('.implode(',',$c).') '; $this->con->execute($sql); } public function db_alter_index($table,$name,$newname,$type,$cols) { $c = array(); foreach ($cols as $v) { $c[] = $this->con->escapeSystem($v); } $sql = 'ALTER TABLE '.$this->con->escapeSystem($table).' '. 'DROP INDEX '.$this->con->escapeSystem($name).', '. 'ADD INDEX '.$this->con->escapeSystem($newname).' '. 'USING '.$type.' '. '('.implode(',',$c).') '; $this->con->execute($sql); } public function db_alter_reference($name,$newname,$c_table,$c_cols,$p_table,$p_cols,$update,$delete) { $sql = 'ALTER TABLE '.$this->con->escapeSystem($c_table).' '. 'DROP FOREIGN KEY '.$this->con->escapeSystem($name); $this->con->execute($sql); $this->createReference($newname,$c_table,$c_cols,$p_table,$p_cols,$update,$delete); } public function db_drop_unique($table,$name) { $sql = 'ALTER TABLE '.$this->con->escapeSystem($table).' '. 'DROP INDEX '.$this->con->escapeSystem($name); $this->con->execute($sql); } } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/dbschema/class.mysqli.dbschema.php000066400000000000000000000010531230033266200266650ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/dbschema/class.pgsql.dbschema.php000066400000000000000000000255301230033266200265030ustar00rootroot00000000000000 'no action', 'r' => 'restrict', 'c' => 'cascade', 'n' => 'set null', 'd' => 'set default' ); public function dbt2udt($type,&$len,&$default) { $type = parent::dbt2udt($type,$len,$default); return $type; } public function udt2dbt($type,&$len,&$default) { $type = parent::udt2dbt($type,$len,$default); return $type; } public function db_get_tables() { $sql = 'SELECT table_name '. 'FROM information_schema.tables '. "WHERE table_schema = current_schema() "; $rs = $this->con->select($sql); $res = array(); while ($rs->fetch()) { $res[] = $rs->f(0); } return $res; } public function db_get_columns($table) { $sql = 'SELECT column_name, udt_name, character_maximum_length, '. 'is_nullable, column_default '. 'FROM information_schema.columns '. "WHERE table_name = '".$this->con->escape($table)."' "; $rs = $this->con->select($sql); $res = array(); while ($rs->fetch()) { $field = trim($rs->column_name); $type = trim($rs->udt_name); $null = strtolower($rs->is_nullable) == 'yes'; $default = $rs->column_default; $len = $rs->character_maximum_length; if ($len == '') { $len = null; } $default = preg_replace('/::([\w\d\s]*)$/','',$default); $res[$field] = array( 'type' => $type, 'len' => $len, 'null' => $null, 'default' => $default ); } return $res; } public function db_get_keys($table) { $sql = 'SELECT DISTINCT ON(cls.relname) cls.oid, cls.relname as idxname, indisunique::integer, indisprimary::integer, '. 'indnatts, tab.relname as tabname, contype, amname '. 'FROM pg_index idx '. 'JOIN pg_class cls ON cls.oid=indexrelid '. 'JOIN pg_class tab ON tab.oid=indrelid '. 'LEFT OUTER JOIN pg_tablespace ta on ta.oid=cls.reltablespace '. 'JOIN pg_namespace n ON n.oid=tab.relnamespace '. 'JOIN pg_am am ON am.oid=cls.relam '. "LEFT JOIN pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0') ". 'LEFT OUTER JOIN pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) '. 'LEFT OUTER JOIN pg_description des ON des.objoid=con.oid '. 'LEFT OUTER JOIN pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0) '. "WHERE tab.relname = '".$this->con->escape($table)."' ". "AND contype IN ('p','u') ". 'ORDER BY cls.relname '; $rs = $this->con->select($sql); $res = array(); while ($rs->fetch()) { $k = array( 'name' => $rs->idxname, 'primary' => (boolean) $rs->indisprimary, 'unique' => (boolean) $rs->indisunique, 'cols' => array() ); for ($i=1; $i<=$rs->indnatts; $i++) { $cols = $this->con->select('SELECT pg_get_indexdef('.$rs->oid.'::oid, '.$i.', true);'); $k['cols'][] = $cols->f(0); } $res[] = $k; } return $res; } public function db_get_indexes($table) { $sql = 'SELECT DISTINCT ON(cls.relname) cls.oid, cls.relname as idxname, n.nspname, '. 'indnatts, tab.relname as tabname, contype, amname '. 'FROM pg_index idx '. 'JOIN pg_class cls ON cls.oid=indexrelid '. 'JOIN pg_class tab ON tab.oid=indrelid '. 'LEFT OUTER JOIN pg_tablespace ta on ta.oid=cls.reltablespace '. 'JOIN pg_namespace n ON n.oid=tab.relnamespace '. 'JOIN pg_am am ON am.oid=cls.relam '. "LEFT JOIN pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0') ". 'LEFT OUTER JOIN pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) '. 'LEFT OUTER JOIN pg_description des ON des.objoid=con.oid '. 'LEFT OUTER JOIN pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0) '. "WHERE tab.relname = '".$this->con->escape($table)."' ". 'AND conname IS NULL '. 'ORDER BY cls.relname '; $rs = $this->con->select($sql); $res = array(); while ($rs->fetch()) { $k = array( 'name' => $rs->idxname, 'type' => $rs->amname, 'cols' => array() ); for ($i=1; $i<=$rs->indnatts; $i++) { $cols = $this->con->select('SELECT pg_get_indexdef('.$rs->oid.'::oid, '.$i.', true);'); $k['cols'][] = $cols->f(0); } $res[] = $k; } return $res; } public function db_get_references($table) { $sql = 'SELECT ct.oid, conname, condeferrable, condeferred, confupdtype, '. 'confdeltype, confmatchtype, conkey, confkey, conrelid, confrelid, cl.relname as fktab, '. 'cr.relname as reftab '. 'FROM pg_constraint ct '. 'JOIN pg_class cl ON cl.oid=conrelid '. 'JOIN pg_namespace nl ON nl.oid=cl.relnamespace '. 'JOIN pg_class cr ON cr.oid=confrelid '. 'JOIN pg_namespace nr ON nr.oid=cr.relnamespace '. "WHERE contype='f' ". "AND cl.relname = '".$this->con->escape($table)."' ". 'ORDER BY conname '; $rs = $this->con->select($sql); $cols_sql = 'SELECT a1.attname as conattname, a2.attname as confattname '. 'FROM pg_attribute a1, pg_attribute a2 '. 'WHERE a1.attrelid=%1$s::oid AND a1.attnum=%2$s '. 'AND a2.attrelid=%3$s::oid AND a2.attnum=%4$s '; $res = array(); while ($rs->fetch()) { $conkey = preg_replace('/[^\d]/','',$rs->conkey); $confkey = preg_replace('/[^\d]/','',$rs->confkey); $k = array( 'name' => $rs->conname, 'c_cols' => array(), 'p_table' => $rs->reftab, 'p_cols' => array(), 'update' => $this->ref_actions_map[$rs->confupdtype], 'delete' => $this->ref_actions_map[$rs->confdeltype] ); $cols = $this->con->select(sprintf($cols_sql,$rs->conrelid,$conkey,$rs->confrelid,$confkey)); while ($cols->fetch()) { $k['c_cols'][] = $cols->conattname; $k['p_cols'][] = $cols->confattname; } $res[] = $k; } return $res; } public function db_create_table($name,$fields) { $a = array(); foreach ($fields as $n => $f) { $type = $f['type']; $len = (integer) $f['len']; $default = $f['default']; $null = $f['null']; $type = $this->udt2dbt($type,$len,$default); $len = $len > 0 ? '('.$len.')' : ''; $null = $null ? 'NULL' : 'NOT NULL'; if ($default === null) { $default = 'DEFAULT NULL'; } elseif ($default !== false) { $default = 'DEFAULT '.$default.' '; } else { $default = ''; } $a[] = $n.' '. $type.$len.' '.$null.' '.$default; } $sql = 'CREATE TABLE '.$name." (\n". implode(",\n",$a). "\n)"; $this->con->execute($sql); } public function db_create_field($table,$name,$type,$len,$null,$default) { $type = $this->udt2dbt($type,$len,$default); $len = $len > 0 ? '('.$len.')' : ''; $null = $null ? 'NULL' : 'NOT NULL'; if ($default === null) { $default = 'DEFAULT NULL'; } elseif ($default !== false) { $default = 'DEFAULT '.$default.' '; } else { $default = ''; } $sql = 'ALTER TABLE '.$table.' ADD COLUMN '.$name.' '. $type.$len.' '.$null.' '.$default; $this->con->execute($sql); } public function db_create_primary($table,$name,$cols) { $sql = 'ALTER TABLE '.$table.' '. 'ADD CONSTRAINT '.$name.' PRIMARY KEY ('.implode(",",$cols).') '; $this->con->execute($sql); } public function db_create_unique($table,$name,$cols) { $sql = 'ALTER TABLE '.$table.' '. 'ADD CONSTRAINT '.$name.' UNIQUE ('.implode(',',$cols).') '; $this->con->execute($sql); } public function db_create_index($table,$name,$type,$cols) { $sql = 'CREATE INDEX '.$name.' ON '.$table.' USING '.$type. '('.implode(',',$cols).') '; $this->con->execute($sql); } public function db_create_reference($name,$c_table,$c_cols,$p_table,$p_cols,$update,$delete) { $sql = 'ALTER TABLE '.$c_table.' '. 'ADD CONSTRAINT '.$name.' FOREIGN KEY '. '('.implode(',',$c_cols).') '. 'REFERENCES '.$p_table.' '. '('.implode(',',$p_cols).') '; if ($update) { $sql .= 'ON UPDATE '.$update.' '; } if ($delete) { $sql .= 'ON DELETE '.$delete.' '; } $this->con->execute($sql); } public function db_alter_field($table,$name,$type,$len,$null,$default) { $type = $this->udt2dbt($type,$len,$default); $len = (integer) $len > 0 ? '('.(integer) $len.')' : ''; $sql = 'ALTER TABLE '.$table.' ALTER COLUMN '.$name.' TYPE '.$type.$len; $this->con->execute($sql); if ($default === null) { $default = 'SET DEFAULT NULL'; } elseif ($default !== false) { $default = 'SET DEFAULT '.$default; } else { $default = 'DROP DEFAULT'; } $sql = 'ALTER TABLE '.$table.' ALTER COLUMN '.$name.' '.$default; $this->con->execute($sql); $null = $null ? 'DROP NOT NULL' : 'SET NOT NULL'; $sql = 'ALTER TABLE '.$table.' ALTER COLUMN '.$name.' '.$null; $this->con->execute($sql); } public function db_alter_primary($table,$name,$newname,$cols) { $sql = 'ALTER TABLE '.$table.' DROP CONSTRAINT '.$name; $this->con->execute($sql); $this->createPrimary($table,$newname,$cols); } public function db_alter_unique($table,$name,$newname,$cols) { $sql = 'ALTER TABLE '.$table.' DROP CONSTRAINT '.$name; $this->con->execute($sql); $this->createUnique($table,$newname,$cols); } public function db_alter_index($table,$name,$newname,$type,$cols) { $sql = 'DROP INDEX '.$name; $this->con->execute($sql); $this->createIndex($table,$newname,$type,$cols); } public function db_alter_reference($name,$newname,$c_table,$c_cols,$p_table,$p_cols,$update,$delete) { $sql = 'ALTER TABLE '.$c_table.' DROP CONSTRAINT '.$name; $this->con->execute($sql); $this->createReference($newname,$c_table,$c_cols,$p_table,$p_cols,$update,$delete); } public function db_drop_unique($table,$name) { $sql = 'ALTER TABLE '.$table.' DROP CONSTRAINT '.$name; $this->con->execute($sql); } } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/dbschema/class.sqlite.dbschema.php000066400000000000000000000331631230033266200266570ustar00rootroot00000000000000table_stack as $table => $def) { $sql = 'CREATE TABLE '.$table." (\n".implode(",\n",$def)."\n)\n "; $this->con->execute($sql); } foreach ($this->x_stack as $x) { $this->con->execute($x); } } public function db_get_tables() { $res = array(); $sql = "SELECT * FROM sqlite_master WHERE type = 'table'"; $rs = $this->con->select($sql); $res = array(); while ($rs->fetch()) { $res[] = $rs->tbl_name; } return $res; } public function db_get_columns($table) { $sql = 'PRAGMA table_info('.$this->con->escapeSystem($table).')'; $rs = $this->con->select($sql); $res = array(); while ($rs->fetch()) { $field = trim($rs->name); $type = trim($rs->type); $null = trim($rs->notnull) == 0; $default = trim($rs->dflt_value); $len = null; if (preg_match('/^(.+?)\(([\d,]+)\)$/si',$type,$m)) { $type = $m[1]; $len = (integer) $m[2]; } $res[$field] = array( 'type' => $type, 'len' => $len, 'null' => $null, 'default' => $default ); } return $res; } public function db_get_keys($table) { $t = array(); $res = array(); # Get primary keys first $sql = "SELECT sql FROM sqlite_master WHERE type='table' AND name='".$this->con->escape($table)."'"; $rs = $this->con->select($sql); if ($rs->isEmpty()) { return array(); } # Get primary keys $n = preg_match_all('/^\s*CONSTRAINT\s+([^,]+?)\s+PRIMARY\s+KEY\s+\((.+?)\)/msi',$rs->sql,$match); if ($n > 0) { foreach ($match[1] as $i => $name) { $cols = preg_split('/\s*,\s*/',$match[2][$i]); $res[] = array( 'name' => $name, 'primary' => true, 'unique' => false, 'cols' => $cols ); } } # Get unique keys $n = preg_match_all('/^\s*CONSTRAINT\s+([^,]+?)\s+UNIQUE\s+\((.+?)\)/msi',$rs->sql,$match); if ($n > 0) { foreach ($match[1] as $i => $name) { $cols = preg_split('/\s*,\s*/',$match[2][$i]); $res[] = array( 'name' => $name, 'primary' => false, 'unique' => true, 'cols' => $cols ); } } return $res; } public function db_get_indexes($table) { $sql = 'PRAGMA index_list('.$this->con->escapeSystem($table).')'; $rs = $this->con->select($sql); $res = array(); while ($rs->fetch()) { if (preg_match('/^sqlite_/',$rs->name)) { continue; } $idx = $this->con->select('PRAGMA index_info('.$this->con->escapeSystem($rs->name).')'); $cols = array(); while ($idx->fetch()) { $cols[] = $idx->name; } $res[] = array( 'name' => $rs->name, 'type' => 'btree', 'cols' => $cols ); } return $res; } public function db_get_references($table) { $sql = 'SELECT * FROM sqlite_master WHERE type=\'trigger\' AND tbl_name = \'%1$s\' AND name LIKE \'%2$s_%%\' '; $res = array(); # Find constraints on table $bir = $this->con->select(sprintf($sql,$this->con->escape($table),'bir')); $bur = $this->con->select(sprintf($sql,$this->con->escape($table),'bur')); if ($bir->isEmpty() || $bur->isempty()) { return $res; } while ($bir->fetch()) { # Find child column and parent table and column if (!preg_match('/FROM\s+(.+?)\s+WHERE\s+(.+?)\s+=\s+NEW\.(.+?)\s*?\) IS\s+NULL/msi',$bir->sql,$m)) { continue; } $c_col = $m[3]; $p_table = $m[1]; $p_col = $m[2]; # Find on update $on_update = 'restrict'; $aur = $this->con->select(sprintf($sql,$this->con->escape($p_table),'aur')); while ($aur->fetch()) { if (!preg_match('/AFTER\s+UPDATE/msi',$aur->sql)) { continue; } if (preg_match('/UPDATE\s+'.$table.'\s+SET\s+'.$c_col.'\s*=\s*NEW.'.$p_col. '\s+WHERE\s+'.$c_col.'\s*=\s*OLD\.'.$p_col.'/msi',$aur->sql)) { $on_update = 'cascade'; break; } if (preg_match('/UPDATE\s+'.$table.'\s+SET\s+'.$c_col.'\s*=\s*NULL'. '\s+WHERE\s+'.$c_col.'\s*=\s*OLD\.'.$p_col.'/msi',$aur->sql)) { $on_update = 'set null'; break; } } # Find on delete $on_delete = 'restrict'; $bdr = $this->con->select(sprintf($sql,$this->con->escape($p_table),'bdr')); while ($bdr->fetch()) { if (!preg_match('/BEFORE\s+DELETE/msi',$bdr->sql)) { continue; } if (preg_match('/DELETE\s+FROM\s+'.$table.'\s+WHERE\s+'.$c_col.'\s*=\s*OLD\.'.$p_col.'/msi',$bdr->sql)) { $on_delete = 'cascade'; break; } if (preg_match('/UPDATE\s+'.$table.'\s+SET\s+'.$c_col.'\s*=\s*NULL'. '\s+WHERE\s+'.$c_col.'\s*=\s*OLD\.'.$p_col.'/msi',$bdr->sql)) { $on_update = 'set null'; break; } } $res[] = array( 'name' => substr($bir->name,4), 'c_cols' => array($c_col), 'p_table' => $p_table, 'p_cols' => array($p_col), 'update' => $on_update, 'delete' => $on_delete ); } return $res; } public function db_create_table($name,$fields) { $a = array(); foreach ($fields as $n => $f) { $type = $f['type']; $len = (integer) $f['len']; $default = $f['default']; $null = $f['null']; $type = $this->udt2dbt($type,$len,$default); $len = $len > 0 ? '('.$len.')' : ''; $null = $null ? 'NULL' : 'NOT NULL'; if ($default === null) { $default = 'DEFAULT NULL'; } elseif ($default !== false) { $default = 'DEFAULT '.$default.' '; } else { $default = ''; } $a[] = $n.' '.$type.$len.' '.$null.' '.$default; } $this->table_stack[$name][] = implode(",\n",$a); $this->table_hist[$name] = $fields; } public function db_create_field($table,$name,$type,$len,$null,$default) { $type = $this->udt2dbt($type,$len,$default); $len = $len > 0 ? '('.$len.')' : ''; $null = $null ? 'NULL' : 'NOT NULL'; if ($default === null) { $default = 'DEFAULT NULL'; } elseif ($default !== false) { $default = 'DEFAULT '.$default.' '; } else { $default = ''; } $sql = 'ALTER TABLE '.$this->con->escapeSystem($table).' '. 'ADD COLUMN '.$this->con->escapeSystem($name).' '. $type.$len.' '.$null.' '.$default; $this->con->execute($sql); } public function db_create_primary($table,$name,$cols) { $this->table_stack[$table][] = 'CONSTRAINT '.$name.' PRIMARY KEY ('.implode(',',$cols).') '; } public function db_create_unique($table,$name,$cols) { $this->table_stack[$table][] = 'CONSTRAINT '.$name.' UNIQUE ('.implode(',',$cols).') '; } public function db_create_index($table,$name,$type,$cols) { $this->x_stack[] = 'CREATE INDEX '.$name.' ON '.$table.' ('.implode(',',$cols).') '; } public function db_create_reference($name,$c_table,$c_cols,$p_table,$p_cols,$update,$delete) { if (!isset($this->table_hist[$c_table])) { return; } if (count($c_cols) > 1 || count($p_cols) > 1) { throw new Exception('SQLite UDBS does not support multiple columns foreign keys'); } $c_col = $c_cols[0]; $p_col = $p_cols[0]; $update = strtolower($update); $delete = strtolower($delete); $cnull = $this->table_hist[$c_table][$c_col]['null']; # Create constraint $this->x_stack[] = 'CREATE TRIGGER bir_'.$name."\n". 'BEFORE INSERT ON '.$c_table."\n". "FOR EACH ROW BEGIN\n". ' SELECT RAISE(ROLLBACK,\'insert on table "'.$c_table.'" violates foreign key constraint "'.$name.'"\')'."\n". ' WHERE '. ($cnull ? 'NEW.'.$c_col." IS NOT NULL\n AND " : ''). '(SELECT '.$p_col.' FROM '.$p_table.' WHERE '.$p_col.' = NEW.'.$c_col.") IS NULL;\n". "END;\n"; # Update constraint $this->x_stack[] = 'CREATE TRIGGER bur_'.$name."\n". 'BEFORE UPDATE ON '.$c_table."\n". "FOR EACH ROW BEGIN\n". ' SELECT RAISE(ROLLBACK,\'update on table "'.$c_table.'" violates foreign key constraint "'.$name.'"\')'."\n". ' WHERE '. ($cnull ? 'NEW.'.$c_col." IS NOT NULL\n AND " : ''). '(SELECT '.$p_col.' FROM '.$p_table.' WHERE '.$p_col.' = NEW.'.$c_col.") IS NULL;\n". "END;\n"; # ON UPDATE if ($update == 'cascade') { $this->x_stack[] = 'CREATE TRIGGER aur_'.$name."\n". 'AFTER UPDATE ON '.$p_table."\n". "FOR EACH ROW BEGIN\n". ' UPDATE '.$c_table.' SET '.$c_col.' = NEW.'.$p_col.' WHERE '.$c_col.' = OLD.'.$p_col.";\n". "END;\n"; } elseif ($update == 'set null') { $this->x_stack[] = 'CREATE TRIGGER aur_'.$name."\n". 'AFTER UPDATE ON '.$p_table."\n". "FOR EACH ROW BEGIN\n". ' UPDATE '.$c_table.' SET '.$c_col.' = NULL WHERE '.$c_col.' = OLD.'.$p_col.";\n". "END;\n"; } else # default on restrict { $this->x_stack[] = 'CREATE TRIGGER burp_'.$name."\n". 'BEFORE UPDATE ON '.$p_table."\n". "FOR EACH ROW BEGIN\n". ' SELECT RAISE (ROLLBACK,\'update on table "'.$p_table.'" violates foreign key constraint "'.$name.'"\')'."\n". ' WHERE (SELECT '.$c_col.' FROM '.$c_table.' WHERE '.$c_col.' = OLD.'.$p_col.") IS NOT NULL;\n". "END;\n"; } # ON DELETE if ($delete == 'cascade') { $this->x_stack[] = 'CREATE TRIGGER bdr_'.$name."\n". 'BEFORE DELETE ON '.$p_table."\n". "FOR EACH ROW BEGIN\n". ' DELETE FROM '.$c_table.' WHERE '.$c_col.' = OLD.'.$p_col.";\n". "END;\n"; } elseif ($delete == 'set null') { $this->x_stack[] = 'CREATE TRIGGER bdr_'.$name."\n". 'BEFORE DELETE ON '.$p_table."\n". "FOR EACH ROW BEGIN\n". ' UPDATE '.$c_table.' SET '.$c_col.' = NULL WHERE '.$c_col.' = OLD.'.$p_col.";\n". "END;\n"; } else { $this->x_stack[] = 'CREATE TRIGGER bdr_'.$name."\n". 'BEFORE DELETE ON '.$p_table."\n". "FOR EACH ROW BEGIN\n". ' SELECT RAISE (ROLLBACK,\'delete on table "'.$p_table.'" violates foreign key constraint "'.$name.'"\')'."\n". ' WHERE (SELECT '.$c_col.' FROM '.$c_table.' WHERE '.$c_col.' = OLD.'.$p_col.") IS NOT NULL;\n". "END;\n"; } } public function db_alter_field($table,$name,$type,$len,$null,$default) { $type = $this->udt2dbt($type,$len,$default); if ($type != 'integer' && $type != 'text' && $type != 'timestamp') { throw new Exception('SQLite fields cannot be changed.'); } } public function db_alter_primary($table,$name,$newname,$cols) { throw new Exception('SQLite primary key cannot be changed.'); } public function db_alter_unique($table,$name,$newname,$cols) { throw new Exception('SQLite unique index cannot be changed.'); } public function db_alter_index($table,$name,$newname,$type,$cols) { $this->con->execute('DROP INDEX IF EXISTS '.$name); $this->con->execute('CREATE INDEX '.$newname.' ON '.$table.' ('.implode(',',$cols).') '); } public function db_alter_reference($name,$newname,$c_table,$c_cols,$p_table,$p_cols,$update,$delete) { $this->con->execute('DROP TRIGGER IF EXISTS bur_'.$name); $this->con->execute('DROP TRIGGER IF EXISTS burp_'.$name); $this->con->execute('DROP TRIGGER IF EXISTS bir_'.$name); $this->con->execute('DROP TRIGGER IF EXISTS aur_'.$name); $this->con->execute('DROP TRIGGER IF EXISTS bdr_'.$name); $this->table_hist[$c_table] = $this->db_get_columns($c_table); $this->db_create_reference($newname,$c_table,$c_cols,$p_table,$p_cols,$update,$delete); } public function db_drop_unique($table,$name) { throw new Exception('SQLite unique index cannot be removed.'); } } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/debian/000077500000000000000000000000001230033266200214425ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/debian/changelog000066400000000000000000000416141230033266200233220ustar00rootroot00000000000000libclearbricks (0.8-22) unstable; urgency=low ; svnrev=165 * SVN Revision 152 - olivier, on Mon, 30 Jun 2008 15:04:18 +0200 New debian changelog * SVN Revision 153 - olivier, on Thu, 03 Jul 2008 21:12:19 +0200 SQLite with PDO and SQLite 3 only. * SVN Revision 154 - olivier, on Fri, 11 Jul 2008 14:48:43 +0200 Bug fix with TZ file load. * SVN Revision 155 - olivier, on Wed, 16 Jul 2008 15:55:11 +0200 Minor performances tweaks. * SVN Revision 156 - olivier, on Wed, 16 Jul 2008 16:11:17 +0200 Added getTypes() in urlHandler. * SVN Revision 157 - olivier, on Wed, 16 Jul 2008 18:11:01 +0200 Added support for inline HTML in wiki2xhtml * SVN Revision 158 - olivier, on Wed, 16 Jul 2008 18:22:00 +0200 Description error in wiki2xhtml * SVN Revision 159 - olivier, on Thu, 17 Jul 2008 12:51:08 +0200 Added ?> in lib.crypt.php * SVN Revision 160 - olivier, on Thu, 17 Jul 2008 16:13:25 +0200 Always force a new connection for mysql dblayer. * SVN Revision 161 - olivier, on Sun, 20 Jul 2008 16:41:36 +0200 Added l10n::getTextDirection() method. * SVN Revision 162 - olivier, on Sun, 20 Jul 2008 18:35:31 +0200 l10n::getISOcodes returns now native langue names. * SVN Revision 163 - olivier, on Mon, 21 Jul 2008 15:02:59 +0200 Init content in htmlFilter::aply() * SVN Revision 164 - olivier, on Mon, 21 Jul 2008 15:16:15 +0200 Basic scheme instead of BASIC. * SVN Revision 165 - olivier, on Wed, 30 Jul 2008 18:35:08 +0200 Typo fix in filemanager. -- Olivier Meunier Wed, 06 Aug 2008 14:36:17 +0200 libclearbricks (0.8-21) unstable; urgency=low ; svnrev=151 * SVN Revision 142 - olivier, on Tue, 13 May 2008 14:26:02 +0200 New debian changelog * SVN Revision 143 - olivier, on Mon, 02 Jun 2008 14:45:13 +0200 In imageTools::memoryAllocate, multiply by 8 instead of 5 * SVN Revision 144 - olivier, on Tue, 03 Jun 2008 14:57:26 +0200 Fixed sorting bug in filemanager * SVN Revision 145 - olivier, on Wed, 04 Jun 2008 09:15:57 +0200 Fixed a minor bug in imageTools when image size becomes zero. * SVN Revision 146 - olivier, on Fri, 06 Jun 2008 10:30:46 +0200 "'" is a space in text::tidyURL * SVN Revision 147 - olivier, on Fri, 06 Jun 2008 10:54:59 +0200 Added filemanager::getPwd() and filemanager::writable() methods. * SVN Revision 148 - olivier, on Fri, 06 Jun 2008 14:11:34 +0200 Removed dead line in feedReader. * SVN Revision 149 - olivier, on Mon, 16 Jun 2008 09:25:37 +0200 Changed longdesc by title in wiki2xhtml. * SVN Revision 150 - olivier, on Thu, 19 Jun 2008 17:50:31 +0200 Added languages in lib.l10n.php * SVN Revision 151 - olivier, on Wed, 25 Jun 2008 18:04:43 +0200 Fixed bugs in l10n and url.handler. -- Olivier Meunier Mon, 30 Jun 2008 15:03:33 +0200 libclearbricks (0.8-20) unstable; urgency=low ; svnrev=141 * SVN Revision 121 - olivier, on Tue, 26 Feb 2008 10:20:48 +0100 New debian changelog * SVN Revision 122 - olivier, on Wed, 27 Feb 2008 09:13:52 +0100 Fixed seconds reading in fileUnzip * SVN Revision 124 - olivier, on Wed, 27 Feb 2008 11:22:23 +0100 Added fileZip class * SVN Revision 126 - olivier, on Wed, 27 Feb 2008 14:03:43 +0100 More memory for fileUnzip * SVN Revision 128 - olivier, on Sun, 02 Mar 2008 14:10:07 +0100 Fixed time offset output for RFC822 dates. * SVN Revision 129 - olivier, on Sun, 02 Mar 2008 14:10:56 +0100 Tweak in fileUnzip to handle directories in central. * SVN Revision 131 - olivier, on Fri, 21 Mar 2008 11:25:28 +0100 Changed all chmod($file,fileperms(dirname($file))) calls with new files::inheritChmod() static method. Some minor fixes. * SVN Revision 132 - olivier, on Fri, 21 Mar 2008 11:26:33 +0100 Added files::inheritChmod() calls in filemanager uploadFile() and uploadBits() methods. Closes #177. * SVN Revision 133 - olivier, on Fri, 04 Apr 2008 15:23:51 +0200 Added translation support in l10n::getISOcodes() * SVN Revision 134 - olivier, on Fri, 04 Apr 2008 17:45:23 +0200 Added template::blockExists(), template::valueExists() and template::tagExists() methods. * SVN Revision 135 - olivier, on Thu, 17 Apr 2008 17:54:27 +0200 filemanager::exclude_list is now a regexp list and handles file upload. * SVN Revision 136 - olivier, on Fri, 18 Apr 2008 10:29:17 +0200 Reverted to revision 134 * SVN Revision 137 - olivier, on Fri, 18 Apr 2008 11:41:03 +0200 Added fileManager::$exclude_pattern property. This works only for files. * SVN Revision 138 - pep, on Wed, 23 Apr 2008 02:10:08 +0200 Should fix problems when sending mail (/r/n or /n header terminator) * SVN Revision 139 - olivier, on Wed, 23 Apr 2008 18:07:03 +0200 memory_get_usage test. * SVN Revision 140 - olivier, on Thu, 24 Apr 2008 11:34:02 +0200 Fix a bug in html::absoluteURLs() * SVN Revision 141 - olivier, on Wed, 07 May 2008 15:44:15 +0200 Added X-Forwarded-For support in netHttp -- Olivier Meunier Tue, 13 May 2008 14:04:11 +0200 libclearbricks (0.8-18) unstable; urgency=low ; svnrev=120 * SVN Revision 109 - olivier, on Tue, 19 Feb 2008 12:50:10 +0100 New debian changelog * SVN Revision 110 - olivier, on Thu, 21 Feb 2008 01:23:59 +0100 Fixed a bug and added getRootDir method in fileUnzip * SVN Revision 112 - olivier, on Thu, 21 Feb 2008 02:18:58 +0100 Added isEmpty and hasFile methods in fileUnzip * SVN Revision 114 - olivier, on Thu, 21 Feb 2008 12:03:01 +0100 Created text::deaccent and applied this method in text::str2URL and files::tidyFileName * SVN Revision 116 - olivier, on Thu, 21 Feb 2008 16:47:25 +0100 Try to handle memory usage in imageTools. Add a grey background on alpha channel of PNG images for resize method. Destroy image resource in close method. * SVN Revision 118 - olivier, on Sat, 23 Feb 2008 19:16:15 +0100 Fix with files::registerMimeTypes * SVN Revision 119 - olivier, on Mon, 25 Feb 2008 11:36:41 +0100 fileUnzip - Added a better way to recognize directories and tries to increase memory limit if needed. -- Olivier Meunier Tue, 26 Feb 2008 10:19:58 +0100 libclearbricks (0.8-17) unstable; urgency=low ; svnrev=108 * SVN Revision 108 - olivier, on Tue, 19 Feb 2008 10:25:56 +0100 New debian changelog -- Olivier Meunier Tue, 19 Feb 2008 12:47:49 +0100 libclearbricks (0.8-14) unstable; urgency=low ; svnrev=107 * SVN Revision 63 - mik, on Fri, 06 Jul 2007 13:19:43 +0200 last version * SVN Revision 64 - olivier, on Fri, 13 Jul 2007 12:07:00 +0200 May have fixed some bugs in UDBS synchronize process. * SVN Revision 65 - olivier, on Thu, 26 Jul 2007 10:08:11 +0200 HTML validator class * SVN Revision 66 - olivier, on Thu, 26 Jul 2007 10:17:29 +0200 HTML validator documentation update * SVN Revision 67 - olivier, on Fri, 27 Jul 2007 16:36:30 +0200 Fixed a serious bug with tidy in HTML Filter * SVN Revision 68 - olivier, on Fri, 27 Jul 2007 16:40:40 +0200 Better way to fix tidy issue in HTML Filter * SVN Revision 69 - olivier, on Sat, 28 Jul 2007 10:32:28 +0200 You can now add some patterns for html::absoluteURLHandler() * SVN Revision 70 - olivier, on Mon, 30 Jul 2007 11:22:32 +0200 Try to read php://input if HTTP_RAW_POST_DATA is empty in net.xmlrpc. * SVN Revision 71 - olivier, on Tue, 21 Aug 2007 10:00:58 +0200 Allow some specific index to exist in DB and Schema. Typo fixes in comments and messages. * SVN Revision 72 - biou, on Sun, 02 Sep 2007 11:58:16 +0200 text::cutString now works in utf-8 (possible problems with trackbacks) thx sasha for detecting the bug * SVN Revision 73 - olivier, on Thu, 20 Sep 2007 15:22:36 +0200 Changed some properties scope * SVN Revision 76 - olivier, on Wed, 07 Nov 2007 15:06:38 +0100 Fixed a bug with timezone offset in ISO8601 and RFC822 dates * SVN Revision 89 - olivier, on Sat, 01 Dec 2007 12:01:23 +0100 Changed require by require_once in dbLayer::init * SVN Revision 92 - olivier, on Tue, 11 Dec 2007 22:53:56 +0100 Fixed realIP() code. * SVN Revision 94 - biou, on Sat, 29 Dec 2007 11:41:47 +0100 ability to register new mime types * SVN Revision 95 - biou, on Wed, 09 Jan 2008 11:10:26 +0100 autoload upgraded to use spl_autoload_register (with backward compat) * SVN Revision 96 - olivier, on Tue, 15 Jan 2008 16:11:37 +0100 Changed the way we sort items in filemanager * SVN Revision 98 - olivier, on Fri, 15 Feb 2008 15:43:35 +0100 Added unzip class * SVN Revision 100 - olivier, on Fri, 15 Feb 2008 22:31:39 +0100 Changed getFilesList() and added getDirsList() in fileUnzip class. * SVN Revision 101 - olivier, on Fri, 15 Feb 2008 22:50:25 +0100 Don't append zip file basename to target in unzipAll (fileUnzip) * SVN Revision 102 - olivier, on Fri, 15 Feb 2008 23:12:12 +0100 Moved exclude condition from unzipAll() to getList() in fileUnzip. * SVN Revision 103 - olivier, on Sat, 16 Feb 2008 00:40:16 +0100 Removed files::makePackage and files::installPackage. * SVN Revision 104 - olivier, on Mon, 18 Feb 2008 14:00:42 +0100 Fix in urlHandler class * SVN Revision 106 - olivier, on Mon, 18 Feb 2008 15:58:57 +0100 Added cleanFileName() in fileUnzip class. -- Olivier Meunier Tue, 19 Feb 2008 10:24:09 +0100 libclearbricks (0.8-13) unstable; urgency=low ; svnrev=62 * SVN Revision 61 - mik, on Mon, 02 Jul 2007 11:10:18 +0200 last version changelog * SVN Revision 62 - olivier, on Fri, 06 Jul 2007 13:14:27 +0200 Fixed a bug in socketMail::getFrom() -- Olivier Meunier Fri, 06 Jul 2007 13:18:46 +0200 libclearbricks (0.8-12) unstable; urgency=low ; svnrev=60 * SVN Revision 53 - pep, on Sun, 03 Jun 2007 12:31:25 +0200 Changed the way we obtain current TZ * SVN Revision 54 - olivier, on Mon, 11 Jun 2007 10:46:06 +0200 Changed default values in sessionDB constructor * SVN Revision 55 - pep, on Tue, 12 Jun 2007 19:51:21 +0200 Fixed a bug * SVN Revision 56 - biou, on Wed, 13 Jun 2007 14:24:02 +0200 permits file creation with putContent * SVN Revision 57 - biou, on Thu, 21 Jun 2007 17:15:06 +0200 added a consistency check on the moveFile method * SVN Revision 58 - olivier, on Thu, 28 Jun 2007 16:03:35 +0200 Added video/x-flv in lib.files * SVN Revision 59 - olivier, on Mon, 02 Jul 2007 10:29:10 +0200 Fixed bugs in socketMail::getFrom * SVN Revision 60 - mik, on Mon, 02 Jul 2007 11:07:16 +0200 export LANG=C before svn commands -- Olivier Meunier Mon, 02 Jul 2007 11:09:40 +0200 libclearbricks (0.8-11) unstable; urgency=low ; svnrev=52 * SVN Revision 36 - olivier, on Thu, 15 Feb 2007 19:02:26 +0100 Fixed redirect bug in netHttp * SVN Revision 37 - olivier, on Sun, 18 Feb 2007 18:08:32 +0100 Added default timezone in common/_main.php * SVN Revision 38 - olivier, on Sun, 18 Feb 2007 18:17:22 +0100 Changed template::getData() code. * SVN Revision 39 - olivier, on Sun, 18 Feb 2007 22:20:26 +0100 template::getData() optim. * SVN Revision 40 - olivier, on Mon, 19 Feb 2007 11:02:48 +0100 Added strict_check mode in xmlrpcServer. Default to false. * SVN Revision 41 - olivier, on Mon, 19 Feb 2007 11:24:51 +0100 Removed l10n::getHtmlFile() and added l10n::getFilePath(). * SVN Revision 42 - olivier, on Fri, 23 Feb 2007 14:00:39 +0100 Fixed a bug with starting dot lines in nntp class. * SVN Revision 43 - pep, on Fri, 23 Feb 2007 16:43:40 +0100 Small fix : seems better ... * SVN Revision 44 - olivier, on Mon, 26 Feb 2007 14:35:56 +0100 Forgot 'class' attribute for 'a' tag. * SVN Revision 45 - pep, on Wed, 28 Feb 2007 02:50:48 +0100 Shouldn't inflate incoming content when use_gzip = false * SVN Revision 46 - olivier, on Wed, 21 Mar 2007 16:33:28 +0100 * New dbSchema classes collection. * Removed getTables() and getColumns() method from dbLayer(). * Added a database() method in dbLayer returning current database in use. * SVN Revision 47 - olivier, on Wed, 21 Mar 2007 23:58:02 +0100 Returns changes count in dbStruct::synchronize(). * SVN Revision 48 - olivier, on Fri, 30 Mar 2007 17:30:22 +0200 Added a static property (https_scheme_on_443) to force https scheme if port is 443 in http::getHost(). * SVN Revision 49 - olivier, on Mon, 02 Apr 2007 13:35:06 +0200 added http::browserUID. * SVN Revision 50 - olivier, on Mon, 02 Apr 2007 14:52:44 +0200 Allow secure session cookies * SVN Revision 51 - olivier, on Mon, 02 Apr 2007 14:57:20 +0200 Added cookie_domain for session * SVN Revision 52 - olivier, on Tue, 17 Apr 2007 17:53:44 +0200 Signature fix in mail.convert -- Olivier Meunier Thu, 19 Apr 2007 16:06:54 +0200 libclearbricks (0.8-10) unstable; urgency=low ; svnrev=35 * SVN Revision 33 - mik, on Thu, 01 Feb 2007 18:39:56 +0100 Romuald:gruik pour display de la date en fonction de la timezone * SVN Revision 34 - olivier, on Mon, 05 Feb 2007 11:05:25 +0100 Timezone display in dt::str and dt::dt2str * SVN Revision 35 - olivier, on Mon, 05 Feb 2007 16:22:59 +0100 net.xmlrpc -- Olivier Meunier Mon, 05 Feb 2007 17:50:20 +0100 libclearbricks (0.8-9) unstable; urgency=low ; svnrev=32 * SVN Revision 30 - olivier, on Thu, 25 Jan 2007 16:53:01 +0100 Implemented status_string in netHttp * SVN Revision 31 - olivier, on Wed, 31 Jan 2007 13:53:10 +0100 NEWNEWS implementation in netNntp::getNewArticles(). * SVN Revision 32 - olivier, on Wed, 31 Jan 2007 19:32:05 +0100 Fix in net.nntp -- Olivier Meunier Wed, 31 Jan 2007 19:36:08 +0100 libclearbricks (0.8-8) unstable; urgency=low ; svnrev=29 * SVN Revision 28 - olivier, on Thu, 25 Jan 2007 10:31:20 +0100 Can now specify a port for postgresql connection. * SVN Revision 29 - olivier, on Thu, 25 Jan 2007 14:47:15 +0100 Fix in text::QPEncode() static method -- Olivier Meunier Thu, 25 Jan 2007 15:31:25 +0100 libclearbricks (0.8-7) unstable; urgency=low ; svnrev=27 * SVN Revision 26 - olivier, on Wed, 17 Jan 2007 16:57:51 +0100 Chmod on feed cache file * SVN Revision 27 - olivier, on Wed, 17 Jan 2007 16:58:09 +0100 Chmod on template cache file -- Olivier Meunier Wed, 17 Jan 2007 16:59:11 +0100 libclearbricks (0.8-6) unstable; urgency=low ; svnrev=25 * SVN Revision 25 - olivier, on Wed, 17 Jan 2007 16:22:49 +0100 Fixed chmod bug. -- Olivier Meunier Wed, 17 Jan 2007 16:23:25 +0100 libclearbricks (0.8-5) unstable; urgency=low ; svnrev=24 * SVN Revision 24 - olivier, on Tue, 16 Jan 2007 16:13:10 +0100 New debian changelog -- Olivier Meunier Wed, 17 Jan 2007 14:26:32 +0100 libclearbricks (0.8-4) unstable; urgency=low ; svnrev=23 * SVN Revision 18 - mik, on Fri, 12 Jan 2007 13:33:59 +0100 libclearbricks' readme in the package * SVN Revision 19 - mik, on Fri, 12 Jan 2007 13:36:13 +0100 empty so removed * SVN Revision 20 - mik, on Mon, 15 Jan 2007 18:24:05 +0100 README file copied in debian dir * SVN Revision 21 - olivier, on Tue, 16 Jan 2007 15:17:05 +0100 Test .svn dir before mkdcl.php launch * SVN Revision 22 - olivier, on Tue, 16 Jan 2007 15:48:04 +0100 Fix in files::touch() method * SVN Revision 23 - olivier, on Tue, 16 Jan 2007 16:12:02 +0100 Zend hash del key or index fix. -- Olivier Meunier Tue, 16 Jan 2007 16:12:50 +0100 libclearbricks (0.8-3) unstable; urgency=low ; svnrev=17 * SVN Revision 13 - olivier, on Wed, 10 Jan 2007 00:51:10 +0100 Makefile and Debian package for clearbricks * SVN Revision 14 - olivier, on Wed, 10 Jan 2007 16:27:08 +0100 Clearbricks Debian packager * SVN Revision 15 - olivier, on Thu, 11 Jan 2007 14:44:42 +0100 Test if database functions exist on dblayer driver load. * SVN Revision 16 - olivier, on Fri, 12 Jan 2007 01:30:36 +0100 Fixed Windows bug in files::makeDir. * SVN Revision 17 - olivier, on Fri, 12 Jan 2007 01:57:56 +0100 Fixed an issue with recursive files::makeDir and open_basedir. -- Olivier Meunier Fri, 12 Jan 2007 13:34:21 +0100 libclearbricks (0.8-2) unstable; urgency=low ; svnrev=12 * SVN Revision 10 - olivier, on Tue, 09 Jan 2007 13:53:03 +0100 Added default HTTP Status Messages in http::head() * SVN Revision 11 - olivier, on Tue, 09 Jan 2007 16:46:09 +0100 Added clearbricks version number. * SVN Revision 12 - olivier, on Wed, 10 Jan 2007 00:17:53 +0100 Fixed PHP 5.0 compatibilty issue \o/ -- Olivier Meunier Wed, 10 Jan 2007 16:24:31 +0100 libclearbricks (0.8-1) unstable; urgency=low ; svnrev=9 First upstream release -- Olivier Meunier Tue, 09 Jan 2007 16:50:12 +0100 dotclear-2.6.2+dfsg/inc/libs/clearbricks/debian/compat000066400000000000000000000000021230033266200226400ustar00rootroot000000000000004 dotclear-2.6.2+dfsg/inc/libs/clearbricks/debian/control000066400000000000000000000010641230033266200230460ustar00rootroot00000000000000Source: libclearbricks Section: web Priority: optional Maintainer: Olivier Meunier Build-Depends: debhelper (>= 4.0.0), php5-cli Standards-Version: 3.6.1 Package: libclearbricks Architecture: all Depends: ${misc:Depends}, php5-cli | php5-cgi | libapache2-mod-php5 | libapache-mod-php5 Suggests: php5-pgsql | php5-sqlite | php5-mysql, php5-gd, php5-tidy Description: libclearbricks is a set of PHP classes and utilities Clearbricks is not yet another PHP framework. Clearbricks is only about code and efficiency, consider it as a toolbox. dotclear-2.6.2+dfsg/inc/libs/clearbricks/debian/copyright000066400000000000000000000020511230033266200233730ustar00rootroot00000000000000This is Clearbricks, written and maintained by Olivier Meunier <> on Fri, 29 Dec 2006 16:55:20 +0200. The original source can always be found at: http://clearbricks.org/ Copyright (C) 2006 Olivier Meunier License: This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this package; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. On Debian systems, the complete text of the GNU General Public License can be found in `/usr/share/common-licenses/GPL'. dotclear-2.6.2+dfsg/inc/libs/clearbricks/debian/dirs000066400000000000000000000000241230033266200223220ustar00rootroot00000000000000usr/lib/clearbricks dotclear-2.6.2+dfsg/inc/libs/clearbricks/debian/docs000066400000000000000000000000071230033266200223120ustar00rootroot00000000000000README dotclear-2.6.2+dfsg/inc/libs/clearbricks/debian/mkdcl.php000066400000000000000000000073041230033266200232510ustar00rootroot00000000000000#!/usr/bin/env php f)) { throw new Exception('No changelog file found'); } } private function readLastRevision() { $f = file($this->f); $res = array(); $done = false; foreach ($f as $v) { $v = rtrim($v,"\n"); # First line of a change if (strpos($v,' ') !== 0 && trim($v) != '') { if ($done) { break; } $done = true; $res = $this->getPackageInfo($v,$res[$i]); } # Maintainer information elseif (strpos($v,' --') === 0) { $res['maintainer'] = $this->getMaintainerInfo($v); } # Changelog elseif (strpos($v,' ') === 0) { $res['changelog'] .= $v."\n"; } } return $res; } public function writeChangelog() { $ch = $this->readLastRevision(); # Get debian revision $rev = 1; if (preg_match('/^(.*)-(\d+)$/',$ch['version'],$m)) { $ch['version'] = $m[1]; $rev = $m[2]; } $rev++; # Get SVN revision $svnrev = isset($ch['keywords']['svnrev']) ? (integer) $ch['keywords']['svnrev'] : 1; # Get current SVN revision $currev = svnInfo::getCurrentRevision(); if ($currev <= $svnrev) { return; } $changelog = ''; $changes = svnInfo::getChangeLog($svnrev+1,$currev); foreach ($changes as $k => $v) { $changelog .= ' * SVN Revision '.$k.' - '.$v['author']. ', on '.date('r',strtotime($v['date']))."\n". ' '.trim(preg_replace('/\n/ms',"\n ",$v['msg']))."\n\n"; } $res = $ch['package'].' ('.$ch['version'].'-'.$rev.') '.$ch['dist'].'; urgency='.$ch['keywords']['urgency']. ' ; svnrev='.$currev. "\n\n". rtrim($changelog)."\n\n". ' -- '.$ch['maintainer']['name'].' <'.$ch['maintainer']['email'].'> '.date('r')."\n". "\n"; $old_changelog = file_get_contents($this->f); $fp = fopen($this->f,'wb'); fwrite($fp,$res.$old_changelog); fclose($fp); } private function getPackageInfo($l) { $res = array( 'package' => '', 'version' => '', 'dist' => '', 'keywords' => '', 'changelog' => '', 'maintainer' => array() ); $l = explode(';',$l); # Info $info = array_shift($l); $res['package'] = strtok($info,' '); $res['version'] = strtok('()'); $res['dist'] = trim(strtok(';')); # Keywords foreach ($l as $v) { $v = explode('=',$v); if (count($v) == 2) { $res['keywords'][trim($v[0])] = trim($v[1]); } } return $res; } private function getMaintainerInfo($l) { $res = array( 'name' => '', 'email' => '', 'date' => '' ); if (preg_match('/^ -- (.+?) <(.+?)> (.+?)$/',$l,$m)) { $res['name'] = $m[1]; $res['email'] = $m[2]; $res['date'] = $m[3]; } return $res; } } class svnInfo { public static function getCurrentRevision() { $info = `LANG=C svn info --xml`; $x = @simplexml_load_string($info); if (!$x) { throw new Exception('Unable to get current SVN revision'); } $rev = $x->entry->commit['revision']; if (!$rev) { throw new Exception('Last revision number is invalid'); } return (integer) $rev; } public static function getChangeLog($fromrev,$torev) { $log = `LANG=C svn log --xml -r $fromrev:$torev`; $x = @simplexml_load_string($log); if (!$x) { throw new Exception('Unable to open SVN log'); } $res = array(); foreach ($x->logentry as $change) { $res[(integer) $change['revision']] = array( 'author' => (string) $change->author, 'date' => (string) $change->date, 'msg' => trim((string) $change->msg) ); } return $res; } } # Main try { $ch = new debianChangelog(); $ch->writeChangelog(); } catch (Exception $e) { fwrite(STDERR,$e->getMessage()."\n"); exit(1); } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/debian/rules000066400000000000000000000021571230033266200225240ustar00rootroot00000000000000#!/usr/bin/make -f # -*- makefile -*- DEST=debian/dotclear/usr/share/dotclear configure: configure-stamp configure-stamp: dh_testdir # Add here commands to configure the package. touch configure-stamp build: build-stamp build-stamp: configure-stamp dh_testdir # Add here commands to compile the package. $(MAKE) config touch build-stamp clean: dh_testdir dh_testroot rm -f build-stamp configure-stamp # Add here commands to clean up after the build process. -$(MAKE) clean dh_clean install: build dh_testdir dh_testroot dh_clean -k dh_installdirs cp -af $(CURDIR)/_dist/clearbricks $(CURDIR)/debian/libclearbricks/usr/lib/ # Build architecture-independent files here. binary-indep: build install # We have nothing to do by default. # Build architecture-dependent files here. binary-arch: build install dh_testdir dh_testroot dh_installchangelogs dh_installdocs dh_installexamples dh_installman dh_link dh_strip dh_compress dh_fixperms dh_installdeb dh_gencontrol dh_md5sums dh_builddeb binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install configure dotclear-2.6.2+dfsg/inc/libs/clearbricks/diff/000077500000000000000000000000001230033266200211305ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/diff/lib.diff.php000066400000000000000000000167401230033266200233260ustar00rootroot000000000000000); $end_reached = false; # Find LCS length for ($D = 0; $D < $cx+$cy+1 && !$end_reached; $D++) { for ($k = -$D; $k <= $D; $k += 2) { $x = ($k == -$D || $k != $D && $V[$k-1] < $V[$k+1]) ? $V[$k+1] : $V[$k-1]+1; $y = $x-$k; while ($x < $cx && $y < $cy && $src[$x] == $dst[$y]) { $x++; $y++; } $V[$k] = $x; if ($x == $cx && $y == $cy) { $end_reached = true; break; } } $stack[] = $V; } $D--; # Recover edit path $res = array(); for ($D = $D; $D > 0; $D--) { $V = array_pop($stack); $cx = $x; $cy = $y; # Try right diagonal $k++; $x = array_key_exists($k,$V) ? $V[$k] : 0; $y = $x-$k; $y++; while ($x < $cx && $y < $cy && isset($src[$x]) && isset($dst[$y]) && $src[$x] == $dst[$y]) { $x++; $y++; } if ($x == $cx && $y == $cy) { $x = $V[$k]; $y = $x-$k; $res[] = array('i',$x,$y); continue; } # Right diagonal wasn't the solution, use left diagonal $k -= 2; $x = $V[$k]; $y = $x-$k; $res[] = array('d',$x,$y); } return array_reverse($res); } /** * Returns unified diff from source $src to destination $dst. * * @param string $src Original data * @param string $dst New data * @param string $ctx Context length * @return string */ public static function uniDiff($src,$dst,$ctx=2) { list($src,$dst) = array(explode("\n",$src),explode("\n",$dst)); $cx = count($src); $cy = count($dst); $ses = diff::SES($src,$dst); $res = ''; $pos_x = 0; $pos_y = 0; $old_lines = 0; $new_lines = 0; $buffer = ''; foreach ($ses as $cmd) { list($cmd,$x,$y) = array($cmd[0],$cmd[1],$cmd[2]); # New chunk if ($x-$pos_x > 2*$ctx || $pos_x == 0 && $x > $ctx) { # Footer for current chunk for ($i = 0; $buffer && $i < $ctx; $i++) { $buffer .= sprintf(self::$us_ctx,$src[$pos_x+$i]); } # Header for current chunk $res .= sprintf(self::$us_range, $pos_x+1-$old_lines,$old_lines+$i, $pos_y+1-$new_lines,$new_lines+$i ).$buffer; $pos_x = $x; $pos_y = $y; $old_lines = 0; $new_lines = 0; $buffer = ''; # Header for next chunk for ($i = $ctx; $i > 0 ; $i--) { $buffer .= sprintf(self::$us_ctx,$src[$pos_x-$i]); $old_lines++; $new_lines++; } } # Context while ($x > $pos_x) { $old_lines++; $new_lines++; $buffer .= sprintf(self::$us_ctx,$src[$pos_x]); $pos_x++; $pos_y++; } # Deletion if ($cmd == 'd') { $old_lines++; $buffer .= sprintf(self::$us_del,$src[$x]); $pos_x++; } # Insertion elseif ($cmd == 'i') { $new_lines++; $buffer .= sprintf(self::$us_ins,$dst[$y]); $pos_y++; } } # Remaining chunk if ($buffer) { # Footer for ($i = 0; $i < $ctx; $i++) { if (!isset($src[$pos_x+$i])) { break; } $buffer .= sprintf(self::$us_ctx,$src[$pos_x+$i]); } # Header for current chunk $res .= sprintf(self::$us_range, $pos_x+1-$old_lines,$old_lines+$i, $pos_y+1-$new_lines,$new_lines+$i ).$buffer; } return $res; } /** * Applies a unified patch to a piece of text. * Throws an exception on invalid or not applicable diff. * * @param string $src Source text * @param string $diff Patch to apply * @return string */ public static function uniPatch($src,$diff) { $dst = array(); $src = explode("\n",$src); $diff = explode("\n",$diff); $t = count($src); $old_length = $new_length = 0; foreach ($diff as $line) { # New chunk if (preg_match(self::$up_range,$line,$m)) { $m[1]--; $m[3]--; if ($m[1] > $t) { throw new Exception(__('Bad range')); } if ($t - count($src) > $m[1]) { throw new Exception(__('Invalid range')); } while ($t - count($src) < $m[1]) { $dst[] = array_shift($src); } if (count($dst) !== $m[3]) { throw new Exception(__('Invalid line number')); } if ($old_length || $new_length) { throw new Exception(__('Chunk is out of range')); } $old_length = (integer) $m[2]; $new_length = (integer) $m[4]; } # Context elseif (preg_match(self::$up_ctx,$line,$m)) { if (array_shift($src) !== $m[1]) { throw new Exception(__('Bad context')); } $dst[] = $m[1]; $old_length--; $new_length--; } # Addition elseif (preg_match(self::$up_ins,$line,$m)) { $dst[] = $m[1]; $new_length--; } # Deletion elseif (preg_match(self::$up_del,$line,$m)) { if (array_shift($src) !== $m[1]) { throw new Exception(__('Bad context (in deletion)')); } $old_length--; } elseif ($line == '') { continue; } else { throw new Exception(__('Invalid diff format')); } } if ($old_length || $new_length) { throw new Exception(__('Chunk is out of range')); } return implode("\n",array_merge($dst,$src)); } /** * Throws an exception on invalid unified diff. * * @param string $diff Diff text to check */ public static function uniCheck($diff) { $diff = explode("\n",$diff); $cur_line = 1; $ins_lines = 0; # Chunk length $old_length = $new_length = 0; foreach ($diff as $line) { # New chunk if (preg_match(self::$up_range,$line,$m)) { if ($cur_line > $m[1]) { throw new Exception(__('Invalid range')); } while ($cur_line < $m[1]) { $ins_lines++; $cur_line++; } if ($ins_lines+1 != $m[3]) { throw new Exception(__('Invalid line number')); } if ($old_length || $new_length) { throw new Exception(__('Chunk is out of range')); } $old_length = $m[2]; $new_length = $m[4]; } # Context elseif (preg_match(self::$up_ctx,$line,$m)) { $ins_lines++; $cur_line++; $old_length--; $new_length--; } # Addition elseif (preg_match(self::$up_ins,$line,$m)) { $ins_lines++; $new_length--; } # Deletion elseif (preg_match(self::$up_del,$line,$m)) { $cur_line++; $old_length--; } # Skip empty lines elseif ($line == '') { continue; } # Unrecognized diff format else { throw new Exception(__('Invalid diff format')); } } if ($old_length || $new_length) { throw new Exception(__('Chunk is out of range')); } } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/diff/lib.tidy.diff.php000066400000000000000000000170331230033266200242720ustar00rootroot00000000000000up_range,$udiff,$context); $chunks = preg_split($this->up_range,$udiff,-1,PREG_SPLIT_NO_EMPTY); foreach ($chunks as $k => $chunk) { $tidy_chunk = new tidyDiffChunk(); $tidy_chunk->setRange( (int) $context[1][$k], (int) $context[2][$k], (int) $context[3][$k], (int) $context[4][$k] ); $old_line = (int) $context[1][$k]; $new_line = (int) $context[3][$k]; foreach (explode("\n",$chunk) as $line) { # context if (preg_match($this->up_ctx,$line,$m)) { $tidy_chunk->addLine('context',array($old_line,$new_line),$m[1]); $old_line++; $new_line++; } # insertion if (preg_match($this->up_ins,$line,$m)) { $tidy_chunk->addLine('insert',array($old_line,$new_line),$m[1]); $new_line++; } # deletion if (preg_match($this->up_del,$line,$m)) { $tidy_chunk->addLine('delete',array($old_line,$new_line),$m[1]); $old_line++; } } if ($inline_changes) { $tidy_chunk->findInsideChanges(); } array_push($this->__data,$tidy_chunk); } } /** * All chunks * * Returns all chunks defined. * * @return array */ public function getChunks() { return $this->__data; } } /** * TIDY diff chunk * * A diff chunk representation. Used by a TIDY diff. * * @package Clearbricks * @subpackage Diff */ class tidyDiffChunk { /** @var array Chunk information array */ protected $__info; /** @var array Chunk data array */ protected $__data; /** * Constructor * * Creates and initializes a chunk representation for a TIDY diff. */ public function __construct() { $this->__info = array( 'context' => 0, 'delete' => 0, 'insert' => 0, 'range' => array( 'start' => array(), 'end' => array() ) ); $this->__data = array(); } /** * Set chunk range * * Sets chunk range in TIDY chunk object. * * @param integer $line_start Old start line number * @param integer $offest_start Old offset number * @param integer $line_end new start line number * @param integer $offset_end New offset number */ public function setRange($line_start,$offest_start,$line_end,$offset_end) { if (is_int($line_start) && is_int($offest_start) && is_int($line_end) && is_int($offset_end)) { $this->__info['range']['start'] = array($line_start,$offest_start); $this->__info['range']['end'] = array($line_end,$offset_end); } } /** * Add line * * Adds TIDY line object for TIDY chunk object. * * @param string $type Tine type * @param array $lines Line number for old and new context * @param string $content Line content */ public function addLine($type,$lines,$content) { $tidy_line = new tidyDiffLine($type,$lines,$content); if (!is_null($tidy_line)) { array_push($this->__data,$tidy_line); $this->__info[$type]++; } } /** * All lines * * Returns all lines defined. * * @return array */ public function getLines() { return $this->__data; } /** * Chunk information * * Returns chunk information according to the given name, null otherwise. * * @param string $n Info name * @return string */ public function getInfo($n) { return array_key_exists($n,$this->__info) ? $this->__info[$n] : null; } /** * Find changes * * Finds changes inside lines for each groups of diff lines. Wraps changes * by string \0 and \1 */ public function findInsideChanges() { $groups = $this->getGroups(); foreach ($groups as $group) { $middle = count($group) / 2; for ($i = 0; $i < $middle; $i++) { $from = $group[$i]; $to = $group[$i + $middle]; $threshold = $this->getChangeExtent($from->content,$to->content); if ($threshold['start'] != 0 || $threshold['end'] != 0) { $start = $threshold['start']; $end = $threshold['end'] + strlen($from->content); $offset = $end - $start; $from->overwrite( substr($from->content,0,$start).'\0'. substr($from->content,$start,$offset).'\1'. substr($from->content,$end,strlen($from->content)) ); $end = $threshold['end'] + strlen($to->content); $offset = $end - $start; $to->overwrite( substr($to->content,0,$start).'\0'. substr($to->content,$start,$offset).'\1'. substr($to->content,$end,strlen($to->content)) ); } } } } private function getGroups() { $res = $group = array(); $allowed_types = array('delete','insert'); $delete = $insert = 0; foreach ($this->__data as $k => $line) { if (in_array($line->type,$allowed_types)) { array_push($group,$line); ${$line->type}++; } else { if ($delete === $insert && count($group) > 0) { array_push($res,$group); } $delete = $insert = 0; $group = array(); } } if ($delete === $insert && count($group) > 0) { array_push($res,$group); } return $res; } private function getChangeExtent($str1,$str2) { $start = 0; $limit = min(strlen($str1), strlen($str2)); while ($start < $limit and $str1[$start] === $str2[$start]) { $start++; } $end = -1; $limit = $limit - $start; while (-$end <= $limit && $str1[strlen($str1) + $end] === $str2[strlen($str2) + $end]) { $end--; } return array('start' => $start,'end' => $end +1); } } /** * TIDY diff line * * A diff line representation. Used by a TIDY chunk. * * @package Clearbricks * @subpackage Diff */ class tidyDiffLine { /** @var string Line type */ protected $type; /** @var array Line number for old and new context */ protected $lines; /** @var string Line content */ protected $content; /** * Constructor * * Creates a line representation for a tidy chunk. Returns a new object if * all parameters are fine, null otherwise. * * @param string $type Tine type * @param array $lines Line number for old and new context * @param string $content Line content * @return object */ public function __construct($type,$lines,$content) { $allowed_type = array('context','delete','insert'); if (in_array($type,$allowed_type) && is_array($lines) && is_string($content)) { $this->type = $type; $this->lines = $lines; $this->content = $content; return $this; } return null; } /** * Magic get * * Returns field content according to the given name, null otherwise. * * @param string $n Field name * @return string */ public function __get($n) { return isset($n,$this) ? $this->{$n} : null; } /** * Overwrite * * Overwrites content for the current line. * * @param string $content Line content */ public function overwrite($content) { if (is_string($content)) { $this->content = $content; } } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/ext/000077500000000000000000000000001230033266200210205ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/ext/incutio.ixr_library.php000066400000000000000000000701411230033266200255330ustar00rootroot00000000000000 htmlspecialchars) Site: http://scripts.incutio.com/xmlrpc/ Manual: http://scripts.incutio.com/xmlrpc/manual.php Made available under the Artistic License: http://www.opensource.org/licenses/artistic-license.php */ class IXR_Value { public $data; public $type; function IXR_Value ($data, $type = false) { $this->data = $data; if (!$type) { $type = $this->calculateType(); } $this->type = $type; if ($type == 'struct') { /* Turn all the values in the array in to new IXR_Value objects */ foreach ($this->data as $key => $value) { $this->data[$key] = new IXR_Value($value); } } if ($type == 'array') { for ($i = 0, $j = count($this->data); $i < $j; $i++) { $this->data[$i] = new IXR_Value($this->data[$i]); } } } function calculateType() { if ($this->data === true || $this->data === false) { return 'boolean'; } if (is_integer($this->data)) { return 'int'; } if (is_double($this->data)) { return 'double'; } // Deal with IXR object types base64 and date if (is_object($this->data) && $this->data instanceof IXR_Date) { return 'date'; } if (is_object($this->data) && $this->data instanceof IXR_Base64) { return 'base64'; } // If it is a normal PHP object convert it in to a struct if (is_object($this->data)) { $this->data = get_object_vars($this->data); return 'struct'; } if (!is_array($this->data)) { return 'string'; } /* We have an array - is it an array or a struct ? */ if ($this->isStruct($this->data)) { return 'struct'; } else { return 'array'; } } function getXml() { /* Return XML for this value */ switch ($this->type) { case 'boolean': return ''.(($this->data) ? '1' : '0').''; break; case 'int': return ''.$this->data.''; break; case 'double': return ''.$this->data.''; break; case 'string': return ''.htmlspecialchars($this->data).''; break; case 'array': $return = ''."\n"; foreach ($this->data as $item) { $return .= ' '.$item->getXml()."\n"; } $return .= ''; return $return; break; case 'struct': $return = ''."\n"; foreach ($this->data as $name => $value) { $return .= " $name"; $return .= $value->getXml()."\n"; } $return .= ''; return $return; break; case 'date': case 'base64': return $this->data->getXml(); break; } return false; } function isStruct($array) { /* Nasty function to check if an array is a struct or not */ $expected = 0; foreach ($array as $key => $value) { if ((string)$key != (string)$expected) { return true; } $expected++; } return false; } } class IXR_Message { public $brutxml; public $message; public $messageType; // methodCall / methodResponse / fault public $faultCode; public $faultString; public $methodName; public $params; // Current variable stacks public $_arraystructs = array(); // The stack used to keep track of the current array/struct public $_arraystructstypes = array(); // Stack keeping track of if things are structs or array public $_currentStructName = array(); // A stack as well public $_param; public $_value; public $_currentTag; public $_currentTagContents; // The XML parser public $_parser; function IXR_Message ($message) { $this->brutxml = $this->message = $message; } function parse() { // first remove the XML declaration $this->message = preg_replace('/<\?xml(.*)?\?'.'>/', '', $this->message); if (trim($this->message) == '') { return false; } $this->_parser = xml_parser_create(); // Set XML parser to take the case of tags in to account xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false); // Set XML parser callback functions xml_set_object($this->_parser, $this); xml_set_element_handler($this->_parser, 'tag_open', 'tag_close'); xml_set_character_data_handler($this->_parser, 'cdata'); if (!xml_parse($this->_parser, $this->message)) { /* die(sprintf('XML error: %s at line %d', xml_error_string(xml_get_error_code($this->_parser)), xml_get_current_line_number($this->_parser))); */ return false; } xml_parser_free($this->_parser); // Grab the error messages, if any if ($this->messageType == 'fault') { $this->faultCode = $this->params[0]['faultCode']; $this->faultString = $this->params[0]['faultString']; } return true; } function tag_open($parser, $tag, $attr) { $this->currentTag = $tag; switch($tag) { case 'methodCall': case 'methodResponse': case 'fault': $this->messageType = $tag; break; /* Deal with stacks of arrays and structs */ case 'data': // data is to all intents and puposes more interesting than array $this->_arraystructstypes[] = 'array'; $this->_arraystructs[] = array(); break; case 'struct': $this->_arraystructstypes[] = 'struct'; $this->_arraystructs[] = array(); break; } } function cdata($parser, $cdata) { $this->_currentTagContents .= $cdata; } function tag_close($parser, $tag) { $valueFlag = false; switch($tag) { case 'int': case 'i4': $value = (int)trim($this->_currentTagContents); $this->_currentTagContents = ''; $valueFlag = true; break; case 'double': $value = (double)trim($this->_currentTagContents); $this->_currentTagContents = ''; $valueFlag = true; break; case 'string': $value = (string)trim($this->_currentTagContents); $this->_currentTagContents = ''; $valueFlag = true; break; case 'dateTime.iso8601': $value = new IXR_Date(trim($this->_currentTagContents)); // $value = $iso->getTimestamp(); $this->_currentTagContents = ''; $valueFlag = true; break; case 'value': // "If no type is indicated, the type is string." if (trim($this->_currentTagContents) != '') { $value = (string)$this->_currentTagContents; $this->_currentTagContents = ''; $valueFlag = true; } break; case 'boolean': $value = (boolean)trim($this->_currentTagContents); $this->_currentTagContents = ''; $valueFlag = true; break; case 'base64': $value = base64_decode($this->_currentTagContents); $this->_currentTagContents = ''; $valueFlag = true; break; /* Deal with stacks of arrays and structs */ case 'data': case 'struct': $value = array_pop($this->_arraystructs); array_pop($this->_arraystructstypes); $valueFlag = true; break; case 'member': array_pop($this->_currentStructName); break; case 'name': $this->_currentStructName[] = trim($this->_currentTagContents); $this->_currentTagContents = ''; break; case 'methodName': $this->methodName = trim($this->_currentTagContents); $this->_currentTagContents = ''; break; } if ($valueFlag) { /* if (!is_array($value) && !is_object($value)) { $value = trim($value); } */ if (count($this->_arraystructs) > 0) { // Add value to struct or array if ($this->_arraystructstypes[count($this->_arraystructstypes)-1] == 'struct') { // Add to struct $this->_arraystructs[count($this->_arraystructs)-1][$this->_currentStructName[count($this->_currentStructName)-1]] = $value; } else { // Add to array $this->_arraystructs[count($this->_arraystructs)-1][] = $value; } } else { // Just add as a paramater $this->params[] = $value; } } } } class IXR_Server { public $data; public $callbacks = array(); public $message; public $capabilities; function IXR_Server($callbacks = false, $data = false) { $this->setCapabilities(); if ($callbacks) { $this->callbacks = $callbacks; } $this->setCallbacks(); $this->serve($data); } function head($code,$msg) { $status_mode = preg_match('/cgi/',php_sapi_name()); if ($status_mode) { header('Status: '.$code.' '.$msg); } else { if (version_compare(phpversion(),'4.3.0','>=')) { header($msg, TRUE, $code); } else { header('HTTP/1.x '.$code.' '.$msg); } } } function serve($data = false, $encoding='ISO-8859-1') { if (!$data) { global $HTTP_RAW_POST_DATA; if (!$HTTP_RAW_POST_DATA) { $this->head(405,'Method Not Allowed'); header('Content-Type: text/plain'); echo 'XML-RPC server accepts POST requests only.'; exit; } $data = $HTTP_RAW_POST_DATA; } $this->message = new IXR_Message($data); if (!$this->message->parse()) { $this->error(-32700, 'parse error. not well formed'); } if ($this->message->messageType != 'methodCall') { $this->error(-32600, 'server error. invalid xml-rpc. not conforming to spec. Request must be a methodCall'); } $result = $this->call($this->message->methodName, $this->message->params); // Is the result an error? if ($result instanceof IXR_Error) { $this->error($result); } // Encode the result $r = new IXR_Value($result); $resultxml = $r->getXml(); // Create the XML $xml = << $resultxml EOD; // Send it $this->output($xml,$encoding); } function call($methodname, $args) { if (!$this->hasMethod($methodname)) { return new IXR_Error(-32601, 'server error. requested method '.$methodname.' does not exist.'); } $method = $this->callbacks[$methodname]; // Perform the callback and send the response if (count($args) == 1) { // If only one paramater just send that instead of the whole array $args = $args[0]; } // Are we dealing with a function or a method? if (substr($method, 0, 5) == 'this:') { // It's a class method - check it exists $method = substr($method, 5); if (!method_exists($this, $method)) { return new IXR_Error(-32601, 'server error. requested class method "'.$method.'" does not exist.'); } // Call the method $result = $this->$method($args); } else { // It's a function - does it exist? if (!function_exists($method)) { return new IXR_Error(-32601, 'server error. requested function "'.$method.'" does not exist.'); } // Call the function $result = $method($args); } return $result; } function error($error, $message = false) { // Accepts either an error object or an error code and message if ($message && !is_object($error)) { $error = new IXR_Error($error, $message); } $this->output($error->getXml()); } function output($xml,$encoding='ISO-8859-1') { $xml = ''."\n".$xml; $length = strlen($xml); header('Connection: close'); header('Content-Length: '.$length); header('Content-Type: text/xml'); header('Date: '.date('r')); echo $xml; exit; } function hasMethod($method) { return in_array($method, array_keys($this->callbacks)); } function setCapabilities() { // Initialises capabilities array $this->capabilities = array( 'xmlrpc' => array( 'specUrl' => 'http://www.xmlrpc.com/spec', 'specVersion' => 1 ), 'faults_interop' => array( 'specUrl' => 'http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php', 'specVersion' => 20010516 ), 'system.multicall' => array( 'specUrl' => 'http://www.xmlrpc.com/discuss/msgReader$1208', 'specVersion' => 1 ) ); } function getCapabilities($args) { return $this->capabilities; } function setCallbacks() { $this->callbacks['system.getCapabilities'] = 'this:getCapabilities'; $this->callbacks['system.listMethods'] = 'this:listMethods'; $this->callbacks['system.multicall'] = 'this:multiCall'; } function listMethods($args) { // Returns a list of methods - uses array_reverse to ensure user defined // methods are listed before server defined methods return array_reverse(array_keys($this->callbacks)); } function multiCall($methodcalls) { // See http://www.xmlrpc.com/discuss/msgReader$1208 $return = array(); foreach ($methodcalls as $call) { $method = $call['methodName']; $params = $call['params']; if ($method == 'system.multicall') { $result = new IXR_Error(-32600, 'Recursive calls to system.multicall are forbidden'); } else { $result = $this->call($method, $params); } if ($result instanceof IXR_Error) { $return[] = array( 'faultCode' => $result->code, 'faultString' => $result->message ); } else { $return[] = array($result); } } return $return; } } class IXR_Request { public $method; public $args; public $xml; function IXR_Request($method, $args) { $this->method = $method; $this->args = $args; $this->xml = << {$this->method} EOD; foreach ($this->args as $arg) { $this->xml .= ''; $v = new IXR_Value($arg); $this->xml .= $v->getXml(); $this->xml .= "\n"; } $this->xml .= ''; } function getLength() { return strlen($this->xml); } function getXml() { return $this->xml; } } class IXR_Client { public $server; public $port; public $path; public $useragent; protected $proxy_host; protected $proxy_port; public $timeout = 10; public $response; public $message = false; public $debug = false; // Storage place for an error message public $error = false; function IXR_Client($server, $path = false, $port = 80) { if (!$path) { // Assume we have been given a URL instead $bits = parse_url($server); $this->server = $bits['host']; $this->port = isset($bits['port']) ? $bits['port'] : 80; $this->path = isset($bits['path']) ? $bits['path'] : '/'; // Make absolutely sure we have a path if (!$this->path) { $this->path = '/'; } } else { $this->server = $server; $this->path = $path; $this->port = $port; } $this->useragent = 'The Incutio XML-RPC PHP Library'; if (defined('HTTP_PROXY_HOST') && defined('HTTP_PROXY_PORT')) { $this->setProxy(HTTP_PROXY_HOST,HTTP_PROXY_PORT); } } function setProxy($host,$port='8080') { $this->proxy_host = $host; $this->proxy_port = $port; } function query() { $args = func_get_args(); $method = array_shift($args); $request = new IXR_Request($method, $args); $length = $request->getLength(); $xml = $request->getXml(); $r = "\r\n"; $request = "POST {$this->path} HTTP/1.0$r"; $request .= "Host: {$this->server}$r"; $request .= "Content-Type: text/xml$r"; $request .= "User-Agent: {$this->useragent}$r"; $request .= "Content-length: {$length}$r$r"; $request .= $xml; // Now send the request if ($this->debug) { echo '
    '.htmlspecialchars($request)."\n
    \n\n"; } if ($this->proxy_host && $this->proxy_port) { $host = $this->proxy_host; $port = $this->proxy_port; } else { $host = $this->server; $port = $this->port; } $fp = @fsockopen($host, $port, $errno, $errstr, $this->timeout); if (!$fp) { $this->error = new IXR_Error(-32300, 'transport error - could not open socket'); return false; } socket_set_timeout($fp, $this->timeout); fputs($fp, $request); $contents = ''; $gotFirstLine = false; $gettingHeaders = true; while (!feof($fp)) { $line = fgets($fp, 4096); if (!$gotFirstLine) { // Check line for '200' if (strstr($line, '200') === false) { $this->error = new IXR_Error(-32300, 'transport error - HTTP status code was not 200'); return false; } $gotFirstLine = true; } if (trim($line) == '') { $gettingHeaders = false; } if (!$gettingHeaders) { $contents .= trim($line)."\n"; } } if ($this->debug) { echo '
    '.htmlspecialchars($contents)."\n
    \n\n"; } // Now parse what we've got back $this->message = new IXR_Message($contents); if (!$this->message->parse()) { // XML error $this->error = new IXR_Error(-32700, 'parse error. not well formed'); return false; } // Is the message a fault? if ($this->message->messageType == 'fault') { $this->error = new IXR_Error($this->message->faultCode, $this->message->faultString); return false; } // Message must be OK return true; } function getResponse() { // methodResponses can only have one param - return that return $this->message->params[0]; } function isError() { return (is_object($this->error)); } function getErrorCode() { return $this->error->code; } function getErrorMessage() { return $this->error->message; } } class IXR_Error { public $code; public $message; function IXR_Error($code, $message) { $this->code = $code; $this->message = $message; } function getXml() { $xml = << faultCode {$this->code} faultString {$this->message} EOD; return $xml; } } class IXR_Date { public $year; public $month; public $day; public $hour; public $minute; public $second; function IXR_Date($time) { // $time can be a PHP timestamp or an ISO one if (is_numeric($time)) { $this->parseTimestamp($time); } else { $this->parseTimestamp(strtotime($time)); } } function parseTimestamp($timestamp) { $this->year = date('Y', $timestamp); $this->month = date('m', $timestamp); $this->day = date('d', $timestamp); $this->hour = date('H', $timestamp); $this->minute = date('i', $timestamp); $this->second = date('s', $timestamp); $this->ts = $timestamp; } function getIso() { return $this->year.$this->month.$this->day.'T'.$this->hour.':'.$this->minute.':'.$this->second; } function getXml() { return ''.$this->getIso().''; } function getTimestamp() { return mktime($this->hour, $this->minute, $this->second, $this->month, $this->day, $this->year); } } class IXR_Base64 { public $data; function IXR_Base64($data) { $this->data = $data; } function getXml() { return ''.base64_encode($this->data).''; } } class IXR_IntrospectionServer extends IXR_Server { public $signatures; public $help; function IXR_IntrospectionServer() { $this->setCallbacks(); $this->setCapabilities(); $this->capabilities['introspection'] = array( 'specUrl' => 'http://xmlrpc.usefulinc.com/doc/reserved.html', 'specVersion' => 1 ); $this->addCallback( 'system.methodSignature', 'this:methodSignature', array('array', 'string'), 'Returns an array describing the return type and required parameters of a method' ); $this->addCallback( 'system.getCapabilities', 'this:getCapabilities', array('struct'), 'Returns a struct describing the XML-RPC specifications supported by this server' ); $this->addCallback( 'system.listMethods', 'this:listMethods', array('array'), 'Returns an array of available methods on this server' ); $this->addCallback( 'system.methodHelp', 'this:methodHelp', array('string', 'string'), 'Returns a documentation string for the specified method' ); } function addCallback($method, $callback, $args, $help) { $this->callbacks[$method] = $callback; $this->signatures[$method] = $args; $this->help[$method] = $help; } function call($methodname, $args) { // Make sure it's in an array if ($args && !is_array($args)) { $args = array($args); } // Over-rides default call method, adds signature check if (!$this->hasMethod($methodname)) { return new IXR_Error(-32601, 'server error. requested method "'.$this->message->methodName.'" not specified.'); } $method = $this->callbacks[$methodname]; $signature = $this->signatures[$methodname]; $returnType = array_shift($signature); // Check the number of arguments if (count($args) != count($signature)) { // print 'Num of args: '.count($args).' Num in signature: '.count($signature); return new IXR_Error(-32602, 'server error. wrong number of method parameters'); } // Check the argument types $ok = true; $argsbackup = $args; for ($i = 0, $j = count($args); $i < $j; $i++) { $arg = array_shift($args); $type = array_shift($signature); switch ($type) { case 'int': case 'i4': if (is_array($arg) || !is_int($arg)) { $ok = false; } break; case 'base64': case 'string': if (!is_string($arg)) { $ok = false; } break; case 'boolean': if ($arg !== false && $arg !== true) { $ok = false; } break; case 'float': case 'double': if (!is_float($arg)) { $ok = false; } break; case 'date': case 'dateTime.iso8601': if ($arg instanceof IXR_Date) { $ok = false; } break; } if (!$ok) { return new IXR_Error(-32602, 'server error. invalid method parameters'); } } // It passed the test - run the "real" method call return parent::call($methodname, $argsbackup); } function methodSignature($method) { if (!$this->hasMethod($method)) { return new IXR_Error(-32601, 'server error. requested method "'.$method.'" not specified.'); } // We should be returning an array of types $types = $this->signatures[$method]; $return = array(); foreach ($types as $type) { switch ($type) { case 'string': $return[] = 'string'; break; case 'int': case 'i4': $return[] = 42; break; case 'double': $return[] = 3.1415; break; case 'dateTime.iso8601': $return[] = new IXR_Date(time()); break; case 'boolean': $return[] = true; break; case 'base64': $return[] = new IXR_Base64('base64'); break; case 'array': $return[] = array('array'); break; case 'struct': $return[] = array('struct' => 'struct'); break; } } return $return; } function methodHelp($method) { return $this->help[$method]; } } class IXR_ClientMulticall extends IXR_Client { public $calls = array(); function IXR_ClientMulticall($server, $path = false, $port = 80) { parent::IXR_Client($server, $path, $port); $this->useragent = 'The Incutio XML-RPC PHP Library (multicall client)'; } function addCall() { $args = func_get_args(); $methodName = array_shift($args); $struct = array( 'methodName' => $methodName, 'params' => $args ); $this->calls[] = $struct; } function query() { // Prepare multicall, then call the parent::query() method return parent::query('system.multicall', $this->calls); } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/filemanager/000077500000000000000000000000001230033266200224725ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/filemanager/class.filemanager.php000066400000000000000000000324231230033266200265650ustar00rootroot00000000000000array(),'files'=>array()); /** * Constructor * * New filemanage istance. Note that filemanage is a jail in given root * path. You won't be able to access files outside {@link $root} path with * the object's methods. * * @param string $root Root path * @param string $root_url Root URL */ public function __construct($root,$root_url='') { $this->root = $this->pwd = path::real($root); $this->root_url = $root_url; if (!preg_match('#/$#',$this->root_url)) { $this->root_url = $this->root_url.'/'; } if (!$this->root) { throw new Exception('Invalid root directory.'); } } /** * Change directory * * Changes working directory. $dir is relative to instance {@link $root} * directory. * * @param string $dir Directory */ public function chdir($dir) { $realdir = path::real($this->root.'/'.path::clean($dir)); if (!$realdir || !is_dir($realdir)) { throw new Exception('Invalid directory.'); } if ($this->isExclude($realdir)) { throw new Exception('Directory is excluded.'); } $this->pwd = $realdir; } /** * Get working directory * * Returns working directory path. * * @return string */ public function getPwd() { return $this->pwd; } /** * Current directory is writable * * @return boolean true if working directory is writable */ public function writable() { if (!$this->pwd) { return false; } return is_writable($this->pwd); } /** * Add exclusion * * Appends an exclusion to exclusions list. $f should be a regexp. * * @see $exclude_list * @param string $f Exclusion regexp */ public function addExclusion($f) { if (is_array($f)) { foreach ($f as $v) { if (($V = path::real($v)) !== false) { $this->exclude_list[] = $V; } } } elseif (($F = path::real($f)) !== false) { $this->exclude_list[] = $F; } } /** * Path is excluded * * Returns true if path (file or directory) $f is excluded. $f path is * relative to {@link $root} path. * * @see $exclude_list * @param string $f Path to match * @return boolean */ protected function isExclude($f) { foreach ($this->exclude_list as $v) { if (strpos($f,$v) === 0) { return true; } } return false; } /** * File is excluded * * Returns true if file $f is excluded. $f path is relative to {@link $root} * path. * * @see $exclude_pattern * @param string $f File to match * @return boolean */ protected function isFileExclude($f) { if (!$this->exclude_pattern) { return false; } return preg_match($this->exclude_pattern,$f); } /** * Item in jail * * Returns true if file or directory $f is in jail (ie. not outside the * {@link $root} directory). * * @param string $f Path to match * @return boolean */ protected function inJail($f) { $f = path::real($f); if ($f !== false) { return preg_match('|^'.preg_quote($this->root,'|').'|',$f); } return false; } /** * File in files * * Returns true if file $f is in files array of {@link $dir}. * * @param string $f File to match * @return boolean */ public function inFiles($f) { foreach ($this->dir['files'] as $v) { if ($v->relname == $f) { return true; } } return false; } /** * Directory list * * Creates list of items in working directory and append it to {@link $dir} * * @uses sortHandler() * @uses fileItem */ public function getDir() { $dir = path::clean($this->pwd); $dh = @opendir($dir); if ($dh === false) { throw new Exception('Unable to read directory.'); } $d_res = $f_res = array(); while (($file = readdir($dh)) !== false) { $fname = $dir.'/'.$file; if ($this->inJail($fname) && !$this->isExclude($fname)) { if (is_dir($fname) && $file != '.') { $tmp = new fileItem($fname,$this->root,$this->root_url); if ($file == '..') { $tmp->parent = true; } $d_res[] = $tmp; } if (is_file($fname) && strpos($file,'.') !== 0 && !$this->isFileExclude($file)) { $f_res[] = new fileItem($fname,$this->root,$this->root_url); } } } closedir($dh); $this->dir = array('dirs'=>$d_res,'files'=>$f_res); usort($this->dir['dirs'],array($this,'sortHandler')); usort($this->dir['files'],array($this,'sortHandler')); } /** * Root directories * * Returns an array of directory under {@link $root} directory. * * @uses fileItem * @return array */ public function getRootDirs() { $d = files::getDirList($this->root); $dir = array(); foreach ($d['dirs'] as $v) { $dir[] = new fileItem($v,$this->root,$this->root_url); } return $dir; } /** * Upload file * * Move $tmp file to its final destination $dest and * returns the destination file path. * $dest should be in jail. This method will throw exception * if the file cannot be written. * * You should first verify upload status, with {@link files::uploadStatus()} * or PHP native functions. * * @see files::uploadStatus() * @param string $tmp Temporary uploaded file path * @param string $dest Destination file * @param string $overwrite overwrite mode * @return string Destination real path */ public function uploadFile($tmp,$dest,$overwrite=false) { $dest = $this->pwd.'/'.path::clean($dest); if ($this->isFileExclude($dest)) { throw new Exception(__('Uploading this file is not allowed.')); } if (!$this->inJail(dirname($dest))) { throw new Exception(__('Destination directory is not in jail.')); } if (!$overwrite && file_exists($dest)) { throw new Exception(__('File already exists.')); } if (!is_writable(dirname($dest))) { throw new Exception(__('Cannot write in this directory.')); } if (@move_uploaded_file($tmp,$dest) === false) { throw new Exception(__('An error occurred while writing the file.')); } files::inheritChmod($dest); return path::real($dest); } /** * Upload file by bits * * Creates a new file $dest with contents of $bits and * return the destination file path. * $dest should be in jail. This method will throw exception * if file cannot be written. * * @param string $bits Destination file content * @param string $dest Destination file * @return string Destination real path */ public function uploadBits($name,$bits) { $dest = $this->pwd.'/'.path::clean($name); if ($this->isFileExclude($dest)) { throw new Exception(__('Uploading this file is not allowed.')); } if (!$this->inJail(dirname($dest))) { throw new Exception(__('Destination directory is not in jail.')); } if (!is_writable(dirname($dest))) { throw new Exception(__('Cannot write in this directory.')); } $fp = @fopen($dest,'wb'); if ($fp === false) { throw new Exception(__('An error occurred while writing the file.')); } fwrite($fp,$bits); fclose($fp); files::inheritChmod($dest); return path::real($dest); } /** * New directory * * Creates a new directory $d relative to working directory. * * @param string $d Directory name */ public function makeDir($d) { files::makeDir($this->pwd.'/'.path::clean($d)); } /** * Move file * * Moves a file $s to a new destination $d. Both * $s and $d are relative to {@link $root}. * * @param string $s Source file * @param string $d Destination file */ public function moveFile($s,$d) { $s = $this->root.'/'.path::clean($s); $d = $this->root.'/'.path::clean($d); if (($s = path::real($s)) === false) { throw new Exception(__('Source file does not exist.')); } $dest_dir = path::real(dirname($d)); if (!$this->inJail($s)) { throw new Exception(__('File is not in jail.')); } if (!$this->inJail($dest_dir)) { throw new Exception(__('File is not in jail.')); } if (!is_writable($dest_dir)) { throw new Exception(__('Destination directory is not writable.')); } if (@rename($s,$d) === false) { throw new Exception(__('Unable to rename file.')); } } /** * Remove item * * Removes a file or directory $f which is relative to working * directory. * * @param string $f Path to remove */ public function removeItem($f) { $file = path::real($this->pwd.'/'.path::clean($f)); if (is_file($file)) { $this->removeFile($f); } elseif (is_dir($file)) { $this->removeDir($f); } } /** * Remove item * * Removes a file $f which is relative to working directory. * * @param string $f File to remove */ public function removeFile($f) { $f = path::real($this->pwd.'/'.path::clean($f)); if (!$this->inJail($f)) { throw new Exception(__('File is not in jail.')); } if (!files::isDeletable($f)) { throw new Exception(__('File cannot be removed.')); } if (@unlink($f) === false) { throw new Exception(__('File cannot be removed.')); } } /** * Remove item * * Removes a directory $d which is relative to working directory. * * @param string $d Directory to remove */ public function removeDir($d) { $d = path::real($this->pwd.'/'.path::clean($d)); if (!$this->inJail($d)) { throw new Exception(__('Directory is not in jail.')); } if (!files::isDeletable($d)) { throw new Exception(__('Directory cannot be removed.')); } if (@rmdir($d) === false) { throw new Exception(__('Directory cannot be removed.')); } } /** * SortHandler * * This method is called by {@link getDir()} to sort files. Can be overrided * in inherited classes. * * @param fileItem $a fileItem object * @param fileItem $b fileItem object * @return integer */ protected function sortHandler($a,$b) { if ($a->parent && !$b->parent || !$a->parent && $b->parent) { return ($a->parent) ? -1 : 1; } return strcasecmp($a->basename,$b->basename); } } /** * File item * * File item class used by {@link filemanager}. In this class {@link $file} could * be either a file or a directory. * * @package Clearbricks * @subpackage Filemanager */ class fileItem { /** @var string Complete path to file */ public $file; /** @var string File basename */ public $basename; /** @var string File directory name */ public $dir; /** @var string File URL */ public $file_url; /** @var string File directory URL */ public $dir_url; /** @var string File extension */ public $extension; /** @var string File path relative to $root given in constructor */ public $relname; /** @var boolean Parent directory (ie. "..") */ public $parent = false; /** @var string File MimeType. See {@link files::getMimeType()}. */ public $type; /** @var integer File modification timestamp */ public $mtime; /** @var integer File size */ public $size; /** @var integer File permissions mode */ public $mode; /** @var integer File owner ID */ public $uid; /** @var integer File group ID */ public $gid; /** @var boolean True if file or directory is writable */ public $w; /** @var boolean True if file is a directory */ public $d; /** @var boolean True if file file is executable or directory is traversable */ public $x; /** @var boolean True if file is a file */ public $f; /** @var boolean True if file or directory is deletable */ public $del; /** * Constructor * * Creates an instance of fileItem object. * * @param string $file Absolute file or directory path * @param string $root File root path * @param string $root_url File root URL */ public function __construct($file,$root,$root_url='') { $file = path::real($file); $stat = stat($file); $path = path::info($file); $rel = preg_replace('/^'.preg_quote($root,'/').'\/?/','',$file); $this->file = $file; $this->basename = $path['basename']; $this->dir = $path['dirname']; $this->relname = $rel; $this->file_url = str_replace('%2F','/',rawurlencode($rel)); $this->file_url = $root_url.$this->file_url; $this->dir_url = dirname($this->file_url); $this->extension = $path['extension']; $this->mtime = $stat[9]; $this->size = $stat[7]; $this->mode = $stat[2]; $this->uid = $stat[4]; $this->gid = $stat[5]; $this->w = is_writable($file); $this->d = is_dir($file); $this->f = is_file($file); if ($this->d) { $this->x = file_exists($file.'/.'); } else { $this->x = false; } $this->del = files::isDeletable($file); $this->type = $this->d ? null : files::getMimeType($file); $this->type_prefix = preg_replace('/^(.+?)\/.+$/','$1',$this->type); } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/html.filter/000077500000000000000000000000001230033266200224505ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/html.filter/class.html.filter.php000066400000000000000000000622411230033266200265220ustar00rootroot00000000000000parser = xml_parser_create('UTF-8'); xml_set_object($this->parser,$this); xml_set_element_handler($this->parser, 'tag_open', 'tag_close'); xml_set_character_data_handler($this->parser, 'cdata'); xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false); $this->removeTags( 'applet','base','basefont','body','center','dir','font', 'frame','frameset','head','html','isindex', 'link','menu','meta','noframes','script','style' ); $this->removeAttributes( 'onclick','ondblclick','onfocus','onkeydown','onkeypress', 'onkeyup','onload','onmousedown','onmousemove','onmouseout', 'onmouseover','onmouseup','onreset','onselect','onsubmit', 'onunload' ); } /** * Append tags * * Appends tags to remove. Each method argument is a tag. Example: * * * removeTags('frame','script'); * ?> * */ public function removeTags() { foreach ($this->argsArray(func_get_args()) as $tag) { $this->removed_tags[] = $tag; } } /** * Append attributes * * Appends attributes to remove. Each method argument is an attribute. Example: * * * removeAttributes('onclick','onunload'); * ?> * */ public function removeAttributes() { foreach ($this->argsArray(func_get_args()) as $a) { $this->removed_attrs[] = $a; } } /** * Append attributes for tags * * Appends attributes to remove from specific tags. Each method argument is * an array of tags with attributes. Example: * * * removeTagAttributes(array('a' => array('src','title'))); * ?> * */ public function removeTagAttributes($tag) { $args = $this->argsArray(func_get_args()); array_shift($args); foreach ($args as $a) { $this->removed_tag_attrs[$tag][] = $a; } } /** * Known tags * * Creates a list of known tags. * * @param array $t Tags array */ public function setTags($t) { if (is_array($t)) { $this->tags = $t; } } /** * Apply filter * * This method applies filter on given $str string. It will first * try to use tidy extension if exists and then apply the filter. * * @param string $str String to filter * @return string Filtered string */ public function apply($str) { if (extension_loaded('tidy') && class_exists('tidy')) { $config = array( 'doctype' => 'strict', 'drop-proprietary-attributes' => true, 'drop-font-tags' => true, 'escape-cdata' => true, 'indent' => false, 'join-classes' => false, 'join-styles' => true, 'lower-literals' => true, 'output-xhtml' => true, 'show-body-only' => true, 'wrap' => 80 ); $str = '

    tt

    '.$str; // Fixes a big issue $tidy = new tidy; $tidy->parseString($str, $config, 'utf8'); $tidy->cleanRepair(); $str = (string) $tidy; $str = preg_replace('#^

    tt

    \s?#','',$str); } else { $str = $this->miniTidy($str); } # Removing open comments, open CDATA and processing instructions $str = preg_replace('%%msu','',$str); $str = str_replace(' $fc = preg_replace('/(^\s*)?/ms','',$fc); # Compile blocks foreach ($this->blocks as $b => $f) { $pattern = sprintf($this->tag_block,preg_quote($b,'#')); $fc = preg_replace_callback('#'.$pattern.'#ms', array($this,'compileBlock'),$fc); } # Compile values foreach ($this->values as $v => $f) { $pattern = sprintf($this->tag_value,preg_quote($v,'#')); $fc = preg_replace_callback('#'.$pattern.'#ms', array($this,'compileValue'),$fc); } return $fc; } protected function compileBlock($match) { $b = $match[1]; $content = $match[3]; $attr = $this->getAttrs($match[2]); # Call block function return call_user_func($this->blocks[$b],$attr,$content); } protected function compileValue($match) { $v = $match[1]; $attr = isset($match[2]) ? $this->getAttrs($match[2]) : array(); $str_attr = isset($match[2]) ? $match[2] : null; return call_user_func($this->values[$v],$attr,ltrim($str_attr)); } protected function getAttrs($str) { $res = array(); if (preg_match_all('|([a-zA-Z0-9_:-]+)="([^"]*)"|ms',$str,$m) > 0) { foreach ($m[1] as $i => $v) { $res[$v] = $m[2][$i]; } } return $res; } } ?> dotclear-2.6.2+dfsg/inc/libs/clearbricks/tests/000077500000000000000000000000001230033266200213625ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/tests/unit/000077500000000000000000000000001230033266200223415ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/tests/unit/bootstrap.php000066400000000000000000000016661230033266200251000ustar00rootroot00000000000000text(50); $this ->string(__($text)) ->isEqualTo($text); } public function testSimpleSingular() { \l10n::init(); \l10n::set(__DIR__.'/../fixtures/l10n/fr/core'); $this ->string(__('Dotclear has been upgraded.')) ->isEqualTo('Dotclear a été mis à jour.'); } public function testZeroForCountEn() { \l10n::init(); $this ->string(__('singular', 'plural', 0)) ->isEqualTo('plural'); } public function testZeroForCountFr() { \l10n::init(); \l10n::set(__DIR__.'/../fixtures/l10n/fr/main'); $this ->string(__('The category has been successfully removed.', 'The categories have been successfully removed.', 0)) ->isEqualTo('Catégories supprimées avec succès.'); } public function testZeroForCountFrUsingLang() { \l10n::init(); \l10n::set(__DIR__.'/../fixtures/l10n/fr/main'); \l10n::lang('fr'); $this ->string(__('The category has been successfully removed.', 'The categories have been successfully removed.', 0)) ->isEqualTo('Catégorie supprimée avec succès.'); } public function testCodeLang() { \l10n::init(); $this ->boolean(\l10n::isCode('xx')) ->isEqualTo(false); $this ->boolean(\l10n::isCode('fr')) ->isEqualTo(true); } public function testChangeNonExistingLangShouldUseDefaultOne() { \l10n::init('en'); $this ->string(\l10n::lang('xx')) ->isEqualTo('en'); } public function testgetLanguageName() { \l10n::init(); $this ->string(\l10n::getLanguageName('fr')) ->isEqualTo('Français'); } public function testgetCode() { \l10n::init(); $this ->string(\l10n::getCode('Français')) ->isEqualTo('fr'); $this ->string(\l10n::getCode(\l10n::getLanguageName('es'))) ->isEqualTo('es'); } public function testPhpFormatSingular() { $faker = Faker\Factory::create(); $text = $faker->text(20); \l10n::init(); \l10n::set(__DIR__.'/../fixtures/l10n/fr/php-format'); $this ->string(sprintf(__('The e-mail was sent successfully to %s.'), $text)) ->isEqualTo(sprintf('Message envoyé avec succès à %s.', $text)); } public function testPluralWithoutTranslation() { \l10n::init(); \l10n::set(__DIR__.'/../fixtures/l10n/dummy'); $this ->string(__('The category has been successfully removed.', 'The categories have been successfully removed.', 1)) ->isEqualTo('The category has been successfully removed.'); $this ->string(__('The category has been successfully removed.', 'The categories have been successfully removed.', 2)) ->isEqualTo('The categories have been successfully removed.'); } public function testPluralForLanguageWithoutPluralForms() { \l10n::init(); $this ->integer(\l10n::getLanguagePluralsNumber('aa')) ->isEqualTo(\l10n::getLanguagePluralsNumber('en')); $this ->string(\l10n::getLanguagePluralExpression('aa')) ->isEqualTo(\l10n::getLanguagePluralExpression('en')); } public function testSimplePlural() { \l10n::init(); \l10n::set(__DIR__.'/../fixtures/l10n/fr/main'); /* msgid "The category has been successfully removed." msgid_plural "The categories have been successfully removed." msgstr[0] "Catégorie supprimée avec succès." msgstr[1] "Catégories supprimées avec succès." */ $this ->string(__('The category has been successfully removed.', 'The categories have been successfully removed.', 1)) ->isEqualTo('Catégorie supprimée avec succès.'); $this ->string(__('The category has been successfully removed.', 'The categories have been successfully removed.', 2)) ->isEqualTo('Catégories supprimées avec succès.'); } public function testNotExistingPhpAndPoFiles() { \l10n::init(); \l10n::set(__DIR__.'/../fixtures/l10n/dummy'); $this ->string(__('Dotclear has been upgraded.')) ->isEqualTo('Dotclear has been upgraded.'); } public function testGetFilePath() { \l10n::init(); $this ->string(\l10n::getFilePath(__DIR__.$this->l10n_dir, 'main.po', 'fr')) ->isEqualTo(__DIR__.$this->l10n_dir.'/fr/main.po'); $this ->boolean(\l10n::getFilePath(__DIR__.$this->l10n_dir, 'dummy.po', 'fr')) ->isEqualTo(false); } public function testMultiLineIdString() { \l10n::init(); $en_str = 'Not a real long sentence'; $content = 'msgid ""'."\n".'"'; $content .= implode('"'."\n".'" ', explode(' ', $en_str)); $content .= '"'."\n"; $content .= 'msgstr "Pas vraiment une très longue phrase"'."\n"; $tmp_file = $this->tempPoFile($content); \l10n::set(str_replace('.po', '', $tmp_file)); $this ->string(__($en_str)) ->isEqualTo("Pas vraiment une très longue phrase"); if (file_exists($tmp_file)) { unlink($tmp_file); } } public function testMultiLineValueString() { \l10n::init(); $en_str = 'Not a real long sentence'; $fr_str = "Pas vraiment une très longue phrase"; $content = 'msgid "'.$en_str.'"'."\n"; $content .= 'msgstr ""'."\n".'"'; $content .= implode('"'."\n".'" ', explode(' ', $fr_str)); $content .= '"'."\n"; $tmp_file = $this->tempPoFile($content); \l10n::set(str_replace('.po', '', $tmp_file)); $this ->string(__($en_str)) ->isEqualTo($fr_str); if (file_exists($tmp_file)) { unlink($tmp_file); } } public function testSimpleStringInPhpFile() { \l10n::init(); $file = __DIR__.'/../fixtures/l10n/fr/simple'; if (file_exists("$file.lang.php")) { unlink("$file.lang.php"); } \l10n::generatePhpFileFromPo($file); \l10n::set($file); $this ->array($GLOBALS['__l10n']) ->isIdenticalTo(array('Dotclear has been upgraded.' => 'Dotclear a été mis à jour.')); } public function testPluralStringsInPhpFile() { \l10n::init(); $file = __DIR__.'/../fixtures/l10n/fr/plurals'; if (file_exists("$file.lang.php")) { unlink("$file.lang.php"); } \l10n::generatePhpFileFromPo($file); \l10n::set($file); $this ->array($GLOBALS['__l10n']) ->isIdenticalTo(array('The category has been successfully removed.' => array('Catégorie supprimée avec succès.', 'Catégories supprimées avec succès.'))); } /* **/ protected function tempPoFile($content) { $filename = sys_get_temp_dir() . '/temp.po'; file_put_contents($filename, $content); return $filename; } } dotclear-2.6.2+dfsg/inc/libs/clearbricks/tests/unit/fixtures/000077500000000000000000000000001230033266200242125ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/tests/unit/fixtures/l10n/000077500000000000000000000000001230033266200247645ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/tests/unit/fixtures/l10n/es/000077500000000000000000000000001230033266200253735ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/tests/unit/fixtures/l10n/es/core.lang.php000066400000000000000000000015071230033266200277570ustar00rootroot00000000000000, 2006. # Enrique Matias Sanchez (aka Quique) , 2009. msgid "" msgstr "" "Project-Id-Version: main\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-11-06 18:11+0100\n" "PO-Revision-Date: 2009-10-02 16:02+0200\n" "Last-Translator: Quique \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Spanish\n" "X-Generator: Lokalize 1.0\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Dotclear has been upgraded." msgstr "Dotclear ha sido actualizado." msgid "The category has been successfully created." msgstr "La categoría ha sido creada con éxito." msgid "The category has been successfully removed." msgid_plural "The categories have been successfully removed." msgstr[0] "La categoría se ha eliminado con éxito." msgstr[1] "Las categorías se han eliminado con éxito." dotclear-2.6.2+dfsg/inc/libs/clearbricks/tests/unit/fixtures/l10n/es/main.lang.php000066400000000000000000002252661230033266200277650ustar00rootroot00000000000000Information about this version
    .'] = ''; $GLOBALS['__l10n']['Some plugins are installed twice:'] = 'Se han instalado los siguientes complementos:'; $GLOBALS['__l10n']['Quick entry'] = 'Entrada rápida'; $GLOBALS['__l10n']['Content:'] = 'Contenido:'; $GLOBALS['__l10n']['Category:'] = 'Categoría:'; $GLOBALS['__l10n']['Save and publish'] = 'guardar y publicar'; $GLOBALS['__l10n']['PHP version is %s (5.0 or earlier needed).'] = 'La versión de PHP es %s (se necesita 5.0 o posterior).'; $GLOBALS['__l10n']['Multibyte string module (mbstring) is not available.'] = 'El soporte de multibyte (mbstring) no está disponible.'; $GLOBALS['__l10n']['Iconv module is not available.'] = 'El módulo iconv no está disponible.'; $GLOBALS['__l10n']['Output control functions are not available.'] = 'Las funciones de control de salida no están disponibles.'; $GLOBALS['__l10n']['SimpleXML module is not available.'] = 'El módulo SimpleXML no está disponible.'; $GLOBALS['__l10n']['DOM XML module is not available.'] = 'El módulo DOM XML no está disponible.'; $GLOBALS['__l10n']['PCRE engine does not support UTF-8 strings.'] = 'El motor de expresiones racionales PCRE no gestiona las cadenas UTF-8.'; $GLOBALS['__l10n']['SPL module is not available.'] = 'El módulo SPL no está disponible.'; $GLOBALS['__l10n']['MySQL version is %s (4.1 or earlier needed).'] = 'La versión de MySQL es %s (4.1 o más reciente necesaria).'; $GLOBALS['__l10n']['MySQL InnoDB engine is not available.'] = 'El sistema de almacenamiento InnoDB de MySQL no está disponible.'; $GLOBALS['__l10n']['PostgreSQL version is %s (8.0 or earlier needed).'] = 'La versión de PostgreSQL es %s (8.0 o más reciente necesaria).'; $GLOBALS['__l10n']['Please set a master key (DC_MASTER_KEY) in configuration file.'] = 'Indique una clave de referencia (DC_MASTER_KEY) en el fichero de configuración.'; $GLOBALS['__l10n']['Dotclear is already installed.'] = 'Dotclear ya está instalado.'; $GLOBALS['__l10n']['Dotclear cannot be installed.'] = 'Dotclear no se puede instalar.'; $GLOBALS['__l10n']['No user ID given'] = 'La ID de usuario no ha sido especificada'; $GLOBALS['__l10n']['User ID must contain at least 2 characters using letters, numbers or symbols.'] = 'La ID del usuario debe contener al menos 2 caracteres compuestos por letras, cifras o símbolos.'; $GLOBALS['__l10n']['Invalid email address'] = 'Dirección de correo electrónico no válida'; $GLOBALS['__l10n']['No password given'] = 'La contraseña no ha sido especificada'; $GLOBALS['__l10n']['Password must contain at least 6 characters.'] = 'La contraseña debe tener al menos 6 caracteres.'; $GLOBALS['__l10n']['My first blog'] = 'Mi primer blog'; $GLOBALS['__l10n']['%A, %B %e %Y'] = ''; $GLOBALS['__l10n']['Welcome to Dotclear!'] = 'Bienvenido a Dotclear'; $GLOBALS['__l10n']['This is your first entry. When you\'re ready to blog, log in to edit or delete it.'] = 'Ésta es su primera entrada. Cuando esté preparado para bloguear, inicie una sesión para editarla o borrarla.'; $GLOBALS['__l10n']['Dotclear Team'] = 'El equipo de Dotclear'; $GLOBALS['__l10n']['

    This is a comment.

    To delete it, log in and view your blog\'s comments. Then you might remove or edit it.

    '] = '

    Esto es un comentario.

    Para borrarlo, inicie sesión y vea los comentarios de su blog. Entonces podrá eliminarlo o borrarlo.

    '; $GLOBALS['__l10n']['Dotclear Install'] = 'Instalación de Dotclear'; $GLOBALS['__l10n']['show'] = 'mostrar'; $GLOBALS['__l10n']['Dotclear installation'] = 'Instalación de Dotclear'; $GLOBALS['__l10n']['Cache directory %s is not writable.'] = 'No se puede escribir en el directorio de cache %s.'; $GLOBALS['__l10n']['Errors:'] = 'Errores:'; $GLOBALS['__l10n']['Configuration file has been successfully created.'] = 'El fichero de configuración ha sido creado con éxito.'; $GLOBALS['__l10n']['User information'] = 'Información del usuario'; $GLOBALS['__l10n']['Please provide the following information needed to create the first user.'] = 'Por favor, introduzca la siguiente información para crear el primer usuario.'; $GLOBALS['__l10n']['First Name:'] = 'Nombre:'; $GLOBALS['__l10n']['Last Name:'] = 'Apellidos:'; $GLOBALS['__l10n']['Username and password'] = 'Usuario y contraseña'; $GLOBALS['__l10n']['All done!'] = 'Fin'; $GLOBALS['__l10n']['Dotclear has been successfully installed. Here is some useful information you should keep.'] = 'Dotclear se ha instalado con éxito. Aquí tiene algunos datos útiles que debería conservar.'; $GLOBALS['__l10n']['Your account'] = 'Su cuenta'; $GLOBALS['__l10n']['Your blog'] = 'Su blog'; $GLOBALS['__l10n']['Blog address:'] = 'Dirección del blog:'; $GLOBALS['__l10n']['Administration interface:'] = 'Interfaz de administración:'; $GLOBALS['__l10n']['Manage your blog now'] = 'Gestione su blog ahora'; $GLOBALS['__l10n']['Installation can not be completed'] = ''; $GLOBALS['__l10n']['For the said reasons, Dotclear can not be installed. Please refer to the documentation to learn how to correct the problem.'] = ''; $GLOBALS['__l10n']['File %s does not exist.'] = 'El fichero %s no existe.'; $GLOBALS['__l10n']['Cannot write %s file.'] = 'No se puede escribir el fichero %s.'; $GLOBALS['__l10n']['Dotclear installation wizard'] = 'Asistente de instalación de Dotclear'; $GLOBALS['__l10n']['Welcome'] = ''; $GLOBALS['__l10n']['To complete your Dotclear installation and start writing on your blog, we just need to know how to access your database and who you are. Just fill this two steps wizard with this information and we will be done.'] = ''; $GLOBALS['__l10n']['Attention:'] = 'Acción'; $GLOBALS['__l10n']['this wizard may not function on every host. If it does not work for you, please refer to the documentation to learn how to create the config.php file manually.'] = ''; $GLOBALS['__l10n']['System information'] = 'Información del sistema'; $GLOBALS['__l10n']['Please provide the following information needed to create your configuration file.'] = 'Por favor, indique la información siguiente para crear su fichero de configuración.'; $GLOBALS['__l10n']['Database type:'] = 'Tipo de base de datos:'; $GLOBALS['__l10n']['Database Host Name:'] = 'Nombre del servidor de la base de datos:'; $GLOBALS['__l10n']['Database Name:'] = 'Nombre de la base de datos:'; $GLOBALS['__l10n']['Database User Name:'] = 'Usuario de la base de datos:'; $GLOBALS['__l10n']['Database Password:'] = 'Contraseña de la base de datos:'; $GLOBALS['__l10n']['Database Tables Prefix:'] = 'Prefijo de las tablas de la base de datos:'; $GLOBALS['__l10n']['Continue'] = 'Contenido:'; $GLOBALS['__l10n']['No such installed language'] = 'No está instalado ese idioma'; $GLOBALS['__l10n']['You can\'t remove English language.'] = 'No puede eliminar el idioma inglés.'; $GLOBALS['__l10n']['Permissions to delete language denied.'] = 'Permiso para borrar el idioma denegado.'; $GLOBALS['__l10n']['Invalid language file URL.'] = 'URL del fichero de idioma no válido.'; $GLOBALS['__l10n']['Languages management'] = 'Gestión de los idiomas'; $GLOBALS['__l10n']['Language has been successfully deleted.'] = 'El idioma se ha borrado con éxito.'; $GLOBALS['__l10n']['Language has been successfully installed.'] = 'El idioma se ha instalado con éxito.'; $GLOBALS['__l10n']['Language has been successfully upgraded'] = 'El idioma se ha actualizado con éxito'; $GLOBALS['__l10n']['Here you can install, upgrade or remove languages for your Dotclear installation.'] = 'Aquí puede instalar, actualizar o eliminar idiomas de su instalación de Dotclear.'; $GLOBALS['__l10n']['You can change your user language in your preferences or change your blog\'s main language in your blog settings.'] = 'Puede cambiar su idioma de usuario en sus preferencias o cambiar el idioma principal de su blog en los ajustes de su blog.'; $GLOBALS['__l10n']['Installed languages'] = 'Idiomas instalados'; $GLOBALS['__l10n']['No additional language is installed.'] = 'No hay instalado ningún idioma más.'; $GLOBALS['__l10n']['Language'] = 'Idioma'; $GLOBALS['__l10n']['Action'] = 'Acción'; $GLOBALS['__l10n']['Install or upgrade languages'] = 'Instalar o actualizar los idiomas'; $GLOBALS['__l10n']['You can install or remove a language by adding or removing the relevant directory in your %s folder.'] = 'Puede instalar o eliminar un idioma añadiendo o eliminando el directorio correspondiente en su carpeta %s.'; $GLOBALS['__l10n']['Available languages'] = 'Idiomas disponibles'; $GLOBALS['__l10n']['You can download and install a additional language directly from Dotclear.net. Proposed languages are based on your version: %s.'] = 'Puede descargar e instalar más idiomas directamente desde Dotclear.net. Los idiomas propuestos se basan en su versión: %s.'; $GLOBALS['__l10n']['Language:'] = 'Idioma:'; $GLOBALS['__l10n']['Install language'] = 'Instalar el idioma'; $GLOBALS['__l10n']['You can install languages by uploading zip files.'] = 'Puede instalar idiomas enviando ficheros zip.'; $GLOBALS['__l10n']['Language zip file:'] = 'Fichero zip del idioma:'; $GLOBALS['__l10n']['Upload language'] = 'Enviar un idioma'; $GLOBALS['__l10n']['Invalid language zip file.'] = 'Fichero zip de idioma no válido.'; $GLOBALS['__l10n']['The zip file does not appear to be a valid Dotclear language pack.'] = 'El fichero zip no parece ser un paquete de idioma válido para Dotclear.'; $GLOBALS['__l10n']['An error occurred during language upgrade.'] = 'Se produjo un error durante la actualización del idioma.'; $GLOBALS['__l10n']['Error:'] = 'Error:'; $GLOBALS['__l10n']['By names, in ascending order'] = 'Por nombres, ascendente'; $GLOBALS['__l10n']['By names, in descending order'] = 'Por nombres, descendente'; $GLOBALS['__l10n']['By dates, in ascending order'] = 'Por fechas, ascendente'; $GLOBALS['__l10n']['By dates, in descending order'] = 'Por fechas, descendente'; $GLOBALS['__l10n']['Media manager'] = 'Gestor de medios'; $GLOBALS['__l10n']['confirm removal'] = 'confirmar la eliminación'; $GLOBALS['__l10n']['Are you sure you want to remove %s?'] = '¿Seguro que desea eliminar %s ?'; $GLOBALS['__l10n']['Cancel'] = 'cancelar'; $GLOBALS['__l10n']['Yes'] = 'sí'; $GLOBALS['__l10n']['Directory has been successfully created.'] = 'Directorio creado satisfactoriamente.'; $GLOBALS['__l10n']['Files have been successfully uploaded.'] = 'Los ficheros se han enviado con éxito.'; $GLOBALS['__l10n']['File has been successfully removed.'] = 'El fichero ha sido eliminado con éxito.'; $GLOBALS['__l10n']['Directory has been successfully removed.'] = 'El directorio ha sido eliminado con éxito.'; $GLOBALS['__l10n']['Directory has been successfully rebuilt.'] = 'El directorio ha sido reconstruido con éxito.'; $GLOBALS['__l10n']['Zip file has been successfully extracted.'] = 'El fichero zip se ha extraído con éxito.'; $GLOBALS['__l10n']['Choose a file to attach to entry %s by clicking on %s.'] = 'Elija un fichero para adjuntar a la entrada %s pulsando en %s.'; $GLOBALS['__l10n']['Attach this file to entry'] = 'Adjuntar este fichero a la entrada'; $GLOBALS['__l10n']['Choose a file to insert into entry by clicking on %s.'] = 'Elija un fichero para insertarlo en la entrada pulsando en %s.'; $GLOBALS['__l10n']['No file.'] = 'Ningún fichero.'; $GLOBALS['__l10n']['Sort files:'] = 'Ordenar los ficheros:'; $GLOBALS['__l10n']['Sort'] = 'Ordenar:'; $GLOBALS['__l10n']['Add files'] = 'Añadir ficheros'; $GLOBALS['__l10n']['Please take care to publish media that you own and that are not protected by copyright.'] = 'Por favor, tenga el cuidado de publicar sólo medios que le pertenezcan o que no estén protegidos contra copia.'; $GLOBALS['__l10n']['Choose a file:'] = 'Elija un fichero:'; $GLOBALS['__l10n']['Maximum size %s'] = 'Tamaño máximo %s'; $GLOBALS['__l10n']['Private'] = 'Privado'; $GLOBALS['__l10n']['To send several files at the same time, you can activate the enhanced uploader in'] = ''; $GLOBALS['__l10n']['Send'] = ''; $GLOBALS['__l10n']['New directory'] = 'Nuevo directorio'; $GLOBALS['__l10n']['Directory Name:'] = 'Nombre del directorio:'; $GLOBALS['__l10n']['Download this directory as a zip file'] = 'Descargar este directorio como un fichero zip'; $GLOBALS['__l10n']['open'] = 'abrir'; $GLOBALS['__l10n']['Insert this file into entry'] = 'Insertar este fichero en la entrada'; $GLOBALS['__l10n']['delete'] = 'Borrar'; $GLOBALS['__l10n']['Not a valid file'] = 'Fichero no válido'; $GLOBALS['__l10n']['File has been successfully updated.'] = 'El fichero se ha actualizado con éxito.'; $GLOBALS['__l10n']['Thumbnails have been successfully updated.'] = 'Las miniaturas se han actualizado con éxito.'; $GLOBALS['__l10n']['Insert media item'] = 'Insertar un elemento multimedia'; $GLOBALS['__l10n']['Image size:'] = 'Tamaño de la imagen:'; $GLOBALS['__l10n']['original'] = 'original'; $GLOBALS['__l10n']['Image alignment'] = 'Alineación de la imagen'; $GLOBALS['__l10n']['None'] = 'Ninguna'; $GLOBALS['__l10n']['Left'] = 'Izquierda'; $GLOBALS['__l10n']['Right'] = 'Derecha'; $GLOBALS['__l10n']['Center'] = 'Centro'; $GLOBALS['__l10n']['Image insertion'] = 'Inserción de imagen'; $GLOBALS['__l10n']['As a single image'] = 'Como una única imagen'; $GLOBALS['__l10n']['As a link to original image'] = 'Como enlace a la imagen original'; $GLOBALS['__l10n']['MP3 disposition'] = 'Disposición del MP3'; $GLOBALS['__l10n']['Please note that you cannot insert mp3 files with visual editor.'] = 'Tenga en cuenta que no puede insertar ficheros MP3 con el editor visual.'; $GLOBALS['__l10n']['Please note that you cannot insert video files with visual editor.'] = 'Tenga en cuenta que no puede insertar ficheros de vídeo con el editor visual.'; $GLOBALS['__l10n']['Video size'] = 'Tamaño del vídeo'; $GLOBALS['__l10n']['Width:'] = 'Anchura:'; $GLOBALS['__l10n']['Height:'] = 'Altura:'; $GLOBALS['__l10n']['Video disposition'] = 'Disposición del vídeo'; $GLOBALS['__l10n']['Media item will be inserted as a link.'] = 'El elemento multimedia se insertará como un enlace.'; $GLOBALS['__l10n']['Insert'] = 'Insertar'; $GLOBALS['__l10n']['Media details'] = 'Detalles del elemento multimedia'; $GLOBALS['__l10n']['Available sizes:'] = 'Tamaños disponibles:'; $GLOBALS['__l10n']['File owner:'] = 'Propietario del fichero:'; $GLOBALS['__l10n']['File type:'] = 'Tipo de fichero:'; $GLOBALS['__l10n']['File size:'] = 'Tamaño del fichero:'; $GLOBALS['__l10n']['File URL:'] = 'URL del fichero:'; $GLOBALS['__l10n']['Show entries containing this media'] = 'Mostrar las entradas que contengan este elemento multimedia'; $GLOBALS['__l10n']['Entries containing this media'] = 'Entradas que contengan este elemento multimedia'; $GLOBALS['__l10n']['No entry seems contain this media.'] = 'No parece que haya ninguna entrada que contenga este elemento multimedia.'; $GLOBALS['__l10n']['Image details'] = 'Detalles de la imagen'; $GLOBALS['__l10n']['No detail'] = 'Sin detalles'; $GLOBALS['__l10n']['Update thumbnails'] = 'Actualizar las miniaturas'; $GLOBALS['__l10n']['This will create or update thumbnails for this image.'] = 'Esto creará o actualizará las miniaturas de esta imagen.'; $GLOBALS['__l10n']['Extract in a new directory'] = 'Extraer en un nuevo directorio'; $GLOBALS['__l10n']['Extract in current directory'] = 'Extraer en el directorio actual'; $GLOBALS['__l10n']['Extract archive'] = 'Extraer el archivo'; $GLOBALS['__l10n']['This will extract archive in a new directory that should not exist yet.'] = 'Esto extraerá el archivo en un nuevo directorio que no debería existir todavía.'; $GLOBALS['__l10n']['This will extract archive in current directory and will overwrite existing files or directory.'] = 'Esto extraerá el archivo en el directorio actual y sobrescribirá los ficheros o directorios ya existentes.'; $GLOBALS['__l10n']['Extract mode:'] = 'Modo de extracción:'; $GLOBALS['__l10n']['Extract'] = 'extraer'; $GLOBALS['__l10n']['Change media properties'] = 'Cambiar las propiedades del elemento multimedia'; $GLOBALS['__l10n']['File name:'] = 'Nombre del fichero:'; $GLOBALS['__l10n']['File title:'] = 'Título del fichero:'; $GLOBALS['__l10n']['File date:'] = 'Fecha del fichero:'; $GLOBALS['__l10n']['New directory:'] = 'Nuevo directorio:'; $GLOBALS['__l10n']['Change file'] = 'Cambiar el fichero'; $GLOBALS['__l10n']['No blog or user given.'] = 'No ha indicado el blog o el usuario.'; $GLOBALS['__l10n']['permissions'] = 'permisos'; $GLOBALS['__l10n']['Permissions'] = 'Permisos'; $GLOBALS['__l10n']['The permissions have been successfully updated.'] = 'Los permisos se han actualizado con éxito.'; $GLOBALS['__l10n']['You are about to change permissions on the following blogs for users %s.'] = 'Se dispone a cambiar los permisos de los usuarios %s para los siguientes blogs.'; $GLOBALS['__l10n']['Validate permissions'] = 'establecer los permisos'; $GLOBALS['__l10n']['choose a blog'] = 'elija un blog'; $GLOBALS['__l10n']['Choose a blog'] = 'Elija un blog'; $GLOBALS['__l10n']['Entries per page'] = 'Entradas por página'; $GLOBALS['__l10n']['Choose one or more blogs to which you want to give permissions to users %s.'] = 'Elija uno o más blogs sobre los que quiera dar permisos a los siguientes usuarios: %s.'; $GLOBALS['__l10n']['Set permissions'] = 'establecer los permisos'; $GLOBALS['__l10n']['select'] = 'seleccionado'; $GLOBALS['__l10n']['No content found on this plugin.'] = 'No hay ningún contenido para este complemento.'; $GLOBALS['__l10n']['Plugin not found'] = 'Complemento no encontrado'; $GLOBALS['__l10n']['The plugin you reached does not exist or does not have an admin page.'] = 'El complemento que busca no existe o no tiene página de administración.'; $GLOBALS['__l10n']['No such plugin.'] = 'Complemento inexistente.'; $GLOBALS['__l10n']['You don\'t have permissions to delete this plugin.'] = 'No tiene permisos para borrar este complemento.'; $GLOBALS['__l10n']['You don\'t have permissions to deactivate this plugin.'] = 'No tiene permisos para desactivar este complemento.'; $GLOBALS['__l10n']['Plugins management'] = 'Gestión de los complementos'; $GLOBALS['__l10n']['Plugin has been successfully deleted.'] = 'El complemento se ha borrado con éxito.'; $GLOBALS['__l10n']['Plugin has been successfully installed.'] = 'El complemento se ha instalado con éxito.'; $GLOBALS['__l10n']['Plugin has been successfully upgraded'] = 'El complemento se ha actualizado con éxito'; $GLOBALS['__l10n']['Plugins add new functionalities to Dotclear. Here you can activate or deactivate installed plugins.'] = 'Los complementos añaden nuevas funcionalidades a Dotclear. Aquí puede activar o desactivar los complementos instalados.'; $GLOBALS['__l10n']['You can find additional plugins for your blog on %s.'] = 'Puede buscar más complementos para su blog en %s.'; $GLOBALS['__l10n']['To install or upgrade a plugin you generally just need to upload it in "Install or upgrade a plugin" section.'] = 'Para instalar o actualizar un complemento, generalmente sólo necesita enviarlo desde la sección «Instalar o actualizar un complemento».'; $GLOBALS['__l10n']['To install or upgrade a plugin you just need to extract it in your plugins directory.'] = 'Para instalar o actualizar un complemento sólo necesita extraerlo en su directorio de complementos.'; $GLOBALS['__l10n']['Plugins'] = 'Complementos'; $GLOBALS['__l10n']['Activated plugins'] = 'Complementos activados'; $GLOBALS['__l10n']['Plugin'] = 'Complemento'; $GLOBALS['__l10n']['Version'] = 'Versión'; $GLOBALS['__l10n']['Details'] = 'Detalles'; $GLOBALS['__l10n']['Deactivate'] = 'Desactivar'; $GLOBALS['__l10n']['Deactivated plugins'] = 'Complementos desactivados'; $GLOBALS['__l10n']['Activate'] = 'Activar'; $GLOBALS['__l10n']['Install or upgrade a plugin'] = 'Instalar o actualizar un complemento'; $GLOBALS['__l10n']['You can install plugins by uploading or downloading zip files.'] = 'Puede instalar complementos enviando o descargando ficheros zip.'; $GLOBALS['__l10n']['Plugin zip file:'] = 'Fichero zip del complemento:'; $GLOBALS['__l10n']['Upload plugin'] = 'Enviar el complemento'; $GLOBALS['__l10n']['Plugin zip file URL:'] = 'URL del fichero zip del complemento:'; $GLOBALS['__l10n']['Download plugin'] = 'Descargar el complemento'; $GLOBALS['__l10n']['To enable this function, please give write access to your plugins directory.'] = 'Para habilitar esta función, conceda acceso de escritura a su directorio de complementos.'; $GLOBALS['__l10n']['Add a link'] = 'Añadir un enlace'; $GLOBALS['__l10n']['Available'] = 'Disponible'; $GLOBALS['__l10n']['Most used'] = 'Los más usados'; $GLOBALS['__l10n']['Link URL:'] = 'URL del enlace:'; $GLOBALS['__l10n']['Link title:'] = 'Título del fichero:'; $GLOBALS['__l10n']['Link language:'] = 'Idioma del enlace:'; $GLOBALS['__l10n']['Add a link to an entry'] = 'Añadir un enlace a una entrada'; $GLOBALS['__l10n']['Search entry:'] = 'Buscar una entrada:'; $GLOBALS['__l10n']['Search'] = 'Buscar'; $GLOBALS['__l10n']['cancel'] = 'cancelar'; $GLOBALS['__l10n']['This entry does not exist.'] = 'Esta entrada no existe.'; $GLOBALS['__l10n']['Edit entry'] = 'Modificar entrada'; $GLOBALS['__l10n']['next entry'] = 'entrada siguiente'; $GLOBALS['__l10n']['previous entry'] = 'entrada precedente'; $GLOBALS['__l10n']['Entry has been successfully updated.'] = 'Entrada actualizada con éxito.'; $GLOBALS['__l10n']['Entry has been successfully created.'] = 'Entrada creada con éxito.'; $GLOBALS['__l10n']['File has been successfully attached.'] = 'Fichero adjuntado con éxito.'; $GLOBALS['__l10n']['Attachment has been successfully removed.'] = 'Fichero adjunto eliminado con éxito.'; $GLOBALS['__l10n']['Comment has been successfully created.'] = 'El comentario se ha creado con éxito.'; $GLOBALS['__l10n']['Don\'t forget to validate your XHTML conversion by saving your post.'] = 'No olvide validar su conversión XHTML guardando su post.'; $GLOBALS['__l10n']['Go to this entry on the site'] = ''; $GLOBALS['__l10n']['new window'] = ''; $GLOBALS['__l10n']['Excerpt:'] = 'Extracto:'; $GLOBALS['__l10n']['Notes:'] = 'Notas:'; $GLOBALS['__l10n']['Preview'] = 'Previsualizar la entrada'; $GLOBALS['__l10n']['Entry status:'] = 'Estado de la entrada:'; $GLOBALS['__l10n']['Published on:'] = 'Publicado el:'; $GLOBALS['__l10n']['Text formating:'] = 'Formato del texto:'; $GLOBALS['__l10n']['Convert to XHTML'] = 'Convertir a XHTML'; $GLOBALS['__l10n']['Selected entry'] = 'Entrada seleccionada'; $GLOBALS['__l10n']['Entry lang:'] = 'Idioma de la entrada:'; $GLOBALS['__l10n']['Entry password:'] = 'Contraseña de la entrada:'; $GLOBALS['__l10n']['Basename:'] = 'URL específico:'; $GLOBALS['__l10n']['Warning: If you set the URL manually, it may conflict with another entry.'] = 'Atención: si indica manualmente el URL, éste podría entrar en conflicto con otra entrada.'; $GLOBALS['__l10n']['Ping blogs'] = 'Hacer ping a blogs'; $GLOBALS['__l10n']['Trackbacks'] = 'Retroenlaces'; $GLOBALS['__l10n']['No trackback'] = 'Ningún retroenlace'; $GLOBALS['__l10n']['Add a comment'] = 'Añadir un comentario'; $GLOBALS['__l10n']['Name:'] = 'Apellido:'; $GLOBALS['__l10n']['IP address'] = 'Dirección IP'; $GLOBALS['__l10n']['published'] = 'publicado'; $GLOBALS['__l10n']['unpublished'] = 'no publicado'; $GLOBALS['__l10n']['pending'] = 'en espera'; $GLOBALS['__l10n']['junk'] = 'no deseado'; $GLOBALS['__l10n']['select this comment'] = 'Modificar este comentario'; $GLOBALS['__l10n']['select this trackback'] = 'Aceptar retroenlaces'; $GLOBALS['__l10n']['Edit this comment'] = 'Modificar este comentario'; $GLOBALS['__l10n']['This attachment does not exist'] = 'Este fichero adjunto no existe'; $GLOBALS['__l10n']['Remove attachment'] = 'Eliminar el fichero adjunto'; $GLOBALS['__l10n']['Attachment'] = 'Fichero adjunto'; $GLOBALS['__l10n']['Are you sure you want to remove this attachment?'] = '¿Seguro que desea eliminar este fichero adjunto?'; $GLOBALS['__l10n']['selected'] = 'seleccionado'; $GLOBALS['__l10n']['not selected'] = 'no seleccionado'; $GLOBALS['__l10n']['Category'] = 'Categoría'; $GLOBALS['__l10n']['Selected'] = 'Seleccionado'; $GLOBALS['__l10n']['Publish'] = 'Publicar'; $GLOBALS['__l10n']['Unpublish'] = 'No publicar'; $GLOBALS['__l10n']['Schedule'] = 'Planificar'; $GLOBALS['__l10n']['Mark as pending'] = 'Marcar como pendiente'; $GLOBALS['__l10n']['Mark'] = 'Marcar'; $GLOBALS['__l10n']['Mark as selected'] = 'Marcar como seleccionado'; $GLOBALS['__l10n']['Mark as unselected'] = 'Marcar como no seleccionado'; $GLOBALS['__l10n']['Change'] = 'Cambiar'; $GLOBALS['__l10n']['Change category'] = 'Cambiar la categoría'; $GLOBALS['__l10n']['Change author'] = 'Cambiar el autor'; $GLOBALS['__l10n']['Selected:'] = 'Seleccionado:'; $GLOBALS['__l10n']['Month:'] = 'Mes:'; $GLOBALS['__l10n']['Lang:'] = 'Idioma:'; $GLOBALS['__l10n']['Selected entries action:'] = 'Acción sobre las entradas seleccionadas:'; $GLOBALS['__l10n']['This user does not exist'] = 'Este usuario no existe'; $GLOBALS['__l10n']['Change category for entries'] = 'Cambiar la categoría de las entradas'; $GLOBALS['__l10n']['Change author for entries'] = 'Cambiar el autor de las entradas'; $GLOBALS['__l10n']['Author ID:'] = 'Identificativo del autor:'; $GLOBALS['__l10n']['Default'] = ''; $GLOBALS['__l10n']['If you want to change your email or password you must provide your current password.'] = 'Si desea cambiar su dirección de correo electrónico o contraseña debe proporcionar su contraseña actual.'; $GLOBALS['__l10n']['No favorite selected'] = 'no seleccionado'; $GLOBALS['__l10n']['Personal information has been successfully updated.'] = 'Información personal actualizada con éxito.'; $GLOBALS['__l10n']['Personal options has been successfully updated.'] = 'Información personal actualizada con éxito.'; $GLOBALS['__l10n']['Favorites have been successfully added.'] = 'Los ficheros se han enviado con éxito.'; $GLOBALS['__l10n']['Favorites have been successfully updated.'] = 'El fichero se ha actualizado con éxito.'; $GLOBALS['__l10n']['Favorites have been successfully removed.'] = 'El fichero ha sido eliminado con éxito.'; $GLOBALS['__l10n']['Default favorites have been successfully updated.'] = 'Las miniaturas se han actualizado con éxito.'; $GLOBALS['__l10n']['My profile'] = ''; $GLOBALS['__l10n']['Display name:'] = 'Seudónimo :'; $GLOBALS['__l10n']['User language:'] = 'Idioma del usuario:'; $GLOBALS['__l10n']['User timezone:'] = 'Huso horario del usuario:'; $GLOBALS['__l10n']['If you have changed this user email or password you must provide your current password to save these modifications.'] = 'Si desea cambiar su dirección de correo electrónico o contraseña debe proporcionar su contraseña actual.'; $GLOBALS['__l10n']['My options'] = 'Opciones de búsqueda'; $GLOBALS['__l10n']['Preferred format:'] = 'Formato de edición :'; $GLOBALS['__l10n']['Default entry status:'] = 'Estado predeterminado de las entradas:'; $GLOBALS['__l10n']['Entry edit field height:'] = 'Tamaño de la zona de edición:'; $GLOBALS['__l10n']['Enable WYSIWYG mode'] = 'Habilitar el modo WYSIWYG'; $GLOBALS['__l10n']['Activate enhanced uploader in media manager'] = 'Activar la interfaz avanzada'; $GLOBALS['__l10n']['Iconset:'] = ''; $GLOBALS['__l10n']['Do not use standard favicon'] = ''; $GLOBALS['__l10n']['This will be applied for all users'] = ''; $GLOBALS['__l10n']['Accessibility options'] = ''; $GLOBALS['__l10n']['Disable javascript powered drag and drop for ordering items'] = ''; $GLOBALS['__l10n']['Numeric fields will allow to type the elements\' ordering number.'] = ''; $GLOBALS['__l10n']['Dashboard modules'] = 'Tablero de mandos'; $GLOBALS['__l10n']['Display documentation links'] = 'Documentación'; $GLOBALS['__l10n']['Display Dotclear news'] = 'Actualizar Dotclear'; $GLOBALS['__l10n']['Display quick entry form'] = ''; $GLOBALS['__l10n']['My favorites'] = ''; $GLOBALS['__l10n']['position of %s'] = ''; $GLOBALS['__l10n']['Save order'] = 'Reordenar'; $GLOBALS['__l10n']['Delete selected favorites'] = 'Borrar el fichero seleccionado'; $GLOBALS['__l10n']['Are you sure you want to remove selected favorites?'] = '¿Seguro que desea reordenar todas las categorías?'; $GLOBALS['__l10n']['If you are a super administrator, you may define this set of favorites to be used by default on all blogs of this installation:'] = ''; $GLOBALS['__l10n']['Define as default favorites'] = ''; $GLOBALS['__l10n']['Currently no personal favorites.'] = ''; $GLOBALS['__l10n']['Default favorites'] = ''; $GLOBALS['__l10n']['Those favorites are displayed when My Favorites list is empty.'] = ''; $GLOBALS['__l10n']['Available favorites'] = 'Tamaños disponibles:'; $GLOBALS['__l10n']['Add to my favorites'] = ''; $GLOBALS['__l10n']['Search options'] = 'Opciones de búsqueda'; $GLOBALS['__l10n']['Query:'] = 'Consulta:'; $GLOBALS['__l10n']['Search entries'] = 'buscar entradas'; $GLOBALS['__l10n']['Search comments'] = 'buscar comentarios'; $GLOBALS['__l10n']['schedule'] = 'planificar'; $GLOBALS['__l10n']['change category'] = 'cambiar la categoría'; $GLOBALS['__l10n']['change author'] = 'cambiar el autor'; $GLOBALS['__l10n']['%d entries found'] = '%d entradas encontradas'; $GLOBALS['__l10n']['%d entry found'] = '%d entrada encontrada'; $GLOBALS['__l10n']['%d comment found'] = '%d comentario encontrado'; $GLOBALS['__l10n']['%d comments found'] = '%d comentarios encontrados'; $GLOBALS['__l10n']['This entry does not exist or is not published'] = 'Esta entrada no existe o no ha sido publicada'; $GLOBALS['__l10n']['All pings sent.'] = 'Todos los pings han sido enviados.'; $GLOBALS['__l10n']['Back to "%s"'] = 'Volver a «%s»'; $GLOBALS['__l10n']['Auto discover ping URLs'] = 'Descubrimiento automático de las URL ping'; $GLOBALS['__l10n']['URLs to ping:'] = 'URL a las que enviar un ping:'; $GLOBALS['__l10n']['Send excerpt:'] = 'Enviar el extracto:'; $GLOBALS['__l10n']['Previously sent pings'] = 'Pings ya enviados'; $GLOBALS['__l10n']['Dotclear update'] = 'Actualización de Dotclear'; $GLOBALS['__l10n']['Unable to delete file %s'] = 'No es posible borrar el fichero %s'; $GLOBALS['__l10n']['Downloaded Dotclear archive seems to be corrupted. Try download it again.'] = 'El archivo de Dotclear descargado parece estar dañado. Intente descargarlo de nuevo.'; $GLOBALS['__l10n']['The following files of your Dotclear installation have been modified so we won\'t try to update your installation. Please try to update manually.'] = 'Los siguientes ficheros de su instalación de Dotclear han sido modificados, por lo que no se intenta actualizar su instalación. Intente actualizarla manualmente.'; $GLOBALS['__l10n']['The following files of your Dotclear installation are not readable. Please fix this or try to make a backup file named %s manually.'] = 'Los siguientes ficheros de su instalación de Dotclear no se pueden leer. Solucione esto o intente hacer un fichero de respaldo llamado %s manualmente.'; $GLOBALS['__l10n']['The following files of your Dotclear installation cannot be written. Please fix this or try to update manually.'] = 'Los siguientes ficheros de su instalación de Dotclear no se pueden escribir. Solucione esto o intente actualizar manualmente.'; $GLOBALS['__l10n']['No newer Dotclear version available.'] = 'No hay disponible ninguna versión más moderna de Dotclear.'; $GLOBALS['__l10n']['Dotclear %s is available.'] = 'Está disponible Dotclear %s.'; $GLOBALS['__l10n']['To upgrade your Dotclear installation simply click on the following button. A backup file of your current installation will be created in your root directory.'] = 'Para actualizar su instalación de Dotclear, simplemente pulse el siguiente botón. Se creará un fichero de respaldo de su instalación actual en su directorio raíz.'; $GLOBALS['__l10n']['Update Dotclear'] = 'Actualizar Dotclear'; $GLOBALS['__l10n']['Update backup files'] = 'Actualizar los ficheros de respaldo'; $GLOBALS['__l10n']['The following files are backups of previously updates. You can revert your previous installation or delete theses files.'] = 'Los siguientes ficheros son respaldos de actualizaciones anteriores. Puede volver a su instalación anterior o borrar estos ficheros.'; $GLOBALS['__l10n']['Please note that reverting your Dotclear version may have some unwanted side-effects. Consider reverting only if you experience strong issues with this new version.'] = 'Tenga en cuenta que volver atrás en su versión de Dotclear puede tener algunas efectos laterales no deseados. Considere la posibilidad de retroceder sólo si experimenta importantes problemas con esta nueva versión.'; $GLOBALS['__l10n']['You should not revert to version prior to last one (%s).'] = 'No debería retroceder a una versión anterior a la última (%s).'; $GLOBALS['__l10n']['Delete selected file'] = 'Borrar el fichero seleccionado'; $GLOBALS['__l10n']['Revert to selected file'] = 'Restablecer el fichero seleccionado'; $GLOBALS['__l10n']['Congratulations, you\'re one click away from the end of the update.'] = 'Enhorabuena, está a un clic del final de la actualización.'; $GLOBALS['__l10n']['Finish the update.'] = 'Finalizar la actualización.'; $GLOBALS['__l10n']['new user'] = 'nuevo usuario'; $GLOBALS['__l10n']['User "%s" already exists.'] = 'El usuario «%s» ya existe.'; $GLOBALS['__l10n']['User has been successfully updated.'] = 'Usuario actualizado con éxito.'; $GLOBALS['__l10n']['User has been successfully created.'] = 'Usuario creado con éxito.'; $GLOBALS['__l10n']['Warning:'] = 'Aviso:'; $GLOBALS['__l10n']['If you change your username, you will have to log in again.'] = 'Si cambia su nombre de usuario, tendrá que volver a iniciar sesión.'; $GLOBALS['__l10n']['Mandatory for password recovering procedure.'] = ''; $GLOBALS['__l10n']['Password change required to connect'] = 'Se necesita un cambio de contraseña para conectar'; $GLOBALS['__l10n']['Save and create another'] = ''; $GLOBALS['__l10n']['No permissions.'] = 'Sin permisos.'; $GLOBALS['__l10n']['Add new permissions'] = 'Añadir nuevos permisos'; $GLOBALS['__l10n']['Username'] = 'Usuario'; $GLOBALS['__l10n']['Last Name'] = 'Apellidos'; $GLOBALS['__l10n']['First Name'] = 'Nombre'; $GLOBALS['__l10n']['Display name'] = 'Seudónimo'; $GLOBALS['__l10n']['Number of entries'] = 'Número de entradas'; $GLOBALS['__l10n']['users'] = 'usuarios'; $GLOBALS['__l10n']['User has been successfully removed.'] = 'Usuario eliminado con éxito.'; $GLOBALS['__l10n']['Create a new user'] = 'Crear un nuevo usuario'; $GLOBALS['__l10n']['Users per page'] = 'Usuarios por página'; $GLOBALS['__l10n']['Selected users action:'] = 'Acción sobre los usuarios seleccionados:'; $GLOBALS['__l10n']['Blog:'] = 'Blog:'; $GLOBALS['__l10n']['Change blog'] = 'Cambiar de blog'; $GLOBALS['__l10n']['Blogs:'] = 'Blogs:'; $GLOBALS['__l10n']['Go to site'] = ''; $GLOBALS['__l10n']['My dashboard'] = 'Tablero de mandos'; $GLOBALS['__l10n']['Logout %s'] = 'Cerrar la sesión'; $GLOBALS['__l10n']['Safe mode'] = ''; $GLOBALS['__l10n']['You are in safe mode. All plugins have been temporarily disabled. Remind to log out then log in again normally to get back all functionalities'] = ''; $GLOBALS['__l10n']['Thank you for using %s.'] = 'Gracias por usar %s.'; $GLOBALS['__l10n']['Help'] = 'Ayuda'; $GLOBALS['__l10n']['uncover'] = 'descubrir'; $GLOBALS['__l10n']['hide'] = 'ocultar'; $GLOBALS['__l10n']['help'] = 'ayuda'; $GLOBALS['__l10n']['no selection'] = 'Sin selección'; $GLOBALS['__l10n']['select all'] = 'Seleccionar todo'; $GLOBALS['__l10n']['invert selection'] = 'Invertir la selección'; $GLOBALS['__l10n']['view entry'] = 'ver la entrada'; $GLOBALS['__l10n']['Are you sure you want to delete selected entries (%s)?'] = '¿Seguro que desea borrar las entradas seleccionadas?'; $GLOBALS['__l10n']['Are you sure you want to delete this entry?'] = '¿Seguro que desea borrar esta entrada?'; $GLOBALS['__l10n']['Are you sure you want to delete selected comments (%s)?'] = '¿Seguro que desea borrar los comentarios seleccionados?'; $GLOBALS['__l10n']['Are you sure you want to delete this comment?'] = '¿Seguro que desea borrar este comentario?'; $GLOBALS['__l10n']['Users with posts cannot be deleted.'] = 'Los usuarios que hayan escrito entradas no se pueden borrar.'; $GLOBALS['__l10n']['Are you sure you want to delete selected users (%s)?'] = '¿Seguro que desea borrar los usuarios seleccionados?'; $GLOBALS['__l10n']['Are you sure you want to delete category "%s"?'] = '¿Seguro que desea borrar la categoría «%s»?'; $GLOBALS['__l10n']['Are you sure you want to reorder all categories?'] = '¿Seguro que desea reordenar todas las categorías?'; $GLOBALS['__l10n']['Are you sure you want to remove media "%s"?'] = '¿Seguro que desea eliminar el elemento multimedia «%s»?'; $GLOBALS['__l10n']['Are you sure you want to extract archive in current directory?'] = '¿Seguro que desea extraer el archivo en el directorio actual?'; $GLOBALS['__l10n']['Are you sure you want to remove attachment "%s"?'] = '¿Seguro que desea eliminar el adjunto «%s»?'; $GLOBALS['__l10n']['Are you sure you want to delete "%s" language?'] = '¿Seguro que desea borrar el idioma «%s»?'; $GLOBALS['__l10n']['Are you sure you want to delete "%s" plugin?'] = '¿Seguro que desea borrar el complemento «%s»?'; $GLOBALS['__l10n']['Use this theme'] = 'Usar este tema'; $GLOBALS['__l10n']['Remove this theme'] = 'Eliminar este tema'; $GLOBALS['__l10n']['Are you sure you want to delete "%s" theme?'] = '¿Seguro que desea borrar el tema «%s»?'; $GLOBALS['__l10n']['Zip file content'] = 'Contenido del fichero zip'; $GLOBALS['__l10n']['XHTML markup validator'] = 'Validador de las etiquetas XHTML'; $GLOBALS['__l10n']['XHTML content is valid.'] = 'El contenido XHTML es válido.'; $GLOBALS['__l10n']['There are XHTML markup errors.'] = 'Hay errores en las etiquetas XHTML.'; $GLOBALS['__l10n']['You have unsaved changes. Switch post format will loose these changes. Proceed anyway?'] = ''; $GLOBALS['__l10n']['Loading enhanced uploader, please wait.'] = ''; $GLOBALS['__l10n']['You have unsaved changes.'] = 'No ha guardado sus modificaciones.'; $GLOBALS['__l10n']['close'] = 'cerrar'; $GLOBALS['__l10n']['now'] = 'ahora'; $GLOBALS['__l10n']['visual'] = 'visual'; $GLOBALS['__l10n']['source'] = 'fuente'; $GLOBALS['__l10n']['You can use the following shortcuts to format your text.'] = 'Puede utilizar los siguientes accesos directos para dar formato a su texto.'; $GLOBALS['__l10n']['-- none --'] = '-- ninguno --'; $GLOBALS['__l10n']['-- block format --'] = '-- formato de bloque --'; $GLOBALS['__l10n']['Paragraph'] = 'Párrafo'; $GLOBALS['__l10n']['Level 1 header'] = 'Cabecera de nivel 1'; $GLOBALS['__l10n']['Level 2 header'] = 'Cabecera de nivel 2'; $GLOBALS['__l10n']['Level 3 header'] = 'Cabecera de nivel 3'; $GLOBALS['__l10n']['Level 4 header'] = 'Cabecera de nivel 4'; $GLOBALS['__l10n']['Level 5 header'] = 'Cabecera de nivel 5'; $GLOBALS['__l10n']['Level 6 header'] = 'Cabecera de nivel 6'; $GLOBALS['__l10n']['Strong emphasis'] = 'Énfasis fuerte'; $GLOBALS['__l10n']['Emphasis'] = 'Énfasis'; $GLOBALS['__l10n']['Inserted'] = 'Insertado'; $GLOBALS['__l10n']['Deleted'] = 'Borrado'; $GLOBALS['__l10n']['Inline quote'] = 'Cita en línea'; $GLOBALS['__l10n']['Code'] = 'Código'; $GLOBALS['__l10n']['Line break'] = 'Salto de línea'; $GLOBALS['__l10n']['Blockquote'] = 'Bloque de cita'; $GLOBALS['__l10n']['Preformated text'] = 'Texto preformateado'; $GLOBALS['__l10n']['Unordered list'] = 'Lista sin orden'; $GLOBALS['__l10n']['Ordered list'] = 'Lista numerada'; $GLOBALS['__l10n']['Link'] = 'Enlace'; $GLOBALS['__l10n']['URL?'] = '¿URL?'; $GLOBALS['__l10n']['Language?'] = '¿Idioma?'; $GLOBALS['__l10n']['External image'] = 'Imagen externa'; $GLOBALS['__l10n']['Media chooser'] = 'Selector de elementos multimedia'; $GLOBALS['__l10n']['Link to an entry'] = 'Enlace a una entrada'; $GLOBALS['__l10n']['Temporarily activate enhanced uploader'] = 'Activar la interfaz avanzada'; $GLOBALS['__l10n']['Temporarily disable enhanced uploader'] = 'Inhabilitar la interfaz avanzada'; $GLOBALS['__l10n']['File successfully uploaded.'] = 'Fichero enviado con éxito.'; $GLOBALS['__l10n']['Maximum file size allowed:'] = 'Tamaño máximo de fichero permitido:'; $GLOBALS['__l10n']['Limit exceeded.'] = 'Límite sobrepasado.'; $GLOBALS['__l10n']['File size exceeds allowed limit.'] = 'El tamaño del fichero excede el límite permitido.'; $GLOBALS['__l10n']['Canceled.'] = 'Cancelado.'; $GLOBALS['__l10n']['HTTP Error:'] = 'Error HTTP:'; $GLOBALS['__l10n']['Choose file'] = 'Elegir el fichero'; $GLOBALS['__l10n']['Choose files'] = 'Elegir los ficheros'; $GLOBALS['__l10n']['Clean'] = 'Limpiar'; $GLOBALS['__l10n']['Upload'] = 'Enviar'; $GLOBALS['__l10n']['No file in queue.'] = 'No hay ningún fichero en la cola de espera.'; $GLOBALS['__l10n']['1 file in queue.'] = '1 fichero en la cola.'; $GLOBALS['__l10n']['%d files in queue.'] = '%d ficheros en la cola.'; $GLOBALS['__l10n']['Queue error:'] = 'Error de la cola de espera:'; $GLOBALS['__l10n']['«prev.'] = '«anterior'; $GLOBALS['__l10n']['next»'] = 'siguiente»'; $GLOBALS['__l10n']['No entry'] = 'No hay entrada'; $GLOBALS['__l10n']['scheduled'] = 'programado'; $GLOBALS['__l10n']['protected'] = 'protegido'; $GLOBALS['__l10n']['%d attachment'] = '%d adjunto'; $GLOBALS['__l10n']['%d attachments'] = '%d adjuntos'; $GLOBALS['__l10n']['Type'] = 'Tipo'; $GLOBALS['__l10n']['No user'] = 'No hay usuario'; $GLOBALS['__l10n']['admin'] = ''; $GLOBALS['__l10n']['superadmin'] = 'Súper administrador'; $GLOBALS['__l10n']['Database error'] = 'Tipo de base de datos:'; $GLOBALS['__l10n']['There seems to be no Session table in your database. Is Dotclear completly installed?'] = ''; $GLOBALS['__l10n']['System'] = 'Sistema'; $GLOBALS['__l10n']['Blog'] = 'Blog'; $GLOBALS['__l10n']['Update'] = 'Actualizaciones'; $GLOBALS['__l10n']['Languages'] = 'Idiomas'; $GLOBALS['__l10n']['administrator'] = 'administrador'; $GLOBALS['__l10n']['manage their own entries and comments'] = 'gestionar sus propias entradas y comentarios'; $GLOBALS['__l10n']['publish entries and comments'] = 'publicar entradas y comentarios'; $GLOBALS['__l10n']['delete entries and comments'] = 'eliminar entradas y comentarios'; $GLOBALS['__l10n']['manage all entries and comments'] = 'gestionar todas las entradas y comentarios'; $GLOBALS['__l10n']['manage categories'] = 'gestionar las categorías'; $GLOBALS['__l10n']['manage their own media items'] = 'gestionar sus propios media'; $GLOBALS['__l10n']['manage all media items'] = 'gestionar todos los media'; $GLOBALS['__l10n']['That user does not exist in the database.'] = 'Ese usuario no existe en la base de datos.'; $GLOBALS['__l10n']['That key does not exist in the database.'] = 'Esa clave no existe en la base de datos.'; $GLOBALS['__l10n']['You are not allowed to add categories'] = 'No está autorizado a crear categorías'; $GLOBALS['__l10n']['You are not allowed to update categories'] = 'No está autorizado a modificar categorías'; $GLOBALS['__l10n']['You are not allowed to delete categories'] = 'No está autorizado a eliminar categorías'; $GLOBALS['__l10n']['This category is not empty.'] = 'Esta categoría no está vacía.'; $GLOBALS['__l10n']['Category URL must be unique.'] = 'El URL de cada categoría debe ser único.'; $GLOBALS['__l10n']['You must provide a category title'] = 'Debe indicar un título para la categoría'; $GLOBALS['__l10n']['You must provide a category URL'] = 'Debe indicar un URL para la categoría'; $GLOBALS['__l10n']['You are not allowed to create an entry'] = 'No está autorizado a crear entradas'; $GLOBALS['__l10n']['You are not allowed to update entries'] = 'No está autorizado a actualizar las entradas'; $GLOBALS['__l10n']['No such entry ID'] = 'ID de entrada desconocida'; $GLOBALS['__l10n']['You are not allowed to edit this entry'] = 'No está autorizado a editar esta entrada'; $GLOBALS['__l10n']['You are not allowed to change this entry status'] = 'No está autorizado a cambiar el estado de esta entrada'; $GLOBALS['__l10n']['You are not allowed to change this entry category'] = 'No está autorizado a cambiar la categoría de esta entrada'; $GLOBALS['__l10n']['You are not allowed to mark this entry as selected'] = 'No está autorizado a marcar esta entrada como seleccionada'; $GLOBALS['__l10n']['You are not allowed to delete entries'] = 'No está autorizado a borrar entradas'; $GLOBALS['__l10n']['You are not allowed to delete this entry'] = 'No está autorizado a borrar esta entrada'; $GLOBALS['__l10n']['No entry title'] = 'La entrada no tiene título'; $GLOBALS['__l10n']['No entry content'] = 'Entrada sin contenido'; $GLOBALS['__l10n']['Empty entry URL'] = 'URL de la entrada vacío'; $GLOBALS['__l10n']['You are not allowed to update comments'] = 'No está autorizado a modificar los comentarios'; $GLOBALS['__l10n']['No such comment ID'] = 'ID del comentario desconocida'; $GLOBALS['__l10n']['You are not allowed to update this comment'] = 'No está autorizado a cambiar este comentario'; $GLOBALS['__l10n']['You are not allowed to change this comment\'s status'] = 'No está autorizado a cambiar el estado de este comentario'; $GLOBALS['__l10n']['You are not allowed to delete comments'] = 'No está autorizado a eliminar comentarios'; $GLOBALS['__l10n']['You are not allowed to delete this comment'] = 'No está autorizado a eliminar este comentario'; $GLOBALS['__l10n']['You must provide a comment'] = 'Debe escribir un comentario'; $GLOBALS['__l10n']['You must provide an author name'] = 'Debe indicar un nombre de autor'; $GLOBALS['__l10n']['Email address is not valid.'] = 'La dirección de correo electrónico no es válida.'; $GLOBALS['__l10n']['online'] = 'conectado'; $GLOBALS['__l10n']['offline'] = 'no conectado'; $GLOBALS['__l10n']['removed'] = 'eliminado'; $GLOBALS['__l10n']['You are not an administrator'] = 'Usted no es el administrador'; $GLOBALS['__l10n']['Invalid user language code'] = 'Código de idioma del usuario no válido'; $GLOBALS['__l10n']['Blog ID must contain at least 2 characters using letters, numbers or symbols.'] = 'La ID del blog debe tener al menos 2 caracteres compuestos por letras, cifras o símbolos.'; $GLOBALS['__l10n']['No blog name'] = 'Blog sin nombre'; $GLOBALS['__l10n']['No blog URL'] = 'El blog no tiene URL'; $GLOBALS['__l10n']['No log message'] = 'Blog sin nombre'; $GLOBALS['__l10n']['unknown'] = 'ahora'; $GLOBALS['__l10n']['No blog defined.'] = 'Ningún blog definido.'; $GLOBALS['__l10n']['Directory %s does not exist.'] = 'El directorio %s no existe.'; $GLOBALS['__l10n']['You are not a super administrator.'] = 'Usted no es súper administrador.'; $GLOBALS['__l10n']['Permission denied.'] = 'Permiso denegado.'; $GLOBALS['__l10n']['You are not the file owner.'] = 'Usted no es el propietario de este fichero.'; $GLOBALS['__l10n']['This file is not allowed.'] = 'No se permite el envío de este fichero.'; $GLOBALS['__l10n']['New file already exists.'] = 'El nuevo fichero ya existe.'; $GLOBALS['__l10n']['File does not exist in the database.'] = 'Ese fichero no existe en la base de datos.'; $GLOBALS['__l10n']['Extract destination directory %s already exists.'] = 'El directorio de destino de extracción %s ya existe.'; $GLOBALS['__l10n']['Embedded Audio Player'] = ''; $GLOBALS['__l10n']['Embedded Video Player'] = ''; $GLOBALS['__l10n']['%s: in [%s] and [%s]'] = ''; $GLOBALS['__l10n']['Empty module zip file.'] = 'Fichero zip de módulo vacío.'; $GLOBALS['__l10n']['The zip file does not appear to be a valid Dotclear module.'] = 'El fichero zip no parece ser un módulo válido de Dotclear.'; $GLOBALS['__l10n']['An error occurred during module deletion.'] = 'Se produjo un error durante el borrado del módulo.'; $GLOBALS['__l10n']['Unable to upgrade "%s". (same version)'] = 'No es posible actualizar «%s» (misma versión).'; $GLOBALS['__l10n']['Unable to read new _define.php file'] = 'No es posible leer el fichero new _define.php'; $GLOBALS['__l10n']['No such module.'] = 'Módulo inexistente.'; $GLOBALS['__l10n']['Cannot remove module files'] = 'No se pueden eliminar los ficheros del módulo'; $GLOBALS['__l10n']['Cannot deactivate plugin.'] = 'No se puede desactivar el complemento.'; $GLOBALS['__l10n']['Cannot activate plugin.'] = 'No se puede activar el complemento.'; $GLOBALS['__l10n']['Invalid setting dcNamespace: %s'] = 'Espacio de nombres del ajuste no válido: %s'; $GLOBALS['__l10n']['Unable to retrieve settings:'] = 'No es posible obtener los ajustes:'; $GLOBALS['__l10n']['%s is not a valid setting id'] = '%s no es un ID de ajuste válido'; $GLOBALS['__l10n']['No namespace specified'] = 'No se ha indicado ningún espacio de nombres'; $GLOBALS['__l10n']['Unable to retrieve workspaces:'] = 'No es posible obtener los ajustes:'; $GLOBALS['__l10n']['Unable to retrieve namespaces:'] = 'No es posible obtener los ajustes:'; $GLOBALS['__l10n']['Invalid setting namespace: %s'] = 'Espacio de nombres del ajuste no válido: %s'; $GLOBALS['__l10n']['%s has still been pinged'] = 'Ya se ha hecho un ping a %s'; $GLOBALS['__l10n']['Unable to ping URL'] = 'No es posible hacer el ping al URL'; $GLOBALS['__l10n']['%s is not a ping URL'] = '%s no es un URL de ping'; $GLOBALS['__l10n']['%s, ping error:'] = '%s, error de ping:'; $GLOBALS['__l10n']['Digests file not found.'] = 'Fichero de resúmenes no encontrado.'; $GLOBALS['__l10n']['No file to download'] = 'No hay ningún fichero a descargar'; $GLOBALS['__l10n']['Root directory is not writable.'] = 'No se puede escribir en el directorio raíz.'; $GLOBALS['__l10n']['An error occurred while downloading archive.'] = 'Se produjo un error durante la descarga del archivo.'; $GLOBALS['__l10n']['Archive not found.'] = 'No se ha encontrado el archivo.'; $GLOBALS['__l10n']['Unable to read current digests file.'] = 'No es posible leer el fichero de resúmenes actual.'; $GLOBALS['__l10n']['Downloaded file does not seem to be a valid archive.'] = 'El fichero descargado no parece ser un archivo válido.'; $GLOBALS['__l10n']['Incomplete archive.'] = 'Archivo incompleto.'; $GLOBALS['__l10n']['Unable to read digests file.'] = 'No es posible leer el fichero de resúmenes.'; $GLOBALS['__l10n']['Invalid digests file.'] = 'Fichero de resúmenes no válido.'; $GLOBALS['__l10n']['Invalid dcWorkspace: %s'] = 'Espacio de nombres del ajuste no válido: %s'; $GLOBALS['__l10n']['Unable to retrieve prefs:'] = 'No es posible obtener los ajustes:'; $GLOBALS['__l10n']['%s is not a valid pref id'] = '%s no es un ID de ajuste válido'; $GLOBALS['__l10n']['No workspace specified'] = 'No se ha indicado ningún espacio de nombres'; $GLOBALS['__l10n']['SQLite Database Schema cannot be upgraded.'] = 'No se puede actualizar el schema de la base de datos SQLite.'; $GLOBALS['__l10n']['Something went wrong with auto upgrade:'] = 'Se ha producido un error durante la actualización automática:'; $GLOBALS['__l10n']['Unable to open directory.'] = 'No es posible abrir el directorio.'; $GLOBALS['__l10n']['Unable to create directory.'] = 'No se puede crear el directorio.'; $GLOBALS['__l10n']['File is not writable.'] = 'El fichero no se puede modificar.'; $GLOBALS['__l10n']['Unable to open file.'] = 'El fichero no se puede abrir.'; $GLOBALS['__l10n']['Not an uploaded file.'] = 'No hay fichero.'; $GLOBALS['__l10n']['The uploaded file exceeds the maximum file size allowed.'] = 'El fichero es más grande que el tamaño máximo permitido.'; $GLOBALS['__l10n']['The uploaded file was only partially uploaded.'] = 'El fichero sólo se ha enviado parcialmente.'; $GLOBALS['__l10n']['No file was uploaded.'] = 'No se ha enviado ningún fichero.'; $GLOBALS['__l10n']['Missing a temporary folder.'] = 'Falta una carpeta temporal.'; $GLOBALS['__l10n']['Failed to write file to disk.'] = 'Fallo al guardar el fichero en el disco.'; $GLOBALS['__l10n']['%s is not a directory.'] = '%s no es un directorio.'; $GLOBALS['__l10n']['Bad range'] = ''; $GLOBALS['__l10n']['Invalid range'] = 'Código de idioma no válido'; $GLOBALS['__l10n']['Invalid line number'] = 'Código de idioma no válido'; $GLOBALS['__l10n']['Chunk is out of range'] = ''; $GLOBALS['__l10n']['Bad context'] = ''; $GLOBALS['__l10n']['Bad context (in deletion)'] = ''; $GLOBALS['__l10n']['Invalid diff format'] = 'Fichero de resúmenes no válido.'; $GLOBALS['__l10n']['Uploading this file is not allowed.'] = 'No se permite el envío de este fichero.'; $GLOBALS['__l10n']['Destination directory is not in jail.'] = 'El directorio de destino no está enjaulado.'; $GLOBALS['__l10n']['File already exists.'] = 'El fichero ya existe.'; $GLOBALS['__l10n']['Cannot write in this directory.'] = 'No se puede escribir en este directorio.'; $GLOBALS['__l10n']['An error occurred while writing the file.'] = 'Se ha producido un error durante la escritura del fichero.'; $GLOBALS['__l10n']['Source file does not exist.'] = 'El fichero de origen no existe.'; $GLOBALS['__l10n']['File is not in jail.'] = 'El fichero no está enjaulado.'; $GLOBALS['__l10n']['Destination directory is not writable.'] = 'No se puede escribir en el directorio de destino.'; $GLOBALS['__l10n']['Unable to rename file.'] = 'No se puede cambiar el nombre del fichero.'; $GLOBALS['__l10n']['File cannot be removed.'] = 'Este fichero no se puede eliminar.'; $GLOBALS['__l10n']['Directory is not in jail.'] = 'El directorio no está enjaulado.'; $GLOBALS['__l10n']['Directory cannot be removed.'] = 'No se puede eliminar este directorio.'; $GLOBALS['__l10n']['Not enough memory to open image.'] = 'No hay suficiente memoria para abrir la imagen.'; $GLOBALS['__l10n']['File %s is not compressed in the zip.'] = 'El fichero %s no está comprimido en el zip.'; $GLOBALS['__l10n']['Trying to unzip a folder name %s'] = 'Intentando descomprimir una carpeta %s'; $GLOBALS['__l10n']['Unable to write destination file.'] = 'No es posible escribir el fichero de destino.'; $GLOBALS['__l10n']['Unable to write in target directory, permission denied.'] = 'No es posible escribir el directorio de destino, permiso denegado.'; $GLOBALS['__l10n']['Not enough memory to open file.'] = 'No hay suficiente memoria para abrir el fichero.'; $GLOBALS['__l10n']['File does not exist'] = 'El fichero no existe'; $GLOBALS['__l10n']['Cannot read file'] = 'No se puede leer el fichero'; $GLOBALS['__l10n']['Directory does not exist'] = 'El directorio no existe'; $GLOBALS['__l10n']['Cannot read directory'] = 'No se puede leer el directorio'; $GLOBALS['__l10n']['Unable to connect to database'] = ''; $GLOBALS['__l10n']['

    This either means that the username and password information in your config.php file is incorrect or we can\'t contact the database server at "%s". This could mean your host\'s database server is down.

    • Are you sure you have the correct username and password?
    • Are you sure that you have typed the correct hostname?
    • Are you sure that the database server is running?

    If you\'re unsure what these terms mean you should probably contact your host. If you still need help you can always visit the Dotclear Support Forums.

    '] = ''; $GLOBALS['__l10n']['The following error was encountered while trying to read the database:'] = ''; dotclear-2.6.2+dfsg/inc/libs/clearbricks/tests/unit/fixtures/l10n/es/main.po000066400000000000000000002146101230033266200266630ustar00rootroot00000000000000# translation of main.po to Spanish # French translation of DotClear # Copyright (C) 2006. # # Olivier Meunier , 2006. # Enrique Matias Sanchez (aka Quique) , 2009. msgid "" msgstr "" "Project-Id-Version: main\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-11-06 18:11+0100\n" "PO-Revision-Date: 2009-10-02 16:02+0200\n" "Last-Translator: Quique \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Spanish\n" "X-Generator: Lokalize 1.0\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Dotclear has been upgraded." msgstr "Dotclear ha sido actualizado." msgid "Password reset" msgstr "Restablecer la contraseña" msgid "Someone has requested to reset the password for the following site and username." msgstr "Alguien ha solicitado restablecer la contraseña para el sitio y el usuario siguientes." msgid "Username:" msgstr "Usuario:" msgid "To reset your password visit the following address, otherwise just ignore this email and nothing will happen." msgstr "Para restablecer su contraseña vaya a la siguiente dirección, si no, simplemente ignore este mensaje y no pasará nada." #, php-format msgid "The e-mail was sent successfully to %s." msgstr "El mensaje se ha enviado con éxito a %s." msgid "Your new password" msgstr "Su nueva contraseña" msgid "Password:" msgstr "Contraseña:" msgid "Your new password is in your mailbox." msgstr "Su nueva contraseña está en la bandeja de entrada." msgid "Passwords don't match" msgstr "Las contraseñas no coinciden" msgid "You didn't change your password." msgstr "No ha cambiado su contraseña." msgid "You have to change your password before you can login." msgstr "Tiene que cambiar su contraseña para poder iniciar una sesión." msgid "In order to login, you have to change your password now." msgstr "Para iniciar una sesión, tiene que cambiar su contraseña ahora." #, fuzzy msgid "Safe Mode can only be used for super administrators." msgstr "Usted no es súper administrador." msgid "Wrong username or password" msgstr "Nombre de usuario o contraseña incorrecto" msgid "Back to login screen" msgstr "Volver a la pantalla de inicio de sesión" msgid "Request a new password" msgstr "Solicitar una nueva contraseña" msgid "Email:" msgstr "Correo electrónico:" msgid "recover" msgstr "recuperar" msgid "Change your password" msgstr "Cambiar su contraseña" msgid "New password:" msgstr "Nueva contraseña:" msgid "Confirm password:" msgstr "Confirmar la contraseña :" msgid "change" msgstr "cambiar" msgid "Safe mode login" msgstr "" msgid "This mode allows you to login without activating any of your plugins. This may be useful to solve compatibility problems" msgstr "" msgid "Disable or delete any plugin suspected to cause trouble, then log out and log back in normally." msgstr "" msgid "Remember my ID on this computer" msgstr "Recordar mi ID en este equipo" #, fuzzy msgid "log in" msgstr "Nombre del blog" msgid "You must accept cookies in order to use the private area." msgstr "Debe aceptar las 'cookies' para utilizar el área privada." msgid "Get back to normal authentication" msgstr "" msgid "Connection issue?" msgstr "" msgid "I forgot my password" msgstr "He olvidado mi contraseña" msgid "I want to log in in safe mode" msgstr "" msgid "New blog" msgstr "Nuevo blog" msgid "Blogs" msgstr "Blogs" msgid "Blog ID:" msgstr "ID del blog:" msgid "Required field" msgstr "Campo obligatorio" msgid "At least 2 characters using letters, numbers or symbols." msgstr "Al menos 2 caracteres, compuestos por letras, cifras o símbolos." msgid "Please note that changing your blog ID may require changes in your public index.php file." msgstr "Tenga en cuenta que cambiar el ID de su blog puede requerir cambios en su fichero index.php público." msgid "Blog name:" msgstr "Nombre del blog:" msgid "Blog URL:" msgstr "URL del blog:" msgid "Blog description:" msgstr "Descripción del blog:" msgid "Create" msgstr "" msgid "No such blog ID" msgstr "ID del blog desconocido" msgid "Password verification failed" msgstr "Contraseña incorrecta" msgid "Delete a blog" msgstr "Borrar un blog" msgid "Warning" msgstr "Aviso" #, php-format msgid "You are about to delete the blog %s. Every entry, comment and category will be deleted." msgstr "Está a punto de borrar el blog %s. Se borrarán todas sus entradas, comentarios y categorías." msgid "Please give your password to confirm the blog deletion." msgstr "Por favor indique su contraseña para confirmar la supresión del blog." msgid "Your password:" msgstr "Su contraseña:" msgid "Delete this blog" msgstr "Borrar este blog" msgid "No given blog id." msgstr "Sin identificativo de blog." msgid "No such blog." msgstr "No existe ese blog." msgid "year/month/day/title" msgstr "año/mes/día/título" msgid "year/month/title" msgstr "año/mes/título" msgid "year/title" msgstr "año/título" msgid "title" msgstr "título" msgid "Title" msgstr "Título" msgid "Title, Date" msgstr "Título, fecha" msgid "Title, Country, Date" msgstr "Título, país, fecha" msgid "Title, City, Country, Date" msgstr "Título, ciudad, país, fecha" msgid "I would like search engines and archivers to index and archive my blog's content." msgstr "Me gustaría los motores de búsqueda y archivadores indexen y archiven el contenido de mi blog." msgid "I would like search engines and archivers to index but not archive my blog's content." msgstr "Me gustaría que los motores de búsqueda y archivadores indexen el contenido de mi blog, pero no que lo archiven." msgid "I would like to prevent search engines and archivers from indexing or archiving my blog's content." msgstr "Me gustaría evitar que los motores de búsqueda y archivadores indexen o archiven el contenido de mi blog." #, fuzzy msgid "That blog Id is already in use." msgstr "Dotclear ya está instalado." msgid "Invalid language code" msgstr "Código de idioma no válido" msgid "Blog settings" msgstr "Ajustes del blog" msgid "Warning: except for special configurations, it is generally advised to have a trailing \"/\" in your blog URL in PATH_INFO mode." msgstr "" msgid "Warning: except for special configurations, it is generally advised to have a trailing \"?\" in your blog URL in QUERY_STRING mode." msgstr "" msgid "Blog has been successfully created." msgstr "El blog ha sido creado con éxito." msgid "Blog has been successfully updated." msgstr "El blog ha sido actualizado con éxito." msgid "Parameters" msgstr "Parámetros" msgid "Blog details" msgstr "Detalles del blog" msgid "URL scan method:" msgstr "Método de lectura del URL:" msgid "Blog status:" msgstr "Estado del blog:" msgid "Blog configuration" msgstr "Configuración del blog" msgid "Blog editor name:" msgstr "Nombre del editor del blog:" msgid "Default language:" msgstr "Idioma predeterminado:" msgid "Blog timezone:" msgstr "Huso horario del blog:" msgid "Copyright notice:" msgstr "Aviso de copyright:" msgid "New post URL format:" msgstr "Formato del URL de las nuevas entradas:" msgid "Enable XML/RPC interface" msgstr "Activar la interfaz XML/RPC" msgid "more information" msgstr "más información" msgid "Comments and trackbacks" msgstr "Comentarios y retroenlaces" msgid "Accept comments" msgstr "Aceptar los comentarios" msgid "Moderate comments" msgstr "Moderar los comentarios" #, php-format msgid "Leave comments open for %s days" msgstr "Dejar los comentarios abiertos durante %s días" msgid "Leave blank to disable this feature." msgstr "Déjelo vacío para inhabilitar esta función." msgid "Wiki syntax for comments" msgstr "Sintaxis wiki para los comentarios" msgid "Accept trackbacks" msgstr "Aceptar retroenlaces" msgid "Moderate trackbacks" msgstr "Moderar los retroenlaces" #, php-format msgid "Leave trackbacks open for %s days" msgstr "Dejar los retroenlaces abiertos durante %s días" msgid "Add \"nofollow\" relation on comments and trackbacks links" msgstr "Añadir la relación «nofollow» a los enlaces de los comentarios y retroenlaces" msgid "Blog presentation" msgstr "Presentación del blog" msgid "Date format:" msgstr "Formato de fecha:" msgid "Time format:" msgstr "Formato de hora:" msgid "Display smilies on entries and comments" msgstr "Mostrar emoticones en las entradas y comentarios" #, php-format msgid "Display %s entries per page" msgstr "Mostrar %s entradas por página" #, php-format msgid "Display %s entries per feed" msgstr "Mostrar %s entradas por fuente" #, php-format msgid "Display %s comments per feed" msgstr "Mostrar %s comentarios por fuente" msgid "Truncate feeds" msgstr "Omitir las fuentes" msgid "Media and images" msgstr "Medios e imágenes" msgid "Generated image sizes (in pixels)" msgstr "Tamaños de las imágenes generadas (en píxeles)" msgid "Thumbnails:" msgstr "Miniaturas:" msgid "Small:" msgstr "Pequeño:" msgid "Medium:" msgstr "Medio:" msgid "Inserted image title" msgstr "Títulos de las imágenes insertadas" msgid "This defines image tag title when you insert it in a post from the media manager. It is retrieved from the picture's metadata." msgstr "Esto define el título de la etiqueta de una imagen insertada desde el gestor de medios. La información se obtiene de los metadatos de la imagen." msgid "Search engines robots policy" msgstr "Política de los robots de los motores de búsqueda" msgid "Save" msgstr "Guardar" msgid "XML/RPC interface" msgstr "Interfaz XML/RPC" msgid "XML/RPC interface allows you to edit your blog with an external client." msgstr "La interfaz XML/RPC le permite editar su blog con un cliente externo." msgid "XML/RPC interface is not active. Change settings to enable it." msgstr "La interfaz XML/RPC no está activa. Cambie sus parámetros para activarla." msgid "XML/RPC interface is active. You should set the following parameters on your XML/RPC client:" msgstr "La interfaz XML/RPC está activa. Debería establecer los siguientes parámetros en su cliente XML/RPC:" msgid "Server URL:" msgstr "URL del servidor:" msgid "Blogging system:" msgstr "Sistema de blog:" msgid "User name:" msgstr "Usuario:" msgid "your password" msgstr "su contraseña" msgid "Users" msgstr "Usuarios" msgid "Users on this blog" msgstr "Usuarios de este blog" msgid "No users" msgstr "Ningún usuario" msgid "Change permissions" msgstr "cambiar los permisos" msgid "Super administrator" msgstr "Súper administrador" msgid "You can't remove default theme." msgstr "No puede eliminar el tema predeterminado." msgid "Theme does not exist." msgstr "El tema no existe." msgid "Unable to move uploaded file." msgstr "No fue posible mover el fichero descargado." msgid "An error occurred while downloading the file." msgstr "Se produjo un error durante la descarga del fichero." #, php-format msgid "by %s" msgstr "por %s" # , php-format #, php-format msgid "version %s" msgstr "versión %s" #, php-format msgid "(built on \"%s\")" msgstr "(basado en «%s»)" #, php-format msgid "(requires \"%s\")" msgstr "(precisa «%s»)" msgid "Stylesheet" msgstr "Hoja de estilos" #, fuzzy msgid "Configure theme" msgstr "Temas del blog" msgid "Blog appearance" msgstr "Aspecto del blog" msgid "Theme has been successfully changed." msgstr "Tema cambiado con éxito." msgid "Theme has been successfully installed." msgstr "El tema se ha instalado con éxito." msgid "Theme has been successfully upgraded" msgstr "El tema se ha actualizado con éxito" msgid "Theme has been successfully deleted." msgstr "El tema se ha borrado con éxito." #, php-format msgid "You can find additional themes for your blog on %s." msgstr "Puede encontrar más temas para su blog en %s." msgid "To install or upgrade a theme you generally just need to upload it in \"Install or upgrade a theme\" section." msgstr "Para instalar o actualizar un tema, generalmente sólo necesita enviarlo a la sección «Instalar o actualizar un tema»." msgid "Themes" msgstr "Temas" #, php-format msgid "You are currently using \"%s\"" msgstr "Actualmente está usando «%s»" #, fuzzy msgid "Use selected theme" msgstr "usar el tema seleccionado" #, fuzzy msgid "Delete selected theme" msgstr "borrar el tema seleccionado" msgid "Install or upgrade a theme" msgstr "Instalar o actualizar un tema" msgid "You can install themes by uploading or downloading zip files." msgstr "Puede instalar nuevos temas enviando o descargando ficheros zip." msgid "Upload a zip file" msgstr "Enviar un fichero zip" msgid "Theme zip file:" msgstr "Fichero zip del tema:" msgid "Upload theme" msgstr "Enviar un tema" msgid "Download a zip file" msgstr "Descargar un fichero zip" msgid "Theme zip file URL:" msgstr "URL del fichero zip del tema:" msgid "Download theme" msgstr "Descargar el tema" msgid "To enable this function, please give write access to your themes directory." msgstr "Para habilitar esta función, conceda permisos de escritura a su directorio de temas." msgid "Theme configuration" msgstr "Configuración del tema" msgid "back" msgstr "atrás" msgid "Last update" msgstr "Última actualización" msgid "Blog name" msgstr "Nombre del blog" msgid "Blog ID" msgstr "ID del blog" msgid "Descending" msgstr "Descendente" msgid "Ascending" msgstr "Ascendente" msgid "List of blogs" msgstr "Lista de blogs" msgid "Blog has been successfully deleted." msgstr "El blog ha sido borrado con éxito." msgid "Create a new blog" msgstr "Crear un nuevo blog" msgid "Filters" msgstr "Filtros" msgid "Order by:" msgstr "Ordenar por:" msgid "Sort:" msgstr "Ordenar:" msgid "Search:" msgstr "Buscar:" msgid "Blogs per page" msgstr "Blogs por página" #, fuzzy msgid "Apply filters" msgstr "Añadir ficheros" msgid "No blog" msgstr "No hay blog" msgid "Page(s)" msgstr "Página(s)" msgid "Entries" msgstr "Entradas" msgid "Status" msgstr "Estado" #, php-format msgid "Edit blog %s" msgstr "Modificar el blog %s" msgid "edit" msgstr "modificar" #, php-format msgid "Switch to blog %s" msgstr "Pasar al blog %s" msgid "This category does not exist." msgstr "Esta categoría no existe." msgid "Categories" msgstr "Categorías" msgid "The category has been successfully created." msgstr "La categoría ha sido creada con éxito." msgid "The category has been successfully removed." msgstr "La categoría se ha eliminado con éxito." msgid "Categories have been successfully reordered." msgstr "Las categorías se han reordenado con éxito." msgid "The category has been successfully moved." msgstr "La categoría se ha movido con éxito." msgid "No category yet." msgstr "Ninguna categoría todavía." msgid "Categories list" msgstr "Lista de categorías" #, php-format msgid "%d entries" msgstr "%d entradas" #, php-format msgid "%d entry" msgstr "%d entrada" msgid "total:" msgstr "total:" msgid "URL:" msgstr "URL:" msgid "Add a new category" msgstr "Añadir una nueva categoría" msgid "Title:" msgstr "Título:" msgid "Parent:" msgstr "Padre:" msgid "Top level" msgstr "Primer nivel" msgid "Remove a category" msgstr "Eliminar una categoría" msgid "Choose a category to remove:" msgstr "Elija la categoría a eliminar:" msgid "Delete" msgstr "Borrar" msgid "Reorder categories" msgstr "Reordenar las categorías" msgid "This will relocate all categories on the top level" msgstr "Esto reubicará todas las categorías al primer nivel" msgid "Reorder" msgstr "Reordenar" msgid "New category" msgstr "Nueva categoría" msgid "Category has been successfully updated." msgstr "Categoría actualizada con éxito." msgid "Category information" msgstr "Información de la categoría" msgid "Warning: If you set the URL manually, it may conflict with another category." msgstr "Aviso: si indica manualmente el URL, ésta podría entrar en conflicto con otra categoría." msgid "Description:" msgstr "Descripción:" msgid "Move this category" msgstr "Mover esta categoría" msgid "Category parent" msgstr "Padre de la categoría" msgid "Category sibling" msgstr "Hermano de la categoría" msgid "Move current category" msgstr "Mover la categoría actual" msgid "after" msgstr "después" msgid "before" msgstr "antes" #, fuzzy msgid "position: " msgstr "Disposición del MP3" msgid "Entry does not exist." msgstr "La entrada no existe." msgid "No comment" msgstr "Ningún comentario" msgid "You can't edit this comment." msgstr "No puede modificar este comentario." msgid "Edit comment" msgstr "Modificar el comentario" msgid "Comment has been successfully updated." msgstr "El comentario se ha actualizado con éxito." #, php-format msgid "Your comment on my blog %s" msgstr "Su comentario en mi blog %s" #, php-format msgid "" "Hi!\n" "\n" "You wrote a comment on:\n" "%s\n" "\n" "\n" msgstr "" "¡Hola!\n" "\n" "Ha escrito un comentario en:\n" "%s\n" "\n" "\n" msgid "Send an e-mail" msgstr "Enviar un correo electrónico" msgid "IP address:" msgstr "Dirección IP:" msgid "Date:" msgstr "Fecha:" msgid "Author:" msgstr "Autor:" msgid "Web site:" msgstr "Sitio web:" msgid "Status:" msgstr "Estado:" msgid "Comment:" msgstr "Comentario:" msgid "comment" msgstr "comentario" msgid "trackback" msgstr "retroenlace" msgid "Date" msgstr "Fecha" msgid "Entry title" msgstr "Título de la entrada" msgid "Author" msgstr "Autor" msgid "publish" msgstr "publicar" msgid "unpublish" msgstr "no publicado" msgid "mark as pending" msgstr "marcar como pendiente" msgid "mark as junk" msgstr "marcar como no deseado" msgid "Type:" msgstr "Tipo:" msgid "Comments per page" msgstr "Comentarios por página" msgid "Comment author:" msgstr "Autor del comentario:" msgid "You have one spam comments." msgstr "Tiene un comentario no deseado." msgid "Show it." msgstr "Mostrarlo." #, php-format msgid "You have %s spam comments." msgstr "Tiene %s comentarios no deseados." msgid "Show them." msgstr "Mostrarlos." msgid "Selected comments action:" msgstr "Acción sobre los comentarios seleccionados:" #, fuzzy msgid "action: " msgstr "Acción" msgid "ok" msgstr "aceptar" msgid "Comments" msgstr "Comentarios" #, php-format msgid "%d comment" msgstr "%d comentario" #, php-format msgid "%d comments" msgstr "%d comentarios" msgid "New entry" msgstr "Nueva entrada" #, fuzzy msgid "My preferences" msgstr "Preferencias del usuario" #, fuzzy msgid "Documentation and support" msgstr "Documentación" msgid "Latest news" msgstr "Últimas noticias" msgid "Dashboard" msgstr "Tablero de mandos" msgid "Make this blog my default blog" msgstr "Definir como blog predeterminado" msgid "This blog is offline" msgstr "Este blog no está publicado" msgid "This blog is removed" msgstr "Este blog está suprimido" #, fuzzy msgid "is not defined, you should edit your configuration file." msgstr "DC_ADMIN_URL no está definido, debería corregir su fichero de configuración." msgid "Following plugins have been installed:" msgstr "Se han instalado los siguientes complementos:" msgid "Following plugins have not been installed:" msgstr "No se han instalado los siguientes complementos:" # , php-format #, php-format msgid "Dotclear %s is available!" msgstr "¡Está disponible Dotclear %s!" msgid "Upgrade now" msgstr "Actualizar ahora" msgid "Remind me later" msgstr "Recordármelo más tarde" msgid "Information about this version." msgstr "" #, fuzzy msgid "Some plugins are installed twice:" msgstr "Se han instalado los siguientes complementos:" msgid "Quick entry" msgstr "Entrada rápida" msgid "Content:" msgstr "Contenido:" msgid "Category:" msgstr "Categoría:" #, fuzzy msgid "Save and publish" msgstr "guardar y publicar" #, php-format msgid "PHP version is %s (5.0 or earlier needed)." msgstr "La versión de PHP es %s (se necesita 5.0 o posterior)." msgid "Multibyte string module (mbstring) is not available." msgstr "El soporte de multibyte (mbstring) no está disponible." msgid "Iconv module is not available." msgstr "El módulo iconv no está disponible." msgid "Output control functions are not available." msgstr "Las funciones de control de salida no están disponibles." msgid "SimpleXML module is not available." msgstr "El módulo SimpleXML no está disponible." msgid "DOM XML module is not available." msgstr "El módulo DOM XML no está disponible." msgid "PCRE engine does not support UTF-8 strings." msgstr "El motor de expresiones racionales PCRE no gestiona las cadenas UTF-8." msgid "SPL module is not available." msgstr "El módulo SPL no está disponible." #, php-format msgid "MySQL version is %s (4.1 or earlier needed)." msgstr "La versión de MySQL es %s (4.1 o más reciente necesaria)." msgid "MySQL InnoDB engine is not available." msgstr "El sistema de almacenamiento InnoDB de MySQL no está disponible." #, php-format msgid "PostgreSQL version is %s (8.0 or earlier needed)." msgstr "La versión de PostgreSQL es %s (8.0 o más reciente necesaria)." msgid "Please set a master key (DC_MASTER_KEY) in configuration file." msgstr "Indique una clave de referencia (DC_MASTER_KEY) en el fichero de configuración." msgid "Dotclear is already installed." msgstr "Dotclear ya está instalado." msgid "Dotclear cannot be installed." msgstr "Dotclear no se puede instalar." msgid "No user ID given" msgstr "La ID de usuario no ha sido especificada" msgid "User ID must contain at least 2 characters using letters, numbers or symbols." msgstr "La ID del usuario debe contener al menos 2 caracteres compuestos por letras, cifras o símbolos." msgid "Invalid email address" msgstr "Dirección de correo electrónico no válida" msgid "No password given" msgstr "La contraseña no ha sido especificada" msgid "Password must contain at least 6 characters." msgstr "La contraseña debe tener al menos 6 caracteres." msgid "My first blog" msgstr "Mi primer blog" msgid "%A, %B %e %Y" msgstr "" msgid "Welcome to Dotclear!" msgstr "Bienvenido a Dotclear" msgid "This is your first entry. When you're ready to blog, log in to edit or delete it." msgstr "Ésta es su primera entrada. Cuando esté preparado para bloguear, inicie una sesión para editarla o borrarla." msgid "Dotclear Team" msgstr "El equipo de Dotclear" msgid "" "

    This is a comment.

    \n" "

    To delete it, log in and view your blog's comments. Then you might remove or edit it.

    " msgstr "" "

    Esto es un comentario.

    \n" "

    Para borrarlo, inicie sesión y vea los comentarios de su blog. Entonces podrá eliminarlo o borrarlo.

    " #, fuzzy msgid "Dotclear Install" msgstr "Instalación de Dotclear" msgid "show" msgstr "mostrar" msgid "Dotclear installation" msgstr "Instalación de Dotclear" #, php-format msgid "Cache directory %s is not writable." msgstr "No se puede escribir en el directorio de cache %s." msgid "Errors:" msgstr "Errores:" msgid "Configuration file has been successfully created." msgstr "El fichero de configuración ha sido creado con éxito." msgid "User information" msgstr "Información del usuario" msgid "Please provide the following information needed to create the first user." msgstr "Por favor, introduzca la siguiente información para crear el primer usuario." msgid "First Name:" msgstr "Nombre:" msgid "Last Name:" msgstr "Apellidos:" msgid "Username and password" msgstr "Usuario y contraseña" msgid "All done!" msgstr "Fin" msgid "Dotclear has been successfully installed. Here is some useful information you should keep." msgstr "Dotclear se ha instalado con éxito. Aquí tiene algunos datos útiles que debería conservar." msgid "Your account" msgstr "Su cuenta" msgid "Your blog" msgstr "Su blog" msgid "Blog address:" msgstr "Dirección del blog:" msgid "Administration interface:" msgstr "Interfaz de administración:" msgid "Manage your blog now" msgstr "Gestione su blog ahora" msgid "Installation can not be completed" msgstr "" msgid "For the said reasons, Dotclear can not be installed. Please refer to the documentation to learn how to correct the problem." msgstr "" #, php-format msgid "File %s does not exist." msgstr "El fichero %s no existe." #, php-format msgid "Cannot write %s file." msgstr "No se puede escribir el fichero %s." msgid "Dotclear installation wizard" msgstr "Asistente de instalación de Dotclear" msgid "Welcome" msgstr "" msgid "To complete your Dotclear installation and start writing on your blog, we just need to know how to access your database and who you are. Just fill this two steps wizard with this information and we will be done." msgstr "" #, fuzzy msgid "Attention:" msgstr "Acción" msgid "this wizard may not function on every host. If it does not work for you, please refer to the documentation to learn how to create the config.php file manually." msgstr "" msgid "System information" msgstr "Información del sistema" msgid "Please provide the following information needed to create your configuration file." msgstr "Por favor, indique la información siguiente para crear su fichero de configuración." msgid "Database type:" msgstr "Tipo de base de datos:" msgid "Database Host Name:" msgstr "Nombre del servidor de la base de datos:" msgid "Database Name:" msgstr "Nombre de la base de datos:" msgid "Database User Name:" msgstr "Usuario de la base de datos:" msgid "Database Password:" msgstr "Contraseña de la base de datos:" msgid "Database Tables Prefix:" msgstr "Prefijo de las tablas de la base de datos:" #, fuzzy msgid "Continue" msgstr "Contenido:" msgid "No such installed language" msgstr "No está instalado ese idioma" msgid "You can't remove English language." msgstr "No puede eliminar el idioma inglés." msgid "Permissions to delete language denied." msgstr "Permiso para borrar el idioma denegado." msgid "Invalid language file URL." msgstr "URL del fichero de idioma no válido." msgid "Languages management" msgstr "Gestión de los idiomas" msgid "Language has been successfully deleted." msgstr "El idioma se ha borrado con éxito." msgid "Language has been successfully installed." msgstr "El idioma se ha instalado con éxito." msgid "Language has been successfully upgraded" msgstr "El idioma se ha actualizado con éxito" msgid "Here you can install, upgrade or remove languages for your Dotclear installation." msgstr "Aquí puede instalar, actualizar o eliminar idiomas de su instalación de Dotclear." #, php-format msgid "You can change your user language in your preferences or change your blog's main language in your blog settings." msgstr "Puede cambiar su idioma de usuario en sus preferencias o cambiar el idioma principal de su blog en los ajustes de su blog." msgid "Installed languages" msgstr "Idiomas instalados" msgid "No additional language is installed." msgstr "No hay instalado ningún idioma más." msgid "Language" msgstr "Idioma" msgid "Action" msgstr "Acción" msgid "Install or upgrade languages" msgstr "Instalar o actualizar los idiomas" #, php-format msgid "You can install or remove a language by adding or removing the relevant directory in your %s folder." msgstr "Puede instalar o eliminar un idioma añadiendo o eliminando el directorio correspondiente en su carpeta %s." msgid "Available languages" msgstr "Idiomas disponibles" #, php-format msgid "You can download and install a additional language directly from Dotclear.net. Proposed languages are based on your version: %s." msgstr "Puede descargar e instalar más idiomas directamente desde Dotclear.net. Los idiomas propuestos se basan en su versión: %s." msgid "Language:" msgstr "Idioma:" msgid "Install language" msgstr "Instalar el idioma" msgid "You can install languages by uploading zip files." msgstr "Puede instalar idiomas enviando ficheros zip." msgid "Language zip file:" msgstr "Fichero zip del idioma:" msgid "Upload language" msgstr "Enviar un idioma" msgid "Invalid language zip file." msgstr "Fichero zip de idioma no válido." msgid "The zip file does not appear to be a valid Dotclear language pack." msgstr "El fichero zip no parece ser un paquete de idioma válido para Dotclear." msgid "An error occurred during language upgrade." msgstr "Se produjo un error durante la actualización del idioma." msgid "Error:" msgstr "Error:" msgid "By names, in ascending order" msgstr "Por nombres, ascendente" msgid "By names, in descending order" msgstr "Por nombres, descendente" msgid "By dates, in ascending order" msgstr "Por fechas, ascendente" msgid "By dates, in descending order" msgstr "Por fechas, descendente" msgid "Media manager" msgstr "Gestor de medios" msgid "confirm removal" msgstr "confirmar la eliminación" #, php-format msgid "Are you sure you want to remove %s?" msgstr "¿Seguro que desea eliminar %s ?" msgid "Cancel" msgstr "cancelar" msgid "Yes" msgstr "sí" msgid "Directory has been successfully created." msgstr "Directorio creado satisfactoriamente." msgid "Files have been successfully uploaded." msgstr "Los ficheros se han enviado con éxito." msgid "File has been successfully removed." msgstr "El fichero ha sido eliminado con éxito." msgid "Directory has been successfully removed." msgstr "El directorio ha sido eliminado con éxito." msgid "Directory has been successfully rebuilt." msgstr "El directorio ha sido reconstruido con éxito." msgid "Zip file has been successfully extracted." msgstr "El fichero zip se ha extraído con éxito." #, php-format msgid "Choose a file to attach to entry %s by clicking on %s." msgstr "Elija un fichero para adjuntar a la entrada %s pulsando en %s." msgid "Attach this file to entry" msgstr "Adjuntar este fichero a la entrada" #, php-format msgid "Choose a file to insert into entry by clicking on %s." msgstr "Elija un fichero para insertarlo en la entrada pulsando en %s." msgid "No file." msgstr "Ningún fichero." msgid "Sort files:" msgstr "Ordenar los ficheros:" #, fuzzy msgid "Sort" msgstr "Ordenar:" msgid "Add files" msgstr "Añadir ficheros" msgid "Please take care to publish media that you own and that are not protected by copyright." msgstr "Por favor, tenga el cuidado de publicar sólo medios que le pertenezcan o que no estén protegidos contra copia." msgid "Choose a file:" msgstr "Elija un fichero:" #, php-format msgid "Maximum size %s" msgstr "Tamaño máximo %s" msgid "Private" msgstr "Privado" msgid "To send several files at the same time, you can activate the enhanced uploader in" msgstr "" msgid "Send" msgstr "" msgid "New directory" msgstr "Nuevo directorio" msgid "Directory Name:" msgstr "Nombre del directorio:" msgid "Download this directory as a zip file" msgstr "Descargar este directorio como un fichero zip" msgid "open" msgstr "abrir" msgid "Insert this file into entry" msgstr "Insertar este fichero en la entrada" #, fuzzy msgid "delete" msgstr "Borrar" msgid "Not a valid file" msgstr "Fichero no válido" msgid "File has been successfully updated." msgstr "El fichero se ha actualizado con éxito." msgid "Thumbnails have been successfully updated." msgstr "Las miniaturas se han actualizado con éxito." msgid "Insert media item" msgstr "Insertar un elemento multimedia" msgid "Image size:" msgstr "Tamaño de la imagen:" msgid "original" msgstr "original" msgid "Image alignment" msgstr "Alineación de la imagen" msgid "None" msgstr "Ninguna" msgid "Left" msgstr "Izquierda" msgid "Right" msgstr "Derecha" msgid "Center" msgstr "Centro" msgid "Image insertion" msgstr "Inserción de imagen" msgid "As a single image" msgstr "Como una única imagen" msgid "As a link to original image" msgstr "Como enlace a la imagen original" msgid "MP3 disposition" msgstr "Disposición del MP3" msgid "Please note that you cannot insert mp3 files with visual editor." msgstr "Tenga en cuenta que no puede insertar ficheros MP3 con el editor visual." msgid "Please note that you cannot insert video files with visual editor." msgstr "Tenga en cuenta que no puede insertar ficheros de vídeo con el editor visual." msgid "Video size" msgstr "Tamaño del vídeo" msgid "Width:" msgstr "Anchura:" msgid "Height:" msgstr "Altura:" msgid "Video disposition" msgstr "Disposición del vídeo" msgid "Media item will be inserted as a link." msgstr "El elemento multimedia se insertará como un enlace." msgid "Insert" msgstr "Insertar" msgid "Media details" msgstr "Detalles del elemento multimedia" msgid "Available sizes:" msgstr "Tamaños disponibles:" msgid "File owner:" msgstr "Propietario del fichero:" msgid "File type:" msgstr "Tipo de fichero:" msgid "File size:" msgstr "Tamaño del fichero:" msgid "File URL:" msgstr "URL del fichero:" msgid "Show entries containing this media" msgstr "Mostrar las entradas que contengan este elemento multimedia" msgid "Entries containing this media" msgstr "Entradas que contengan este elemento multimedia" msgid "No entry seems contain this media." msgstr "No parece que haya ninguna entrada que contenga este elemento multimedia." msgid "Image details" msgstr "Detalles de la imagen" msgid "No detail" msgstr "Sin detalles" msgid "Update thumbnails" msgstr "Actualizar las miniaturas" msgid "This will create or update thumbnails for this image." msgstr "Esto creará o actualizará las miniaturas de esta imagen." msgid "Extract in a new directory" msgstr "Extraer en un nuevo directorio" msgid "Extract in current directory" msgstr "Extraer en el directorio actual" msgid "Extract archive" msgstr "Extraer el archivo" #, fuzzy msgid "This will extract archive in a new directory that should not exist yet." msgstr "Esto extraerá el archivo en un nuevo directorio que no debería existir todavía." msgid "This will extract archive in current directory and will overwrite existing files or directory." msgstr "Esto extraerá el archivo en el directorio actual y sobrescribirá los ficheros o directorios ya existentes." msgid "Extract mode:" msgstr "Modo de extracción:" #, fuzzy msgid "Extract" msgstr "extraer" msgid "Change media properties" msgstr "Cambiar las propiedades del elemento multimedia" msgid "File name:" msgstr "Nombre del fichero:" msgid "File title:" msgstr "Título del fichero:" msgid "File date:" msgstr "Fecha del fichero:" msgid "New directory:" msgstr "Nuevo directorio:" msgid "Change file" msgstr "Cambiar el fichero" msgid "No blog or user given." msgstr "No ha indicado el blog o el usuario." msgid "permissions" msgstr "permisos" msgid "Permissions" msgstr "Permisos" msgid "The permissions have been successfully updated." msgstr "Los permisos se han actualizado con éxito." #, php-format msgid "You are about to change permissions on the following blogs for users %s." msgstr "Se dispone a cambiar los permisos de los usuarios %s para los siguientes blogs." #, fuzzy msgid "Validate permissions" msgstr "establecer los permisos" msgid "choose a blog" msgstr "elija un blog" msgid "Choose a blog" msgstr "Elija un blog" msgid "Entries per page" msgstr "Entradas por página" #, php-format msgid "Choose one or more blogs to which you want to give permissions to users %s." msgstr "Elija uno o más blogs sobre los que quiera dar permisos a los siguientes usuarios: %s." msgid "Set permissions" msgstr "establecer los permisos" #, fuzzy msgid "select" msgstr "seleccionado" msgid "No content found on this plugin." msgstr "No hay ningún contenido para este complemento." msgid "Plugin not found" msgstr "Complemento no encontrado" msgid "The plugin you reached does not exist or does not have an admin page." msgstr "El complemento que busca no existe o no tiene página de administración." msgid "No such plugin." msgstr "Complemento inexistente." msgid "You don't have permissions to delete this plugin." msgstr "No tiene permisos para borrar este complemento." msgid "You don't have permissions to deactivate this plugin." msgstr "No tiene permisos para desactivar este complemento." msgid "Plugins management" msgstr "Gestión de los complementos" msgid "Plugin has been successfully deleted." msgstr "El complemento se ha borrado con éxito." msgid "Plugin has been successfully installed." msgstr "El complemento se ha instalado con éxito." msgid "Plugin has been successfully upgraded" msgstr "El complemento se ha actualizado con éxito" msgid "Plugins add new functionalities to Dotclear. Here you can activate or deactivate installed plugins." msgstr "Los complementos añaden nuevas funcionalidades a Dotclear. Aquí puede activar o desactivar los complementos instalados." #, php-format msgid "You can find additional plugins for your blog on %s." msgstr "Puede buscar más complementos para su blog en %s." msgid "To install or upgrade a plugin you generally just need to upload it in \"Install or upgrade a plugin\" section." msgstr "Para instalar o actualizar un complemento, generalmente sólo necesita enviarlo desde la sección «Instalar o actualizar un complemento»." msgid "To install or upgrade a plugin you just need to extract it in your plugins directory." msgstr "Para instalar o actualizar un complemento sólo necesita extraerlo en su directorio de complementos." msgid "Plugins" msgstr "Complementos" msgid "Activated plugins" msgstr "Complementos activados" msgid "Plugin" msgstr "Complemento" msgid "Version" msgstr "Versión" msgid "Details" msgstr "Detalles" msgid "Deactivate" msgstr "Desactivar" msgid "Deactivated plugins" msgstr "Complementos desactivados" msgid "Activate" msgstr "Activar" msgid "Install or upgrade a plugin" msgstr "Instalar o actualizar un complemento" msgid "You can install plugins by uploading or downloading zip files." msgstr "Puede instalar complementos enviando o descargando ficheros zip." msgid "Plugin zip file:" msgstr "Fichero zip del complemento:" msgid "Upload plugin" msgstr "Enviar el complemento" msgid "Plugin zip file URL:" msgstr "URL del fichero zip del complemento:" msgid "Download plugin" msgstr "Descargar el complemento" msgid "To enable this function, please give write access to your plugins directory." msgstr "Para habilitar esta función, conceda acceso de escritura a su directorio de complementos." msgid "Add a link" msgstr "Añadir un enlace" msgid "Available" msgstr "Disponible" msgid "Most used" msgstr "Los más usados" msgid "Link URL:" msgstr "URL del enlace:" #, fuzzy msgid "Link title:" msgstr "Título del fichero:" msgid "Link language:" msgstr "Idioma del enlace:" msgid "Add a link to an entry" msgstr "Añadir un enlace a una entrada" msgid "Search entry:" msgstr "Buscar una entrada:" msgid "Search" msgstr "Buscar" #, fuzzy msgid "cancel" msgstr "cancelar" msgid "This entry does not exist." msgstr "Esta entrada no existe." msgid "Edit entry" msgstr "Modificar entrada" msgid "next entry" msgstr "entrada siguiente" msgid "previous entry" msgstr "entrada precedente" msgid "Entry has been successfully updated." msgstr "Entrada actualizada con éxito." msgid "Entry has been successfully created." msgstr "Entrada creada con éxito." msgid "File has been successfully attached." msgstr "Fichero adjuntado con éxito." msgid "Attachment has been successfully removed." msgstr "Fichero adjunto eliminado con éxito." msgid "Comment has been successfully created." msgstr "El comentario se ha creado con éxito." msgid "Don't forget to validate your XHTML conversion by saving your post." msgstr "No olvide validar su conversión XHTML guardando su post." msgid "Go to this entry on the site" msgstr "" msgid "new window" msgstr "" msgid "Excerpt:" msgstr "Extracto:" msgid "Notes:" msgstr "Notas:" #, fuzzy msgid "Preview" msgstr "Previsualizar la entrada" msgid "Entry status:" msgstr "Estado de la entrada:" msgid "Published on:" msgstr "Publicado el:" msgid "Text formating:" msgstr "Formato del texto:" msgid "Convert to XHTML" msgstr "Convertir a XHTML" msgid "Selected entry" msgstr "Entrada seleccionada" msgid "Entry lang:" msgstr "Idioma de la entrada:" msgid "Entry password:" msgstr "Contraseña de la entrada:" msgid "Basename:" msgstr "URL específico:" msgid "Warning: If you set the URL manually, it may conflict with another entry." msgstr "Atención: si indica manualmente el URL, éste podría entrar en conflicto con otra entrada." msgid "Ping blogs" msgstr "Hacer ping a blogs" msgid "Trackbacks" msgstr "Retroenlaces" msgid "No trackback" msgstr "Ningún retroenlace" msgid "Add a comment" msgstr "Añadir un comentario" msgid "Name:" msgstr "Apellido:" msgid "IP address" msgstr "Dirección IP" msgid "published" msgstr "publicado" msgid "unpublished" msgstr "no publicado" msgid "pending" msgstr "en espera" msgid "junk" msgstr "no deseado" #, fuzzy msgid "select this comment" msgstr "Modificar este comentario" #, fuzzy msgid "select this trackback" msgstr "Aceptar retroenlaces" msgid "Edit this comment" msgstr "Modificar este comentario" msgid "This attachment does not exist" msgstr "Este fichero adjunto no existe" msgid "Remove attachment" msgstr "Eliminar el fichero adjunto" msgid "Attachment" msgstr "Fichero adjunto" msgid "Are you sure you want to remove this attachment?" msgstr "¿Seguro que desea eliminar este fichero adjunto?" msgid "selected" msgstr "seleccionado" msgid "not selected" msgstr "no seleccionado" msgid "Category" msgstr "Categoría" msgid "Selected" msgstr "Seleccionado" msgid "Publish" msgstr "Publicar" msgid "Unpublish" msgstr "No publicar" msgid "Schedule" msgstr "Planificar" msgid "Mark as pending" msgstr "Marcar como pendiente" msgid "Mark" msgstr "Marcar" msgid "Mark as selected" msgstr "Marcar como seleccionado" msgid "Mark as unselected" msgstr "Marcar como no seleccionado" msgid "Change" msgstr "Cambiar" msgid "Change category" msgstr "Cambiar la categoría" msgid "Change author" msgstr "Cambiar el autor" msgid "Selected:" msgstr "Seleccionado:" msgid "Month:" msgstr "Mes:" msgid "Lang:" msgstr "Idioma:" msgid "Selected entries action:" msgstr "Acción sobre las entradas seleccionadas:" msgid "This user does not exist" msgstr "Este usuario no existe" msgid "Change category for entries" msgstr "Cambiar la categoría de las entradas" msgid "Change author for entries" msgstr "Cambiar el autor de las entradas" msgid "Author ID:" msgstr "Identificativo del autor:" msgid "Default" msgstr "" msgid "If you want to change your email or password you must provide your current password." msgstr "Si desea cambiar su dirección de correo electrónico o contraseña debe proporcionar su contraseña actual." #, fuzzy msgid "No favorite selected" msgstr "no seleccionado" msgid "Personal information has been successfully updated." msgstr "Información personal actualizada con éxito." #, fuzzy msgid "Personal options has been successfully updated." msgstr "Información personal actualizada con éxito." #, fuzzy msgid "Favorites have been successfully added." msgstr "Los ficheros se han enviado con éxito." #, fuzzy msgid "Favorites have been successfully updated." msgstr "El fichero se ha actualizado con éxito." #, fuzzy msgid "Favorites have been successfully removed." msgstr "El fichero ha sido eliminado con éxito." #, fuzzy msgid "Default favorites have been successfully updated." msgstr "Las miniaturas se han actualizado con éxito." msgid "My profile" msgstr "" msgid "Display name:" msgstr "Seudónimo :" msgid "User language:" msgstr "Idioma del usuario:" msgid "User timezone:" msgstr "Huso horario del usuario:" #, fuzzy msgid "If you have changed this user email or password you must provide your current password to save these modifications." msgstr "Si desea cambiar su dirección de correo electrónico o contraseña debe proporcionar su contraseña actual." #, fuzzy msgid "My options" msgstr "Opciones de búsqueda" msgid "Preferred format:" msgstr "Formato de edición :" msgid "Default entry status:" msgstr "Estado predeterminado de las entradas:" msgid "Entry edit field height:" msgstr "Tamaño de la zona de edición:" msgid "Enable WYSIWYG mode" msgstr "Habilitar el modo WYSIWYG" #, fuzzy msgid "Activate enhanced uploader in media manager" msgstr "Activar la interfaz avanzada" msgid "Iconset:" msgstr "" msgid "Do not use standard favicon" msgstr "" msgid "This will be applied for all users" msgstr "" msgid "Accessibility options" msgstr "" msgid "Disable javascript powered drag and drop for ordering items" msgstr "" msgid "Numeric fields will allow to type the elements' ordering number." msgstr "" #, fuzzy msgid "Dashboard modules" msgstr "Tablero de mandos" #, fuzzy msgid "Display documentation links" msgstr "Documentación" #, fuzzy msgid "Display Dotclear news" msgstr "Actualizar Dotclear" msgid "Display quick entry form" msgstr "" msgid "My favorites" msgstr "" #, php-format msgid "position of %s" msgstr "" #, fuzzy msgid "Save order" msgstr "Reordenar" #, fuzzy msgid "Delete selected favorites" msgstr "Borrar el fichero seleccionado" # , php-format #, fuzzy msgid "Are you sure you want to remove selected favorites?" msgstr "¿Seguro que desea reordenar todas las categorías?" msgid "If you are a super administrator, you may define this set of favorites to be used by default on all blogs of this installation:" msgstr "" msgid "Define as default favorites" msgstr "" msgid "Currently no personal favorites." msgstr "" msgid "Default favorites" msgstr "" msgid "Those favorites are displayed when My Favorites list is empty." msgstr "" #, fuzzy msgid "Available favorites" msgstr "Tamaños disponibles:" msgid "Add to my favorites" msgstr "" msgid "Search options" msgstr "Opciones de búsqueda" msgid "Query:" msgstr "Consulta:" #, fuzzy msgid "Search entries" msgstr "buscar entradas" #, fuzzy msgid "Search comments" msgstr "buscar comentarios" msgid "schedule" msgstr "planificar" msgid "change category" msgstr "cambiar la categoría" msgid "change author" msgstr "cambiar el autor" #, php-format msgid "%d entries found" msgstr "%d entradas encontradas" #, php-format msgid "%d entry found" msgstr "%d entrada encontrada" #, php-format msgid "%d comment found" msgstr "%d comentario encontrado" #, php-format msgid "%d comments found" msgstr "%d comentarios encontrados" msgid "This entry does not exist or is not published" msgstr "Esta entrada no existe o no ha sido publicada" msgid "All pings sent." msgstr "Todos los pings han sido enviados." #, php-format msgid "Back to \"%s\"" msgstr "Volver a «%s»" msgid "Auto discover ping URLs" msgstr "Descubrimiento automático de las URL ping" msgid "URLs to ping:" msgstr "URL a las que enviar un ping:" msgid "Send excerpt:" msgstr "Enviar el extracto:" msgid "Previously sent pings" msgstr "Pings ya enviados" msgid "Dotclear update" msgstr "Actualización de Dotclear" # , php-format #, php-format msgid "Unable to delete file %s" msgstr "No es posible borrar el fichero %s" #, php-format msgid "Downloaded Dotclear archive seems to be corrupted. Try download it again." msgstr "El archivo de Dotclear descargado parece estar dañado. Intente descargarlo de nuevo." msgid "The following files of your Dotclear installation have been modified so we won't try to update your installation. Please try to update manually." msgstr "Los siguientes ficheros de su instalación de Dotclear han sido modificados, por lo que no se intenta actualizar su instalación. Intente actualizarla manualmente." #, php-format msgid "The following files of your Dotclear installation are not readable. Please fix this or try to make a backup file named %s manually." msgstr "Los siguientes ficheros de su instalación de Dotclear no se pueden leer. Solucione esto o intente hacer un fichero de respaldo llamado %s manualmente." msgid "The following files of your Dotclear installation cannot be written. Please fix this or try to update manually." msgstr "Los siguientes ficheros de su instalación de Dotclear no se pueden escribir. Solucione esto o intente actualizar manualmente." msgid "No newer Dotclear version available." msgstr "No hay disponible ninguna versión más moderna de Dotclear." # , php-format #, php-format msgid "Dotclear %s is available." msgstr "Está disponible Dotclear %s." msgid "To upgrade your Dotclear installation simply click on the following button. A backup file of your current installation will be created in your root directory." msgstr "Para actualizar su instalación de Dotclear, simplemente pulse el siguiente botón. Se creará un fichero de respaldo de su instalación actual en su directorio raíz." msgid "Update Dotclear" msgstr "Actualizar Dotclear" msgid "Update backup files" msgstr "Actualizar los ficheros de respaldo" msgid "The following files are backups of previously updates. You can revert your previous installation or delete theses files." msgstr "Los siguientes ficheros son respaldos de actualizaciones anteriores. Puede volver a su instalación anterior o borrar estos ficheros." msgid "Please note that reverting your Dotclear version may have some unwanted side-effects. Consider reverting only if you experience strong issues with this new version." msgstr "Tenga en cuenta que volver atrás en su versión de Dotclear puede tener algunas efectos laterales no deseados. Considere la posibilidad de retroceder sólo si experimenta importantes problemas con esta nueva versión." #, php-format msgid "You should not revert to version prior to last one (%s)." msgstr "No debería retroceder a una versión anterior a la última (%s)." msgid "Delete selected file" msgstr "Borrar el fichero seleccionado" msgid "Revert to selected file" msgstr "Restablecer el fichero seleccionado" msgid "Congratulations, you're one click away from the end of the update." msgstr "Enhorabuena, está a un clic del final de la actualización." msgid "Finish the update." msgstr "Finalizar la actualización." msgid "new user" msgstr "nuevo usuario" # , php-format #, php-format msgid "User \"%s\" already exists." msgstr "El usuario «%s» ya existe." msgid "User has been successfully updated." msgstr "Usuario actualizado con éxito." msgid "User has been successfully created." msgstr "Usuario creado con éxito." msgid "Warning:" msgstr "Aviso:" msgid "If you change your username, you will have to log in again." msgstr "Si cambia su nombre de usuario, tendrá que volver a iniciar sesión." msgid "Mandatory for password recovering procedure." msgstr "" msgid "Password change required to connect" msgstr "Se necesita un cambio de contraseña para conectar" msgid "Save and create another" msgstr "" msgid "No permissions." msgstr "Sin permisos." msgid "Add new permissions" msgstr "Añadir nuevos permisos" msgid "Username" msgstr "Usuario" msgid "Last Name" msgstr "Apellidos" msgid "First Name" msgstr "Nombre" msgid "Display name" msgstr "Seudónimo" msgid "Number of entries" msgstr "Número de entradas" msgid "users" msgstr "usuarios" msgid "User has been successfully removed." msgstr "Usuario eliminado con éxito." msgid "Create a new user" msgstr "Crear un nuevo usuario" msgid "Users per page" msgstr "Usuarios por página" msgid "Selected users action:" msgstr "Acción sobre los usuarios seleccionados:" msgid "Blog:" msgstr "Blog:" msgid "Change blog" msgstr "Cambiar de blog" msgid "Blogs:" msgstr "Blogs:" msgid "Go to site" msgstr "" #, fuzzy msgid "My dashboard" msgstr "Tablero de mandos" #, fuzzy, php-format msgid "Logout %s" msgstr "Cerrar la sesión" msgid "Safe mode" msgstr "" msgid "You are in safe mode. All plugins have been temporarily disabled. Remind to log out then log in again normally to get back all functionalities" msgstr "" #, php-format msgid "Thank you for using %s." msgstr "Gracias por usar %s." msgid "Help" msgstr "Ayuda" msgid "uncover" msgstr "descubrir" msgid "hide" msgstr "ocultar" msgid "help" msgstr "ayuda" #, fuzzy msgid "no selection" msgstr "Sin selección" msgid "select all" msgstr "Seleccionar todo" msgid "invert selection" msgstr "Invertir la selección" msgid "view entry" msgstr "ver la entrada" #, fuzzy, php-format msgid "Are you sure you want to delete selected entries (%s)?" msgstr "¿Seguro que desea borrar las entradas seleccionadas?" msgid "Are you sure you want to delete this entry?" msgstr "¿Seguro que desea borrar esta entrada?" #, fuzzy, php-format msgid "Are you sure you want to delete selected comments (%s)?" msgstr "¿Seguro que desea borrar los comentarios seleccionados?" msgid "Are you sure you want to delete this comment?" msgstr "¿Seguro que desea borrar este comentario?" msgid "Users with posts cannot be deleted." msgstr "Los usuarios que hayan escrito entradas no se pueden borrar." #, fuzzy, php-format msgid "Are you sure you want to delete selected users (%s)?" msgstr "¿Seguro que desea borrar los usuarios seleccionados?" # , php-format #, php-format msgid "Are you sure you want to delete category \"%s\"?" msgstr "¿Seguro que desea borrar la categoría «%s»?" # , php-format msgid "Are you sure you want to reorder all categories?" msgstr "¿Seguro que desea reordenar todas las categorías?" # , php-format #, php-format msgid "Are you sure you want to remove media \"%s\"?" msgstr "¿Seguro que desea eliminar el elemento multimedia «%s»?" msgid "Are you sure you want to extract archive in current directory?" msgstr "¿Seguro que desea extraer el archivo en el directorio actual?" # , php-format #, php-format msgid "Are you sure you want to remove attachment \"%s\"?" msgstr "¿Seguro que desea eliminar el adjunto «%s»?" # , php-format #, php-format msgid "Are you sure you want to delete \"%s\" language?" msgstr "¿Seguro que desea borrar el idioma «%s»?" # , php-format #, php-format msgid "Are you sure you want to delete \"%s\" plugin?" msgstr "¿Seguro que desea borrar el complemento «%s»?" msgid "Use this theme" msgstr "Usar este tema" msgid "Remove this theme" msgstr "Eliminar este tema" # , php-format #, php-format msgid "Are you sure you want to delete \"%s\" theme?" msgstr "¿Seguro que desea borrar el tema «%s»?" msgid "Zip file content" msgstr "Contenido del fichero zip" msgid "XHTML markup validator" msgstr "Validador de las etiquetas XHTML" msgid "XHTML content is valid." msgstr "El contenido XHTML es válido." msgid "There are XHTML markup errors." msgstr "Hay errores en las etiquetas XHTML." msgid "You have unsaved changes. Switch post format will loose these changes. Proceed anyway?" msgstr "" msgid "Loading enhanced uploader, please wait." msgstr "" msgid "You have unsaved changes." msgstr "No ha guardado sus modificaciones." msgid "close" msgstr "cerrar" msgid "now" msgstr "ahora" msgid "visual" msgstr "visual" msgid "source" msgstr "fuente" msgid "You can use the following shortcuts to format your text." msgstr "Puede utilizar los siguientes accesos directos para dar formato a su texto." msgid "-- none --" msgstr "-- ninguno --" msgid "-- block format --" msgstr "-- formato de bloque --" msgid "Paragraph" msgstr "Párrafo" msgid "Level 1 header" msgstr "Cabecera de nivel 1" msgid "Level 2 header" msgstr "Cabecera de nivel 2" msgid "Level 3 header" msgstr "Cabecera de nivel 3" msgid "Level 4 header" msgstr "Cabecera de nivel 4" msgid "Level 5 header" msgstr "Cabecera de nivel 5" msgid "Level 6 header" msgstr "Cabecera de nivel 6" msgid "Strong emphasis" msgstr "Énfasis fuerte" msgid "Emphasis" msgstr "Énfasis" msgid "Inserted" msgstr "Insertado" msgid "Deleted" msgstr "Borrado" msgid "Inline quote" msgstr "Cita en línea" msgid "Code" msgstr "Código" msgid "Line break" msgstr "Salto de línea" msgid "Blockquote" msgstr "Bloque de cita" msgid "Preformated text" msgstr "Texto preformateado" msgid "Unordered list" msgstr "Lista sin orden" msgid "Ordered list" msgstr "Lista numerada" msgid "Link" msgstr "Enlace" msgid "URL?" msgstr "¿URL?" msgid "Language?" msgstr "¿Idioma?" msgid "External image" msgstr "Imagen externa" msgid "Media chooser" msgstr "Selector de elementos multimedia" msgid "Link to an entry" msgstr "Enlace a una entrada" msgid "Temporarily activate enhanced uploader" msgstr "Activar la interfaz avanzada" msgid "Temporarily disable enhanced uploader" msgstr "Inhabilitar la interfaz avanzada" msgid "File successfully uploaded." msgstr "Fichero enviado con éxito." msgid "Maximum file size allowed:" msgstr "Tamaño máximo de fichero permitido:" msgid "Limit exceeded." msgstr "Límite sobrepasado." msgid "File size exceeds allowed limit." msgstr "El tamaño del fichero excede el límite permitido." msgid "Canceled." msgstr "Cancelado." msgid "HTTP Error:" msgstr "Error HTTP:" msgid "Choose file" msgstr "Elegir el fichero" msgid "Choose files" msgstr "Elegir los ficheros" msgid "Clean" msgstr "Limpiar" msgid "Upload" msgstr "Enviar" msgid "No file in queue." msgstr "No hay ningún fichero en la cola de espera." msgid "1 file in queue." msgstr "1 fichero en la cola." #, php-format msgid "%d files in queue." msgstr "%d ficheros en la cola." msgid "Queue error:" msgstr "Error de la cola de espera:" msgid "«prev." msgstr "«anterior" msgid "next»" msgstr "siguiente»" msgid "No entry" msgstr "No hay entrada" msgid "scheduled" msgstr "programado" msgid "protected" msgstr "protegido" #, php-format msgid "%d attachment" msgstr "%d adjunto" #, php-format msgid "%d attachments" msgstr "%d adjuntos" msgid "Type" msgstr "Tipo" msgid "No user" msgstr "No hay usuario" msgid "admin" msgstr "" #, fuzzy msgid "superadmin" msgstr "Súper administrador" #, fuzzy msgid "Database error" msgstr "Tipo de base de datos:" msgid "There seems to be no Session table in your database. Is Dotclear completly installed?" msgstr "" msgid "System" msgstr "Sistema" msgid "Blog" msgstr "Blog" msgid "Update" msgstr "Actualizaciones" msgid "Languages" msgstr "Idiomas" msgid "administrator" msgstr "administrador" msgid "manage their own entries and comments" msgstr "gestionar sus propias entradas y comentarios" msgid "publish entries and comments" msgstr "publicar entradas y comentarios" msgid "delete entries and comments" msgstr "eliminar entradas y comentarios" msgid "manage all entries and comments" msgstr "gestionar todas las entradas y comentarios" msgid "manage categories" msgstr "gestionar las categorías" msgid "manage their own media items" msgstr "gestionar sus propios media" msgid "manage all media items" msgstr "gestionar todos los media" msgid "That user does not exist in the database." msgstr "Ese usuario no existe en la base de datos." msgid "That key does not exist in the database." msgstr "Esa clave no existe en la base de datos." msgid "You are not allowed to add categories" msgstr "No está autorizado a crear categorías" msgid "You are not allowed to update categories" msgstr "No está autorizado a modificar categorías" msgid "You are not allowed to delete categories" msgstr "No está autorizado a eliminar categorías" msgid "This category is not empty." msgstr "Esta categoría no está vacía." msgid "Category URL must be unique." msgstr "El URL de cada categoría debe ser único." msgid "You must provide a category title" msgstr "Debe indicar un título para la categoría" msgid "You must provide a category URL" msgstr "Debe indicar un URL para la categoría" msgid "You are not allowed to create an entry" msgstr "No está autorizado a crear entradas" msgid "You are not allowed to update entries" msgstr "No está autorizado a actualizar las entradas" msgid "No such entry ID" msgstr "ID de entrada desconocida" msgid "You are not allowed to edit this entry" msgstr "No está autorizado a editar esta entrada" msgid "You are not allowed to change this entry status" msgstr "No está autorizado a cambiar el estado de esta entrada" msgid "You are not allowed to change this entry category" msgstr "No está autorizado a cambiar la categoría de esta entrada" msgid "You are not allowed to mark this entry as selected" msgstr "No está autorizado a marcar esta entrada como seleccionada" msgid "You are not allowed to delete entries" msgstr "No está autorizado a borrar entradas" msgid "You are not allowed to delete this entry" msgstr "No está autorizado a borrar esta entrada" msgid "No entry title" msgstr "La entrada no tiene título" msgid "No entry content" msgstr "Entrada sin contenido" msgid "Empty entry URL" msgstr "URL de la entrada vacío" msgid "You are not allowed to update comments" msgstr "No está autorizado a modificar los comentarios" msgid "No such comment ID" msgstr "ID del comentario desconocida" msgid "You are not allowed to update this comment" msgstr "No está autorizado a cambiar este comentario" msgid "You are not allowed to change this comment's status" msgstr "No está autorizado a cambiar el estado de este comentario" msgid "You are not allowed to delete comments" msgstr "No está autorizado a eliminar comentarios" msgid "You are not allowed to delete this comment" msgstr "No está autorizado a eliminar este comentario" msgid "You must provide a comment" msgstr "Debe escribir un comentario" msgid "You must provide an author name" msgstr "Debe indicar un nombre de autor" msgid "Email address is not valid." msgstr "La dirección de correo electrónico no es válida." msgid "online" msgstr "conectado" msgid "offline" msgstr "no conectado" msgid "removed" msgstr "eliminado" msgid "You are not an administrator" msgstr "Usted no es el administrador" msgid "Invalid user language code" msgstr "Código de idioma del usuario no válido" msgid "Blog ID must contain at least 2 characters using letters, numbers or symbols." msgstr "La ID del blog debe tener al menos 2 caracteres compuestos por letras, cifras o símbolos." msgid "No blog name" msgstr "Blog sin nombre" msgid "No blog URL" msgstr "El blog no tiene URL" #, fuzzy msgid "No log message" msgstr "Blog sin nombre" #, fuzzy msgid "unknown" msgstr "ahora" msgid "No blog defined." msgstr "Ningún blog definido." #, php-format msgid "Directory %s does not exist." msgstr "El directorio %s no existe." msgid "You are not a super administrator." msgstr "Usted no es súper administrador." msgid "Permission denied." msgstr "Permiso denegado." msgid "You are not the file owner." msgstr "Usted no es el propietario de este fichero." #, fuzzy msgid "This file is not allowed." msgstr "No se permite el envío de este fichero." msgid "New file already exists." msgstr "El nuevo fichero ya existe." msgid "File does not exist in the database." msgstr "Ese fichero no existe en la base de datos." # , php-format #, php-format msgid "Extract destination directory %s already exists." msgstr "El directorio de destino de extracción %s ya existe." msgid "Embedded Audio Player" msgstr "" msgid "Embedded Video Player" msgstr "" #, php-format msgid "%s: in [%s] and [%s]" msgstr "" msgid "Empty module zip file." msgstr "Fichero zip de módulo vacío." msgid "The zip file does not appear to be a valid Dotclear module." msgstr "El fichero zip no parece ser un módulo válido de Dotclear." msgid "An error occurred during module deletion." msgstr "Se produjo un error durante el borrado del módulo." #, php-format msgid "Unable to upgrade \"%s\". (same version)" msgstr "No es posible actualizar «%s» (misma versión)." msgid "Unable to read new _define.php file" msgstr "No es posible leer el fichero new _define.php" msgid "No such module." msgstr "Módulo inexistente." msgid "Cannot remove module files" msgstr "No se pueden eliminar los ficheros del módulo" msgid "Cannot deactivate plugin." msgstr "No se puede desactivar el complemento." msgid "Cannot activate plugin." msgstr "No se puede activar el complemento." # , php-format #, fuzzy, php-format msgid "Invalid setting dcNamespace: %s" msgstr "Espacio de nombres del ajuste no válido: %s" msgid "Unable to retrieve settings:" msgstr "No es posible obtener los ajustes:" #, php-format msgid "%s is not a valid setting id" msgstr "%s no es un ID de ajuste válido" msgid "No namespace specified" msgstr "No se ha indicado ningún espacio de nombres" #, fuzzy msgid "Unable to retrieve workspaces:" msgstr "No es posible obtener los ajustes:" #, fuzzy msgid "Unable to retrieve namespaces:" msgstr "No es posible obtener los ajustes:" # , php-format #, php-format msgid "Invalid setting namespace: %s" msgstr "Espacio de nombres del ajuste no válido: %s" #, php-format msgid "%s has still been pinged" msgstr "Ya se ha hecho un ping a %s" msgid "Unable to ping URL" msgstr "No es posible hacer el ping al URL" #, php-format msgid "%s is not a ping URL" msgstr "%s no es un URL de ping" #, php-format msgid "%s, ping error:" msgstr "%s, error de ping:" msgid "Digests file not found." msgstr "Fichero de resúmenes no encontrado." msgid "No file to download" msgstr "No hay ningún fichero a descargar" msgid "Root directory is not writable." msgstr "No se puede escribir en el directorio raíz." msgid "An error occurred while downloading archive." msgstr "Se produjo un error durante la descarga del archivo." msgid "Archive not found." msgstr "No se ha encontrado el archivo." msgid "Unable to read current digests file." msgstr "No es posible leer el fichero de resúmenes actual." #, fuzzy msgid "Downloaded file does not seem to be a valid archive." msgstr "El fichero descargado no parece ser un archivo válido." msgid "Incomplete archive." msgstr "Archivo incompleto." msgid "Unable to read digests file." msgstr "No es posible leer el fichero de resúmenes." msgid "Invalid digests file." msgstr "Fichero de resúmenes no válido." # , php-format #, fuzzy, php-format msgid "Invalid dcWorkspace: %s" msgstr "Espacio de nombres del ajuste no válido: %s" #, fuzzy msgid "Unable to retrieve prefs:" msgstr "No es posible obtener los ajustes:" #, fuzzy, php-format msgid "%s is not a valid pref id" msgstr "%s no es un ID de ajuste válido" #, fuzzy msgid "No workspace specified" msgstr "No se ha indicado ningún espacio de nombres" msgid "SQLite Database Schema cannot be upgraded." msgstr "No se puede actualizar el schema de la base de datos SQLite." msgid "Something went wrong with auto upgrade:" msgstr "Se ha producido un error durante la actualización automática:" msgid "Unable to open directory." msgstr "No es posible abrir el directorio." msgid "Unable to create directory." msgstr "No se puede crear el directorio." msgid "File is not writable." msgstr "El fichero no se puede modificar." msgid "Unable to open file." msgstr "El fichero no se puede abrir." msgid "Not an uploaded file." msgstr "No hay fichero." msgid "The uploaded file exceeds the maximum file size allowed." msgstr "El fichero es más grande que el tamaño máximo permitido." msgid "The uploaded file was only partially uploaded." msgstr "El fichero sólo se ha enviado parcialmente." msgid "No file was uploaded." msgstr "No se ha enviado ningún fichero." msgid "Missing a temporary folder." msgstr "Falta una carpeta temporal." msgid "Failed to write file to disk." msgstr "Fallo al guardar el fichero en el disco." #, php-format msgid "%s is not a directory." msgstr "%s no es un directorio." msgid "Bad range" msgstr "" #, fuzzy msgid "Invalid range" msgstr "Código de idioma no válido" #, fuzzy msgid "Invalid line number" msgstr "Código de idioma no válido" msgid "Chunk is out of range" msgstr "" msgid "Bad context" msgstr "" msgid "Bad context (in deletion)" msgstr "" #, fuzzy msgid "Invalid diff format" msgstr "Fichero de resúmenes no válido." msgid "Uploading this file is not allowed." msgstr "No se permite el envío de este fichero." msgid "Destination directory is not in jail." msgstr "El directorio de destino no está enjaulado." msgid "File already exists." msgstr "El fichero ya existe." msgid "Cannot write in this directory." msgstr "No se puede escribir en este directorio." msgid "An error occurred while writing the file." msgstr "Se ha producido un error durante la escritura del fichero." msgid "Source file does not exist." msgstr "El fichero de origen no existe." msgid "File is not in jail." msgstr "El fichero no está enjaulado." msgid "Destination directory is not writable." msgstr "No se puede escribir en el directorio de destino." msgid "Unable to rename file." msgstr "No se puede cambiar el nombre del fichero." msgid "File cannot be removed." msgstr "Este fichero no se puede eliminar." msgid "Directory is not in jail." msgstr "El directorio no está enjaulado." msgid "Directory cannot be removed." msgstr "No se puede eliminar este directorio." msgid "Not enough memory to open image." msgstr "No hay suficiente memoria para abrir la imagen." #, php-format msgid "File %s is not compressed in the zip." msgstr "El fichero %s no está comprimido en el zip." #, php-format msgid "Trying to unzip a folder name %s" msgstr "Intentando descomprimir una carpeta %s" msgid "Unable to write destination file." msgstr "No es posible escribir el fichero de destino." msgid "Unable to write in target directory, permission denied." msgstr "No es posible escribir el directorio de destino, permiso denegado." msgid "Not enough memory to open file." msgstr "No hay suficiente memoria para abrir el fichero." msgid "File does not exist" msgstr "El fichero no existe" msgid "Cannot read file" msgstr "No se puede leer el fichero" msgid "Directory does not exist" msgstr "El directorio no existe" msgid "Cannot read directory" msgstr "No se puede leer el directorio" msgid "Unable to connect to database" msgstr "" #, php-format msgid "

    This either means that the username and password information in your config.php file is incorrect or we can't contact the database server at \"%s\". This could mean your host's database server is down.

    • Are you sure you have the correct username and password?
    • Are you sure that you have typed the correct hostname?
    • Are you sure that the database server is running?

    If you're unsure what these terms mean you should probably contact your host. If you still need help you can always visit the Dotclear Support Forums.

    " msgstr "" msgid "The following error was encountered while trying to read the database:" msgstr "" #, fuzzy #~ msgid "Pages" #~ msgstr "Página(s)" #, fuzzy #~ msgid "Blogroll" #~ msgstr "Blog" #~ msgid "send" #~ msgstr "enviar" #~ msgid "update thumbnails" #~ msgstr "actualizar las miniaturas" #~ msgid "insert" #~ msgstr "insertar" #~ msgid "View entry" #~ msgstr "Ver la entrada" #~ msgid "Attachments" #~ msgstr "Ficheros adjuntos" #~ msgid "remove" #~ msgstr "eliminar" #~ msgid "No attachment." #~ msgstr "No hay ficheros adjuntos." #~ msgid "Add files to this entry" #~ msgstr "Añadir un fichero a esta entrada" #~ msgid "User:" #~ msgstr "Usuario:" #~ msgid "login" #~ msgstr "iniciar sesión" #~ msgid "filter" #~ msgstr "filtro" #~ msgid "View site" #~ msgstr "Ver el sitio" #~ msgid "The file %s already exists. If you need to reset any of the configuration items in this file, please delete it first or you may continue to install." #~ msgstr "El fichero %s ya existe. Para reiniciar su configuración, bórrelo antes o bien continúe con la instalación." #~ msgid "Login:" #~ msgstr "Usuario:" #~ msgid "Login and password" #~ msgstr "Usuario y contraseña" #~ msgid "User ID" #~ msgstr "Identificativo del usuario" #~ msgid "Name" #~ msgstr "Apellidos" dotclear-2.6.2+dfsg/inc/libs/clearbricks/tests/unit/fixtures/l10n/fr/000077500000000000000000000000001230033266200253735ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/tests/unit/fixtures/l10n/fr/core.lang.php000066400000000000000000000016621230033266200277610ustar00rootroot00000000000000, 2006. # # Translators: # Franck , 2011. # Stéphane Aulery , 2012. # xave , 2012. msgid "" msgstr "" "Project-Id-Version: Dotclear\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-08-13 09:59+0200\n" "PO-Revision-Date: 2012-08-13 07:13+0000\n" "Last-Translator: xave \n" "Language-Team: French (http://www.transifex.com/projects/p/dotclear/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" msgid "Dotclear has been upgraded." msgstr "Dotclear a été mis à jour." msgid "The category has been successfully created." msgstr "Catégorie créée avec succès." msgid "The category has been successfully removed." msgid_plural "The categories have been successfully removed." msgstr[0] "La catégorie a été supprimée avec succès." msgstr[1] "Les catégories ont été supprimées avec succès." #, php-format msgid "The e-mail was sent successfully to %s." msgstr "Message envoyé avec succès à %s." dotclear-2.6.2+dfsg/inc/libs/clearbricks/tests/unit/fixtures/l10n/fr/main.lang.php000066400000000000000000000016311230033266200277510ustar00rootroot00000000000000, 2006. # # Translators: # Franck , 2011. # Stéphane Aulery , 2012. # xave , 2012. msgid "" msgstr "" "Project-Id-Version: Dotclear\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-08-13 09:59+0200\n" "PO-Revision-Date: 2012-08-13 07:13+0000\n" "Last-Translator: xave \n" "Language-Team: French (http://www.transifex.com/projects/p/dotclear/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" msgid "Dotclear has been upgraded." msgstr "Dotclear a été mis à jour." msgid "The category has been successfully created." msgstr "Catégorie créée avec succès." msgid "The category has been successfully removed." msgid_plural "The categories have been successfully removed." msgstr[0] "Catégorie supprimée avec succès." msgstr[1] "Catégories supprimées avec succès." #, php-format msgid "The e-mail was sent successfully to %s." msgstr "Message envoyé avec succès à %s." dotclear-2.6.2+dfsg/inc/libs/clearbricks/tests/unit/fixtures/l10n/fr/php-format.lang.php000066400000000000000000000007761230033266200311130ustar00rootroot00000000000000text(20); $this ->string($wiki2xhtml->Transform(sprintf('%s%s%s', $delimiters[0], $phrase, $delimiters[1]))) ->isIdenticalTo(sprintf('

    <%1$s>%2$s

    ', $tag, $phrase)); } public function testLinks() { $wiki2xhtml = new \wiki2xhtml(); $faker = Faker\Factory::create(); $lang = $faker->languageCode(); $title = $faker->text(10); $label = $faker->text(20); $url = $faker->url(); $this ->string($wiki2xhtml->transform(sprintf('[%s|%s]', $label, $url))) ->isIdenticalTo(sprintf('

    %2$s

    ', $url, $label)) ->string($wiki2xhtml->transform(sprintf('[%s|%s|%s]', $label, $url, $lang))) ->isIdenticalTo(sprintf('

    %s

    ', $url, $lang, $label)) ->string($wiki2xhtml->transform(sprintf('[%s|%s|%s|%s]', $label, $url, $lang, $title))) ->isIdenticalTo(sprintf('

    %s

    ', $url, $lang, $title, $label)) ; } public function testImages() { $wiki2xhtml = new \wiki2xhtml(); $faker = Faker\Factory::create(); $title = $faker->text(10); $alt = $faker->text(20); $url = $faker->url(); $this ->string($wiki2xhtml->transform(sprintf('((%s|%s))', $url, $alt))) ->isIdenticalTo(sprintf('

    %s

    ', $url, $alt)) ->string($wiki2xhtml->transform(sprintf('((%s|%s||%s))', $url, $alt, $title))) ->isIdenticalTo(sprintf('

    %s

    ', $url, $alt, $title)) ->string($wiki2xhtml->transform(sprintf('((%s|))', $url))) ->isIdenticalTo(sprintf('

    ', $url)) ->string($wiki2xhtml->transform(sprintf('((%s|%s|L))', $url, $alt))) ->isIdenticalTo(sprintf('

    %s

    ', $url, $alt)) ->string($wiki2xhtml->transform(sprintf('((%s|%s|L|%s))', $url, $alt, $title))) ->isIdenticalTo(sprintf('

    %s

    ', $url, $alt, $title)) ->string($wiki2xhtml->transform(sprintf('((%s|%s|G))', $url, $alt))) ->isIdenticalTo(sprintf('

    %s

    ', $url, $alt)) ->string($wiki2xhtml->transform(sprintf('((%s|%s|G|%s))', $url, $alt, $title))) ->isIdenticalTo(sprintf('

    %s

    ', $url, $alt, $title)) ->string($wiki2xhtml->transform(sprintf('((%s|%s|D))', $url, $alt))) ->isIdenticalTo(sprintf('

    %s

    ', $url, $alt)) ->string($wiki2xhtml->transform(sprintf('((%s|%s|D|%s))', $url, $alt, $title))) ->isIdenticalTo(sprintf('

    %s

    ', $url, $alt, $title)) ->string($wiki2xhtml->transform(sprintf('((%s|%s|R))', $url, $alt))) ->isIdenticalTo(sprintf('

    %s

    ', $url, $alt)) ->string($wiki2xhtml->transform(sprintf('((%s|%s|R|%s))', $url, $alt, $title))) ->isIdenticalTo(sprintf('

    %s

    ', $url, $alt, $title)) ->string($wiki2xhtml->transform(sprintf('((%s|%s|C))', $url, $alt))) ->isIdenticalTo(sprintf('

    %s

    ', $url, $alt)) ->string($wiki2xhtml->transform(sprintf('((%s|%s|C|%s))', $url, $alt, $title))) ->isIdenticalTo(sprintf('

    %s

    ', $url, $alt, $title)) ; } public function testBlocks($in, $out, $count) { $wiki2xhtml = new \wiki2xhtml(); $faker = Faker\Factory::create(); $url = $faker->url(); $word = $faker->word(); $lang = $faker->languageCode(); $search = array('%url%', '%lang%', '%word%'); $replace = array($url, $lang, $word); $in = str_replace($search, $replace, $in); $out = str_replace($search, $replace, $out); /* echo "$in\n"; */ /* echo "$out\n"; */ if (strpos($in, '%s')!==false) { for ($n=1;$n<=$count;$n++) { $phrase[$n] = $faker->text(20); } $in = vsprintf($in, $phrase); $out = vsprintf($out, $phrase); } $this ->string($this->removeSpace($wiki2xhtml->transform($in))) ->isIdenticalTo($out); } public function testAutoBR() { $wiki2xhtml = new \wiki2xhtml(); $faker = Faker\Factory::create(); $text = $faker->paragraphs(3); $this ->string($wiki2xhtml->transform(implode("\n", $text))) ->isIdenticalTo('

    '.implode("\n", $text).'

    ') ->if($wiki2xhtml->setOpt('active_auto_br',1)) ->then() ->string($wiki2xhtml->transform(implode("\n", $text))) ->isIdenticalTo('

    '.nl2br(implode("\n", $text)).'

    ') ; } public function testMacro() { $wiki2xhtml = new \wiki2xhtml(); $macro_name = 'php'; $in_html = "///html\n

    some text

    \n

    un autre

    \n///"; $out_html = "

    some text

    \n

    un autre

    \n"; $in = "///dummy-macro\n\n///"; $out_without_macro = "
    dummy-macro\n<?php\necho 'Hello World!';\n?>\n
    "; $out = "[[\n]]"; $this ->string($wiki2xhtml->transform($in_html)) ->isIdenticalTo($out_html) ->string($wiki2xhtml->transform($in)) ->isIdenticalTo($out_without_macro); $this ->if($wiki2xhtml->registerFunction('macro:dummy-macro', function($s){return "[[$s]]";})) ->object($wiki2xhtml->functions['macro:dummy-macro']) ->isCallable() ->string($wiki2xhtml->transform($in)) ->isIdenticalTo($out); } /* * DataProviders **/ protected function testTagTransformDataProvider() { return array( array('em', array("''","''")), array('strong', array('__','__')), array('acronym', array('??','??')), array('q', array('{{','}}')), array('code', array('@@','@@')), array('ins', array('++','++')), array('del', array('--','--')), // array('word', array('¶¶¶','¶¶¶')), ); } protected function testBlocksDataProvider() { return array( array('\[not a link | not a title label\]', '

    [not a link | not a title label]

    ',0), array('``%s%s

    • %s
    • %s
    ``', '

    %s%s

    • %s
    • %s

    ',4), array("* item 1\n** item 1.1\n** item 1.2\n* item 2\n* item 3\n*# item 3.1", '
    • item 1
      • item 1.1
      • item 1.2
    • '. '
    • item 2
    • item 3
      1. item 3.1
    ', 1), array('{{%s}}', '

    %s

    ', 1), array('{{%s|%lang%}}', '

    %s

    ', 1), array('{{%s|%lang%|%url%}}', '

    %s

    ', 1), array(" %s\n %s\n %s", '
    %s%s%s
    ', 3), array('??%1$s|%2$s??', '

    %1$s

    ', 2), array(">%s\n>%s", '

    %s%s

    ', 2), array('----', '
    ', 0), array(' %s', '
    %s
    ', 1), array('!!!!%s', '

    %s

    ', 1), array('!!!%s', '

    %s

    ', 1), array('!!%s', '

    %s

    ', 1), array('!%s', '
    %s
    ', 1), array('~%word%~', '

    ', 1), array('@@%s@@', '

    %s

    ', 1), array('%s$$%s$$', '

    %s[1]

    '. '

    Note

    [1] '. '%s

    ', 2), array('%s$$%s$$', '

    %s[1]

    '. '

    Note

    [1] '. '%s

    ', 2), array("* %s\n///\n%s\n///\n","
    • %s
    %s
    ", 2), array("# %s\n///\n%s\n///\n","
    1. %s
    %s
    ", 2) ); } /* **/ private function removeSpace($s) { return str_replace(array("\r\n","\n"), array('',''), $s); } } dotclear-2.6.2+dfsg/inc/libs/clearbricks/text.wiki2xhtml/000077500000000000000000000000001230033266200233055ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/text.wiki2xhtml/class.wiki2xhtml.php000066400000000000000000001007321230033266200272270ustar00rootroot00000000000000 Les styles d'alignement des images sont modifiables via les options # # 3.2.6 # => Added ``inline html`` support # # 3.2.5 # => Changed longdesc by title in images # # 3.2.4 # => Auto links # => Code cleanup # # 3.2.3 # Olivier # => PHP5 Strict # # 3.2.2 # Olivier # => Changement de la gestion des URL spéciales # # 3.2.1 # Olivier # => Changement syntaxe des macros # # 3.2 # Olivier # => Changement de fonctionnement des macros # => Passage de fonctions externes pour les macros et les mots wiki # # 3.1d # Jérôme Lipowicz # => antispam # Olivier # => centrage d'image # # 3.1c # Olivier # => Possibilité d'échaper les | dans les marqueurs avec \ # # 3.1b # Nicolas Chachereau # => Changement de regexp pour la correction syntaxique # # 3.1a # Olivier # => Bug du Call-time pass-by-reference # # 3.1 # Olivier # => Ajout des macros «««..»»» # => Ajout des blocs vides øøø # => Ajout du niveau de titre paramétrable # => Option de blocage du parseur dans les
    #			=> Titres au format setext (experimental, désactivé)
    #
    # 3.0
    # Olivier		=> Récriture du parseur inline, plus d'erreur XHTML
    #			=> Ajout d'une vérification d'intégrité pour les listes
    #			=> Les acronymes sont maintenant dans un fichier texte
    #			=> Ajout d'un tag images ((..)), del --..-- et ins ++..++
    #			=> Plus possible de faire des liens JS [lien|javascript:...]
    #			=> Ajout des notes de bas de page §§...§§
    #			=> Ajout des mots wiki
    #
    # 2.5
    # Olivier		=> Récriture du code, plus besoin du saut de ligne entre blocs !=
    #
    # 2.0
    # Stephanie	=> correction des PCRE et ajout de fonctionnalités
    # Mathieu 	=> ajout du strip-tags, implementation des options, reconnaissance automatique d'url, etc.
    # Olivier		=> chagement de active_link en active_urls
    #			=> ajout des options pour les blocs
    #			=> intégration de l'aide dans le code, avec les options
    #			=> début de quelque chose pour la reconnaissance auto d'url (avec Mat)
    
    # TODO :
    # Mathieu	=> active_wiki_urls (modifier wikiParseUrl ?)
    # 		=> active_auto_urls
    #
    # *		=> ajouter des options.
    # 		=> trouver un meilleur nom pour active_link ? (pour le jour ou ca sera tellement une usine
    #		   a gaz que on generera des tags  :)
    #
    
    # Wiki2xhtml
    
    class wiki2xhtml
    {
    	public $__version__ = '3.2.7';
    
    	public $T;
    	public $opt;
    	public $line;
    	public $acro_table;
    	public $foot_notes;
    	public $macros;
    	public $functions;
    
    	public $tags;
    	public $open_tags;
    	public $close_tags;
    	public $custom_tags = array();
    	public $all_tags;
    	public $tag_pattern;
    	public $escape_table;
    	public $allowed_inline = array();
    
    	function __construct()
    	{
    		# Mise en place des options
    		$this->setOpt('active_title',1);		# Activation des titres !!!
    		$this->setOpt('active_setext_title',0);	# Activation des titres setext (EXPERIMENTAL)
    		$this->setOpt('active_hr',1);			# Activation des 
    $this->setOpt('active_lists',1); # Activation des listes $this->setOpt('active_quote',1); # Activation du
    $this->setOpt('active_pre',1); # Activation du
    		$this->setOpt('active_empty',1);		# Activation du bloc vide øøø
    		$this->setOpt('active_auto_urls',0);	# Activation de la reconnaissance d'url
    		$this->setOpt('active_auto_br',0);	# Activation du saut de ligne automatique (dans les paragraphes)
    		$this->setOpt('active_antispam',1);	# Activation de l'antispam pour les emails
    		$this->setOpt('active_urls',1);		# Activation des liens []
    		$this->setOpt('active_auto_img',1);	# Activation des images automatiques dans les liens []
    		$this->setOpt('active_img',1);		# Activation des images (())
    		$this->setOpt('active_anchor',1);		# Activation des ancres ~...~
    		$this->setOpt('active_em',1);			# Activation du  ''...''
    		$this->setOpt('active_strong',1);		# Activation du  __...__
    		$this->setOpt('active_br',1);			# Activation du 
    %%% $this->setOpt('active_q',1); # Activation du {{...}} $this->setOpt('active_code',1); # Activation du @@...@@ $this->setOpt('active_acronym',1); # Activation des acronymes $this->setOpt('active_ins',1); # Activation des ins ++..++ $this->setOpt('active_del',1); # Activation des del --..-- $this->setOpt('active_inline_html',1); # Activation du HTML inline ``...`` $this->setOpt('active_footnotes',1); # Activation des notes de bas de page $this->setOpt('active_wikiwords',0); # Activation des mots wiki $this->setOpt('active_macros',1); # Activation des macros /// /// $this->setOpt('parse_pre',1); # Parser l'intérieur de blocs
     ?
    
    		$this->setOpt('active_fr_syntax',1);	# Corrections syntaxe FR
    
    		$this->setOpt('first_title_level',3);	# Premier niveau de titre 
    
    		$this->setOpt('note_prefix','wiki-footnote');
    		$this->setOpt('note_str','

    Notes

    %s
    '); $this->setOpt('note_str_single','

    Note

    %s
    '); $this->setOpt('words_pattern', '((?setOpt('auto_url_pattern', '%(?setOpt('acronyms_file',dirname(__FILE__).'/acronyms.txt'); $this->setOpt('img_style_left','float:left; margin: 0 1em 1em 0;'); $this->setOpt('img_style_center','display:block; margin:0 auto;'); $this->setOpt('img_style_right','float:right; margin: 0 0 1em 1em;'); $this->acro_table = $this->__getAcronyms(); $this->foot_notes = array(); $this->functions = array(); $this->macros = array(); $this->registerFunction('macro:html',array($this,'__macroHTML')); } function setOpt($option, $value) { $this->opt[$option] = $value; } function setOpts($options) { if (!is_array($options)) { return; } foreach ($options as $k => $v) { $this->opt[$k] = $v; } } function getOpt($option) { return (!empty($this->opt[$option])) ? $this->opt[$option] : false; } function registerFunction($type,$name) { if (is_callable($name)) { $this->functions[$type] = $name; } } function transform($in) { # Initialisation des tags $this->__initTags(); $this->foot_notes = array(); # Récupération des macros if ($this->getOpt('active_macros')) { $in = preg_replace_callback('#^///(.*?)///($|\r)#ms',array($this,'__getMacro'),$in); } # Vérification du niveau de titre if ($this->getOpt('first_title_level') > 4) { $this->setOpt('first_title_level',4); } $res = str_replace("\r", '', $in); $escape_pattern = array(); # traitement des titres à la setext if ($this->getOpt('active_setext_title') && $this->getOpt('active_title')) { $res = preg_replace('/^(.*)\n[=]{5,}$/m','!!!$1',$res); $res = preg_replace('/^(.*)\n[-]{5,}$/m','!!$1',$res); } # Transformation des mots Wiki if ($this->getOpt('active_wikiwords') && $this->getOpt('words_pattern')) { $res = preg_replace('/'.$this->getOpt('words_pattern').'/msu','¶¶¶$1¶¶¶',$res); } # Transformation des URLs automatiques if ($this->getOpt('active_auto_urls')) { $active_urls = $this->getOpt('active_urls'); $this->setOpt('active_urls',1); $this->__initTags(); # If urls are not active, escape URLs tags if (!$active_urls) { $res = preg_replace( '%(?tags['a'])).'])%msU', '\\\$1',$res ); } # Transforms urls while preserving tags. $tree = preg_split($this->tag_pattern,$res,-1,PREG_SPLIT_DELIM_CAPTURE); foreach ($tree as &$leaf) { $leaf = preg_replace($this->getOpt('auto_url_pattern'),'[$1$2]',$leaf); } unset($leaf); $res = implode($tree); } $this->T = explode("\n",$res); $this->T[] = ''; # Parse les blocs $res = $this->__parseBlocks(); # Line break if ($this->getOpt('active_br')) { $res = preg_replace('/(?', $res); $escape_pattern[] = '%%%'; } # Nettoyage des \s en trop $res = preg_replace('/([\s]+)(<\/p>|<\/li>|<\/pre>)/u', '$2', $res); $res = preg_replace('/(
  • )([\s]+)/u', '$1', $res); # On vire les escapes if (!empty($escape_pattern)) { $res = preg_replace('/\\\('.implode('|',$escape_pattern).')/','$1',$res); } # On vire les ¶¶¶MotWiki¶¶¶ qui sont resté (dans les url...) if ($this->getOpt('active_wikiwords') && $this->getOpt('words_pattern')) { $res = preg_replace('/¶¶¶'.$this->getOpt('words_pattern').'¶¶¶/msu','$1',$res); } # On remet les macros if ($this->getOpt('active_macros')) { $res = preg_replace_callback('/^##########MACRO#([0-9]+)#$/ms',array($this,'__putMacro'),$res); } # Auto line break dans les paragraphes if ($this->getOpt('active_auto_br')) { $res = preg_replace_callback('%(

    )(.*?)(

    )%msu',array($this,'__autoBR'),$res); } # On ajoute les notes if (count($this->foot_notes) > 0) { $res_notes = ''; $i = 1; foreach ($this->foot_notes as $k => $v) { $res_notes .= "\n".'

    ['.$i.'] '.$v.'

    '; $i++; } $res .= sprintf("\n".(count($this->foot_notes) > 1 ? $this->getOpt('note_str') : $this->getOpt('note_str_single'))."\n",$res_notes); } return $res; } /* PRIVATE --------------------------------------------------- */ function __initTags() { $tags = array( 'em' => array("''","''"), 'strong' => array('__','__'), 'acronym' => array('??','??'), 'a' => array('[',']'), 'img' => array('((','))'), 'q' => array('{{','}}'), 'code' => array('@@','@@'), 'anchor' => array('~','~'), 'del' => array('--','--'), 'ins' => array('++','++'), 'inline' => array('``','``'), 'note' => array('$$','$$'), 'word' => array('¶¶¶','¶¶¶') ); $this->linetags = array( 'empty' => 'øøø', 'title' => '([!]{1,4})', 'hr' => '[-]{4}[- ]', 'quote' => '(>|;:)', 'lists' => '([*#]+)', 'pre' => '[ ]{1}' ); $this->tags = array_merge($tags,$this->custom_tags); # Suppression des tags selon les options if (!$this->getOpt('active_urls')) { unset($this->tags['a']); } if (!$this->getOpt('active_img')) { unset($this->tags['img']); } if (!$this->getOpt('active_anchor')) { unset($this->tags['anchor']); } if (!$this->getOpt('active_em')) { unset($this->tags['em']); } if (!$this->getOpt('active_strong')) { unset($this->tags['strong']); } if (!$this->getOpt('active_q')) { unset($this->tags['q']); } if (!$this->getOpt('active_code')) { unset($this->tags['code']); } if (!$this->getOpt('active_acronym')) { unset($this->tags['acronym']); } if (!$this->getOpt('active_ins')) { unset($this->tags['ins']); } if (!$this->getOpt('active_del')) { unset($this->tags['del']); } if (!$this->getOpt('active_inline_html')) { unset($this->tags['inline']); } if (!$this->getOpt('active_footnotes')) { unset($this->tags['note']); } if (!$this->getOpt('active_wikiwords')) { unset($this->tags['word']); } # Suppression des tags de début de ligne selon les options if (!$this->getOpt('active_empty')) { unset($this->linetags['empty']); } if (!$this->getOpt('active_title')) { unset($this->linetags['title']); } if (!$this->getOpt('active_hr')) { unset($this->linetags['hr']); } if (!$this->getOpt('active_quote')) { unset($this->linetags['quote']); } if (!$this->getOpt('active_lists')) { unset($this->linetags['lists']); } if (!$this->getOpt('active_pre')) { unset($this->linetags['pre']); } $this->open_tags = $this->__getTags(); $this->close_tags = $this->__getTags(false); $this->all_tags = $this->__getAllTags(); $this->tag_pattern = $this->__getTagsPattern(); $this->escape_table = $this->all_tags; array_walk($this->escape_table,create_function('&$a','$a = \'\\\\\'.$a;')); } function __getTags($open=true) { $res = array(); foreach ($this->tags as $k => $v) { $res[$k] = ($open) ? $v[0] : $v[1]; } return $res; } function __getAllTags() { $res = array(); foreach ($this->tags as $v) { $res[] = $v[0]; $res[] = $v[1]; } return array_values(array_unique($res)); } function __getTagsPattern($escape=false) { $res = $this->all_tags; array_walk($res,create_function('&$a','$a = preg_quote($a,"/");')); if (!$escape) { return '/(?T); for ($i=0; $i<$max; $i++) { $pre_mode = $mode; $pre_type = $type; $end = ($i+1 == $max); $line = $this->__getLine($i,$type,$mode); if ($type != 'pre' || $this->getOpt('parse_pre')) { $line = $this->__inlineWalk($line); } $res .= $this->__closeLine($type,$mode,$pre_type,$pre_mode); $res .= $this->__openLine($type,$mode,$pre_type,$pre_mode); # P dans les blockquotes if ($type == 'blockquote' && trim($line) == '' && $pre_type == $type) { $res .= "

    \n

    "; } # Correction de la syntaxe FR dans tous sauf pre et hr # Sur idée de Christophe Bonijol # Changement de regex (Nicolas Chachereau) if ($this->getOpt('active_fr_syntax') && $type != null && $type != 'pre' && $type != 'hr') { $line = preg_replace('%[ ]+([:?!;\x{00BB}](\s|$))%u',' $1',$line); $line = preg_replace('%(\x{00AB})[ ]+%u','$1 ',$line); } $res .= $line; } return trim($res); } function __getLine($i,&$type,&$mode) { $pre_type = $type; $pre_mode = $mode; $type = $mode = null; if (empty($this->T[$i])) { return false; } $line = htmlspecialchars($this->T[$i],ENT_NOQUOTES); # Ligne vide if (empty($line)) { $type = null; } elseif ($this->getOpt('active_empty') && preg_match('/^øøø(.*)$/',$line,$cap)) { $type = null; $line = trim($cap[1]); } # Titre elseif ($this->getOpt('active_title') && preg_match('/^([!]{1,4})(.*)$/',$line,$cap)) { $type = 'title'; $mode = strlen($cap[1]); $line = trim($cap[2]); } # Ligne HR elseif ($this->getOpt('active_hr') && preg_match('/^[-]{4}[- ]*$/',$line)) { $type = 'hr'; $line = null; } # Blockquote elseif ($this->getOpt('active_quote') && preg_match('/^(>|;:)(.*)$/',$line,$cap)) { $type = 'blockquote'; $line = trim($cap[2]); } # Liste elseif ($this->getOpt('active_lists') && preg_match('/^([*#]+)(.*)$/',$line,$cap)) { $type = 'list'; $mode = $cap[1]; $valid = true; # Vérification d'intégrité $dl = ($type != $pre_type) ? 0 : strlen($pre_mode); $d = strlen($mode); $delta = $d-$dl; if ($delta < 0 && strpos($pre_mode,$mode) !== 0) { $valid = false; } if ($delta > 0 && $type == $pre_type && strpos($mode,$pre_mode) !== 0) { $valid = false; } if ($delta == 0 && $mode != $pre_mode) { $valid = false; } if ($delta > 1) { $valid = false; } if (!$valid) { $type = 'p'; $mode = null; $line = '
    '.$line; } else { $line = trim($cap[2]); } } # Préformaté elseif ($this->getOpt('active_pre') && preg_match('/^[ ]{1}(.*)$/',$line,$cap)) { $type = 'pre'; $line = $cap[1]; } # Paragraphe else { $type = 'p'; if (preg_match('/^\\\((?:('.implode('|',$this->linetags).')).*)$/',$line,$cap)) { $line = $cap[1]; } $line = trim($line); } return $line; } function __openLine($type,$mode,$pre_type,$pre_mode) { $open = ($type != $pre_type); if ($open && $type == 'p') { return "\n

    "; } elseif ($open && $type == 'blockquote') { return "\n

    "; } elseif (($open || $mode != $pre_mode) && $type == 'title') { $fl = $this->getOpt('first_title_level'); $fl = $fl+3; $l = $fl-$mode; return "\n'; } elseif ($open && $type == 'pre') { return "\n

    ";
    		}
    		elseif ($open && $type == 'hr')
    		{
    			return "\n
    "; } elseif ($type == 'list') { $dl = ($open) ? 0 : strlen($pre_mode); $d = strlen($mode); $delta = $d-$dl; $res = ''; if($delta > 0) { if(substr($mode, -1, 1) == '*') { $res .= "
      \n"; } else { $res .= "
        \n"; } } elseif ($delta < 0) { $res .= "\n"; for($j = 0; $j < abs($delta); $j++) { if (substr($pre_mode,(0 - $j - 1), 1) == '*') { $res .= "
    \n
  • \n"; } else { $res .= "\n\n"; } } } else { $res .= "\n"; } return $res."
  • "; } else { return null; } } function __closeLine($type,$mode,$pre_type,$pre_mode) { $close = ($type != $pre_type); if ($close && $pre_type == 'p') { return "

    \n"; } elseif ($close && $pre_type == 'blockquote') { return "

  • \n"; } elseif (($close || $mode != $pre_mode) && $pre_type == 'title') { $fl = $this->getOpt('first_title_level'); $fl = $fl+3; $l = $fl-$pre_mode; return '\n"; } elseif ($close && $pre_type == 'pre') { return "
    \n"; } elseif ($close && $pre_type == 'list') { $res = ''; for($j = 0; $j < strlen($pre_mode); $j++) { if(substr($pre_mode,(0 - $j - 1), 1) == '*') { $res .= "\n\n"; } else { $res .= "\n\n"; } } return $res; } else { return "\n"; } } /* Inline --------------------------------------------------- */ function __inlineWalk($str,$allow_only=null) { $tree = preg_split($this->tag_pattern,$str,-1,PREG_SPLIT_DELIM_CAPTURE); $res = ''; for ($i=0; $iopen_tags)) && ($allow_only == null || in_array(array_search($tree[$i],$this->open_tags),$allow_only))) { $tag = array_search($tree[$i],$this->open_tags); $tag_type = 'open'; if (($tidy = $this->__makeTag($tree,$tag,$i,$i,$attr,$tag_type)) !== false) { if ($tag != '') { $res .= '<'.$tag.$attr; $res .= ($tag_type == 'open') ? '>' : ' />'; } $res .= $tidy; } else { $res .= $tree[$i]; } } else { $res .= $tree[$i]; } } # Suppression des echappements $res = str_replace($this->escape_table,$this->all_tags,$res); return $res; } function __makeTag(&$tree,&$tag,$position,&$j,&$attr,&$type) { $res = ''; $closed = false; $itag = $this->close_tags[$tag]; # Recherche fermeture for ($i=$position+1;$i__parseLink($res,$tag,$attr,$type); break; case 'img': $type = 'close'; $res = $this->__parseImg($res,$attr); break; case 'acronym': $res = $this->__parseAcronym($res,$attr); break; case 'q': $res = $this->__parseQ($res,$attr); break; case 'anchor': $tag = 'a'; $res = $this->__parseAnchor($res,$attr); break; case 'note': $tag = ''; $res = $this->__parseNote($res); break; case 'inline': $tag = ''; $res = $this->__parseInlineHTML($res); break; case 'word': $res = $this->parseWikiWord($res,$tag,$attr,$type); break; default : $res = $this->__inlineWalk($res); break; } if ($type == 'open' && $tag != '') { $res .= ''; } $j = $i; break; } } return $res; } else { return false; } } function __splitTagsAttr($str) { $res = preg_split('/(? $v) { $res[$k] = str_replace("\|",'|',$v); } return $res; } # Antispam (Jérôme Lipowicz) function __antiSpam($str) { $encoded = bin2hex($str); $encoded = chunk_split($encoded, 2, '%'); $encoded = '%'.substr($encoded, 0, strlen($encoded) - 1); return $encoded; } function __parseLink($str,&$tag,&$attr,&$type) { $n_str = $this->__inlineWalk($str,array('acronym','img')); $data = $this->__splitTagsAttr($n_str); $no_image = false; # Only URL in data if (count($data) == 1) { $url = trim($str); $content = strlen($url) > 35 ? substr($url,0,35).'...' : $url; $lang = ''; $title = $url; } elseif (count($data) > 1) { $url = trim($data[1]); $content = $data[0]; $lang = (!empty($data[2])) ? $this->protectAttr($data[2],true) : ''; $title = (!empty($data[3])) ? $data[3] : ''; $no_image = (!empty($data[4])) ? (boolean) $data[4] : false; } # Remplacement si URL spéciale $this->__specialUrls($url,$content,$lang,$title); # On vire les   dans l'url $url = str_replace(' ',' ',$url); if (preg_match('/^(.+)[.](gif|jpg|jpeg|png)$/', $url) && !$no_image && $this->getOpt('active_auto_img')) { # On ajoute les dimensions de l'image si locale # Idée de Stephanie $img_size = null; if (!preg_match('#[a-zA-Z]+://#', $url)) { if (preg_match('#^/#',$url)) { $path_img = $_SERVER['DOCUMENT_ROOT'] . $url; } else { $path_img = $url; } $img_size = @getimagesize($path_img); } $attr = ' src="'.$this->protectAttr($this->protectUrls($url)).'"'. $attr .= (count($data) > 1) ? ' alt="'.$this->protectAttr($content).'"' : ' alt=""'; $attr .= ($lang) ? ' lang="'.$lang.'"' : ''; $attr .= ($title) ? ' title="'.$this->protectAttr($title).'"' : ''; $attr .= (is_array($img_size)) ? ' '.$img_size[3] : ''; $tag = 'img'; $type = 'close'; return null; } else { if ($this->getOpt('active_antispam') && preg_match('/^mailto:/',$url)) { $content = $content == $url ? preg_replace('%^mailto:%','',$content) : $content; $url = 'mailto:'.$this->__antiSpam(substr($url,7)); } $attr = ' href="'.$this->protectAttr($this->protectUrls($url)).'"'; $attr .= ($lang) ? ' hreflang="'.$lang.'"' : ''; $attr .= ($title) ? ' title="'.$this->protectAttr($title).'"' : ''; return $content; } } function __specialUrls(&$url,&$content,&$lang,&$title) { foreach ($this->functions as $k => $v) { if (strpos($k,'url:') === 0 && strpos($url,substr($k,4)) === 0) { $res = call_user_func($v,$url,$content); $url = isset($res['url']) ? $res['url'] : $url; $content = isset($res['content']) ? $res['content'] : $content; $lang = isset($res['lang']) ? $res['lang'] : $lang; $title = isset($res['title']) ? $res['title'] : $title; break; } } } function __parseImg($str,&$attr) { $data = $this->__splitTagsAttr($str); $alt = ''; $url = $data[0]; if (!empty($data[1])) { $alt = $data[1]; } $attr = ' src="'.$this->protectAttr($this->protectUrls($url)).'"'; $attr .= ' alt="'.$this->protectAttr($alt).'"'; if (!empty($data[2])) { $data[2] = strtoupper($data[2]); $style = ''; if ($data[2] == 'G' || $data[2] == 'L') { $style = $this->getOpt('img_style_left'); } elseif ($data[2] == 'D' || $data[2] == 'R') { $style = $this->getOpt('img_style_right'); } elseif ($data[2] == 'C') { $style = $this->getOpt('img_style_center'); } if ($style != '') { $attr .= ' style="'.$style.'"'; } } if (!empty($data[3])) { $attr .= ' title="'.$this->protectAttr($data[3]).'"'; } return null; } function __parseQ($str,&$attr) { $str = $this->__inlineWalk($str); $data = $this->__splitTagsAttr($str); $content = $data[0]; $lang = (!empty($data[1])) ? $this->protectAttr($data[1],true) : ''; $attr .= (!empty($lang)) ? ' lang="'.$lang.'"' : ''; $attr .= (!empty($data[2])) ? ' cite="'.$this->protectAttr($this->protectUrls($data[2])).'"' : ''; return $content; } function __parseAnchor($str,&$attr) { $name = $this->protectAttr($str,true); if ($name != '') { $attr = ' name="'.$name.'"'; } return null; } function __parseNote($str) { $i = count($this->foot_notes)+1; $id = $this->getOpt('note_prefix').'-'.$i; $this->foot_notes[$id] = $this->__inlineWalk($str); return '\['.$i.'\]'; } function __parseInlineHTML($str) { return str_replace(array('>','<'),array('>','<'),$str); } # Obtenir un acronyme function __parseAcronym($str,&$attr) { $data = $this->__splitTagsAttr($str); $acronym = $data[0]; $title = $lang = ''; if (count($data) > 1) { $title = $data[1]; $lang = (!empty($data[2])) ? $this->protectAttr($data[2],true) : ''; } if ($title == '' && !empty($this->acro_table[$acronym])) { $title = $this->acro_table[$acronym]; } $attr = ($title) ? ' title="'.$this->protectAttr($title).'"' : ''; $attr .= ($lang) ? ' lang="'.$lang.'"' : ''; return $acronym; } # Définition des acronymes, dans le fichier acronyms.txt function __getAcronyms() { $file = $this->getOpt('acronyms_file'); $res = array(); if (file_exists($file)) { if (($fc = @file($file)) !== false) { foreach ($fc as $v) { $v = trim($v); if ($v != '') { $p = strpos($v,':'); $K = (string) trim(substr($v,0,$p)); $V = (string) trim(substr($v,($p+1))); if ($K) { $res[$K] = $V; } } } } } return $res; } # Mots wiki (pour héritage) function parseWikiWord($str,&$tag,&$attr,&$type) { $tag = $attr = ''; if (isset($this->functions['wikiword'])) { return call_user_func($this->functions['wikiword'],$str); } return $str; } /* Protection des attributs */ function protectAttr($str,$name=false) { if ($name && !preg_match('/^[A-Za-z][A-Za-z0-9_:.-]*$/',$str)) { return ''; } return str_replace(array("'",'"'),array(''','"'),$str); } /* Protection des urls */ function protectUrls($str) { if (preg_match('/^javascript:/',$str)) { $str = '#'; } return $str; } /* Auto BR */ function __autoBR($m) { return $m[1].str_replace("\n","
    \n",$m[2]).$m[3]; } /* Macro --------------------------------------------------- */ function __getMacro($s) { $s = is_array($s) ? $s[1] : $s; $this->macros[] = str_replace('\"','"',$s); return 'øøø##########MACRO#'.(count($this->macros)-1).'#'; } function __putMacro($id) { $id = is_array($id) ? (integer) $id[1] : (integer) $id; if (isset($this->macros[$id])) { $content = str_replace("\r",'',$this->macros[$id]); $c = explode("\n",$content); # première ligne, premier mot $fl = trim($c[0]); $fw = $fl; if ($fl) { if (strpos($fl,' ') !== false) { $fw = substr($fl,0,strpos($fl,' ')); } $content = implode("\n",array_slice($c,1)); } if ($c[0] == "\n") { $content = implode("\n",array_slice($c,1)); } if ($fw) { if (isset($this->functions['macro:'.$fw])) { return call_user_func($this->functions['macro:'.$fw],$content,$fl); } } # Si on n'a rien pu faire, on retourne le tout sous # forme de
    			return '
    '.htmlspecialchars($this->macros[$id]).'
    '; } return null; } function __macroHTML($s) { return $s; } /* Aide et debug --------------------------------------------------- */ function help() { $help['b'] = array(); $help['i'] = array(); $help['b'][] = 'Laisser une ligne vide entre chaque bloc de même nature.'; $help['b'][] = 'Paragraphe : du texte et une ligne vide'; if ($this->getOpt('active_title')) { $help['b'][] = 'Titre : !!!, !!, '. '! pour des titres plus ou moins importants'; } if ($this->getOpt('active_hr')) { $help['b'][] = 'Trait horizontal : ----'; } if ($this->getOpt('active_lists')) { $help['b'][] = 'Liste : ligne débutant par * ou '. '#. Il est possible de mélanger les listes '. '(*#*) pour faire des listes de plusieurs niveaux. '. 'Respecter le style de chaque niveau'; } if ($this->getOpt('active_pre')) { $help['b'][] = 'Texte préformaté : espace devant chaque ligne de texte'; } if ($this->getOpt('active_quote')) { $help['b'][] = 'Bloc de citation : > ou '. ';: devant chaque ligne de texte'; } if ($this->getOpt('active_fr_syntax')) { $help['i'][] = 'La correction de ponctuation est active. Un espace '. 'insécable remplacera automatiquement tout espace '. 'précédant les marques ";","?",":" et "!".'; } if ($this->getOpt('active_em')) { $help['i'][] = 'Emphase : deux apostrophes \'\'texte\'\''; } if ($this->getOpt('active_strong')) { $help['i'][] = 'Forte emphase : deux soulignés __texte__'; } if ($this->getOpt('active_br')) { $help['i'][] = 'Retour forcé à la ligne : %%%'; } if ($this->getOpt('active_ins')) { $help['i'][] = 'Insertion : deux plus ++texte++'; } if ($this->getOpt('active_del')) { $help['i'][] = 'Suppression : deux moins --texte--'; } if ($this->getOpt('active_urls')) { $help['i'][] = 'Lien : [url], [nom|url], '. '[nom|url|langue] ou [nom|url|langue|titre].'; $help['i'][] = 'Image : comme un lien mais avec une extension d\'image.'. '
    Pour désactiver la reconnaissance d\'image mettez 0 dans un dernier '. 'argument. Par exemple [image|image.gif||0] fera un lien vers l\'image au '. 'lieu de l\'afficher.'. '
    Il est conseillé d\'utiliser la nouvelle syntaxe.'; } if ($this->getOpt('active_img')) { $help['i'][] = 'Image (nouvelle syntaxe) : '. '((url|texte alternatif)), '. '((url|texte alternatif|position)) ou '. '((url|texte alternatif|position|description longue)). '. '
    La position peut prendre les valeur L ou G (gauche), R ou D (droite) ou C (centré).'; } if ($this->getOpt('active_anchor')) { $help['i'][] = 'Ancre : ~ancre~'; } if ($this->getOpt('active_acronym')) { $help['i'][] = 'Acronyme : ??acronyme?? ou '. '??acronyme|titre??'; } if ($this->getOpt('active_q')) { $help['i'][] = 'Citation : {{citation}}, '. '{{citation|langue}} ou {{citation|langue|url}}'; } if ($this->getOpt('active_code')) { $help['i'][] = 'Code : @@code ici@@'; } if ($this->getOpt('active_footnotes')) { $help['i'][] = 'Note de bas de page : $$Corps de la note$$'; } $res = '
    '; $res .= '
    Blocs
    '; if (count($help['b']) > 0) { $res .= '
    • '; $res .= implode(' ;
    • ', $help['b']); $res .= '.
    '; } $res .= '
    '; $res .= '
    Éléments en ligne
    '; if (count($help['i']) > 0) { $res .= '
    • '; $res .= implode(' ;
    • ', $help['i']); $res .= '.
    '; } $res .= '
    '; $res .= '
    '; return $res; } /* function debug() { $mode = $type = null; $max = count($this->T); $res = ''. ''; for ($i=0; $i<$max; $i++) { $pre_mode = $mode; $pre_type = $type; $line = $this->__getLine($i,$type,$mode); $res .= ''. ''; } $res .= '
    p-modep-typemodetypechaine
    '.$pre_mode.''.$pre_type.''.$mode.''.$type.''.$line.'
    '; return $res; } //*/ } ?> dotclear-2.6.2+dfsg/inc/libs/clearbricks/url.handler/000077500000000000000000000000001230033266200224365ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/url.handler/class.url.handler.php000066400000000000000000000112011230033266200264640ustar00rootroot00000000000000mode = $mode; } public function register($type,$url,$representation,$handler) { $this->types[$type] = array( 'url' => $url, 'representation' => $representation, 'handler' => $handler ); } public function registerDefault($handler) { $this->default_handler = $handler; } public function registerError($handler) { array_unshift($this->error_handlers,$handler); } public function unregister($type) { if (isset($this->types[$type])) { unset($this->types[$type]); } } public function getTypes() { return $this->types; } public function getBase($type) { if (isset($this->types[$type])) { return $this->types[$type]['url']; } return null; } public function getDocument() { $type = $args = ''; if ($this->mode == 'path_info') { $part = substr($_SERVER['PATH_INFO'],1); } else { $part = ''; $qs = $this->parseQueryString(); # Recreates some _GET and _REQUEST pairs if (!empty($qs)) { foreach ($_GET as $k => $v) { if (isset($_REQUEST[$k])) { unset($_REQUEST[$k]); } } $_GET = $qs; $_REQUEST = array_merge($qs,$_REQUEST); list($k,$v) = each($qs); if ($v === null) { $part = $k; unset($_GET[$k]); unset($_REQUEST[$k]); } } } $_SERVER['URL_REQUEST_PART'] = $part; $this->getArgs($part,$type,$args); if (!$type) { $this->type = 'default'; $this->callDefaultHandler($args); } else { $this->type = $type; $this->callHandler($type,$args); } } public function getArgs($part,&$type,&$args) { if ($part == '') { $type = null; $args = null; return; } $this->sortTypes(); foreach ($this->types as $k => $v) { $repr = $v['representation']; if ($repr == $part) { $type = $k; $args = null; return; } elseif (preg_match('#'.$repr.'#',$part,$m)) { $type = $k; $args = isset($m[1]) ? $m[1] : null; return; } } # No type, pass args to default $args = $part; } public function callHandler($type,$args) { if (!isset($this->types[$type])) { throw new Exception('Unknown URL type'); } $handler = $this->types[$type]['handler']; if (!is_callable($handler)) { throw new Exception('Unable to call function'); } try { call_user_func($handler,$args); } catch (Exception $e) { foreach ($this->error_handlers as $err_handler) { if (call_user_func($err_handler,$args,$type,$e) === true) { return; } } # propagate exception, as it has not been processed by handlers throw $e; } } public function callDefaultHandler($args) { if (!is_callable($this->default_handler)) { throw new Exception('Unable to call function'); } try { call_user_func($this->default_handler,$args); } catch (Exception $e) { foreach ($this->error_handlers as $err_handler) { if (call_user_func($err_handler,$args,'default',$e) === true) { return; } } # propagate exception, as it has not been processed by handlers throw $e; } } protected function parseQueryString() { if (!empty($_SERVER['QUERY_STRING'])) { $q = explode('&',$_SERVER['QUERY_STRING']); $T = array(); foreach ($q as $v) { $t = explode('=',$v,2); $t[0] = rawurldecode($t[0]); if (!isset($t[1])) { $T[$t[0]] = null; } else { $T[$t[0]] = urldecode($t[1]); } } return $T; } return array(); } protected function sortTypes() { foreach ($this->types as $k => $v) { $r[$k] = $v['url']; } array_multisort($r,SORT_DESC,$this->types); } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/xmlsql/000077500000000000000000000000001230033266200215405ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/xmlsql/class.xmlsql.php000066400000000000000000000076621230033266200247100ustar00rootroot00000000000000con =& $con; $this->xml = $xml; $schema = dbSchema::init($this->con); $this->tables = $schema->getTables(); unset($schema); } public function replace($str,$rep) { $this->xml = str_replace($str,$rep,$this->xml); } public function execute($version=0) { $this->test_version = $version; $x = @simplexml_load_string($this->xml); if (!$x) { throw new Exception('Unable to load XML file.'); } $this->parseNode($x); } protected function parseNode($node) { foreach ($node->children() as $n) { switch (dom_import_simplexml($n)->nodeName) { case 'test': $this->performTest($n); break; case 'action': $this->performAction($n); break; } } } protected function performTest($node) { /* Test like: ... */ if (isset($node['type']) && (string) $node['type'] == 'table') { $test['result'] = in_array($node['name'],$this->tables); $test['label'] = 'Table %s does not exists'; $test['string'] = (string) $node['name']; $xtest = $node; } /* Test syntax: ... */ elseif (isset($node['type']) && (string) $node['type'] == 'column') { $c = explode('.',$node['name']); if (count($c) != 2) { return false; } list($table,$col) = $c; $rs = $this->con->getColumns($table); $test['result'] = isset($rs[$col]); $test['label'] = 'Column %s does not exists'; $test['string'] = (string) $node['name']; $xtest = $node; } /* Test syntax: ... */ elseif (isset($node['type']) && (string) $node['type'] == 'version') { $comp = isset($node['comp']) ? $node['comp'] : '>'; $test['result'] = version_compare($node['name'],$this->test_version,$comp); $test['label'] = 'Version %s is too low'; $test['string'] = (string) $node['name']; $xtest = $node; } # End tests if (isset($xtest)) { if ($xtest['eq'] == 'neq') { $test['result'] = !$test['result']; } if (isset($xtest['alert'])) { $test['alert'] = (boolean) (integer) $xtest['alert']; } else { $test['alert'] = false; } if (isset($xtest['label'])) { $test['label'] = (string) $xtest['label']; } if (isset($xtest['string'])) { $test['string'] = (string) $xtest['string']; } unset($xtest); # Test false if (!$test['result']) { if ($test['alert']) { throw new Exception(sprintf($test['label'],$test['string'])); } } # Test true else { $this->parseNode($node); } } else { return false; } } protected function performAction($node) { $req = trim((string) $node); if ($req) { try { $this->con->execute($req); } catch (Exception $e) { if ($node['silent'] != 1) { throw $e; } } } } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/zip/000077500000000000000000000000001230033266200210225ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/libs/clearbricks/zip/class.unzip.php000066400000000000000000000416231230033266200240120ustar00rootroot00000000000000file_name = $file_name; } public function __destruct() { $this->close(); } public function close() { if ($this->fp) { fclose($this->fp); $this->fp = null; } if ($this->memory_limit) { ini_set('memory_limit',$this->memory_limit); } } public function getList($stop_on_file=false,$exclude=false) { if (!empty($this->compressed_list)) { return $this->compressed_list; } if (!$this->loadFileListByEOF($stop_on_file,$exclude)) { if(!$this->loadFileListBySignatures($stop_on_file,$exclude)) { return false; } } return $this->compressed_list; } public function unzipAll($target) { if (empty($this->compressed_list)) { $this->getList(); } foreach ($this->compressed_list as $k => $v) { if ($v['is_dir']) { continue; } $this->unzip($k,$target.'/'.$k); } } public function unzip($file_name,$target=false) { if (empty($this->compressed_list)) { $this->getList($file_name); } if (!isset($this->compressed_list[$file_name])) { throw new Exception(sprintf(__('File %s is not compressed in the zip.'),$file_name)); } if ($this->isFileExcluded($file_name)) { return; } $details =& $this->compressed_list[$file_name]; if ($details['is_dir']) { throw new Exception(sprintf(__('Trying to unzip a folder name %s'),$file_name)); } if ($target) { $this->testTargetDir(dirname($target)); } if (!$details['uncompressed_size']) { return $this->putContent('',$target); } fseek($this->fp(),$details['contents_start_offset']); $this->memoryAllocate($details['compressed_size']); return $this->uncompress( fread($this->fp(), $details['compressed_size']), $details['compression_method'], $details['uncompressed_size'], $target ); } public function getFilesList() { if (empty($this->compressed_list)) { $this->getList(); } $res = array(); foreach ($this->compressed_list as $k => $v) { if (!$v['is_dir']) { $res[] = $k; } } return $res; } public function getDirsList() { if (empty($this->compressed_list)) { $this->getList(); } $res = array(); foreach ($this->compressed_list as $k => $v) { if ($v['is_dir']) { $res[] = substr($k,0,-1); } } return $res; } public function getRootDir() { if (empty($this->compressed_list)) { $this->getList(); } $files = $this->getFilesList(); $dirs = $this->getDirsList(); $root_files = 0; $root_dirs = 0; foreach ($files as $v) { if (strpos($v,'/') === false) { $root_files++; }} foreach ($dirs as $v) { if (strpos($v,'/') === false) { $root_dirs++; }} if ($root_files == 0 && $root_dirs == 1) { return $dirs[0]; } else { return false; } } public function isEmpty() { if (empty($this->compressed_list)) { $this->getList(); } return count($this->compressed_list) == 0; } public function hasFile($f) { if (empty($this->compressed_list)) { $this->getList(); } return isset($this->compressed_list[$f]); } public function setExcludePattern($pattern) { $this->exclude_pattern = $pattern; } protected function fp() { if ($this->fp === null) { $this->fp = @fopen($this->file_name,'rb'); } if ($this->fp === false) { throw new Exception('Unable to open file.'); } return $this->fp; } protected function isFileExcluded($f) { if (!$this->exclude_pattern) { return false; } return preg_match($this->exclude_pattern,$f); } protected function putContent($content,$target=false) { if ($target) { $r = @file_put_contents($target,$content); if ($r === false) { throw new Exception(__('Unable to write destination file.')); } files::inheritChmod($target); return true; } return $content; } protected function testTargetDir($dir) { if (is_dir($dir) && !is_writable($dir)) { throw new Exception(__('Unable to write in target directory, permission denied.')); } if (!is_dir($dir)) { files::makeDir($dir,true); } } protected function uncompress($content,$mode,$size,$target=false) { switch ($mode) { case 0: # Not compressed $this->memoryAllocate($size*2); return $this->putContent($content,$target); case 1: throw new Exception('Shrunk mode is not supported.'); case 2: case 3: case 4: case 5: throw new Exception('Compression factor '.($mode-1).' is not supported.'); case 6: throw new Exception('Implode is not supported.'); case 7: throw new Exception('Tokenizing compression algorithm is not supported.'); case 8: # Deflate if (!function_exists('gzinflate')) { throw new Exception('Gzip functions are not available.'); } $this->memoryAllocate($size*2); return $this->putContent(gzinflate($content,$size),$target); case 9: throw new Exception('Enhanced Deflating is not supported.'); case 10: throw new Exception('PKWARE Date Compression Library Impoloding is not supported.'); case 12: # Bzip2 if (!function_exists('bzdecompress')) { throw new Exception('Bzip2 functions are not available.'); } $this->memoryAllocate($size*2); return $this->putContent(bzdecompress($content),$target); case 18: throw new Exception('IBM TERSE is not supported.'); default: throw new Exception('Unknown uncompress method'); } } protected function loadFileListByEOF($stop_on_file=false,$exclude=false) { $fp = $this->fp(); for ($x=0; $x<1024; $x++) { fseek($fp,-22-$x,SEEK_END); $signature = fread($fp,4); if ($signature == $this->dir_sig_e) { $dir_list = array(); $eodir = array( 'disk_number_this' => unpack('v', fread($fp,2)), 'disk_number' => unpack('v', fread($fp,2)), 'total_entries_this' => unpack('v', fread($fp,2)), 'total_entries' => unpack('v', fread($fp,2)), 'size_of_cd' => unpack('V', fread($fp,4)), 'offset_start_cd' => unpack('V', fread($fp,4)) ); $zip_comment_len = unpack('v', fread($fp,2)); $eodir['zipfile_comment'] = $zip_comment_len[1] ? fread($fp,$zip_comment_len) : ''; $this->eo_central = array( 'disk_number_this' => $eodir['disk_number_this'][1], 'disk_number' => $eodir['disk_number'][1], 'total_entries_this' => $eodir['total_entries_this'][1], 'total_entries' => $eodir['total_entries'][1], 'size_of_cd' => $eodir['size_of_cd'][1], 'offset_start_cd' => $eodir['offset_start_cd'][1], 'zipfile_comment' => $eodir['zipfile_comment'] ); fseek($fp, $this->eo_central['offset_start_cd']); $signature = fread($fp,4); while ($signature == $this->dir_sig) { $dir = array(); $dir['version_madeby'] = unpack("v",fread($fp, 2)); # version made by $dir['version_needed'] = unpack("v",fread($fp, 2)); # version needed to extract $dir['general_bit_flag'] = unpack("v",fread($fp, 2)); # general purpose bit flag $dir['compression_method'] = unpack("v",fread($fp, 2)); # compression method $dir['lastmod_time'] = unpack("v",fread($fp, 2)); # last mod file time $dir['lastmod_date'] = unpack("v",fread($fp, 2)); # last mod file date $dir['crc-32'] = fread($fp,4); # crc-32 $dir['compressed_size'] = unpack("V",fread($fp, 4)); # compressed size $dir['uncompressed_size'] = unpack("V",fread($fp, 4)); # uncompressed size $file_name_len = unpack("v",fread($fp, 2)); # filename length $extra_field_len = unpack("v",fread($fp, 2)); # extra field length $file_comment_len = unpack("v",fread($fp, 2)); # file comment length $dir['disk_number_start'] = unpack("v",fread($fp, 2)); # disk number start $dir['internal_attributes'] = unpack("v",fread($fp, 2)); # internal file attributes-byte1 $dir['external_attributes1'] = unpack("v",fread($fp, 2)); # external file attributes-byte2 $dir['external_attributes2'] = unpack("v",fread($fp, 2)); # external file attributes $dir['relative_offset'] = unpack("V",fread($fp, 4)); # relative offset of local header $dir['file_name'] = $this->cleanFileName(fread($fp, $file_name_len[1])); # filename $dir['extra_field'] = $extra_field_len[1] ? fread($fp, $extra_field_len[1]) : ''; # extra field $dir['file_comment'] = $file_comment_len[1] ? fread($fp, $file_comment_len[1]) : ''; # file comment $dir_list[$dir['file_name']] = array( 'version_madeby' => $dir['version_madeby'][1], 'version_needed' => $dir['version_needed'][1], 'general_bit_flag' => str_pad(decbin($dir['general_bit_flag'][1]), 8, '0', STR_PAD_LEFT), 'compression_method' => $dir['compression_method'][1], 'lastmod_datetime' => $this->getTimeStamp($dir['lastmod_date'][1],$dir['lastmod_time'][1]), 'crc-32' => str_pad(dechex(ord($dir['crc-32'][3])), 2, '0', STR_PAD_LEFT). str_pad(dechex(ord($dir['crc-32'][2])), 2, '0', STR_PAD_LEFT). str_pad(dechex(ord($dir['crc-32'][1])), 2, '0', STR_PAD_LEFT). str_pad(dechex(ord($dir['crc-32'][0])), 2, '0', STR_PAD_LEFT), 'compressed_size' => $dir['compressed_size'][1], 'uncompressed_size' => $dir['uncompressed_size'][1], 'disk_number_start' => $dir['disk_number_start'][1], 'internal_attributes' => $dir['internal_attributes'][1], 'external_attributes1' => $dir['external_attributes1'][1], 'external_attributes2' => $dir['external_attributes2'][1], 'relative_offset' => $dir['relative_offset'][1], 'file_name' => $dir['file_name'], 'extra_field' => $dir['extra_field'], 'file_comment' => $dir['file_comment'] ); $signature = fread($fp, 4); } foreach ($dir_list as $k => $v) { if ($exclude && preg_match($exclude,$k)) { continue; } $i = $this->getFileHeaderInformation($v['relative_offset']); $this->compressed_list[$k]['file_name'] = $k; $this->compressed_list[$k]['is_dir'] = $v['external_attributes1'] == 16 || substr($k,-1,1) == '/'; $this->compressed_list[$k]['compression_method'] = $v['compression_method']; $this->compressed_list[$k]['version_needed'] = $v['version_needed']; $this->compressed_list[$k]['lastmod_datetime'] = $v['lastmod_datetime']; $this->compressed_list[$k]['crc-32'] = $v['crc-32']; $this->compressed_list[$k]['compressed_size'] = $v['compressed_size']; $this->compressed_list[$k]['uncompressed_size'] = $v['uncompressed_size']; $this->compressed_list[$k]['lastmod_datetime'] = $v['lastmod_datetime']; $this->compressed_list[$k]['extra_field'] = $i['extra_field']; $this->compressed_list[$k]['contents_start_offset'] = $i['contents_start_offset']; if(strtolower($stop_on_file) == strtolower($k)) { break; } } return true; } } return false; } protected function loadFileListBySignatures($stop_on_file=false,$exclude=false) { $fp = $this->fp(); fseek($fp,0); $return = false; while(true) { $details = $this->getFileHeaderInformation(); if (!$details) { fseek($fp,12-4,SEEK_CUR); # 12: Data descriptor - 4: Signature (that will be read again) $details = $this->getFileHeaderInformation(); } if (!$details) { break; } $filename = $details['file_name']; if ($exclude && preg_match($exclude,$filename)) { continue; } $this->compressed_list[$filename] = $details; $return = true; if (strtolower($stop_on_file) == strtolower($filename)) { break; } } return $return; } protected function getFileHeaderInformation($start_offset=false) { $fp = $this->fp(); if ($start_offset !== false) { fseek($fp,$start_offset); } $signature = fread($fp, 4); if ($signature == $this->zip_sig) { # Get information about the zipped file $file = array(); $file['version_needed'] = unpack("v",fread($fp, 2)); # version needed to extract $file['general_bit_flag'] = unpack("v",fread($fp, 2)); # general purpose bit flag $file['compression_method'] = unpack("v",fread($fp, 2)); # compression method $file['lastmod_time'] = unpack("v",fread($fp, 2)); # last mod file time $file['lastmod_date'] = unpack("v",fread($fp, 2)); # last mod file date $file['crc-32'] = fread($fp,4); # crc-32 $file['compressed_size'] = unpack("V",fread($fp, 4)); # compressed size $file['uncompressed_size'] = unpack("V",fread($fp, 4)); # uncompressed size $file_name_len = unpack("v",fread($fp, 2)); # filename length $extra_field_len = unpack("v",fread($fp, 2)); # extra field length $file['file_name'] = $this->cleanFileName(fread($fp,$file_name_len[1])); # filename $file['extra_field'] = $extra_field_len[1] ? fread($fp, $extra_field_len[1]) : ''; # extra field $file['contents_start_offset'] = ftell($fp); # Look for the next file fseek($fp, $file['compressed_size'][1], SEEK_CUR); # Mount file table $i = array( 'file_name' => $file['file_name'], 'is_dir' => substr($file['file_name'],-1,1) == '/', 'compression_method' => $file['compression_method'][1], 'version_needed' => $file['version_needed'][1], 'lastmod_datetime' => $this->getTimeStamp($file['lastmod_date'][1],$file['lastmod_time'][1]), 'crc-32' => str_pad(dechex(ord($file['crc-32'][3])), 2, '0', STR_PAD_LEFT). str_pad(dechex(ord($file['crc-32'][2])), 2, '0', STR_PAD_LEFT). str_pad(dechex(ord($file['crc-32'][1])), 2, '0', STR_PAD_LEFT). str_pad(dechex(ord($file['crc-32'][0])), 2, '0', STR_PAD_LEFT), 'compressed_size' => $file['compressed_size'][1], 'uncompressed_size' => $file['uncompressed_size'][1], 'extra_field' => $file['extra_field'], 'general_bit_flag' => str_pad(decbin($file['general_bit_flag'][1]), 8, '0', STR_PAD_LEFT), 'contents_start_offset'=>$file['contents_start_offset'] ); return $i; } return false; } protected function getTimeStamp($date,$time) { $BINlastmod_date = str_pad(decbin($date), 16, '0', STR_PAD_LEFT); $BINlastmod_time = str_pad(decbin($time), 16, '0', STR_PAD_LEFT); $lastmod_dateY = bindec(substr($BINlastmod_date, 0, 7))+1980; $lastmod_dateM = bindec(substr($BINlastmod_date, 7, 4)); $lastmod_dateD = bindec(substr($BINlastmod_date, 11, 5)); $lastmod_timeH = bindec(substr($BINlastmod_time, 0, 5)); $lastmod_timeM = bindec(substr($BINlastmod_time, 5, 6)); $lastmod_timeS = bindec(substr($BINlastmod_time, 11, 5)) * 2; return mktime($lastmod_timeH, $lastmod_timeM, $lastmod_timeS, $lastmod_dateM, $lastmod_dateD, $lastmod_dateY); } protected function cleanFileName($n) { $n = str_replace('../','',$n); $n = preg_replace('#^/+#','',$n); return $n; } protected function memoryAllocate($size) { $mem_used = function_exists('memory_get_usage') ? @memory_get_usage() : 4000000; $mem_limit = @ini_get('memory_limit'); if ($mem_used && $mem_limit) { $mem_limit = files::str2bytes($mem_limit); $mem_avail = $mem_limit-$mem_used-(512*1024); $mem_needed = $size; if ($mem_needed > $mem_avail) { if (@ini_set('memory_limit',$mem_limit+$mem_needed+$mem_used) === false) { throw new Exception(__('Not enough memory to open file.')); } if (!$this->memory_limit) { $this->memory_limit = $mem_limit; } } } } } ?>dotclear-2.6.2+dfsg/inc/libs/clearbricks/zip/class.zip.php000066400000000000000000000217511230033266200234470ustar00rootroot00000000000000fp = $out_fp; } public function __destruct() { $this->close(); } public function close() { if ($this->memory_limit) { ini_set('memory_limit',$this->memory_limit); } } public function addExclusion($reg) { $this->exclusions[] = $reg; } public function addFile($file,$name=null) { $file = preg_replace('#[\\\/]+#','/',$file); if (!$name) { $name = $file; } $name = $this->formatName($name); if ($this->isExcluded($name)) { return; } if (!file_exists($file) || !is_file($file)) { throw new Exception(__('File does not exist')); } if (!is_readable($file)) { throw new Exception(__('Cannot read file')); } $info = stat($file); $this->entries[$name] = array( 'file' => $file, 'is_dir' => false, 'mtime' => $info['mtime'], 'size' => $info['size'] ); } public function addDirectory($dir,$name=null,$recursive=false) { $dir = preg_replace('#[\\\/]+#','/',$dir); if (substr($dir,-1-1) != '/') { $dir .= '/'; } if (!$name && $name !== '') { $name = $dir; } if ($this->isExcluded($name)) { return; } if ($name !== '') { if (substr($name,-1,1) != '/') { $name .= '/'; } $name = $this->formatName($name); if ($name !== '') { $this->entries[$name] = array( 'file' => null, 'is_dir' => true, 'mtime' => time(), 'size' => 0 ); } } if ($recursive) { if (!is_dir($dir)) { throw new Exception(__('Directory does not exist')); } if (!is_readable($dir)) { throw new Exception(__('Cannot read directory')); } $D = dir($dir); while (($e = $D->read()) !== false) { if ($e == '.' || $e == '..') { continue; } if (is_dir($dir.'/'.$e)) { $this->addDirectory($dir.$e,$name.$e,true); } elseif (is_file($dir.'/'.$e)) { $this->addFile($dir.$e,$name.$e); } } } } public function write() { foreach ($this->entries as $name => $v) { if ($v['is_dir']) { $this->writeDirectory($name); } else { $this->writeFile($name,$v['file'],$v['size'],$v['mtime']); } } $ctrldir = implode('',$this->ctrl_dir); fwrite($this->fp, $ctrldir. $this->eof_ctrl_dir. pack('v',sizeof($this->ctrl_dir)). # total # of entries "on this disk" pack('v',sizeof($this->ctrl_dir)). # total # of entries overall pack('V',strlen($ctrldir)). # size of central dir pack('V',$this->old_offset). # offset to start of central dir "\x00\x00" # .zip file comment length ); } protected function writeDirectory($name) { if (!isset($this->entries[$name])) { return; } $mdate = $this->makeDate(time()); $mtime = $this->makeTime(time()); # Data descriptor $data_desc = "\x50\x4b\x03\x04". "\x0a\x00". # ver needed to extract "\x00\x00". # gen purpose bit flag "\x00\x00". # compression method pack('v',$mtime). # last mod time pack('v',$mdate). # last mod date pack('V',0). # crc32 pack('V',0). # compressed filesize pack('V',0). # uncompressed filesize pack('v',strlen($name)). # length of pathname pack('v',0). # extra field length $name. # end of "local file header" segment pack('V',0). # crc32 pack('V',0). # compressed filesize pack('V',0); # uncompressed filesize $new_offset = $this->old_offset + strlen($data_desc); fwrite($this->fp,$data_desc); # Add to central record $cdrec = "\x50\x4b\x01\x02". "\x00\x00". # version made by "\x0a\x00". # version needed to extract "\x00\x00". # gen purpose bit flag "\x00\x00". # compression method pack('v',$mtime). # last mod time pack('v',$mdate). # last mod date pack('V',0). # crc32 pack('V',0). # compressed filesize pack('V',0). # uncompressed filesize pack('v',strlen($name)). # length of filename pack('v',0). # extra field length pack('v',0). # file comment length pack('v',0). # disk number start pack('v',0). # internal file attributes pack('V',16). # external file attributes - 'directory' bit set pack('V',$this->old_offset). # relative offset of local header $name; $this->old_offset = $new_offset; $this->ctrl_dir[] = $cdrec; } protected function writeFile($name,$file,$size,$mtime) { if (!isset($this->entries[$name])) { return; } $size = filesize($file); $this->memoryAllocate($size*3); $content = file_get_contents($file); $unc_len = strlen($content); $crc = crc32($content); $zdata = gzdeflate($content); $c_len = strlen($zdata); unset($content); $mdate = $this->makeDate($mtime); $mtime = $this->makeTime($mtime); # Data descriptor $data_desc = "\x50\x4b\x03\x04". "\x14\x00". # ver needed to extract "\x00\x00". # gen purpose bit flag "\x08\x00". # compression method pack('v',$mtime). # last mod time pack('v',$mdate). # last mod date pack('V',$crc). # crc32 pack('V',$c_len). # compressed filesize pack('V',$unc_len). # uncompressed filesize pack('v',strlen($name)). # length of filename pack('v',0). # extra field length $name. # end of "local file header" segment $zdata. # "file data" segment pack('V',$crc). # crc32 pack('V',$c_len). # compressed filesize pack('V',$unc_len); # uncompressed filesize fwrite($this->fp,$data_desc); unset($zdata); $new_offset = $this->old_offset + strlen($data_desc); # Add to central directory record $cdrec = "\x50\x4b\x01\x02". "\x00\x00". # version made by "\x14\x00". # version needed to extract "\x00\x00". # gen purpose bit flag "\x08\x00". # compression method pack('v',$mtime). # last mod time pack('v',$mdate). # last mod date pack('V',$crc). # crc32 pack('V',$c_len). # compressed filesize pack('V',$unc_len). # uncompressed filesize pack('v',strlen($name)). # length of filename pack('v',0). # extra field length pack('v',0). # file comment length pack('v',0). # disk number start pack('v',0). # internal file attributes pack('V',32). # external file attributes - 'archive' bit set pack('V',$this->old_offset). # relative offset of local header $name; $this->old_offset = $new_offset; $this->ctrl_dir[] = $cdrec; } protected function formatName($name) { if (substr($name,0,1) == '/') { $name = substr($name,1); } return $name; } protected function isExcluded($name) { foreach ($this->exclusions as $reg) { if (preg_match($reg,$name)) { return true; } } return false; } protected function makeDate($ts) { $year = date('Y',$ts)-1980; if ($year < 0) { $year = 0; } $year = sprintf('%07b',$year); $month = sprintf('%04b',date('n',$ts)); $day = sprintf('%05b',date('j',$ts)); return bindec($year.$month.$day); } protected function makeTime($ts) { $hour = sprintf('%05b',date('G',$ts)); $minute = sprintf('%06b',date('i',$ts)); $second = sprintf('%05b',ceil(date('s',$ts)/2)); return bindec($hour.$minute.$second); } protected function memoryAllocate($size) { $mem_used = function_exists('memory_get_usage') ? @memory_get_usage() : 4000000; $mem_limit = @ini_get('memory_limit'); if ($mem_used && $mem_limit) { $mem_limit = files::str2bytes($mem_limit); $mem_avail = $mem_limit-$mem_used-(512*1024); $mem_needed = $size; if ($mem_needed > $mem_avail) { if (@ini_set('memory_limit',$mem_limit+$mem_needed+$mem_used) === false) { throw new Exception(__('Not enough memory to open file.')); } if (!$this->memory_limit) { $this->memory_limit = $mem_limit; } } } } } ?>dotclear-2.6.2+dfsg/inc/load_plugin_file.php000066400000000000000000000045251230033266200210160ustar00rootroot00000000000000 1) { header('Content-Type: text/plain'); http::head(403,'Forbidden'); exit; } $allow_types = array('png','jpg','jpeg','gif','css','js','swf'); $pf = path::clean($_GET['pf']); $paths = array_reverse(explode(PATH_SEPARATOR,DC_PLUGINS_ROOT)); # Adding admin/res folder here to load some stuff $paths[] = dirname(__FILE__).'/swf'; foreach ($paths as $m) { $PF = path::real($m.'/'.$pf); if ($PF !== false) { break; } } unset($paths); if ($PF === false || !is_file($PF) || !is_readable($PF)) { header('Content-Type: text/plain'); http::head(404,'Not Found'); exit; } if (!in_array(files::getExtension($PF),$allow_types)) { header('Content-Type: text/plain'); http::head(404,'Not Found'); exit; } http::$cache_max_age = 7200; http::cache(array_merge(array($PF),get_included_files())); header('Content-Type: '.files::getMimeType($PF)); header('Content-Length: '.filesize($PF)); readfile($PF); exit; dotclear-2.6.2+dfsg/inc/prepend.php000066400000000000000000000265271230033266200171650ustar00rootroot00000000000000We apologize for this temporary unavailability.
    '. 'Thank you for your understanding.

    '), 20); } else { __error(__('Unable to connect to database') ,$e->getCode() == 0 ? sprintf(__('

    This either means that the username and password information in '. 'your config.php file is incorrect or we can\'t contact '. 'the database server at "%s". This could mean your '. 'host\'s database server is down.

    '. '
    • Are you sure you have the correct username and password?
    • '. '
    • Are you sure that you have typed the correct hostname?
    • '. '
    • Are you sure that the database server is running?
    '. '

    If you\'re unsure what these terms mean you should probably contact '. 'your host. If you still need help you can always visit the '. 'Dotclear Support Forums.

    '). (DC_DEBUG ? __('The following error was encountered while trying to read the database:').'

    • '.$e->getMessage().'
    ' : '') ,(DC_DBHOST != '' ? DC_DBHOST : 'localhost') ) : '' ,20); } } # If we have some __top_behaviors, we load them if (isset($__top_behaviors) && is_array($__top_behaviors)) { foreach ($__top_behaviors as $b) { $core->addBehavior($b[0],$b[1]); } unset($b); } http::trimRequest(); try { http::unsetGlobals(); } catch (Exception $e) { header('Content-Type: text/plain'); echo $e->getMessage(); exit; } $core->url->registerDefault(array('dcUrlHandlers','home')); $core->url->registerError(array('dcUrlHandlers','default404')); $core->url->register('lang','','^([a-zA-Z]{2}(?:-[a-z]{2})?(?:/page/[0-9]+)?)$',array('dcUrlHandlers','lang')); $core->url->register('post','post','^post/(.+)$',array('dcUrlHandlers','post')); $core->url->register('preview','preview','^preview/(.+)$',array('dcUrlHandlers','preview')); $core->url->register('category','category','^category/(.+)$',array('dcUrlHandlers','category')); $core->url->register('archive','archive','^archive(/.+)?$',array('dcUrlHandlers','archive')); $core->url->register('feed','feed','^feed/(.+)$',array('dcUrlHandlers','feed')); $core->url->register('trackback','trackback','^trackback/(.+)$',array('dcUrlHandlers','trackback')); $core->url->register('rsd','rsd','^rsd$',array('dcUrlHandlers','rsd')); $core->url->register('xmlrpc','xmlrpc','^xmlrpc/(.+)$',array('dcUrlHandlers','xmlrpc')); $core->setPostType('post','post.php?id=%d',$core->url->getURLFor('post','%s'),'Posts'); # Store upload_max_filesize in bytes $u_max_size = files::str2bytes(ini_get('upload_max_filesize')); $p_max_size = files::str2bytes(ini_get('post_max_size')); if ($p_max_size < $u_max_size) { $u_max_size = $p_max_size; } define('DC_MAX_UPLOAD_SIZE',$u_max_size); unset($u_max_size); unset($p_max_size); # Shutdown register_shutdown_function('__shutdown'); function __shutdown() { global $__shutdown; if (is_array($__shutdown)) { foreach ($__shutdown as $f) { if (is_callable($f)) { call_user_func($f); } } } # Explicitly close session before DB connection try { if (session_id()) { session_write_close(); } } catch (Exception $e) {} $GLOBALS['core']->con->close(); } function __error($summary,$message,$code=0) { # Error codes # 10 : no config file # 20 : database issue # 30 : blog is not defined # 40 : template files creation # 50 : no default theme # 60 : template processing error # 70 : blog is offline if (CLI_MODE) { trigger_error($summary,E_USER_ERROR); exit(1); } else { if (defined('DC_ERRORFILE') && is_file(DC_ERRORFILE)) { include DC_ERRORFILE; } else { include dirname(__FILE__).'/core_error.php'; } exit; } } function init_prepend_l10n() { # Loading locales for detected language $dlang = http::getAcceptLanguages(); foreach($dlang as $l) { if ($l == 'en' || l10n::set(dirname(__FILE__).'/../locales/'.$l.'/main') !== false) { l10n::lang($l); break; } } } dotclear-2.6.2+dfsg/inc/public/000077500000000000000000000000001230033266200162615ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/public/class.dc.template.php000066400000000000000000002711521230033266200223060ustar00rootroot00000000000000remove_php = !$core->blog->settings->system->tpl_allow_php; $this->use_cache = $core->blog->settings->system->tpl_use_cache; $this->tag_block = '|>)((?:[^<]|<(?!/?tpl:\1)|(?R))*)'; $this->tag_value = '{{tpl:(\w+)(\s(.*?))?}}'; $this->core =& $core; # Transitional tags $this->addValue('EntryTrackbackCount',array($this,'EntryPingCount')); $this->addValue('EntryTrackbackData',array($this,'EntryPingData')); $this->addValue('EntryTrackbackLink',array($this,'EntryPingLink')); # l10n $this->addValue('lang',array($this,'l10n')); # Loops test tags $this->addBlock('LoopPosition',array($this,'LoopPosition')); $this->addValue('LoopIndex',array($this,'LoopIndex')); # Archives $this->addBlock('Archives',array($this,'Archives')); $this->addBlock('ArchivesHeader',array($this,'ArchivesHeader')); $this->addBlock('ArchivesFooter',array($this,'ArchivesFooter')); $this->addBlock('ArchivesYearHeader',array($this,'ArchivesYearHeader')); $this->addBlock('ArchivesYearFooter',array($this,'ArchivesYearFooter')); $this->addValue('ArchiveDate',array($this,'ArchiveDate')); $this->addBlock('ArchiveNext',array($this,'ArchiveNext')); $this->addBlock('ArchivePrevious',array($this,'ArchivePrevious')); $this->addValue('ArchiveEntriesCount',array($this,'ArchiveEntriesCount')); $this->addValue('ArchiveURL',array($this,'ArchiveURL')); # Blog $this->addValue('BlogArchiveURL',array($this,'BlogArchiveURL')); $this->addValue('BlogCopyrightNotice',array($this,'BlogCopyrightNotice')); $this->addValue('BlogDescription',array($this,'BlogDescription')); $this->addValue('BlogEditor',array($this,'BlogEditor')); $this->addValue('BlogFeedID',array($this,'BlogFeedID')); $this->addValue('BlogFeedURL',array($this,'BlogFeedURL')); $this->addValue('BlogRSDURL',array($this,'BlogRSDURL')); $this->addValue('BlogName',array($this,'BlogName')); $this->addValue('BlogLanguage',array($this,'BlogLanguage')); $this->addValue('BlogThemeURL',array($this,'BlogThemeURL')); $this->addValue('BlogParentThemeURL',array($this,'BlogParentThemeURL')); $this->addValue('BlogUpdateDate',array($this,'BlogUpdateDate')); $this->addValue('BlogID',array($this,'BlogID')); $this->addValue('BlogURL',array($this,'BlogURL')); $this->addValue('BlogXMLRPCURL',array($this,'BlogXMLRPCURL')); $this->addValue('BlogPublicURL',array($this,'BlogPublicURL')); $this->addValue('BlogQmarkURL',array($this,'BlogQmarkURL')); $this->addValue('BlogMetaRobots',array($this,'BlogMetaRobots')); # Categories $this->addBlock('Categories',array($this,'Categories')); $this->addBlock('CategoriesHeader',array($this,'CategoriesHeader')); $this->addBlock('CategoriesFooter',array($this,'CategoriesFooter')); $this->addBlock('CategoryIf',array($this,'CategoryIf')); $this->addBlock('CategoryFirstChildren',array($this,'CategoryFirstChildren')); $this->addBlock('CategoryParents',array($this,'CategoryParents')); $this->addValue('CategoryFeedURL',array($this,'CategoryFeedURL')); $this->addValue('CategoryURL',array($this,'CategoryURL')); $this->addValue('CategoryShortURL',array($this,'CategoryShortURL')); $this->addValue('CategoryDescription',array($this,'CategoryDescription')); $this->addValue('CategoryTitle',array($this,'CategoryTitle')); $this->addValue('CategoryEntriesCount',array($this,'CategoryEntriesCount')); # Comments $this->addBlock('Comments',array($this,'Comments')); $this->addValue('CommentAuthor',array($this,'CommentAuthor')); $this->addValue('CommentAuthorDomain',array($this,'CommentAuthorDomain')); $this->addValue('CommentAuthorLink',array($this,'CommentAuthorLink')); $this->addValue('CommentAuthorMailMD5',array($this,'CommentAuthorMailMD5')); $this->addValue('CommentAuthorURL',array($this,'CommentAuthorURL')); $this->addValue('CommentContent',array($this,'CommentContent')); $this->addValue('CommentDate',array($this,'CommentDate')); $this->addValue('CommentTime',array($this,'CommentTime')); $this->addValue('CommentEmail',array($this,'CommentEmail')); $this->addValue('CommentEntryTitle',array($this,'CommentEntryTitle')); $this->addValue('CommentFeedID',array($this,'CommentFeedID')); $this->addValue('CommentID',array($this,'CommentID')); $this->addBlock('CommentIf',array($this,'CommentIf')); $this->addValue('CommentIfFirst',array($this,'CommentIfFirst')); $this->addValue('CommentIfMe',array($this,'CommentIfMe')); $this->addValue('CommentIfOdd',array($this,'CommentIfOdd')); $this->addValue('CommentIP',array($this,'CommentIP')); $this->addValue('CommentOrderNumber',array($this,'CommentOrderNumber')); $this->addBlock('CommentsFooter',array($this,'CommentsFooter')); $this->addBlock('CommentsHeader',array($this,'CommentsHeader')); $this->addValue('CommentPostURL',array($this,'CommentPostURL')); $this->addBlock('IfCommentAuthorEmail',array($this,'IfCommentAuthorEmail')); $this->addValue('CommentHelp',array($this,'CommentHelp')); # Comment preview $this->addBlock('IfCommentPreview',array($this,'IfCommentPreview')); $this->addValue('CommentPreviewName',array($this,'CommentPreviewName')); $this->addValue('CommentPreviewEmail',array($this,'CommentPreviewEmail')); $this->addValue('CommentPreviewSite',array($this,'CommentPreviewSite')); $this->addValue('CommentPreviewContent',array($this,'CommentPreviewContent')); $this->addValue('CommentPreviewCheckRemember',array($this,'CommentPreviewCheckRemember')); # Entries $this->addBlock('DateFooter',array($this,'DateFooter')); $this->addBlock('DateHeader',array($this,'DateHeader')); $this->addBlock('Entries',array($this,'Entries')); $this->addBlock('EntriesFooter',array($this,'EntriesFooter')); $this->addBlock('EntriesHeader',array($this,'EntriesHeader')); $this->addValue('EntryExcerpt',array($this,'EntryExcerpt')); $this->addValue('EntryAuthorCommonName',array($this,'EntryAuthorCommonName')); $this->addValue('EntryAuthorDisplayName',array($this,'EntryAuthorDisplayName')); $this->addValue('EntryAuthorEmail',array($this,'EntryAuthorEmail')); $this->addValue('EntryAuthorID',array($this,'EntryAuthorID')); $this->addValue('EntryAuthorLink',array($this,'EntryAuthorLink')); $this->addValue('EntryAuthorURL',array($this,'EntryAuthorURL')); $this->addValue('EntryBasename',array($this,'EntryBasename')); $this->addValue('EntryCategory',array($this,'EntryCategory')); $this->addBlock('EntryCategoriesBreadcrumb',array($this,'EntryCategoriesBreadcrumb')); $this->addValue('EntryCategoryID',array($this,'EntryCategoryID')); $this->addValue('EntryCategoryURL',array($this,'EntryCategoryURL')); $this->addValue('EntryCategoryShortURL',array($this,'EntryCategoryShortURL')); $this->addValue('EntryCommentCount',array($this,'EntryCommentCount')); $this->addValue('EntryContent',array($this,'EntryContent')); $this->addValue('EntryDate',array($this,'EntryDate')); $this->addValue('EntryFeedID',array($this,'EntryFeedID')); $this->addValue('EntryFirstImage',array($this,'EntryFirstImage')); $this->addValue('EntryID',array($this,'EntryID')); $this->addBlock('EntryIf',array($this,'EntryIf')); $this->addValue('EntryIfFirst',array($this,'EntryIfFirst')); $this->addValue('EntryIfOdd',array($this,'EntryIfOdd')); $this->addValue('EntryIfSelected',array($this,'EntryIfSelected')); $this->addValue('EntryLang',array($this,'EntryLang')); $this->addBlock('EntryNext',array($this,'EntryNext')); $this->addValue('EntryPingCount',array($this,'EntryPingCount')); $this->addValue('EntryPingData',array($this,'EntryPingData')); $this->addValue('EntryPingLink',array($this,'EntryPingLink')); $this->addBlock('EntryPrevious',array($this,'EntryPrevious')); $this->addValue('EntryTitle',array($this,'EntryTitle')); $this->addValue('EntryTime',array($this,'EntryTime')); $this->addValue('EntryURL',array($this,'EntryURL')); # Languages $this->addBlock('Languages',array($this,'Languages')); $this->addBlock('LanguagesHeader',array($this,'LanguagesHeader')); $this->addBlock('LanguagesFooter',array($this,'LanguagesFooter')); $this->addValue('LanguageCode',array($this,'LanguageCode')); $this->addBlock('LanguageIfCurrent',array($this,'LanguageIfCurrent')); $this->addValue('LanguageURL',array($this,'LanguageURL')); # Pagination $this->addBlock('Pagination',array($this,'Pagination')); $this->addValue('PaginationCounter',array($this,'PaginationCounter')); $this->addValue('PaginationCurrent',array($this,'PaginationCurrent')); $this->addBlock('PaginationIf',array($this,'PaginationIf')); $this->addValue('PaginationURL',array($this,'PaginationURL')); # Trackbacks $this->addValue('PingBlogName',array($this,'PingBlogName')); $this->addValue('PingContent',array($this,'PingContent')); $this->addValue('PingDate',array($this,'PingDate')); $this->addValue('PingEntryTitle',array($this,'PingEntryTitle')); $this->addValue('PingFeedID',array($this,'PingFeedID')); $this->addValue('PingID',array($this,'PingID')); $this->addValue('PingIfFirst',array($this,'PingIfFirst')); $this->addValue('PingIfOdd',array($this,'PingIfOdd')); $this->addValue('PingIP',array($this,'PingIP')); $this->addValue('PingNoFollow',array($this,'PingNoFollow')); $this->addValue('PingOrderNumber',array($this,'PingOrderNumber')); $this->addValue('PingPostURL',array($this,'PingPostURL')); $this->addBlock('Pings',array($this,'Pings')); $this->addBlock('PingsFooter',array($this,'PingsFooter')); $this->addBlock('PingsHeader',array($this,'PingsHeader')); $this->addValue('PingTime',array($this,'PingTime')); $this->addValue('PingTitle',array($this,'PingTitle')); $this->addValue('PingAuthorURL',array($this,'PingAuthorURL')); # System $this->addValue('SysBehavior',array($this,'SysBehavior')); $this->addBlock('SysIf',array($this,'SysIf')); $this->addBlock('SysIfCommentPublished',array($this,'SysIfCommentPublished')); $this->addBlock('SysIfCommentPending',array($this,'SysIfCommentPending')); $this->addBlock('SysIfFormError',array($this,'SysIfFormError')); $this->addValue('SysFeedSubtitle',array($this,'SysFeedSubtitle')); $this->addValue('SysFormError',array($this,'SysFormError')); $this->addValue('SysPoweredBy',array($this,'SysPoweredBy')); $this->addValue('SysSearchString',array($this,'SysSearchString')); $this->addValue('SysSelfURI',array($this,'SysSelfURI')); # Generic $this->addValue('else',array($this,'GenericElse')); } public function getData($________) { # --BEHAVIOR-- tplBeforeData if ($this->core->hasBehavior('tplBeforeData')) { self::$_r = $this->core->callBehavior('tplBeforeData',$this->core); if (self::$_r) { return self::$_r; } } parent::getData($________); # --BEHAVIOR-- tplAfterData if ($this->core->hasBehavior('tplAfterData')) { $this->core->callBehavior('tplAfterData',$this->core,self::$_r); } return self::$_r; } protected function compileFile($file) { $fc = file_get_contents($file); $this->compile_stack[] = $file; # Remove every PHP tags if ($this->remove_php) { $fc = preg_replace('/<\?(?=php|=|\s).*?\?>/ms','',$fc); } # Transform what could be considered as PHP short tags $fc = preg_replace('/(<\?(?!php|=|\s))(.*?)(\?>)/ms', '$2',$fc); # Remove template comments $fc = preg_replace('/(^\s*)?/ms','',$fc); # Lexer part : split file into small pieces # each array entry will be either a tag or plain text $blocks = preg_split( '#(]*>)|()|({{tpl:\w+[^}]*}})#msu',$fc,-1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); # Next : build semantic tree from tokens. $rootNode = new tplNode(); $node = $rootNode; $errors = array(); foreach ($blocks as $id => $block) { $isblock = preg_match('#|>)||{{tpl:(\w+)(\s(.*?))?}}#ms',$block,$match); if ($isblock == 1) { if (substr($match[0],1,1) == '/') { // Closing tag, check if it matches current opened node $tag = $match[3]; if (($node instanceof tplNodeBlock) && $node->getTag() == $tag) { $node->setClosing(); $node = $node->getParent(); } else { // Closing tag does not match opening tag // Search if it closes a parent tag $search = $node; while($search->getTag() != 'ROOT' && $search->getTag() != $tag) { $search = $search->getParent(); } if ($search->getTag() == $tag) { $errors[] = sprintf( __('Did not find closing tag for block . Content has been ignored.'), html::escapeHTML($node->getTag())); $search->setClosing(); $node = $search->getParent(); } else { $errors[]=sprintf( __('Unexpected closing tag found.'), $tag);; } } } elseif (substr($match[0],0,1) == '{') { // Value tag $tag = $match[4]; $str_attr = ''; $attr = array(); if (isset($match[6])) { $str_attr = $match[6]; $attr = $this->getAttrs($match[6]); } $node->addChild(new tplNodeValue($tag,$attr,$str_attr)); } else { // Opening tag, create new node and dive into it $tag = $match[1]; $newnode = new tplNodeBlock($tag,isset($match[2])?$this->getAttrs($match[2]):array()); $node->addChild($newnode); $node = $newnode; } } else { // Simple text $node->addChild(new tplNodeText($block)); } } if (($node instanceof tplNodeBlock) && !$node->isClosed()) { $errors[] = sprintf( __('Did not find closing tag for block . Content has been ignored.'), html::escapeHTML($node->getTag())); } $err = ""; if (count($errors) > 0) { $err = "\n\n\n"; } return $rootNode->compile($this).$err; } public function compileBlockNode($tag,$attr,$content) { $this->current_tag = $tag; $attr = new ArrayObject($attr); # --BEHAVIOR-- templateBeforeBlock $res = $this->core->callBehavior('templateBeforeBlock',$this->core,$this->current_tag,$attr); # --BEHAVIOR-- templateInsideBlock $this->core->callBehavior('templateInsideBlock',$this->core,$this->current_tag,$attr,array(&$content)); if (isset($this->blocks[$this->current_tag])) { $res .= call_user_func($this->blocks[$this->current_tag],$attr,$content); } elseif ($this->unknown_block_handler != null) { $res .= call_user_func($this->unknown_block_handler,$this->current_tag,$attr,$content); } # --BEHAVIOR-- templateAfterBlock $res .= $this->core->callBehavior('templateAfterBlock',$this->core,$this->current_tag,$attr); return $res; } public function compileValueNode($tag,$attr,$str_attr) { $this->current_tag = $tag; $attr = new ArrayObject($attr); # --BEHAVIOR-- templateBeforeValue $res = $this->core->callBehavior('templateBeforeValue',$this->core,$this->current_tag,$attr); if (isset($this->values[$this->current_tag])) { $res .= call_user_func($this->values[$this->current_tag],$attr,ltrim($str_attr)); } elseif ($this->unknown_value_handler != null) { $res .= call_user_func($this->unknown_value_handler,$this->current_tag,$attr,$str_attr); } # --BEHAVIOR-- templateAfterValue $res .= $this->core->callBehavior('templateAfterValue',$this->core,$this->current_tag,$attr); return $res; } public function setUnknownValueHandler($callback) { if (is_callable($callback)) { $this->unknown_value_handler = $callback; } } public function setUnknownBlockHandler($callback) { if (is_callable($callback)) { $this->unknown_block_handler = $callback; } } public function getFilters($attr) { $p[0] = '0'; # encode_xml $p[1] = '0'; # remove_html $p[2] = '0'; # cut_string $p[3] = '0'; # lower_case $p[4] = '0'; # upper_case or capitalize $p[0] = (integer) (!empty($attr['encode_xml']) || !empty($attr['encode_html'])); $p[1] = (integer) !empty($attr['remove_html']); if (!empty($attr['cut_string']) && (integer) $attr['cut_string'] > 0) { $p[2] = (integer) $attr['cut_string']; } $p[3] = (integer) !empty($attr['lower_case']); $p[4] = (integer) !empty($attr['upper_case']); $p[4] = (!empty($attr['capitalize']) ? 2 : $p[4]); return "context::global_filter(%s,".implode(",",$p).",'".addslashes($this->current_tag)."')"; } public static function getOperator($op) { switch (strtolower($op)) { case 'or': case '||': return '||'; case 'and': case '&&': default: return '&&'; } } public function getSortByStr($attr,$table = null) { $res = array(); $default_order = 'desc'; $default_alias = array( 'post' => array( 'title' => 'post_title', 'selected' => 'post_selected', 'author' => 'user_id', 'date' => 'post_dt', 'id' => 'post_id', 'comment' => 'nb_comment', 'trackback' => 'nb_trackback' ), 'comment' => array( 'author' => 'comment_author', 'date' => 'comment_dt', 'id' => 'comment_id' ) ); $alias = new ArrayObject(); # --BEHAVIOR-- templateCustomSortByAlias $this->core->callBehavior('templateCustomSortByAlias',$alias); $alias = $alias->getArrayCopy(); if (is_array($alias)) { foreach ($alias as $k => $v) { if (!is_array($v)) { $alias[$k] = array(); } if (!is_array($v)) { $default_alias[$k] = array(); } $default_alias[$k] = array_merge($default_alias[$k],$alias[$k]); } } if (!array_key_exists($table,$default_alias)) { return implode(', ',$res); } if (isset($attr['order']) && preg_match('/^(desc|asc)$/i',$attr['order'])) { $default_order = $attr['order']; } if (isset($attr['sortby'])) { $sorts = explode(',',$attr['sortby']); foreach ($sorts as $k => $sort) { $order = $default_order; if (preg_match('/([a-z]*)\s*\?(desc|asc)$/i',$sort,$matches)) { $sort = $matches[1]; $order = $matches[2]; } if (array_key_exists($sort,$default_alias[$table])) { array_push($res,$default_alias[$table][$sort].' '.$order); } } } if (count($res) === 0) { array_push($res,$default_alias[$table]['date'].' '.$default_order); } return implode(', ',$res); } public static function getAge($attr) { if (isset($attr['age']) && preg_match('/^(\-[0-9]+|last).*$/i',$attr['age'])) { if (($ts = strtotime($attr['age'])) !== false) { return dt::str('%Y-%m-%d %H:%m:%S',$ts); } } return ''; } /* TEMPLATE FUNCTIONS ------------------------------------------------------- */ public function l10n($attr,$str_attr) { # Normalize content $str_attr = preg_replace('/\s+/x',' ',$str_attr); return ""; } public function LoopPosition($attr,$content) { $start = isset($attr['start']) ? (integer) $attr['start'] : '0'; $length = isset($attr['length']) ? (integer) $attr['length'] : 'null'; $even = isset($attr['even']) ? (integer) (boolean) $attr['even'] : 'null'; if ($start > 0) { $start--; } return 'loopPosition('.$start.','.$length.','.$even.')) : ?>'. $content. ""; } public function LoopIndex($attr) { $f = $this->getFilters($attr); return 'cur_loop ? 0 : $_ctx->cur_loop->index() + 1)').'; ?>'; } /* Archives ------------------------------------------- */ /*dtd */ public function Archives($attr,$content) { $p = "if (!isset(\$params)) \$params = array();\n"; $p .= "\$params['type'] = 'month';\n"; if (isset($attr['type'])) { $p .= "\$params['type'] = '".addslashes($attr['type'])."';\n"; } if (isset($attr['category'])) { $p .= "\$params['cat_url'] = '".addslashes($attr['category'])."';\n"; } if (isset($attr['post_type'])) { $p .= "\$params['post_type'] = '".addslashes($attr['post_type'])."';\n"; } if (isset($attr['post_lang'])) { $p .= "\$params['post_lang'] = '".addslashes($attr['post_lang'])."';\n"; } if (empty($attr['no_context']) && !isset($attr['category'])) { $p .= 'if ($_ctx->exists("categories")) { '. "\$params['cat_id'] = \$_ctx->categories->cat_id; ". "}\n"; } $order = 'desc'; if (isset($attr['order']) && preg_match('/^(desc|asc)$/i',$attr['order'])) { $p .= "\$params['order'] = '".$attr['order']."';\n "; } $res = "core->callBehavior("templatePrepareParams", array("tag" => "Archives","method" => "blog::getDates"), $attr,$content); $res .= '$_ctx->archives = $core->blog->getDates($params); unset($params);'."\n"; $res .= "?>\n"; $res .= 'archives->fetch()) : ?>'.$content.'archives = null; ?>'; return $res; } /*dtd */ public function ArchivesHeader($attr,$content) { return "archives->isStart()) : ?>". $content. ""; } /*dtd */ public function ArchivesFooter($attr,$content) { return "archives->isEnd()) : ?>". $content. ""; } /*dtd */ public function ArchivesYearHeader($attr,$content) { return "archives->yearHeader()) : ?>". $content. ""; } /*dtd */ public function ArchivesYearFooter($attr,$content) { return "archives->yearFooter()) : ?>". $content. ""; } /*dtd */ public function ArchiveDate($attr) { $format = '%B %Y'; if (!empty($attr['format'])) { $format = addslashes($attr['format']); } $f = $this->getFilters($attr); return 'archives->dt)").'; ?>'; } /*dtd */ public function ArchiveEntriesCount($attr) { $f = $this->getFilters($attr); return 'archives->nb_post').'; ?>'; } /*dtd */ public function ArchiveNext($attr,$content) { $p = "if (!isset(\$params)) \$params = array();\n"; $p .= "\$params['type'] = 'month';\n"; if (isset($attr['type'])) { $p .= "\$params['type'] = '".addslashes($attr['type'])."';\n"; } if (isset($attr['post_type'])) { $p .= "\$params['post_type'] = '".addslashes($attr['post_type'])."';\n"; } if (isset($attr['post_lang'])) { $p .= "\$params['post_lang'] = '".addslashes($attr['post_lang'])."';\n"; } $p .= "\$params['next'] = \$_ctx->archives->dt;"; $res = "core->callBehavior("templatePrepareParams", array("tag" => "ArchiveNext","method" => "blog::getDates"), $attr, $content); $res .= '$_ctx->archives = $core->blog->getDates($params); unset($params);'."\n"; $res .= "?>\n"; $res .= 'archives->fetch()) : ?>'.$content.'archives = null; ?>'; return $res; } /*dtd */ public function ArchivePrevious($attr,$content) { $p = 'if (!isset($params)) $params = array();'; $p .= "\$params['type'] = 'month';\n"; if (isset($attr['type'])) { $p .= "\$params['type'] = '".addslashes($attr['type'])."';\n"; } if (isset($attr['post_type'])) { $p .= "\$params['post_type'] = '".addslashes($attr['post_type'])."';\n"; } if (isset($attr['post_lang'])) { $p .= "\$params['post_lang'] = '".addslashes($attr['post_lang'])."';\n"; } $p .= "\$params['previous'] = \$_ctx->archives->dt;"; $res = "core->callBehavior("templatePrepareParams", array("tag" => "ArchivePrevious","method" => "blog::getDates"), $attr, $content); $res .= $p; $res .= '$_ctx->archives = $core->blog->getDates($params); unset($params);'."\n"; $res .= "?>\n"; $res .= 'archives->fetch()) : ?>'.$content.'archives = null; ?>'; return $res; } /*dtd */ public function ArchiveURL($attr) { $f = $this->getFilters($attr); return 'archives->url($core)').'; ?>'; } /* Blog ----------------------------------------------- */ /*dtd */ public function BlogArchiveURL($attr) { $f = $this->getFilters($attr); return 'blog->url.$core->url->getURLFor("archive")').'; ?>'; } /*dtd */ public function BlogCopyrightNotice($attr) { $f = $this->getFilters($attr); return 'blog->settings->system->copyright_notice').'; ?>'; } /*dtd */ public function BlogDescription($attr) { $f = $this->getFilters($attr); return 'blog->desc').'; ?>'; } /*dtd */ public function BlogEditor($attr) { $f = $this->getFilters($attr); return 'blog->settings->system->editor').'; ?>'; } /*dtd */ public function BlogFeedID($attr) { $f = $this->getFilters($attr); return 'blog->uid').'; ?>'; } /*dtd */ public function BlogFeedURL($attr) { $type = !empty($attr['type']) ? $attr['type'] : 'atom'; if (!preg_match('#^(rss2|atom)$#',$type)) { $type = 'atom'; } $f = $this->getFilters($attr); return 'blog->url.$core->url->getURLFor("feed","'.$type.'")').'; ?>'; } /*dtd */ public function BlogName($attr) { $f = $this->getFilters($attr); return 'blog->name').'; ?>'; } /*dtd */ public function BlogLanguage($attr) { $f = $this->getFilters($attr); return 'blog->settings->system->lang').'; ?>'; } /*dtd */ public function BlogThemeURL($attr) { $f = $this->getFilters($attr); return 'blog->settings->system->themes_url."/".$core->blog->settings->system->theme').'; ?>'; } /*dtd */ public function BlogParentThemeURL($attr) { $f = $this->getFilters($attr); $parent = '$core->themes->moduleInfo($core->blog->settings->system->theme,\'parent\')'; return 'blog->settings->system->themes_url."/".('."$parent".' ? '."$parent".' : $core->blog->settings->system->theme)').'; ?>'; } /*dtd */ public function BlogPublicURL($attr) { $f = $this->getFilters($attr); return 'blog->settings->system->public_url').'; ?>'; } /*dtd */ public function BlogUpdateDate($attr) { $format = ''; if (!empty($attr['format'])) { $format = addslashes($attr['format']); } else { $format = '%Y-%m-%d %H:%M:%S'; } $iso8601 = !empty($attr['iso8601']); $rfc822 = !empty($attr['rfc822']); $f = $this->getFilters($attr); if ($rfc822) { return 'blog->upddt,\$core->blog->settings->system->blog_timezone)").'; ?>'; } elseif ($iso8601) { return 'blog->upddt,\$core->blog->settings->system->blog_timezone)").'; ?>'; } else { return 'blog->upddt)").'; ?>'; } } /*dtd */ public function BlogID($attr) { $f = $this->getFilters($attr); return 'blog->id').'; ?>'; } /*dtd */ public function BlogRSDURL($attr) { $f = $this->getFilters($attr); return 'blog->url.$core->url->getURLFor(\'rsd\')').'; ?>'; } /*dtd */ public function BlogXMLRPCURL($attr) { $f = $this->getFilters($attr); return 'blog->url.$core->url->getURLFor(\'xmlrpc\',$core->blog->id)').'; ?>'; } /*dtd */ public function BlogURL($attr) { $f = $this->getFilters($attr); return 'blog->url').'; ?>'; } /*dtd */ public function BlogQmarkURL($attr) { $f = $this->getFilters($attr); return 'blog->getQmarkURL()').'; ?>'; } /*dtd */ public function BlogMetaRobots($attr) { $robots = isset($attr['robots']) ? addslashes($attr['robots']) : ''; return "blog->settings->system->robots_policy,'".$robots."'); ?>"; } /* Categories ----------------------------------------- */ /*dtd */ public function Categories($attr,$content) { $p = "if (!isset(\$params)) \$params = array();\n"; if (isset($attr['url'])) { $p .= "\$params['cat_url'] = '".addslashes($attr['url'])."';\n"; } if (!empty($attr['post_type'])) { $p .= "\$params['post_type'] = '".addslashes($attr['post_type'])."';\n"; } if (!empty($attr['level'])) { $p .= "\$params['level'] = ".(integer) $attr['level'].";\n"; } if (isset($attr['with_empty']) && ((boolean) $attr['with_empty'] == true)) { $p .= '$params[\'without_empty\'] = false;'; } $res = "core->callBehavior("templatePrepareParams", array("tag" => "Categories","method" => "blog::getCategories"), $attr,$content); $res .= '$_ctx->categories = $core->blog->getCategories($params);'."\n"; $res .= "?>\n"; $res .= 'categories->fetch()) : ?>'.$content.'categories = null; unset($params); ?>'; return $res; } /*dtd */ public function CategoriesHeader($attr,$content) { return "categories->isStart()) : ?>". $content. ""; } /*dtd */ public function CategoriesFooter($attr,$content) { return "categories->isEnd()) : ?>". $content. ""; } /*dtd */ public function CategoryIf($attr,$content) { $if = new ArrayObject(); $operator = isset($attr['operator']) ? $this->getOperator($attr['operator']) : '&&'; if (isset($attr['url'])) { $url = addslashes(trim($attr['url'])); if (substr($url,0,1) == '!') { $url = substr($url,1); $if[] = '($_ctx->categories->cat_url != "'.$url.'")'; } else { $if[] = '($_ctx->categories->cat_url == "'.$url.'")'; } } if (isset($attr['has_entries'])) { $sign = (boolean) $attr['has_entries'] ? '>' : '=='; $if[] = '$_ctx->categories->nb_post '.$sign.' 0'; } if (isset($attr['has_description'])) { $sign = (boolean) $attr['has_description'] ? '!=' : '=='; $if[] = '$_ctx->categories->cat_desc '.$sign.' ""'; } $this->core->callBehavior('tplIfConditions','CategoryIf',$attr,$content,$if); if (count($if) != 0) { return ''.$content.''; } else { return $content; } } /*dtd */ public function CategoryFirstChildren($attr,$content) { return "categories = $core->blog->getCategoryFirstChildren($_ctx->categories->cat_id);'."\n". 'while ($_ctx->categories->fetch()) : ?>'.$content.'categories = null; ?>'; } /*dtd */ public function CategoryParents($attr,$content) { return "categories = $core->blog->getCategoryParents($_ctx->categories->cat_id);'."\n". 'while ($_ctx->categories->fetch()) : ?>'.$content.'categories = null; ?>'; } /*dtd */ public function CategoryFeedURL($attr) { $type = !empty($attr['type']) ? $attr['type'] : 'atom'; if (!preg_match('#^(rss2|atom)$#',$type)) { $type = 'atom'; } $f = $this->getFilters($attr); return 'blog->url.$core->url->getURLFor("feed","category/".'. '$_ctx->categories->cat_url."/'.$type.'")').'; ?>'; } /*dtd */ public function CategoryURL($attr) { $f = $this->getFilters($attr); return 'blog->url.$core->url->getURLFor("category",'. '$_ctx->categories->cat_url)').'; ?>'; } /*dtd */ public function CategoryShortURL($attr) { $f = $this->getFilters($attr); return 'categories->cat_url').'; ?>'; } /*dtd */ public function CategoryDescription($attr) { $f = $this->getFilters($attr); return 'categories->cat_desc').'; ?>'; } /*dtd */ public function CategoryTitle($attr) { $f = $this->getFilters($attr); return 'categories->cat_title').'; ?>'; } /*dtd */ public function CategoryEntriesCount($attr) { $f = $this->getFilters($attr); return 'categories->nb_post').'; ?>'; } /* Entries -------------------------------------------- */ /*dtd */ public function Entries($attr,$content) { $lastn = -1; if (isset($attr['lastn'])) { $lastn = abs((integer) $attr['lastn'])+0; } $p = 'if (!isset($_page_number)) { $_page_number = 1; }'."\n"; if ($lastn != 0) { if ($lastn > 0) { $p .= "\$params['limit'] = ".$lastn.";\n"; } else { $p .= "\$params['limit'] = \$_ctx->nb_entry_per_page;\n"; } if (!isset($attr['ignore_pagination']) || $attr['ignore_pagination'] == "0") { $p .= "\$params['limit'] = array(((\$_page_number-1)*\$params['limit']),\$params['limit']);\n"; } else { $p .= "\$params['limit'] = array(0, \$params['limit']);\n"; } } if (isset($attr['author'])) { $p .= "\$params['user_id'] = '".addslashes($attr['author'])."';\n"; } if (isset($attr['category'])) { $p .= "\$params['cat_url'] = '".addslashes($attr['category'])."';\n"; $p .= "context::categoryPostParam(\$params);\n"; } if (isset($attr['no_category']) && $attr['no_category']) { $p .= "@\$params['sql'] .= ' AND P.cat_id IS NULL ';\n"; $p .= "unset(\$params['cat_url']);\n"; } if (!empty($attr['type'])) { $p .= "\$params['post_type'] = preg_split('/\s*,\s*/','".addslashes($attr['type'])."',-1,PREG_SPLIT_NO_EMPTY);\n"; } if (!empty($attr['url'])) { $p .= "\$params['post_url'] = '".addslashes($attr['url'])."';\n"; } if (empty($attr['no_context'])) { if (!isset($attr['author'])) { $p .= 'if ($_ctx->exists("users")) { '. "\$params['user_id'] = \$_ctx->users->user_id; ". "}\n"; } if (!isset($attr['category']) && (!isset($attr['no_category']) || !$attr['no_category'])) { $p .= 'if ($_ctx->exists("categories")) { '. "\$params['cat_id'] = \$_ctx->categories->cat_id.(\$core->blog->settings->system->inc_subcats?' ?sub':'');". "}\n"; } $p .= 'if ($_ctx->exists("archives")) { '. "\$params['post_year'] = \$_ctx->archives->year(); ". "\$params['post_month'] = \$_ctx->archives->month(); "; if (!isset($attr['lastn'])) { $p .= "unset(\$params['limit']); "; } $p .= "}\n"; $p .= 'if ($_ctx->exists("langs")) { '. "\$params['post_lang'] = \$_ctx->langs->post_lang; ". "}\n"; $p .= 'if (isset($_search)) { '. "\$params['search'] = \$_search; ". "}\n"; } $p .= "\$params['order'] = '".$this->getSortByStr($attr,'post')."';\n"; if (isset($attr['no_content']) && $attr['no_content']) { $p .= "\$params['no_content'] = true;\n"; } if (isset($attr['selected'])) { $p .= "\$params['post_selected'] = ".(integer) (boolean) $attr['selected'].";"; } if (isset($attr['age'])) { $age = $this->getAge($attr); $p .= !empty($age) ? "@\$params['sql'] .= ' AND P.post_dt > \'".$age."\'';\n" : ''; } $res = "core->callBehavior("templatePrepareParams", array("tag" => "Entries","method" => "blog::getPosts"), $attr,$content); $res .= '$_ctx->post_params = $params;'."\n"; $res .= '$_ctx->posts = $core->blog->getPosts($params); unset($params);'."\n"; $res .= "?>\n"; $res .= 'posts->fetch()) : ?>'.$content.'posts = null; $_ctx->post_params = null; ?>'; return $res; } /*dtd */ public function DateHeader($attr,$content) { return "posts->firstPostOfDay()) : ?>". $content. ""; } /*dtd */ public function DateFooter($attr,$content) { return "posts->lastPostOfDay()) : ?>". $content. ""; } /*dtd */ public function EntryIf($attr,$content) { $if = new ArrayObject(); $extended = null; $hascategory = null; $operator = isset($attr['operator']) ? $this->getOperator($attr['operator']) : '&&'; if (isset($attr['type'])) { $type = trim($attr['type']); $type = !empty($type)?$type:'post'; $if[] = '$_ctx->posts->post_type == "'.addslashes($type).'"'; } if (isset($attr['url'])) { $url = trim($attr['url']); if (substr($url,0,1) == '!') { $url = substr($url,1); $if[] = '$_ctx->posts->post_url != "'.addslashes($url).'"'; } else { $if[] = '$_ctx->posts->post_url == "'.addslashes($url).'"'; } } if (isset($attr['category'])) { $category = addslashes(trim($attr['category'])); if (substr($category,0,1) == '!') { $category = substr($category,1); $if[] = '($_ctx->posts->cat_url != "'.$category.'")'; } else { $if[] = '($_ctx->posts->cat_url == "'.$category.'")'; } } if (isset($attr['first'])) { $sign = (boolean) $attr['first'] ? '=' : '!'; $if[] = '$_ctx->posts->index() '.$sign.'= 0'; } if (isset($attr['odd'])) { $sign = (boolean) $attr['odd'] ? '=' : '!'; $if[] = '($_ctx->posts->index()+1)%2 '.$sign.'= 1'; } if (isset($attr['extended'])) { $sign = (boolean) $attr['extended'] ? '' : '!'; $if[] = $sign.'$_ctx->posts->isExtended()'; } if (isset($attr['selected'])) { $sign = (boolean) $attr['selected'] ? '' : '!'; $if[] = $sign.'(boolean)$_ctx->posts->post_selected'; } if (isset($attr['has_category'])) { $sign = (boolean) $attr['has_category'] ? '' : '!'; $if[] = $sign.'$_ctx->posts->cat_id'; } if (isset($attr['comments_active'])) { $sign = (boolean) $attr['comments_active'] ? '' : '!'; $if[] = $sign.'$_ctx->posts->commentsActive()'; } if (isset($attr['pings_active'])) { $sign = (boolean) $attr['pings_active'] ? '' : '!'; $if[] = $sign.'$_ctx->posts->trackbacksActive()'; } if (isset($attr['has_comment'])) { $sign = (boolean) $attr['has_comment'] ? '' : '!'; $if[] = $sign.'$_ctx->posts->hasComments()'; } if (isset($attr['has_ping'])) { $sign = (boolean) $attr['has_ping'] ? '' : '!'; $if[] = $sign.'$_ctx->posts->hasTrackbacks()'; } if (isset($attr['show_comments'])) { if ((boolean) $attr['show_comments']) { $if[] = '($_ctx->posts->hasComments() || $_ctx->posts->commentsActive())'; } else { $if[] = '(!$_ctx->posts->hasComments() && !$_ctx->posts->commentsActive())'; } } if (isset($attr['show_pings'])) { if ((boolean) $attr['show_pings']) { $if[] = '($_ctx->posts->hasTrackbacks() || $_ctx->posts->trackbacksActive())'; } else { $if[] = '(!$_ctx->posts->hasTrackbacks() && !$_ctx->posts->trackbacksActive())'; } } if (isset($attr['republished'])) { $sign = (boolean) $attr['republished'] ? '' : '!'; $if[] = $sign.'(boolean)$_ctx->posts->isRepublished()'; } $this->core->callBehavior('tplIfConditions','EntryIf',$attr,$content,$if); if (count($if) != 0) { return ''.$content.''; } else { return $content; } } /*dtd */ public function EntryIfFirst($attr) { $ret = isset($attr['return']) ? $attr['return'] : 'first'; $ret = html::escapeHTML($ret); return 'posts->index() == 0) { '. "echo '".addslashes($ret)."'; } ?>"; } /*dtd */ public function EntryIfOdd($attr) { $ret = isset($attr['return']) ? $attr['return'] : 'odd'; $ret = html::escapeHTML($ret); return 'posts->index()+1)%2 == 1) { '. "echo '".addslashes($ret)."'; } ?>"; } /*dtd */ public function EntryIfSelected($attr) { $ret = isset($attr['return']) ? $attr['return'] : 'selected'; $ret = html::escapeHTML($ret); return 'posts->post_selected) { '. "echo '".addslashes($ret)."'; } ?>"; } /*dtd */ public function EntryContent($attr) { $urls = '0'; if (!empty($attr['absolute_urls'])) { $urls = '1'; } $f = $this->getFilters($attr); if (!empty($attr['full'])) { return 'posts->getExcerpt('.$urls.')." ".$_ctx->posts->getContent('.$urls.')').'; ?>'; } else { return 'posts->getContent('.$urls.')').'; ?>'; } } /*dtd */ public function EntryExcerpt($attr) { $urls = '0'; if (!empty($attr['absolute_urls'])) { $urls = '1'; } $f = $this->getFilters($attr); return 'posts->getExcerpt('.$urls.')').'; ?>'; } /*dtd */ public function EntryAuthorCommonName($attr) { $f = $this->getFilters($attr); return 'posts->getAuthorCN()').'; ?>'; } /*dtd */ public function EntryAuthorDisplayName($attr) { $f = $this->getFilters($attr); return 'posts->user_displayname').'; ?>'; } /*dtd */ public function EntryAuthorID($attr) { $f = $this->getFilters($attr); return 'posts->user_id').'; ?>'; } /*dtd */ public function EntryAuthorEmail($attr) { $p = 'true'; if (isset($attr['spam_protected']) && !$attr['spam_protected']) { $p = 'false'; } $f = $this->getFilters($attr); return 'posts->getAuthorEmail(".$p.")").'; ?>'; } /*dtd */ public function EntryAuthorLink($attr) { $f = $this->getFilters($attr); return 'posts->getAuthorLink()').'; ?>'; } /*dtd */ public function EntryAuthorURL($attr) { $f = $this->getFilters($attr); return 'posts->user_url').'; ?>'; } /*dtd */ public function EntryBasename($attr) { $f = $this->getFilters($attr); return 'posts->post_url').'; ?>'; } /*dtd */ public function EntryCategory($attr) { $f = $this->getFilters($attr); return 'posts->cat_title').'; ?>'; } /*dtd */ public function EntryCategoriesBreadcrumb($attr,$content) { return "categories = $core->blog->getCategoryParents($_ctx->posts->cat_id);'."\n". 'while ($_ctx->categories->fetch()) : ?>'.$content.'categories = null; ?>'; } /*dtd */ public function EntryCategoryID($attr) { $f = $this->getFilters($attr); return 'posts->cat_id').'; ?>'; } /*dtd */ public function EntryCategoryURL($attr) { $f = $this->getFilters($attr); return 'posts->getCategoryURL()').'; ?>'; } /*dtd */ public function EntryCategoryShortURL($attr) { $f = $this->getFilters($attr); return 'posts->cat_url').'; ?>'; } /*dtd */ public function EntryFeedID($attr) { $f = $this->getFilters($attr); return 'posts->getFeedID()').'; ?>'; } /*dtd */ public function EntryFirstImage($attr) { $size = !empty($attr['size']) ? $attr['size'] : ''; $class = !empty($attr['class']) ? $attr['class'] : ''; $with_category = !empty($attr['with_category']) ? 1 : 0; $no_tag = !empty($attr['no_tag']) ? 1 : 0; $content_only = !empty($attr['content_only']) ? 1 : 0; $cat_only = !empty($attr['cat_only']) ? 1 : 0; return ""; } /*dtd */ public function EntryID($attr) { $f = $this->getFilters($attr); return 'posts->post_id').'; ?>'; } /*dtd */ public function EntryLang($attr) { $f = $this->getFilters($attr); return 'posts->post_lang) { '. 'echo '.sprintf($f,'$_ctx->posts->post_lang').'; '. '} else {'. 'echo '.sprintf($f,'$core->blog->settings->system->lang').'; '. '} ?>'; } /*dtd */ public function EntryNext($attr,$content) { $restrict_to_category = !empty($attr['restrict_to_category']) ? '1' : '0'; $restrict_to_lang = !empty($attr['restrict_to_lang']) ? '1' : '0'; return 'blog->getNextPost($_ctx->posts,1,'.$restrict_to_category.','.$restrict_to_lang.'); ?>'."\n". ''. 'posts = $next_post; unset($next_post);'."\n". 'while ($_ctx->posts->fetch()) : ?>'. $content. 'posts = null; ?>'. "\n"; } /*dtd */ public function EntryPrevious($attr,$content) { $restrict_to_category = !empty($attr['restrict_to_category']) ? '1' : '0'; $restrict_to_lang = !empty($attr['restrict_to_lang']) ? '1' : '0'; return 'blog->getNextPost($_ctx->posts,-1,'.$restrict_to_category.','.$restrict_to_lang.'); ?>'."\n". ''. 'posts = $prev_post; unset($prev_post);'."\n". 'while ($_ctx->posts->fetch()) : ?>'. $content. 'posts = null; ?>'. "\n"; } /*dtd */ public function EntryTitle($attr) { $f = $this->getFilters($attr); return 'posts->post_title').'; ?>'; } /*dtd */ public function EntryURL($attr) { $f = $this->getFilters($attr); return 'posts->getURL()').'; ?>'; } /*dtd */ public function EntryDate($attr) { $format = ''; if (!empty($attr['format'])) { $format = addslashes($attr['format']); } $iso8601 = !empty($attr['iso8601']); $rfc822 = !empty($attr['rfc822']); $type = (!empty($attr['creadt']) ? 'creadt' : ''); $type = (!empty($attr['upddt']) ? 'upddt' : $type); $f = $this->getFilters($attr); if ($rfc822) { return 'posts->getRFC822Date('".$type."')").'; ?>'; } elseif ($iso8601) { return 'posts->getISO8601Date('".$type."')").'; ?>'; } else { return 'posts->getDate('".$format."','".$type."')").'; ?>'; } } /*dtd */ public function EntryTime($attr) { $format = ''; if (!empty($attr['format'])) { $format = addslashes($attr['format']); } $type = (!empty($attr['creadt']) ? 'creadt' : ''); $type = (!empty($attr['upddt']) ? 'upddt' : $type); $f = $this->getFilters($attr); return 'posts->getTime('".$format."','".$type."')").'; ?>'; } /*dtd */ public function EntriesHeader($attr,$content) { return "posts->isStart()) : ?>". $content. ""; } /*dtd */ public function EntriesFooter($attr,$content) { return "posts->isEnd()) : ?>". $content. ""; } /*dtd */ public function EntryCommentCount($attr) { $none = 'no comment'; $one = 'one comment'; $more = '%d comments'; if (isset($attr['none'])) { $none = addslashes($attr['none']); } if (isset($attr['one'])) { $one = addslashes($attr['one']); } if (isset($attr['more'])) { $more = addslashes($attr['more']); } if (empty($attr['count_all'])) { $operation = '$_ctx->posts->nb_comment'; } else { $operation = '($_ctx->posts->nb_comment + $_ctx->posts->nb_trackback)'; } return ""; } /*dtd */ public function EntryPingCount($attr) { $none = 'no trackback'; $one = 'one trackback'; $more = '%d trackbacks'; if (isset($attr['none'])) { $none = addslashes($attr['none']); } if (isset($attr['one'])) { $one = addslashes($attr['one']); } if (isset($attr['more'])) { $more = addslashes($attr['more']); } return "posts->nb_trackback == 0) {\n". " printf(__('".$none."'),(integer) \$_ctx->posts->nb_trackback);\n". "} elseif (\$_ctx->posts->nb_trackback == 1) {\n". " printf(__('".$one."'),(integer) \$_ctx->posts->nb_trackback);\n". "} else {\n". " printf(__('".$more."'),(integer) \$_ctx->posts->nb_trackback);\n". "} ?>"; } /*dtd */ public function EntryPingData($attr) { return "posts->trackbacksActive()) { echo \$_ctx->posts->getTrackbackData(); } ?>\n"; } /*dtd */ public function EntryPingLink($attr) { return "posts->trackbacksActive()) { echo \$_ctx->posts->getTrackbackLink(); } ?>\n"; } /* Languages -------------------------------------- */ /*dtd */ public function Languages($attr,$content) { $p = "if (!isset(\$params)) \$params = array();\n"; if (isset($attr['lang'])) { $p = "\$params['lang'] = '".addslashes($attr['lang'])."';\n"; } $order = 'desc'; if (isset($attr['order']) && preg_match('/^(desc|asc)$/i',$attr['order'])) { $p .= "\$params['order'] = '".$attr['order']."';\n "; } $res = "core->callBehavior("templatePrepareParams", array("tag" => "Languages","method" => "blog::getLangs"), $attr,$content); $res .= '$_ctx->langs = $core->blog->getLangs($params); unset($params);'."\n"; $res .= "?>\n"; $res .= 'langs->count() > 1) : '. 'while ($_ctx->langs->fetch()) : ?>'.$content. 'langs = null; endif; ?>'; return $res; } /*dtd */ public function LanguagesHeader($attr,$content) { return "langs->isStart()) : ?>". $content. ""; } /*dtd */ public function LanguagesFooter($attr,$content) { return "langs->isEnd()) : ?>". $content. ""; } /*dtd */ public function LanguageCode($attr) { $f = $this->getFilters($attr); return 'langs->post_lang').'; ?>'; } /*dtd */ public function LanguageIfCurrent($attr,$content) { return "cur_lang == \$_ctx->langs->post_lang) : ?>". $content. ""; } /*dtd */ public function LanguageURL($attr) { $f = $this->getFilters($attr); return 'blog->url.$core->url->getURLFor("lang",'. '$_ctx->langs->post_lang)').'; ?>'; } /* Pagination ------------------------------------- */ /*dtd */ public function Pagination($attr,$content) { $p = "post_params;'."\n"; $p .= $this->core->callBehavior("templatePrepareParams", array("tag" => "Pagination","method" => "blog::getPosts"), $attr,$content); $p .= '$_ctx->pagination = $core->blog->getPosts($params,true); unset($params);'."\n"; $p .= "?>\n"; if (isset($attr['no_context']) && $attr['no_context']) { return $p.$content; } return $p. 'pagination->f(0) > $_ctx->posts->count()) : ?>'. $content. ''; } /*dtd */ public function PaginationCounter($attr) { $f = $this->getFilters($attr); return ''; } /*dtd */ public function PaginationCurrent($attr) { $offset = 0; if (isset($attr['offset'])) { $offset = (integer) $attr['offset']; } $f = $this->getFilters($attr); return ''; } /*dtd */ public function PaginationIf($attr,$content) { $if = array(); if (isset($attr['start'])) { $sign = (boolean) $attr['start'] ? '' : '!'; $if[] = $sign.'context::PaginationStart()'; } if (isset($attr['end'])) { $sign = (boolean) $attr['end'] ? '' : '!'; $if[] = $sign.'context::PaginationEnd()'; } $this->core->callBehavior('tplIfConditions','PaginationIf',$attr,$content,$if); if (count($if) != 0) { return ''.$content.''; } else { return $content; } } /*dtd */ public function PaginationURL($attr) { $offset = 0; if (isset($attr['offset'])) { $offset = (integer) $attr['offset']; } $f = $this->getFilters($attr); return ''; } /* Comments --------------------------------------- */ /*dtd */ public function Comments($attr,$content) { $p = ""; if (empty($attr['with_pings'])) { $p .= "\$params['comment_trackback'] = false;\n"; } $lastn = 0; if (isset($attr['lastn'])) { $lastn = abs((integer) $attr['lastn'])+0; } if ($lastn > 0) { $p .= "\$params['limit'] = ".$lastn.";\n"; } else { $p .= "if (\$_ctx->nb_comment_per_page !== null) { \$params['limit'] = \$_ctx->nb_comment_per_page; }\n"; } if (empty($attr['no_context'])) { $p .= "if (\$_ctx->posts !== null) { ". "\$params['post_id'] = \$_ctx->posts->post_id; ". "\$core->blog->withoutPassword(false);\n". "}\n"; $p .= 'if ($_ctx->exists("categories")) { '. "\$params['cat_id'] = \$_ctx->categories->cat_id; ". "}\n"; $p .= 'if ($_ctx->exists("langs")) { '. "\$params['sql'] = \"AND P.post_lang = '\".\$core->blog->con->escape(\$_ctx->langs->post_lang).\"' \"; ". "}\n"; } if (!isset($attr['order'])) { $attr['order'] = 'asc'; } $p .= "\$params['order'] = '".$this->getSortByStr($attr,'comment')."';\n"; if (isset($attr['no_content']) && $attr['no_content']) { $p .= "\$params['no_content'] = true;\n"; } if (isset($attr['age'])) { $age = $this->getAge($attr); $p .= !empty($age) ? "@\$params['sql'] .= ' AND P.post_dt > \'".$age."\'';\n" : ''; } $res = "core->callBehavior("templatePrepareParams", array("tag" => "Comments","method" => "blog::getComments"), $attr,$content); $res .= $p; $res .= '$_ctx->comments = $core->blog->getComments($params); unset($params);'."\n"; $res .= "if (\$_ctx->posts !== null) { \$core->blog->withoutPassword(true);}\n"; if (!empty($attr['with_pings'])) { $res .= '$_ctx->pings = $_ctx->comments;'."\n"; } $res .= "?>\n"; $res .= 'comments->fetch()) : ?>'.$content.'comments = null; ?>'; return $res; } /*dtd */ public function CommentAuthor($attr) { $f = $this->getFilters($attr); return 'comments->comment_author").'; ?>'; } /*dtd */ public function CommentAuthorDomain($attr) { return 'comments->comment_site); ?>'; } /*dtd */ public function CommentAuthorLink($attr) { $f = $this->getFilters($attr); return 'comments->getAuthorLink()').'; ?>'; } /*dtd */ public function CommentAuthorMailMD5($attr) { return 'comments->comment_email) ; ?>'; } /*dtd */ public function CommentAuthorURL($attr) { $f = $this->getFilters($attr); return 'comments->getAuthorURL()').'; ?>'; } /*dtd */ public function CommentContent($attr) { $urls = '0'; if (!empty($attr['absolute_urls'])) { $urls = '1'; } $f = $this->getFilters($attr); return 'comments->getContent('.$urls.')').'; ?>'; } /*dtd */ public function CommentDate($attr) { $format = ''; if (!empty($attr['format'])) { $format = addslashes($attr['format']); } $iso8601 = !empty($attr['iso8601']); $rfc822 = !empty($attr['rfc822']); $type = (!empty($attr['upddt']) ? 'upddt' : ''); $f = $this->getFilters($attr); if ($rfc822) { return 'comments->getRFC822Date('".$type."')").'; ?>'; } elseif ($iso8601) { return 'comments->getISO8601Date('".$type."')").'; ?>'; } else { return 'comments->getDate('".$format."','".$type."')").'; ?>'; } } /*dtd */ public function CommentTime($attr) { $format = ''; if (!empty($attr['format'])) { $format = addslashes($attr['format']); } $type = (!empty($attr['upddt']) ? 'upddt' : ''); $f = $this->getFilters($attr); return 'comments->getTime('".$format."','".$type."')").'; ?>'; } /*dtd */ public function CommentEmail($attr) { $p = 'true'; if (isset($attr['spam_protected']) && !$attr['spam_protected']) { $p = 'false'; } $f = $this->getFilters($attr); return 'comments->getEmail(".$p.")").'; ?>'; } /*dtd */ public function CommentEntryTitle($attr) { $f = $this->getFilters($attr); return 'comments->post_title').'; ?>'; } /*dtd */ public function CommentFeedID($attr) { $f = $this->getFilters($attr); return 'comments->getFeedID()').'; ?>'; } /*dtd */ public function CommentID($attr) { return 'comments->comment_id; ?>'; } /*dtd */ public function CommentIf($attr,$content) { $if = array(); $is_ping = null; if (isset($attr['is_ping'])) { $sign = (boolean) $attr['is_ping'] ? '' : '!'; $if[] = $sign.'$_ctx->comments->comment_trackback'; } $this->core->callBehavior('tplIfConditions','CommentIf',$attr,$content,$if); if (count($if) != 0) { return ''.$content.''; } else { return $content; } } /*dtd */ public function CommentIfFirst($attr) { $ret = isset($attr['return']) ? $attr['return'] : 'first'; $ret = html::escapeHTML($ret); return 'comments->index() == 0) { '. "echo '".addslashes($ret)."'; } ?>"; } /*dtd */ public function CommentIfMe($attr) { $ret = isset($attr['return']) ? $attr['return'] : 'me'; $ret = html::escapeHTML($ret); return 'comments->isMe()) { '. "echo '".addslashes($ret)."'; } ?>"; } /*dtd */ public function CommentIfOdd($attr) { $ret = isset($attr['return']) ? $attr['return'] : 'odd'; $ret = html::escapeHTML($ret); return 'comments->index()+1)%2) { '. "echo '".addslashes($ret)."'; } ?>"; } /*dtd */ public function CommentIP($attr) { return 'comments->comment_ip; ?>'; } /*dtd */ public function CommentOrderNumber($attr) { return 'comments->index()+1; ?>'; } /*dtd */ public function CommentsFooter($attr,$content) { return "comments->isEnd()) : ?>". $content. ""; } /*dtd */ public function CommentsHeader($attr,$content) { return "comments->isStart()) : ?>". $content. ""; } /*dtd */ public function CommentPostURL($attr) { $f = $this->getFilters($attr); return 'comments->getPostURL()').'; ?>'; } /*dtd */ public function IfCommentAuthorEmail($attr,$content) { return "comments->comment_email) : ?>". $content. ""; } /*dtd */ public function CommentHelp($attr,$content) { return "blog->settings->system->wiki_comments) {\n". " echo __('Comments can be formatted using a simple wiki syntax.');\n". "} else {\n". " echo __('HTML code is displayed as text and web addresses are automatically converted.');\n". "} ?>"; } /* Comment preview -------------------------------- */ /*dtd */ public function IfCommentPreview($attr,$content) { return 'comment_preview !== null && $_ctx->comment_preview["preview"]) : ?>'. $content. ''; } /*dtd */ public function CommentPreviewName($attr) { $f = $this->getFilters($attr); return 'comment_preview["name"]').'; ?>'; } /*dtd */ public function CommentPreviewEmail($attr) { $f = $this->getFilters($attr); return 'comment_preview["mail"]').'; ?>'; } /*dtd */ public function CommentPreviewSite($attr) { $f = $this->getFilters($attr); return 'comment_preview["site"]').'; ?>'; } /*dtd */ public function CommentPreviewContent($attr) { $f = $this->getFilters($attr); if (!empty($attr['raw'])) { $co = '$_ctx->comment_preview["rawcontent"]'; } else { $co = '$_ctx->comment_preview["content"]'; } return ''; } /*dtd */ public function CommentPreviewCheckRemember($attr) { return "comment_preview['remember']) { echo ' checked=\"checked\"'; } ?>"; } /* Trackbacks ------------------------------------- */ /*dtd */ public function PingBlogName($attr) { $f = $this->getFilters($attr); return 'pings->comment_author').'; ?>'; } /*dtd */ public function PingContent($attr) { $f = $this->getFilters($attr); return 'pings->getTrackbackContent()').'; ?>'; } /*dtd */ public function PingDate($attr,$type='') { $format = ''; if (!empty($attr['format'])) { $format = addslashes($attr['format']); } $iso8601 = !empty($attr['iso8601']); $rfc822 = !empty($attr['rfc822']); $type = (!empty($attr['upddt']) ? 'upddt' : ''); $f = $this->getFilters($attr); if ($rfc822) { return 'pings->getRFC822Date('".$type."')").'; ?>'; } elseif ($iso8601) { return 'pings->getISO8601Date('".$type."')").'; ?>'; } else { return 'pings->getDate('".$format."','".$type."')").'; ?>'; } } /*dtd */ public function PingTime($attr) { $format = ''; if (!empty($attr['format'])) { $format = addslashes($attr['format']); } $type = (!empty($attr['upddt']) ? 'upddt' : ''); $f = $this->getFilters($attr); return 'pings->getTime('".$format."','".$type."')").'; ?>'; } /*dtd */ public function PingEntryTitle($attr) { $f = $this->getFilters($attr); return 'pings->post_title').'; ?>'; } /*dtd */ public function PingFeedID($attr) { $f = $this->getFilters($attr); return 'pings->getFeedID()').'; ?>'; } /*dtd */ public function PingID($attr) { return 'pings->comment_id; ?>'; } /*dtd */ public function PingIfFirst($attr) { $ret = isset($attr['return']) ? $attr['return'] : 'first'; $ret = html::escapeHTML($ret); return 'pings->index() == 0) { '. "echo '".addslashes($ret)."'; } ?>"; } /*dtd */ public function PingIfOdd($attr) { $ret = isset($attr['return']) ? $attr['return'] : 'odd'; $ret = html::escapeHTML($ret); return 'pings->index()+1)%2) { '. "echo '".addslashes($ret)."'; } ?>"; } /*dtd */ public function PingIP($attr) { return 'pings->comment_ip; ?>'; } /*dtd */ public function PingNoFollow($attr) { return 'blog->settings->system->comments_nofollow) { '. 'echo \' rel="nofollow"\';'. '} ?>'; } /*dtd */ public function PingOrderNumber($attr) { return 'pings->index()+1; ?>'; } /*dtd */ public function PingPostURL($attr) { $f = $this->getFilters($attr); return 'pings->getPostURL()').'; ?>'; } /*dtd */ public function Pings($attr,$content) { $p = "if (\$_ctx->posts !== null) { ". "\$params['post_id'] = \$_ctx->posts->post_id; ". "\$core->blog->withoutPassword(false);\n". "}\n"; $p .= "\$params['comment_trackback'] = true;\n"; $lastn = 0; if (isset($attr['lastn'])) { $lastn = abs((integer) $attr['lastn'])+0; } if ($lastn > 0) { $p .= "\$params['limit'] = ".$lastn.";\n"; } else { $p .= "if (\$_ctx->nb_comment_per_page !== null) { \$params['limit'] = \$_ctx->nb_comment_per_page; }\n"; } if (empty($attr['no_context'])) { $p .= 'if ($_ctx->exists("categories")) { '. "\$params['cat_id'] = \$_ctx->categories->cat_id; ". "}\n"; $p .= 'if ($_ctx->exists("langs")) { '. "\$params['sql'] = \"AND P.post_lang = '\".\$core->blog->con->escape(\$_ctx->langs->post_lang).\"' \"; ". "}\n"; } $order = 'asc'; if (isset($attr['order']) && preg_match('/^(desc|asc)$/i',$attr['order'])) { $order = $attr['order']; } $p .= "\$params['order'] = 'comment_dt ".$order."';\n"; if (isset($attr['no_content']) && $attr['no_content']) { $p .= "\$params['no_content'] = true;\n"; } $res = "core->callBehavior("templatePrepareParams", array("tag" => "Pings","method" => "blog::getComments"), $attr,$content); $res .= '$_ctx->pings = $core->blog->getComments($params); unset($params);'."\n"; $res .= "if (\$_ctx->posts !== null) { \$core->blog->withoutPassword(true);}\n"; $res .= "?>\n"; $res .= 'pings->fetch()) : ?>'.$content.'pings = null; ?>'; return $res; } /*dtd */ public function PingsFooter($attr,$content) { return "pings->isEnd()) : ?>". $content. ""; } /*dtd */ public function PingsHeader($attr,$content) { return "pings->isStart()) : ?>". $content. ""; } /*dtd */ public function PingTitle($attr) { $f = $this->getFilters($attr); return 'pings->getTrackbackTitle()').'; ?>'; } /*dtd */ public function PingAuthorURL($attr) { $f = $this->getFilters($attr); return 'pings->getAuthorURL()').'; ?>'; } # System /*dtd */ public function SysBehavior($attr,$raw) { if (!isset($attr['behavior'])) { return; } $b = addslashes($attr['behavior']); return 'hasBehavior(\''.$b.'\')) { '. '$core->callBehavior(\''.$b.'\',$core,$_ctx);'. '} ?>'; } /*dtd */ public function SysIf($attr,$content) { $if = new ArrayObject(); $is_ping = null; $operator = isset($attr['operator']) ? $this->getOperator($attr['operator']) : '&&'; if (isset($attr['categories'])) { $sign = (boolean) $attr['categories'] ? '!' : '='; $if[] = '$_ctx->categories '.$sign.'== null'; } if (isset($attr['posts'])) { $sign = (boolean) $attr['posts'] ? '!' : '='; $if[] = '$_ctx->posts '.$sign.'== null'; } if (isset($attr['blog_lang'])) { $if[] = "\$core->blog->settings->system->lang == '".addslashes($attr['blog_lang'])."'"; } if (isset($attr['current_tpl'])) { $sign = '='; if (substr($attr['current_tpl'],0,1) == '!') { $sign = '!'; $attr['current_tpl'] = substr($attr['current_tpl'],1); } $if[] = "\$_ctx->current_tpl ".$sign."= '".addslashes($attr['current_tpl'])."'"; } if (isset($attr['current_mode'])) { $sign = '='; if (substr($attr['current_mode'],0,1) == '!') { $sign = '!'; $attr['current_mode'] = substr($attr['current_mode'],1); } $if[] = "\$core->url->type ".$sign."= '".addslashes($attr['current_mode'])."'"; } if (isset($attr['has_tpl'])) { $sign = ''; if (substr($attr['has_tpl'],0,1) == '!') { $sign = '!'; $attr['has_tpl'] = substr($attr['has_tpl'],1); } $if[] = $sign."\$core->tpl->getFilePath('".addslashes($attr['has_tpl'])."') !== false"; } if (isset($attr['has_tag'])) { $sign = 'true'; if (substr($attr['has_tag'],0,1) == '!') { $sign = 'false'; $attr['has_tag'] = substr($attr['has_tag'],1); } $if[] = "\$core->tpl->tagExists('".addslashes($attr['has_tag'])."') === ".$sign; } if (isset($attr['blog_id'])) { $sign = ''; if (substr($attr['blog_id'],0,1) == '!') { $sign = '!'; $attr['blog_id'] = substr($attr['blog_id'],1); } $if[] = $sign."(\$core->blog->id == '".addslashes($attr['blog_id'])."')"; } if (isset($attr['comments_active'])) { $sign = (boolean) $attr['comments_active'] ? '' : '!'; $if[] = $sign.'$core->blog->settings->system->allow_comments'; } if (isset($attr['pings_active'])) { $sign = (boolean) $attr['pings_active'] ? '' : '!'; $if[] = $sign.'$core->blog->settings->system->allow_trackbacks'; } if (isset($attr['wiki_comments'])) { $sign = (boolean) $attr['wiki_comments'] ? '' : '!'; $if[] = $sign.'$core->blog->settings->system->wiki_comments'; } if (isset($attr['search_count']) && preg_match('/^((=|!|>|<)=|(>|<))\s*[0-9]+$/',trim($attr['search_count']))) { $if[] = '(isset($_search_count) && $_search_count '.html::decodeEntities($attr['search_count']).')'; } $this->core->callBehavior('tplIfConditions','SysIf',$attr,$content,$if); if (count($if) != 0) { return ''.$content.''; } else { return $content; } } /*dtd */ public function SysIfCommentPublished($attr,$content) { return ''. $content. ''; } /*dtd */ public function SysIfCommentPending($attr,$content) { return ''. $content. ''; } /*dtd */ public function SysFeedSubtitle($attr) { $f = $this->getFilters($attr); return 'feed_subtitle !== null) { echo '.sprintf($f,'$_ctx->feed_subtitle').';} ?>'; } /*dtd */ public function SysIfFormError($attr,$content) { return 'form_error !== null) : ?>'. $content. ''; } /*dtd */ public function SysFormError($attr) { return 'form_error !== null) { echo $_ctx->form_error; } ?>'; } public function SysPoweredBy($attr) { return 'Dotclear"); ?>'; } public function SysSearchString($attr) { $s = isset($attr['string']) ? $attr['string'] : '%1$s'; $f = $this->getFilters($attr); return ''; } public function SysSelfURI($attr) { $f = $this->getFilters($attr); return ''; } /*dtd */ public function GenericElse($attr) { return ''; } } # Template nodes, for parsing purposes # Generic list node, this one may only be instanciated # once for root element class tplNode { # Basic tree structure : links to parent, children forrest protected $parentNode; protected $children; public function __construct() { $this->children = array(); $this->parentNode = null; } // Returns compiled block public function compile($tpl) { $res=''; foreach ($this->children as $child) { $res .= $child->compile($tpl); } return $res; } # Add a children to current node public function addChild ($child) { $this->children[] = $child; $child->setParent($this); } # Defines parent for current node protected function setParent($parent) { $this->parentNode = $parent; } # Retrieves current node parent. # If parent is root node, null is returned public function getParent() { return $this->parentNode; } # Current node tag public function getTag() { return "ROOT"; } } // Text node, for any non-tpl content class tplNodeText extends tplNode { // Simple text node, only holds its content protected $content; public function __construct($text) { parent::__construct(); $this->content=$text; } public function compile($tpl) { return $this->content; } public function getTag() { return "TEXT"; } } // Block node, for all ... class tplNodeBlock extends tplNode { protected $attr; protected $tag; protected $closed; public function __construct($tag,$attr) { parent::__construct(); $this->content=''; $this->tag = $tag; $this->attr = $attr; $this->closed=false; } public function setClosing() { $this->closed = true; } public function isClosed() { return $this->closed; } public function compile($tpl) { if ($this->closed) { $content = parent::compile($tpl); return $tpl->compileBlockNode($this->tag,$this->attr,$content); } else { // if tag has not been closed, silently ignore its content... return ''; } } public function getTag() { return $this->tag; } } // Value node, for all {{tpl:Tag}} class tplNodeValue extends tplNode { protected $attr; protected $str_attr; protected $tag; public function __construct($tag,$attr,$str_attr) { parent::__construct(); $this->content=''; $this->tag = $tag; $this->attr = $attr; $this->str_attr = $str_attr; } public function compile($tpl) { return $tpl->compileValueNode($this->tag,$this->attr,$this->str_attr); } public function getTag() { return $this->tag; } } dotclear-2.6.2+dfsg/inc/public/default-templates/000077500000000000000000000000001230033266200217015ustar00rootroot00000000000000dotclear-2.6.2+dfsg/inc/public/default-templates/404.html000066400000000000000000000040431230033266200230770ustar00rootroot00000000000000 {{tpl:lang Document not found}} - {{tpl:BlogName encode_html="1"}} {{tpl:include src="_head.html"}}
    {{tpl:include src="_top.html"}}

    {{tpl:lang Document not found}}

    {{tpl:lang The document you are looking for does not exist.}}

    {{tpl:include src="_footer.html"}}
    dotclear-2.6.2+dfsg/inc/public/default-templates/_flv_player.html000066400000000000000000000007261230033266200250760ustar00rootroot00000000000000 {{tpl:lang Embedded Audio Player}} dotclear-2.6.2+dfsg/inc/public/default-templates/_footer.html000066400000000000000000000001531230033266200242230ustar00rootroot00000000000000 {{tpl:SysBehavior behavior="publicFooterContent"}} dotclear-2.6.2+dfsg/inc/public/default-templates/_head.html000066400000000000000000000007371230033266200236360ustar00rootroot00000000000000 {{tpl:include src="user_head.html"}} {{tpl:SysBehavior behavior="publicHeadContent"}} dotclear-2.6.2+dfsg/inc/public/default-templates/_mp3_player.html000066400000000000000000000010261230033266200250000ustar00rootroot00000000000000 {{tpl:lang Embedded Audio Player}} dotclear-2.6.2+dfsg/inc/public/default-templates/_top.html000066400000000000000000000005631230033266200235340ustar00rootroot00000000000000

    {{tpl:BlogName encode_html="1"}}

    {{tpl:SysBehavior behavior="publicTopAfterContent"}}

    {{tpl:lang To content}} | {{tpl:lang To menu}} | {{tpl:lang To search}}

    dotclear-2.6.2+dfsg/inc/public/default-templates/archive.html000066400000000000000000000050501230033266200242100ustar00rootroot00000000000000 {{tpl:lang Archives}} - {{tpl:BlogName encode_html="1"}} {{tpl:include src="_head.html"}}
    {{tpl:include src="_top.html"}}

    {{tpl:lang Archives}}

    {{tpl:ArchiveDate format="%Y"}}

    {{tpl:include src="_footer.html"}}
    dotclear-2.6.2+dfsg/inc/public/default-templates/archive_month.html000066400000000000000000000073111230033266200254170ustar00rootroot00000000000000 {{tpl:lang Archives}} - {{tpl:ArchiveDate}} - {{tpl:BlogName encode_html="1"}} {{tpl:include src="_head.html"}}
    {{tpl:include src="_top.html"}}
    {{tpl:include src="_footer.html"}}
    dotclear-2.6.2+dfsg/inc/public/default-templates/atom-comments.xml000066400000000000000000000043411230033266200252100ustar00rootroot00000000000000 {{tpl:BlogName encode_xml="1"}}{{tpl:SysFeedSubtitle encode_xml="1"}} - {{tpl:lang Comments}} {{tpl:BlogDescription encode_xml="1"}} {{tpl:BlogUpdateDate iso8601="1"}} {{tpl:BlogEditor encode_xml="1"}} {{tpl:BlogFeedID}} Dotclear [ping] {{tpl:PingEntryTitle encode_xml="1"}} - {{tpl:PingBlogName encode_xml="1"}} {{tpl:PingFeedID}} {{tpl:PingDate iso8601="1"}} {{tpl:PingDate iso8601="1" upddt="1"}} {{tpl:PingBlogName encode_xml="1"}} <p><a href="{{tpl:PingAuthorURL encode_xml="1"}}">{{tpl:PingTitle encode_xml="1"}}</a></p> {{tpl:PingContent encode_xml="1"}} {{tpl:CommentEntryTitle encode_xml="1"}} - {{tpl:CommentAuthor encode_xml="1"}} {{tpl:CommentFeedID}} {{tpl:CommentDate iso8601="1"}} {{tpl:CommentDate iso8601="1" upddt="1"}} {{tpl:CommentAuthor encode_xml="1"}} {{tpl:CommentContent absolute_urls="1" encode_xml="1"}} dotclear-2.6.2+dfsg/inc/public/default-templates/atom.xml000066400000000000000000000042031230033266200233620ustar00rootroot00000000000000 {{tpl:BlogName encode_xml="1"}}{{tpl:SysFeedSubtitle encode_xml="1"}} {{tpl:BlogDescription encode_xml="1"}} {{tpl:BlogUpdateDate iso8601="1"}} {{tpl:BlogEditor encode_xml="1"}} {{tpl:BlogFeedID}} Dotclear {{tpl:EntryTitle encode_xml="1"}} {{tpl:EntryFeedID}} {{tpl:EntryDate iso8601="1"}} {{tpl:EntryDate iso8601="1" upddt="1"}} {{tpl:EntryDate iso8601="1"}} {{tpl:EntryAuthorCommonName encode_xml="1"}} {{tpl:EntryCategory encode_html="1"}} {{tpl:TagID}} {{tpl:EntryExcerpt absolute_urls="1" encode_xml="1"}} {{tpl:EntryContent absolute_urls="1" encode_xml="1"}} {{tpl:EntryURL}}#comment-form {{tpl:BlogFeedURL type="atom"}}/comments/{{tpl:EntryID}} dotclear-2.6.2+dfsg/inc/public/default-templates/category.html000066400000000000000000000154551230033266200244160ustar00rootroot00000000000000 {{tpl:CategoryTitle encode_html="1"}} - {{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf> - {{tpl:lang page}} {{tpl:PaginationCurrent}}" /> {{tpl:include src="_head.html"}}
    {{tpl:include src="_top.html"}}

    {{tpl:CategoryTitle encode_html="1"}} {{tpl:CategoryTitle encode_html="1"}}

    {{tpl:CategoryDescription}}

    {{tpl:lang Entries feed}} - {{tpl:lang Comments feed}}

    {{tpl:lang Subcategories}}

    {{tpl:EntryDate}}

    {{tpl:EntryTitle encode_html="1"}}

    {{tpl:SysBehavior behavior="publicEntryBeforeContent"}}
    {{tpl:EntryExcerpt}}

    {{tpl:lang Continue reading}}...

    {{tpl:EntryContent}}
    {{tpl:SysBehavior behavior="publicEntryAfterContent"}}

    - {{tpl:lang page}} {{tpl:PaginationCurrent}} {{tpl:lang of}} {{tpl:PaginationCounter}} -

    {{tpl:include src="_footer.html"}}
    dotclear-2.6.2+dfsg/inc/public/default-templates/home.html000066400000000000000000000140401230033266200235160ustar00rootroot00000000000000 {{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf> - {{tpl:lang page}} {{tpl:PaginationCurrent}}" /> - {{tpl:lang page}} {{tpl:PaginationCurrent}}" /> {{tpl:include src="_head.html"}}
    {{tpl:include src="_top.html"}}

    {{tpl:EntryDate}}

    {{tpl:EntryTitle encode_html="1"}}

    {{tpl:SysBehavior behavior="publicEntryBeforeContent"}}
    {{tpl:EntryExcerpt}}

    {{tpl:lang Continue reading}}...

    {{tpl:EntryContent}}
    {{tpl:SysBehavior behavior="publicEntryAfterContent"}}

    - {{tpl:lang page}} {{tpl:PaginationCurrent}} {{tpl:lang of}} {{tpl:PaginationCounter}} -

    {{tpl:include src="_footer.html"}}
    dotclear-2.6.2+dfsg/inc/public/default-templates/password-form.html000066400000000000000000000020431230033266200253710ustar00rootroot00000000000000 {{tpl:lang Password needed}} - {{tpl:BlogName encode_html="1"}}

    {{tpl:lang Password needed}}

    {{tpl:lang You must give a password to access this area.}}

    dotclear-2.6.2+dfsg/inc/public/default-templates/post.html000066400000000000000000000243041230033266200235570ustar00rootroot00000000000000 {{tpl:EntryTitle encode_html="1"}} - {{tpl:BlogName encode_html="1"}} {{tpl:include src="_head.html"}}
    {{tpl:EntryPingData}} {{tpl:include src="_top.html"}}

    {{tpl:EntryTitle encode_html="1"}}

    {{tpl:SysBehavior behavior="publicEntryBeforeContent"}}
    {{tpl:EntryExcerpt}}
    {{tpl:EntryContent}}
    {{tpl:SysBehavior behavior="publicEntryAfterContent"}}

    {{tpl:lang Attachments}}

    {{tpl:lang Comments}}

    {{tpl:CommentOrderNumber}}. {{tpl:lang On}} {{tpl:CommentDate}}, {{tpl:CommentTime}} {{tpl:lang by}} {{tpl:CommentAuthorLink}}
    {{tpl:SysBehavior behavior="publicCommentBeforeContent"}} {{tpl:CommentContent}} {{tpl:SysBehavior behavior="publicCommentAfterContent"}}

    {{tpl:SysFormError}}

    {{tpl:lang Your comment has been published.}}

    {{tpl:lang Your comment has been submitted and will be reviewed for publication.}}

    {{tpl:lang Your comment}}

    {{tpl:CommentPreviewContent}}

    {{tpl:lang Add a comment}}

    {{tpl:SysBehavior behavior="publicCommentFormBeforeContent"}}

    {{tpl:CommentHelp}}

    {{tpl:SysBehavior behavior="publicCommentFormAfterContent"}}

    {{tpl:lang They posted on the same topic}}

    {{tpl:PingOrderNumber}}. {{tpl:lang On}} {{tpl:PingDate}}, {{tpl:PingTime}} {{tpl:lang by}} {{tpl:PingBlogName encode_html="1"}}
    {{tpl:SysBehavior behavior="publicPingBeforeContent"}}

    {{tpl:PingTitle encode_html="1"}}

    {{tpl:PingContent}} {{tpl:SysBehavior behavior="publicPingAfterContent"}}

    {{tpl:lang Trackback URL}} : {{tpl:EntryPingLink}}

    {{tpl:lang This post's comments feed}}

    {{tpl:include src="_footer.html"}}
    dotclear-2.6.2+dfsg/inc/public/default-templates/rss2-comments.xml000066400000000000000000000037771230033266200251550ustar00rootroot00000000000000 {{tpl:BlogName encode_xml="1"}}{{tpl:SysFeedSubtitle encode_xml="1"}} - {{tpl:lang Comments}} {{tpl:BlogURL}} {{tpl:BlogDescription encode_xml="1"}} {{tpl:BlogLanguage}} {{tpl:BlogUpdateDate rfc822="1"}} {{tpl:BlogCopyrightNotice encode_xml="1"}} http://blogs.law.harvard.edu/tech/rss Dotclear [ping] {{tpl:PingEntryTitle encode_xml="1"}} - {{tpl:PingBlogName encode_xml="1"}} {{tpl:PingPostURL encode_xml="1"}}#c{{tpl:PingID}} {{tpl:PingFeedID}} {{tpl:PingDate rfc822="1"}} {{tpl:PingBlogName encode_xml="1"}} <p><a href="{{tpl:PingAuthorURL encode_xml="1"}}">{{tpl:PingTitle encode_xml="1"}}</a></p> {{tpl:PingContent encode_xml="1"}} {{tpl:CommentEntryTitle encode_xml="1"}} - {{tpl:CommentAuthor encode_xml="1"}} {{tpl:CommentPostURL encode_xml="1"}}#c{{tpl:CommentID}} {{tpl:CommentFeedID}} {{tpl:CommentDate rfc822="1"}} {{tpl:CommentAuthor encode_xml="1"}} {{tpl:CommentContent absolute_urls="1" encode_xml="1"}} dotclear-2.6.2+dfsg/inc/public/default-templates/rss2.xml000066400000000000000000000037121230033266200233170ustar00rootroot00000000000000 {{tpl:BlogName encode_xml="1"}}{{tpl:SysFeedSubtitle encode_xml="1"}} {{tpl:BlogURL}} {{tpl:BlogDescription encode_xml="1"}} {{tpl:BlogLanguage}} {{tpl:BlogUpdateDate rfc822="1"}} {{tpl:BlogCopyrightNotice encode_xml="1"}} http://blogs.law.harvard.edu/tech/rss Dotclear {{tpl:EntryTitle encode_xml="1"}} {{tpl:EntryURL}} {{tpl:EntryFeedID}} {{tpl:EntryDate rfc822="1"}} {{tpl:EntryAuthorCommonName encode_xml="1"}} {{tpl:EntryCategory encode_html="1"}} {{tpl:TagID}} {{tpl:EntryExcerpt absolute_urls="1" encode_xml="1"}} {{tpl:EntryContent absolute_urls="1" encode_xml="1"}} {{tpl:EntryURL}}#comment-form {{tpl:EntryURL}}#comment-form {{tpl:BlogFeedURL}}/comments/{{tpl:EntryID}} dotclear-2.6.2+dfsg/inc/public/default-templates/rss2.xsl000066400000000000000000000063211230033266200233240ustar00rootroot00000000000000 {{tpl:lang Subscribe to}} <xsl:value-of select="/rss/channel/title"/>

    {{tpl:lang What is an RSS feed?}}

    {{tpl:lang RSS feed is a free blog summary. It provides content (either posts or comments) or summaries of content, together with links to the full versions, and other metadata. The last published items may then be read by your favorite RSS aggregator.}}

    {{tpl:lang Subscribe}}

    {{tpl:lang Simply copy the following URL into your aggregator:}}

    dotclear-2.6.2+dfsg/inc/public/default-templates/search.html000066400000000000000000000143031230033266200240350ustar00rootroot00000000000000 {{tpl:lang Search}} - {{tpl:SysSearchString encode_html="1"}} - {{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf> - {{tpl:lang page}} {{tpl:PaginationCurrent}}" /> {{tpl:include src="_head.html"}}
    {{tpl:include src="_top.html"}}

    {{tpl:lang Search}}

    {{tpl:SysSearchString encode_html="1" string="Your search for %1$s returned no result."}}

    {{tpl:SysSearchString encode_html="1" string="Your search for %1$s returned %2$s result."}}

    {{tpl:SysSearchString encode_html="1" string="Your search for %1$s returned %2$s results."}}

    {{tpl:EntryDate}}

    {{tpl:EntryTitle encode_html="1"}}

    {{tpl:SysBehavior behavior="publicEntryBeforeContent"}}
    {{tpl:EntryExcerpt}}

    {{tpl:lang Continue reading}}...

    {{tpl:EntryContent}}
    {{tpl:SysBehavior behavior="publicEntryAfterContent"}}

    - {{tpl:lang page}} {{tpl:PaginationCurrent}} {{tpl:lang of}} {{tpl:PaginationCounter}} -

    {{tpl:include src="_footer.html"}}
    dotclear-2.6.2+dfsg/inc/public/default-templates/user_head.html000066400000000000000000000001071230033266200245240ustar00rootroot00000000000000 dotclear-2.6.2+dfsg/inc/public/lib.tpl.context.php000066400000000000000000000304771230033266200220340ustar00rootroot00000000000000pop($name); } else { $this->stack[$name][] =& $var; if ($var instanceof record) { $this->stack['cur_loop'][] =& $var; } } } public function __get($name) { if (!isset($this->stack[$name])) { return null; } $n = count($this->stack[$name]); if ($n > 0) { return $this->stack[$name][($n-1)]; } return null; } public function exists($name) { return isset($this->stack[$name][0]); } public function pop($name) { if (isset($this->stack[$name])) { $v = array_pop($this->stack[$name]); if ($v instanceof record) { array_pop($this->stack['cur_loop']); } unset($v); } } # Loop position tests public function loopPosition($start,$length=null,$even=null) { if (!$this->cur_loop) { return false; } $index = $this->cur_loop->index(); $size = $this->cur_loop->count(); $test = false; if ($start >= 0) { $test = $index >= $start; if ($length !== null) { if ($length >= 0) { $test = $test && $index < $start + $length; } else { $test = $test && $index < $size + $length; } } } else { $test = $index >= $size + $start; if ($length !== null) { if ($length >= 0) { $test = $test && $index < $size + $start + $length; } else { $test = $test && $index < $size + $length; } } } if ($even !== null) { $test = $test && $index%2 == $even; } return $test; } # Static methods public static function global_filter($str, $encode_xml, $remove_html, $cut_string, $lower_case, $upper_case ,$tag='') { $args = func_get_args(); array_pop($args); $args[0] =& $str; # --BEHAVIOR-- publicBeforeContentFilter $res = $GLOBALS['core']->callBehavior('publicBeforeContentFilter',$GLOBALS['core'],$tag,$args); if ($remove_html) { $str = self::remove_html($str); $str = preg_replace('/\s+/',' ',$str); } if ($encode_xml) { $str = self::encode_xml($str); } if ($cut_string) { $str = self::cut_string($str,(integer) $cut_string); } if ($lower_case) { $str = self::lower_case($str); } elseif ($upper_case) { if ($upper_case == 2) { $str = self::capitalize($str); } else { $str = self::upper_case($str); } } # --BEHAVIOR-- publicAfterContentFilter $res = $GLOBALS['core']->callBehavior('publicAfterContentFilter',$GLOBALS['core'],$tag,$args); return $str; } public static function cut_string($str,$l) { return text::cutString($str,$l); } public static function encode_xml($str) { return html::escapeHTML($str); } public static function remove_html($str) { return html::decodeEntities(html::clean($str)); } public static function lower_case($str) { return mb_strtolower($str); } public static function upper_case($str) { return mb_strtoupper($str); } public static function capitalize($str) { if ($str != '') { $str[0] = mb_strtoupper($str[0]); } return $str; } public static function categoryPostParam(&$p) { $not = substr($p['cat_url'],0,1) == '!'; if ($not) { $p['cat_url'] = substr($p['cat_url'],1); } $p['cat_url'] = preg_split('/\s*,\s*/',$p['cat_url'],-1,PREG_SPLIT_NO_EMPTY); foreach ($p['cat_url'] as &$v) { if ($not) { $v .= ' ?not'; } if ($GLOBALS['_ctx']->exists('categories') && preg_match('/#self/',$v)) { $v = preg_replace('/#self/',$GLOBALS['_ctx']->categories->cat_url,$v); } elseif ($GLOBALS['_ctx']->exists('posts') && preg_match('/#self/',$v)) { $v = preg_replace('/#self/',$GLOBALS['_ctx']->posts->cat_url,$v); } } } # Static methods for pagination public static function PaginationNbPages() { global $_ctx; if ($_ctx->pagination === null) { return false; } $nb_posts = $_ctx->pagination->f(0); $nb_per_page = $_ctx->post_params['limit'][1]; $nb_pages = ceil($nb_posts/$nb_per_page); return $nb_pages; } public static function PaginationPosition($offset=0) { if (isset($GLOBALS['_page_number'])) { $p = $GLOBALS['_page_number']; } else { $p = 1; } $p = $p+$offset; $n = self::PaginationNbPages(); if (!$n) { return $p; } if ($p > $n || $p <= 0) { return 1; } else { return $p; } } public static function PaginationStart() { if (isset($GLOBALS['_page_number'])) { return self::PaginationPosition() == 1; } return true; } public static function PaginationEnd() { if (isset($GLOBALS['_page_number'])) { return self::PaginationPosition() == self::PaginationNbPages(); } return false; } public static function PaginationURL($offset=0) { $args = $_SERVER['URL_REQUEST_PART']; $n = self::PaginationPosition($offset); $args = preg_replace('#(^|/)page/([0-9]+)$#','',$args); $url = $GLOBALS['core']->blog->url.$args; if ($n > 1) { $url = preg_replace('#/$#','',$url); $url .= '/page/'.$n; } # If search param if (!empty($_GET['q'])) { $s = strpos($url,'?') !== false ? '&' : '?'; $url .= $s.'q='.rawurlencode($_GET['q']); } return $url; } # Robots policy public static function robotsPolicy($base,$over) { $pol = array('INDEX' => 'INDEX','FOLLOW' => 'FOLLOW', 'ARCHIVE' => 'ARCHIVE'); $base = array_flip(preg_split('/\s*,\s*/',$base)); $over = array_flip(preg_split('/\s*,\s*/',$over)); foreach ($pol as $k => &$v) { if (isset($base[$k]) || isset($base['NO'.$k])) { $v = isset($base['NO'.$k]) ? 'NO'.$k : $k; } if (isset($over[$k]) || isset($over['NO'.$k])) { $v = isset($over['NO'.$k]) ? 'NO'.$k : $k; } } if ($pol['ARCHIVE'] == 'ARCHIVE') { unset($pol['ARCHIVE']); } return implode(', ',$pol); } # Smilies static methods public static function getSmilies($blog) { $path = array(); if (isset($GLOBALS['__theme'])) { $path[] = $GLOBALS['__theme']; } $path[] = 'default'; $definition = $blog->themes_path.'/%s/smilies/smilies.txt'; $base_url = $blog->settings->system->themes_url.'/%s/smilies/'; $res = array(); foreach ($path as $t) { if (file_exists(sprintf($definition,$t))) { $base_url = sprintf($base_url,$t); return self::smiliesDefinition(sprintf($definition,$t),$base_url); } } return false; } public static function smiliesDefinition($f,$url) { $def = file($f); $res = array(); foreach($def as $v) { $v = trim($v); if (preg_match('|^([^\t]*)[\t]+(.*)$|',$v,$matches)) { $r = '/(\A|[\s]+|>)('.preg_quote($matches[1],'/').')([\s]+|[<]|\Z)/ms'; $s = '$1$3'; $res[$r] = $s; } } return $res; } public static function addSmilies($str) { if (!isset($GLOBALS['__smilies']) || !is_array($GLOBALS['__smilies'])) { return $str; } # Process part adapted from SmartyPants engine (J. Gruber et al.) : $tokens = self::tokenizeHTML($str); $result = ''; $in_pre = 0; # Keep track of when we're inside
     or  tags.
    
    		foreach ($tokens as $cur_token) {
    			if ($cur_token[0] == "tag") {
    				# Don't mess with quotes inside tags.
    				$result .= $cur_token[1];
    				if (preg_match('@<(/?)(?:pre|code|kbd|script|math)[\s>]@', $cur_token[1], $matches)) {
    					$in_pre = isset($matches[1]) && $matches[1] == '/' ? 0 : 1;
    				}
    			} else {
    				$t = $cur_token[1];
    				if (!$in_pre) {
    					$t = preg_replace(array_keys($GLOBALS['__smilies']),array_values($GLOBALS['__smilies']),$t);
    				}
    				$result .= $t;
    			}
    		}
    
    		return $result;
    	}
    
    	private static function tokenizeHTML($str)
    	{
    		# Function from SmartyPants engine (J. Gruber et al.)
    		#
    		#   Parameter:  String containing HTML markup.
    		#   Returns:    An array of the tokens comprising the input
    		#               string. Each token is either a tag (possibly with nested,
    		#               tags contained therein, such as , or a
    		#               run of text between tags. Each element of the array is a
    		#               two-element array; the first is either 'tag' or 'text';
    		#               the second is the actual value.
    		#
    		#
    		#   Regular expression derived from the _tokenize() subroutine in
    		#   Brad Choate's MTRegex plugin.
    		#   
    		#
    		$index = 0;
    		$tokens = array();
    
    		$match = '(?s:)|'.	# comment
    				 '(?s:<\?.*?\?>)|'.				# processing instruction
    												# regular tags
    				 '(?:<[/!$]?[-a-zA-Z0-9:]+\b(?>[^"\'>]+|"[^"]*"|\'[^\']*\')*>)';
    
    		$parts = preg_split("{($match)}", $str, -1, PREG_SPLIT_DELIM_CAPTURE);
    
    		foreach ($parts as $part) {
    			if (++$index % 2 && $part != '')
    				$tokens[] = array('text', $part);
    			else
    				$tokens[] = array('tag', $part);
    		}
    		return $tokens;
    	}
    
    
    	# First post image helpers
    	public static function EntryFirstImageHelper($size,$with_category,$class="",$no_tag=false,$content_only=false,$cat_only=false)
    	{
    		global $core, $_ctx;
    
    		try {
    			$media = new dcMedia($core);
    			$sizes = implode('|',array_keys($media->thumb_sizes)).'|o';
    			if (!preg_match('/^'.$sizes.'$/',$size)) {
    				$size = 's';
    			}
    			$p_url = $core->blog->settings->system->public_url;
    			$p_site = preg_replace('#^(.+?//.+?)/(.*)$#','$1',$core->blog->url);
    			$p_root = $core->blog->public_path;
    
    			$pattern = '(?:'.preg_quote($p_site,'/').')?'.preg_quote($p_url,'/');
    			$pattern = sprintf('/]+/msui',$pattern);
    
    			$src = '';
    			$alt = '';
    
    			# We first look in post content
    			if (!$cat_only && $_ctx->posts)
    			{
    				$subject = ($content_only ? '' : $_ctx->posts->post_excerpt_xhtml).$_ctx->posts->post_content_xhtml;
    				if (preg_match_all($pattern,$subject,$m) > 0)
    				{
    					foreach ($m[1] as $i => $img) {
    						if (($src = self::ContentFirstImageLookup($p_root,$img,$size)) !== false) {
    							$dirname = str_replace('\\', '/', dirname($img));
    							$src = $p_url.($dirname != '/' ? $dirname : '').'/'.$src;
    							if (preg_match('/alt="([^"]+)"/',$m[0][$i],$malt)) {
    								$alt = $malt[1];
    							}
    							break;
    						}
    					}
    				}
    			}
    
    			# No src, look in category description if available
    	        if (!$src && $with_category && $_ctx->posts->cat_desc)
    	        {
    				if (preg_match_all($pattern,$_ctx->posts->cat_desc,$m) > 0)
    				{
    					foreach ($m[1] as $i => $img) {
    						if (($src = self::ContentFirstImageLookup($p_root,$img,$size)) !== false) {
    							$dirname = str_replace('\\', '/', dirname($img));
    							$src = $p_url.($dirname != '/' ? $dirname : '').'/'.$src;
    							if (preg_match('/alt="([^"]+)"/',$m[0][$i],$malt)) {
    								$alt = $malt[1];
    							}
    							break;
    						}
    					}
    				};
    			}
    
    			if ($src) {
    				if ($no_tag) {
    					return $src;
    				} else {
    					return ''.$alt.'';
    				}
    			}
    
    		} catch (Exception $e) {
    			$core->error->add($e->getMessage());
    		}
    	}
    
    	private static function ContentFirstImageLookup($root,$img,$size)
    	{
    		global $core;
    
    		# Get base name and extension
    		$info = path::info($img);
    		$base = $info['base'];
    
    		try {
    			$media = new dcMedia($core);
    			$sizes = implode('|',array_keys($media->thumb_sizes));
    			if (preg_match('/^\.(.+)_('.$sizes.')$/',$base,$m)) {
    				$base = $m[1];
    			}
    
    			$res = false;
    			if ($size != 'o' && file_exists($root.'/'.$info['dirname'].'/.'.$base.'_'.$size.'.jpg'))
    			{
    				$res = '.'.$base.'_'.$size.'.jpg';
    			}
    			else
    			{
    				$f = $root.'/'.$info['dirname'].'/'.$base;
    				if (file_exists($f.'.'.$info['extension'])) {
    					$res = $base.'.'.$info['extension'];
    				} elseif (file_exists($f.'.jpg')) {
    					$res = $base.'.jpg';
    				} elseif (file_exists($f.'.jpeg')) {
    					$res = $base.'.jpeg';
    				} elseif (file_exists($f.'.png')) {
    					$res = $base.'.png';
    				} elseif (file_exists($f.'.gif')) {
    					$res = $base.'.gif';
    				} elseif (file_exists($f.'.JPG')) {
    					$res = $base.'.JPG';
    				} elseif (file_exists($f.'.JPEG')) {
    					$res = $base.'.JPEG';
    				} elseif (file_exists($f.'.PNG')) {
    					$res = $base.'.PNG';
    				} elseif (file_exists($f.'.GIF')) {
    					$res = $base.'.GIF';
    				}
    			}
    		} catch (Exception $e) {
    			$core->error->add($e->getMessage());
    		}
    
    		if ($res) {
    			return $res;
    		}
    		return false;
    	}
    }
    dotclear-2.6.2+dfsg/inc/public/lib.urlhandlers.php000066400000000000000000000404461230033266200220720ustar00rootroot00000000000000callBehavior("publicGetURLFor",$type,$value);
    		if (!$url) {
    			$url = $this->getBase($type);
    			if ($value) {
    				if ($url) {
    					$url .= '/';
    				}
    				$url .= $value;
    			}
    		}
    		return $url;
    	}
    
    	public function register($type,$url,$representation,$handler)
    	{
    		$core =& $GLOBALS['core'];
    		$t = new ArrayObject(array($type,$url,$representation,$handler));
    		$core->callBehavior("publicRegisterURL",$t);
    		parent::register($t[0],$t[1],$t[2],$t[3]);
    	}
    
    	public static function p404()
    	{
    		throw new Exception ("Page not found",404);
    	}
    
    	public static function default404($args,$type,$e)
    	{
    		if ($e->getCode() != 404) {
    			throw $e;
    		}
    		$_ctx =& $GLOBALS['_ctx'];
    		$core = $GLOBALS['core'];
    
    		header('Content-Type: text/html; charset=UTF-8');
    		http::head(404,'Not Found');
    		$core->url->type = '404';
    		$_ctx->current_tpl = '404.html';
    		$_ctx->content_type = 'text/html';
    
    		echo $core->tpl->getData($_ctx->current_tpl);
    
    		# --BEHAVIOR-- publicAfterDocument
    		$core->callBehavior('publicAfterDocument',$core);
    		exit;
    	}
    
    	protected static function getPageNumber(&$args)
    	{
    		if (preg_match('#(^|/)page/([0-9]+)$#',$args,$m)) {
    			$n = (integer) $m[2];
    			if ($n > 0) {
    				$args = preg_replace('#(^|/)page/([0-9]+)$#','',$args);
    				return $n;
    			}
    		}
    
    		return false;
    	}
    
    	protected static function serveDocument($tpl,$content_type='text/html',$http_cache=true,$http_etag=true)
    	{
    		$_ctx =& $GLOBALS['_ctx'];
    		$core =& $GLOBALS['core'];
    
    		if ($_ctx->nb_entry_per_page === null) {
    			$_ctx->nb_entry_per_page = $core->blog->settings->system->nb_post_per_page;
    		}
    
    		$tpl_file = $core->tpl->getFilePath($tpl);
    
    		if (!$tpl_file) {
    			throw new Exception('Unable to find template ');
    		}
    
    		$result = new ArrayObject;
    
    		$_ctx->current_tpl = $tpl;
    		$_ctx->content_type = $content_type;
    		$_ctx->http_cache = $http_cache;
    		$_ctx->http_etag = $http_etag;
    		$core->callBehavior('urlHandlerBeforeGetData',$_ctx);
    
    		if ($_ctx->http_cache) {
    			$GLOBALS['mod_files'][] = $tpl_file;
    			http::cache($GLOBALS['mod_files'],$GLOBALS['mod_ts']);
    		}
    
    		header('Content-Type: '.$_ctx->content_type.'; charset=UTF-8');
    		$result['content'] = $core->tpl->getData($_ctx->current_tpl);
    		$result['content_type'] = $_ctx->content_type;
    		$result['tpl'] = $_ctx->current_tpl;
    		$result['blogupddt'] = $core->blog->upddt;
    
    		# --BEHAVIOR-- urlHandlerServeDocument
    		$core->callBehavior('urlHandlerServeDocument',$result);
    
    		if ($_ctx->http_cache && $_ctx->http_etag) {
    			http::etag($result['content'],http::getSelfURI());
    		}
    		echo $result['content'];
    	}
    
    	public function getDocument()
    	{
    		$core =& $GLOBALS['core'];
    
    		$type = $args = '';
    
    		if ($this->mode == 'path_info')
    		{
    			$part = substr($_SERVER['PATH_INFO'],1);
    		}
    		else
    		{
    			$part = '';
    
    			$qs = $this->parseQueryString();
    
    			# Recreates some _GET and _REQUEST pairs
    			if (!empty($qs))
    			{
    				foreach ($_GET as $k => $v) {
    					if (isset($_REQUEST[$k])) {
    						unset($_REQUEST[$k]);
    					}
    				}
    				$_GET = $qs;
    				$_REQUEST = array_merge($qs,$_REQUEST);
    
    				list($k,$v) = each($qs);
    				if ($v === null) {
    					$part = $k;
    					unset($_GET[$k]);
    					unset($_REQUEST[$k]);
    				}
    			}
    		}
    
    		$_SERVER['URL_REQUEST_PART'] = $part;
    
    		$this->getArgs($part,$type,$this->args);
    
    		# --BEHAVIOR-- urlHandlerGetArgsDocument
    		$core->callBehavior('urlHandlerGetArgsDocument',$this);
    
    		if (!$type)
    		{
    			$this->type = 'default';
    			$this->callDefaultHandler($this->args);
    		}
    		else
    		{
    			$this->type = $type;
    			$this->callHandler($type,$this->args);
    		}
    	}
    
    	public static function home($args)
    	{
    		$n = self::getPageNumber($args);
    
    		if ($args && !$n)
    		{
    			# "Then specified URL went unrecognized by all URL handlers and
    			# defaults to the home page, but is not a page number.
    			self::p404();
    		}
    		else
    		{
    			$core =& $GLOBALS['core'];
    
    			if ($n) {
    				$GLOBALS['_page_number'] = $n;
    				$core->url->type = $n > 1 ? 'default-page' : 'default';
    			}
    
    			if (empty($_GET['q'])) {
    				self::serveDocument('home.html');
    				$core->blog->publishScheduledEntries();
    			} else {
    				self::search();
    			}
    		}
    	}
    
    	public static function search()
    	{
    		$_ctx =& $GLOBALS['_ctx'];
    		$core =& $GLOBALS['core'];
    
    		$core->url->type='search';
    
    		$GLOBALS['_search'] = !empty($_GET['q']) ? rawurldecode($_GET['q']) : '';
    		if ($GLOBALS['_search']) {
    			$params = new ArrayObject(array('search' => $GLOBALS['_search']));
    			$core->callBehavior('publicBeforeSearchCount',$params);
    			$GLOBALS['_search_count'] = $core->blog->getPosts($params,true)->f(0);
    		}
    
    		self::serveDocument('search.html');
    	}
    
    	public static function lang($args)
    	{
    		$_ctx =& $GLOBALS['_ctx'];
    		$core =& $GLOBALS['core'];
    
    		$n = self::getPageNumber($args);
    		$params = new ArrayObject(array(
    			'lang' => $args));
    
    		$core->callBehavior('publicLangBeforeGetLangs',$params,$args);
    
    		$_ctx->langs = $core->blog->getLangs($params);
    
    		if ($_ctx->langs->isEmpty()) {
    			# The specified language does not exist.
    			self::p404();
    		}
    		else
    		{
    			if ($n) {
    				$GLOBALS['_page_number'] = $n;
    			}
    			$_ctx->cur_lang = $args;
    			self::home(null);
    		}
    	}
    
    	public static function category($args)
    	{
    		$_ctx =& $GLOBALS['_ctx'];
    		$core =& $GLOBALS['core'];
    
    		$n = self::getPageNumber($args);
    
    		if ($args == '' && !$n) {
    			# No category was specified.
    			self::p404();
    		}
    		else
    		{
    			$params = new ArrayObject(array(
    				'cat_url' => $args,
    				'post_type' => 'post',
    				'without_empty' => false));
    
    			$core->callBehavior('publicCategoryBeforeGetCategories',$params,$args);
    
    			$_ctx->categories = $core->blog->getCategories($params);
    
    			if ($_ctx->categories->isEmpty()) {
    				# The specified category does no exist.
    				self::p404();
    			}
    			else
    			{
    				if ($n) {
    					$GLOBALS['_page_number'] = $n;
    				}
    				self::serveDocument('category.html');
    			}
    		}
    	}
    
    	public static function archive($args)
    	{
    		$_ctx =& $GLOBALS['_ctx'];
    		$core =& $GLOBALS['core'];
    
    		$year = $month = $cat_url = null;
    		# Nothing or year and month
    		if ($args == '')
    		{
    			self::serveDocument('archive.html');
    		}
    		elseif (preg_match('|^/([0-9]{4})/([0-9]{2})$|',$args,$m))
    		{
    			$params = new ArrayObject(array(
    				'year' => $m[1],
    				'month' => $m[2],
    				'type' => 'month'));
    
    			$core->callBehavior('publicArchiveBeforeGetDates',$params,$args);
    
    			$_ctx->archives = $core->blog->getDates($params);
    
    			if ($_ctx->archives->isEmpty()) {
    				# There is no entries for the specified period.
    				self::p404();
    			}
    			else
    			{
    				self::serveDocument('archive_month.html');
    			}
    		}
    		else {
    			# The specified URL is not a date.
    			self::p404();
    		}
    	}
    
    	public static function post($args)
    	{
    		if ($args == '') {
    			# No entry was specified.
    			self::p404();
    		}
    		else
    		{
    			$_ctx =& $GLOBALS['_ctx'];
    			$core =& $GLOBALS['core'];
    
    			$core->blog->withoutPassword(false);
    
    			$params = new ArrayObject(array(
    				'post_url' => $args));
    
    			$core->callBehavior('publicPostBeforeGetPosts',$params,$args);
    
    			$_ctx->posts = $core->blog->getPosts($params);
    
    			$_ctx->comment_preview = new ArrayObject();
    			$_ctx->comment_preview['content'] = '';
    			$_ctx->comment_preview['rawcontent'] = '';
    			$_ctx->comment_preview['name'] = '';
    			$_ctx->comment_preview['mail'] = '';
    			$_ctx->comment_preview['site'] = '';
    			$_ctx->comment_preview['preview'] = false;
    			$_ctx->comment_preview['remember'] = false;
    
    			$core->blog->withoutPassword(true);
    
    			if ($_ctx->posts->isEmpty())
    			{
    				# The specified entry does not exist.
    				self::p404();
    			}
    			else
    			{
    				$post_id = $_ctx->posts->post_id;
    				$post_password = $_ctx->posts->post_password;
    
    				# Password protected entry
    				if ($post_password != '' && !$_ctx->preview)
    				{
    					# Get passwords cookie
    					if (isset($_COOKIE['dc_passwd'])) {
    						$pwd_cookie = json_decode($_COOKIE['dc_passwd']);
    						if ($pwd_cookie === NULL) {
    							$pwd_cookie = array();
    						} else {
    							$pwd_cookie = (array) $pwd_cookie;
    						}
    					} else {
    						$pwd_cookie = array();
    					}
    
    					# Check for match
    					if ((!empty($_POST['password']) && $_POST['password'] == $post_password)
    					|| (isset($pwd_cookie[$post_id]) && $pwd_cookie[$post_id] == $post_password))
    					{
    						$pwd_cookie[$post_id] = $post_password;
    						setcookie('dc_passwd',json_encode($pwd_cookie),0,'/');
    					}
    					else
    					{
    						self::serveDocument('password-form.html','text/html',false);
    						return;
    					}
    				}
    
    				$post_comment =
    					isset($_POST['c_name']) && isset($_POST['c_mail']) &&
    					isset($_POST['c_site']) && isset($_POST['c_content']) &&
    					$_ctx->posts->commentsActive();
    
    				# Posting a comment
    				if ($post_comment)
    				{
    					# Spam trap
    					if (!empty($_POST['f_mail'])) {
    						http::head(412,'Precondition Failed');
    						header('Content-Type: text/plain');
    						echo "So Long, and Thanks For All the Fish";
    						# Exits immediately the application to preserve the server.
    						exit;
    					}
    
    					$name = $_POST['c_name'];
    					$mail = $_POST['c_mail'];
    					$site = $_POST['c_site'];
    					$content = $_POST['c_content'];
    					$preview = !empty($_POST['preview']);
    
    					if ($content != '')
    					{
    						if ($core->blog->settings->system->wiki_comments) {
    							$core->initWikiComment();
    						} else {
    							$core->initWikiSimpleComment();
    						}
    						$content = $core->wikiTransform($content);
    						$content = $core->HTMLfilter($content);
    					}
    
    					$_ctx->comment_preview['content'] = $content;
    					$_ctx->comment_preview['rawcontent'] = $_POST['c_content'];
    					$_ctx->comment_preview['name'] = $name;
    					$_ctx->comment_preview['mail'] = $mail;
    					$_ctx->comment_preview['site'] = $site;
    
    					if ($preview)
    					{
    						# --BEHAVIOR-- publicBeforeCommentPreview
    						$core->callBehavior('publicBeforeCommentPreview',$_ctx->comment_preview);
    
    						$_ctx->comment_preview['preview'] = true;
    					}
    					else
    					{
    						# Post the comment
    						$cur = $core->con->openCursor($core->prefix.'comment');
    						$cur->comment_author = $name;
    						$cur->comment_site = html::clean($site);
    						$cur->comment_email = html::clean($mail);
    						$cur->comment_content = $content;
    						$cur->post_id = $_ctx->posts->post_id;
    						$cur->comment_status = $core->blog->settings->system->comments_pub ? 1 : -1;
    						$cur->comment_ip = http::realIP();
    
    						$redir = $_ctx->posts->getURL();
    						$redir .= $core->blog->settings->system->url_scan == 'query_string' ? '&' : '?';
    
    						try
    						{
    							if (!text::isEmail($cur->comment_email)) {
    								throw new Exception(__('You must provide a valid email address.'));
    							}
    
    							# --BEHAVIOR-- publicBeforeCommentCreate
    							$core->callBehavior('publicBeforeCommentCreate',$cur);
    							if ($cur->post_id) {
    								$comment_id = $core->blog->addComment($cur);
    
    								# --BEHAVIOR-- publicAfterCommentCreate
    								$core->callBehavior('publicAfterCommentCreate',$cur,$comment_id);
    							}
    
    							if ($cur->comment_status == 1) {
    								$redir_arg = 'pub=1';
    							} else {
    								$redir_arg = 'pub=0';
    							}
    
    							header('Location: '.$redir.$redir_arg);
    						}
    						catch (Exception $e)
    						{
    							$_ctx->form_error = $e->getMessage();
    							$_ctx->form_error;
    						}
    					}
    				}
    
    				# The entry
    				if ($_ctx->posts->trackbacksActive()) {
    					header('X-Pingback: '.$core->blog->url.$core->url->getURLFor("xmlrpc",$core->blog->id));
    				}
    				self::serveDocument('post.html');
    			}
    		}
    	}
    
    	public static function preview($args)
    	{
    		$core = $GLOBALS['core'];
    		$_ctx = $GLOBALS['_ctx'];
    
    		if (!preg_match('#^(.+?)/([0-9a-z]{40})/(.+?)$#',$args,$m)) {
    			# The specified Preview URL is malformed.
    			self::p404();
    		}
    		else
    		{
    			$user_id = $m[1];
    			$user_key = $m[2];
    			$post_url = $m[3];
    			if (!$core->auth->checkUser($user_id,null,$user_key)) {
    				# The user has no access to the entry.
    				self::p404();
    			}
    			else
    			{
    				$_ctx->preview = true;
    				self::post($post_url);
    			}
    		}
    	}
    
    	public static function feed($args)
    	{
    		$type = null;
    		$comments = false;
    		$cat_url = false;
    		$post_id = null;
    		$subtitle = '';
    
    		$mime = 'application/xml';
    
    		$_ctx =& $GLOBALS['_ctx'];
    		$core =& $GLOBALS['core'];
    
    		if (preg_match('!^([a-z]{2}(-[a-z]{2})?)/(.*)$!',$args,$m)) {
    			$params = new ArrayObject(array('lang' => $m[1]));
    
    			$args = $m[3];
    
    			$core->callBehavior('publicFeedBeforeGetLangs',$params,$args);
    
    			$_ctx->langs = $core->blog->getLangs($params);
    
    			if ($_ctx->langs->isEmpty()) {
    				# The specified language does not exist.
    				self::p404();
    				return;
    			} else {
    				$_ctx->cur_lang = $m[1];
    			}
    		}
    
    		if (preg_match('#^rss2/xslt$#',$args,$m))
    		{
    			# RSS XSLT stylesheet
    			self::serveDocument('rss2.xsl','text/xml');
    			return;
    		}
    		elseif (preg_match('#^(atom|rss2)/comments/([0-9]+)$#',$args,$m))
    		{
    			# Post comments feed
    			$type = $m[1];
    			$comments = true;
    			$post_id = (integer) $m[2];
    		}
    		elseif (preg_match('#^(?:category/(.+)/)?(atom|rss2)(/comments)?$#',$args,$m))
    		{
    			# All posts or comments feed
    			$type = $m[2];
    			$comments = !empty($m[3]);
    			if (!empty($m[1])) {
    				$cat_url = $m[1];
    			}
    		}
    		else
    		{
    			# The specified Feed URL is malformed.
    			self::p404();
    			return;
    		}
    
    		if ($cat_url)
    		{
    			$params = new ArrayObject(array(
    				'cat_url' => $cat_url,
    				'post_type' => 'post'));
    
    			$core->callBehavior('publicFeedBeforeGetCategories',$params,$args);
    
    			$_ctx->categories = $core->blog->getCategories($params);
    
    			if ($_ctx->categories->isEmpty()) {
    				# The specified category does no exist.
    				self::p404();
    				return;
    			}
    
    			$subtitle = ' - '.$_ctx->categories->cat_title;
    		}
    		elseif ($post_id)
    		{
    			$params = new ArrayObject(array(
    				'post_id' => $post_id,
    				'post_type' => ''));
    
    			$core->callBehavior('publicFeedBeforeGetPosts',$params,$args);
    
    			$_ctx->posts = $core->blog->getPosts($params);
    
    			if ($_ctx->posts->isEmpty()) {
    				# The specified post does not exist.
    				self::p404();
    				return;
    			}
    
    			$subtitle = ' - '.$_ctx->posts->post_title;
    		}
    
    		$tpl = $type;
    		if ($comments) {
    			$tpl .= '-comments';
    			$_ctx->nb_comment_per_page = $core->blog->settings->system->nb_comment_per_feed;
    		} else {
    			$_ctx->nb_entry_per_page = $core->blog->settings->system->nb_post_per_feed;
    			$_ctx->short_feed_items = $core->blog->settings->system->short_feed_items;
    		}
    		$tpl .= '.xml';
    
    		if ($type == 'atom') {
    			$mime = 'application/atom+xml';
    		}
    
    		$_ctx->feed_subtitle = $subtitle;
    
    		header('X-Robots-Tag: '.context::robotsPolicy($core->blog->settings->system->robots_policy,''));
    		self::serveDocument($tpl,$mime);
    		if (!$comments && !$cat_url) {
    			$core->blog->publishScheduledEntries();
    		}
    	}
    
    	public static function trackback($args)
    	{
    		if (!preg_match('/^[0-9]+$/',$args)) {
    			# The specified trackback URL is not an number
    			self::p404();
    		} else {
    			$tb = new dcTrackback($GLOBALS['core']);
    			$tb->receive($args);
    		}
    	}
    
    	public static function rsd($args)
    	{
    		$core =& $GLOBALS['core'];
    		http::cache($GLOBALS['mod_files'],$GLOBALS['mod_ts']);
    
    		header('Content-Type: text/xml; charset=UTF-8');
    		echo
    		''."\n".
    		''."\n".
    		"\n".
    		"  Dotclear\n".
    		"  http://www.dotclear.org/\n".
    		'  '.html::escapeHTML($core->blog->url)."\n";
    
    		if ($core->blog->settings->system->enable_xmlrpc)
    		{
    			$u = sprintf(DC_XMLRPC_URL,$core->blog->url,$core->blog->id);
    
    			echo
    			"  \n".
    			'    '."\n".
    			'    '."\n".
    			'    '."\n".
    			'    '."\n".
    			"  \n";
    		}
    
    		echo
    		"\n".
    		"\n";
    	}
    
    	public static function xmlrpc($args)
    	{
    		$core =& $GLOBALS['core'];
    		$blog_id = preg_replace('#^([^/]*).*#','$1',$args);
    		$server = new dcXmlRpc($core,$blog_id);
    		$server->serve();
    	}
    }
    dotclear-2.6.2+dfsg/inc/public/prepend.php000066400000000000000000000102301230033266200204230ustar00rootroot00000000000000setBlog(DC_BLOG_ID);
    	} catch (Exception $e) {
    		init_prepend_l10n();
    		__error(__('Database problem')
    			,DC_DEBUG ?
    				__('The following error was encountered while trying to read the database:').'

    • '.$e->getMessage().'
    ' : __('Something went wrong while trying to read the database.') ,620); } } if ($core->blog->id == null) { __error(__('Blog is not defined.') ,__('Did you change your Blog ID?') ,630); } if ((boolean)!$core->blog->status) { $core->unsetBlog(); __error(__('Blog is offline.') ,__('This blog is offline. Please try again later.') ,670); } # Loading media try { $core->media = new dcMedia($core); } catch (Exception $e) {} # Creating template context $_ctx = new context(); try { $core->tpl = new dcTemplate(DC_TPL_CACHE,'$core->tpl',$core); } catch (Exception $e) { __error(__('Can\'t create template files.') ,$e->getMessage() ,640); } # Loading locales $_lang = $core->blog->settings->system->lang; $_lang = preg_match('/^[a-z]{2}(-[a-z]{2})?$/',$_lang) ? $_lang : 'en'; l10n::lang($_lang); if (l10n::set(dirname(__FILE__).'/../../locales/'.$_lang.'/date') === false && $_lang != 'en') { l10n::set(dirname(__FILE__).'/../../locales/en/date'); } l10n::set(dirname(__FILE__).'/../../locales/'.$_lang.'/public'); l10n::set(dirname(__FILE__).'/../../locales/'.$_lang.'/plugins'); # Loading plugins try { $core->plugins->loadModules(DC_PLUGINS_ROOT,'public',$_lang); } catch (Exception $e) {} # Loading themes $core->themes = new dcThemes($core); $core->themes->loadModules($core->blog->themes_path); # Defining theme if not defined if (!isset($__theme)) { $__theme = $core->blog->settings->system->theme; } if (!$core->themes->moduleExists($__theme)) { $__theme = $core->blog->settings->system->theme = 'default'; } $__parent_theme = $core->themes->moduleInfo($__theme,'parent'); if ($__parent_theme) { if (!$core->themes->moduleExists($__parent_theme)) { $__theme = $core->blog->settings->system->theme = 'default'; $__parent_theme = null; } } # If theme doesn't exist, stop everything if (!$core->themes->moduleExists($__theme)) { __error(__('Default theme not found.') ,__('This either means you removed your default theme or set a wrong theme '. 'path in your blog configuration. Please check theme_path value in '. 'about:config module or reinstall default theme. ('.$__theme.')') ,650); } # Loading _public.php file for selected theme $core->themes->loadNsFile($__theme,'public'); # Loading translations for selected theme if ($__parent_theme) { $core->themes->loadModuleL10N($__parent_theme,$_lang,'main'); } $core->themes->loadModuleL10N($__theme,$_lang,'main'); # --BEHAVIOR-- publicPrepend $core->callBehavior('publicPrepend',$core); # Prepare the HTTP cache thing $mod_files = get_included_files(); $mod_ts = array(); $mod_ts[] = $core->blog->upddt; $__theme_tpl_path = array( $core->blog->themes_path.'/'.$__theme.'/tpl' ); if ($__parent_theme) { $__theme_tpl_path[] = $core->blog->themes_path.'/'.$__parent_theme.'/tpl'; } $core->tpl->setPath( $__theme_tpl_path, dirname(__FILE__).'/default-templates', $core->tpl->getPath()); $core->url->mode = $core->blog->settings->system->url_scan; try { # --BEHAVIOR-- publicBeforeDocument $core->callBehavior('publicBeforeDocument',$core); $core->url->getDocument(); # --BEHAVIOR-- publicAfterDocument $core->callBehavior('publicAfterDocument',$core); } catch (Exception $e) { __error($e->getMessage() ,__('Something went wrong while loading template file for your blog.') ,660); } dotclear-2.6.2+dfsg/inc/public/rs.extension.php000066400000000000000000000045271230033266200214410ustar00rootroot00000000000000addBehavior('coreBlogGetPosts',array('rsExtendPublic','coreBlogGetPosts')); $core->addBehavior('coreBlogGetComments',array('rsExtendPublic','coreBlogGetComments')); class rsExtendPublic { public static function coreBlogGetPosts($rs) { $rs->extend('rsExtPostPublic'); } public static function coreBlogGetComments($rs) { $rs->extend('rsExtCommentPublic'); } } class rsExtPostPublic extends rsExtPost { public static function getContent($rs,$absolute_urls=false) { # Not very nice hack but it does the job :) if (isset($GLOBALS['_ctx']) && $GLOBALS['_ctx']->short_feed_items === true) { $_ctx =& $GLOBALS['_ctx']; $c = parent::getContent($rs,$absolute_urls); $c = context::remove_html($c); $c = context::cut_string($c,350); $c = '

    '.$c.'... '. ''.__('Read').' '. html::escapeHTML($rs->post_title).'

    '; return $c; } if ($rs->core->blog->settings->system->use_smilies) { return self::smilies(parent::getContent($rs,$absolute_urls),$rs->core->blog); } return parent::getContent($rs,$absolute_urls); } public static function getExcerpt($rs,$absolute_urls=false) { if ($rs->core->blog->settings->system->use_smilies) { return self::smilies(parent::getExcerpt($rs,$absolute_urls),$rs->core->blog); } return parent::getExcerpt($rs,$absolute_urls); } protected static function smilies($c,$blog) { if (!isset($GLOBALS['__smilies'])) { $GLOBALS['__smilies'] = context::getSmilies($blog); } return context::addSmilies($c); } } class rsExtCommentPublic extends rsExtComment { public static function getContent($rs,$absolute_urls=false) { if ($rs->core->blog->settings->system->use_smilies) { $c = parent::getContent($rs,$absolute_urls); if (!isset($GLOBALS['__smilies'])) { $GLOBALS['__smilies'] = context::getSmilies($rs->core->blog); } return context::addSmilies($c); } return parent::getContent($rs,$absolute_urls); } } dotclear-2.6.2+dfsg/index.php000066400000000000000000000012471230033266200160560ustar00rootroot00000000000000, YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: Dotclear 2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-04-15 16:27+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "%Y-%m-%d %H:%M" msgstr "" msgid "_Jan" msgstr "Jan" msgid "_Feb" msgstr "Feb" msgid "_Mar" msgstr "Mar" msgid "_Apr" msgstr "Apr" msgid "_May" msgstr "May" msgid "_Jun" msgstr "Jun" msgid "_Jul" msgstr "Jul" msgid "_Aug" msgstr "Aug" msgid "_Sep" msgstr "Sep" msgid "_Oct" msgstr "Oct" msgid "_Nov" msgstr "Nov" msgid "_Dec" msgstr "Dec" msgid "January" msgstr "" msgid "February" msgstr "" msgid "March" msgstr "" msgid "April" msgstr "" msgid "May" msgstr "" msgid "June" msgstr "" msgid "July" msgstr "" msgid "August" msgstr "" msgid "September" msgstr "" msgid "October" msgstr "" msgid "November" msgstr "" msgid "December" msgstr "" msgid "_Mon" msgstr "Mon" msgid "_Tue" msgstr "Tue" msgid "_Wed" msgstr "Wed" msgid "_Thu" msgstr "Thu" msgid "_Fri" msgstr "Fri" msgid "_Sat" msgstr "Sat" msgid "_Sun" msgstr "Sun" msgid "Monday" msgstr "" msgid "Tuesday" msgstr "" msgid "Wednesday" msgstr "" msgid "Thursday" msgstr "" msgid "Friday" msgstr "" msgid "Saturday" msgstr "" msgid "Sunday" msgstr "" dotclear-2.6.2+dfsg/locales/en/help/000077500000000000000000000000001230033266200172065ustar00rootroot00000000000000dotclear-2.6.2+dfsg/locales/en/help/core_blog_new.html000066400000000000000000000011511230033266200226760ustar00rootroot00000000000000 New blog

    Create a new blog

    Blog ID
    Unique identifier of the blog. Mandatory, can only be modified by a super administrator.
    Blog name
    Blog name. Mandatory, can be modified at any time without any impact on the blog operation.
    Blog URL
    Full URL of the blog. Mandatory, can only be modified by a super administrator.
    Blog description
    Free text to describe the blog. It is a simple text without any specific formatting.
    dotclear-2.6.2+dfsg/locales/en/help/core_blog_pref.html000066400000000000000000000225501230033266200230470ustar00rootroot00000000000000 Blog settings

    Blog details

    Blog ID
    Unique ID of the blog. Mandatory, can only be modified by a super administrator.
    Blog name
    Name of the blog, mandatory. It can be modified at any time without any impact on the blog operation.
    Blog URL
    Full blog URL. Mandatory, can only be modified by a super administrator.
    URL scan method
    Defines the way the URL is read. PATH_INFO is recommended, QUERY_STRING has to be used if PATH_INFO does not work. Using PATH_INFO mode, the blog URL must end with a "/" and using QUERY_STRING, it must end with an "?".
    Blog status
    • Online: Blog open to visitors.
    • Offline: Blog closed to visitors but open to writers.
    • Removed: Blog closed to both visitors and writers, open only to super administrators.
    Blog description
    Here you can put any description you want for your blog. This is a simple text, without any formatting.

    Blog configuration

    Blog editor's name
    Name of the person responsible for the blog. It may be the owner or the publisher if there is one. This information will be displayed in the blog feed.
    Default language
    Language of the blog interface. Either this language is amongst the avalaible ones, and the interface will be translated, or it is not, and the interface will be in English by default.
    Blog timezone
    Defines the timezone that will be used for comments and trackbacks.
    Copyright notice
    Note about the reproduction rights for the blog.
    New post URL format
    Dropdown list to select the URL format.
    HTML tag for the title of the notes on the blog
    Dropdown list to select an HTML tag.
    XML/RPC interface
    Allows external clients to interact with your blog via the XML/RPC protocol. After activation the required parameters to be set in your external clients are displayed.

    Comments and trackbacks

    Accept comments
    Globally accepts comments on the blog. Takes precedence over the per post setting.
    Moderate comments
    With this option, comments will be published only after editor's agreement.
    Leave comments open for X days
    The number of days during wich comments will be open after the post publication. When empty, the comments will be kept open indefinitly.
    Wiki syntax for comments
    Allows a subset of the wiki syntax to be used in comments.
    Accept trackbacks
    Globally accepts trackbacks on the blog. Takes precedence over the per post setting.
    Moderate trackbacks
    With this option, trackbacks will be published only after editor's agreement.
    Leave trackbacks open for X days
    The number of days during wich trackbacks will be open after the post publication. When empty, the trackbacks will be kept open indefinitly.
    Add "nofollow" relation on comments and trackbacks links
    Adds an attribute on links in comments and trackbacks, instructing the search bots not to follow them. This antispam features has yet to prove its value.

    Blog presentation

    Date format
    Defines the date format for the blog posts. See the "Format reference" section below for more information. You can use the dropdown list to quickly select a pre-existing pattern.
    Time format
    Defines the time format for the blog posts. See the "Format reference" section below for more information. You can use the dropdown list to quickly select a pre-existing pattern.
    Display smilies on entries and comments
    Turns some strings like :-) or ;-) into pictures.
    Display X entries per page
    Will display X entries on the blog main page as well as in the different categories.
    Display X entries per feed
    Will display X entries in the blog feeds.
    Display X comments per feed
    Will display X comments in the blog comments feeds.
    Truncate feeds
    This option will only provide an abstract from the blog posts in the feeds.
    Include sub-categories in category page and category posts feed
    When this option is activated, posts in sub-categories will be displayed in the parent categories pages as well as in their feeds.

    Media and images

    Generated image sizes (in pixels)
    When you add an image in the media manager, other sizes are automatically generated. Here you can define the dimension of the longest size (width or heigth) of each type of generated images. If you leave one field empty, the media manager will not create the corresponding miniature.
    Default image insertion attributes
    The selected settings will apply on all the new images added to the media manager.
    Inserted image title
    Select the format of the "title" tags applied to your images, based on information retrieved from the images metadata.
    Use original media date if possible
    When this option is activated, if the image metadata contains a date, it will be used. If not, the upload date will be used.
    Size of inserted image
    Defines the default size used when inserting an image in a blog post.
    Image alignment
    Defines the default alignment used when inserting an image in a blog post.
    Insert a link to the original image
    When this option is activated, the pictures inserted in a blog post will be clickable and point to the original-sized picture.

    Search engines robots policy

    Here you can indicate if you want Web search engines to index and/or archive your pages or not. Select the last option if you do not want people to be able to find your blog using a Web search engine.

    Antispam

    You can set the number of days after which you want the junk comments to be automatically deleted. Leave that field blank (or put 0) to deactivate this feature.

    Users

    Lists this blog's users as well as their permissions.

    Format reference

    Some fields can be configured to format the date and time to your needs. Here is a reference:

    • %a: Abreviated week day (local).
    • %A: Complete week day (local).
    • %b: Abbreviated month name (local).
    • %B: Complete month name (local).
    • %c: Default local date and time display.
    • %C: Century (the year, divided by 100 and round up beetween 00 and 99)
    • %d: Numeric month day (from 01 to 31)
    • %D: Identical to %m/%d/%y
    • %e: Numeric month day (from 1 to 31)
    • %g: Identical to %G, 2 digits.
    • %G: The year on 4 digits, according to the week number (cf. %V). Format and value identical to %Y, except that if the number of the week belongs to the preceding or following year, the current year will be used instead.
    • %h: Identical to %b
    • %H: Digital hour of the day, 24H mode (from 00 to 23)
    • %I: Digital hour of the day, 12H mode (from 01 to 12)
    • %j: Day of the year, digital (from 001 to 366)
    • %m: Month, digital (from 1 à 12)
    • %M: Minute, digital
    • %n: Newline character
    • %p: Either `am' or `pm', according to the absolute time, or depending of the local settings.
    • %r: The hour, a.m. and p.m. format
    • %R: The hour, 24h format
    • %S: Seconds, digital
    • %t: Tab character
    • %T: The current time (identical to %H:%M:%S)
    • %u: Day week, digit, from 1 to 7. (1 stands for monday)
    • %U: Week number, the first Sunday of the year being the first day of the first week.
    • %V: The week number as defined in ISO 8601:1988, digital, from 01 to 53. The week 1 is the first week with more than 4 days in the current year, whose Monday is the first day. (Use %G or %g for the year elements corresponding to the number of the week for the considered timestamp.)
    • %W: Number of the week in the year, the first Monday of the year being the start of the first week
    • %w: Day of the week, digital, 0 stands for sunday
    • %x: Prefered format for the date without the time
    • %X: Prefered format for the time without the date
    • %y: The year, two digits (from 00 to 99)
    • %Y: The year, four digits
    • %Z or %z: Timezone, name or abbreviation
    • %%: A litteral `%' character
    dotclear-2.6.2+dfsg/locales/en/help/core_blog_theme.html000066400000000000000000000022411230033266200232100ustar00rootroot00000000000000 Blog aspect

    Installed themes

    The list of installed themes appears in this tab. You can select a theme by clicking on it and pressing Use this one.

    The currently selected theme can be modified using the Edit theme files button. If the selected theme includes a theme editor, it can be easily personalized using the Configure theme button.

    You can also deactivate a theme (for instance if you have compatibilities issues with it). A Deactivated themes tab will appear containing the list of these.

    Add themes

    This tab allows you to browse the DotAddict themes repository either by alphabetical order, either by searching using the dedicated field. The themes that are already installed do not appear in the list.

    Install or upgrade manually

    If the theme you want to install (or upgrade) is not in the DotAddict repository, you can install it either by uploading it from your hard drive, either by entering its installation URL. A theme is always packaged as a zip file.

    dotclear-2.6.2+dfsg/locales/en/help/core_blogs.html000066400000000000000000000011171230033266200222120ustar00rootroot00000000000000 List of blogs

    Filter the list of blogs

    Search
    The search is based on the blog identifier. You can use the * wildcard to specify only a part of the name.
    Order by
    Last update of the blog, blog name, blog ID.
    Sort
    Indicate the sorting you want to use to filter the results (descending or ascending).
    Blogs per page
    Selects the number of blogs displayed per page in this list.
    dotclear-2.6.2+dfsg/locales/en/help/core_categories.html000066400000000000000000000023271230033266200232350ustar00rootroot00000000000000 Categories

    Categories list

    Delete a category
    Choose the category you want to delete by clicking on Delete the category. A pop-up will ask you to confirm this action.
    A category can only be deleted if it contains no article in it.
    To empty a category, you can move the entries by selecting (in the dropdown list) the new category they will be moved to. Click OK to confirm this choice.
    Reorder categories
    You can modify the categories order using drag and drop. You can also move a category to a parent category.
    When you're satisfied with the order, click Save categories order.
    Reorder all categories on the top level
    Use this option to move back all the categories to the top level.
    If you want to modify the categories order more precisely, you can :
    • either move them using drag and drop,
    • either click on each category name and select its parent category or its position to its siblings.
    dotclear-2.6.2+dfsg/locales/en/help/core_category.html000066400000000000000000000024121230033266200227200ustar00rootroot00000000000000 Category

    Create a new category

    Name
    Choose the name you want to give to your new category. This field is mandatory.
    Parent
    It is possible to create sub-categories. In that case, you have to select its parent category in the Parent field.
    URL
    Dotclear creates a default URL for the category, making it reachable with a path such as http://myblog.tld/category/My-category. By clicking the little lock on the right, you can modify it the way you like.
    Description
    This description field content will be displayed when entering a category in the blog. You can fill it with any kind of content (paragraphs, lists, etc.). The format used for this field is XHTML.

    Move this category

    Parent category
    It is possible to create sub-categories. In that case, you have to select its parent category in the Parent field.
    Sibling category
    You can move the category into any other one, which will become its parent. You can also specify its position to its other siblings by moving it before or after one of them.
    dotclear-2.6.2+dfsg/locales/en/help/core_comments.html000066400000000000000000000030161230033266200227310ustar00rootroot00000000000000 Comments

    Filters for comment list

    Type:
    None, comments or trackbacks.
    Status:
    • junk:
    • pending:
    • unpublished: offline ;
    • published: online.
    Order by:
    Choose: date, entry title, author or status, then choose the sort order.
    Sort
    Choose whether the list will be sorted in ascending or descending order.
    Comment author.
    The search is not case sensitive. If you want to search only a part of the name, you can use the * generic character.
    Comments per page :
    Allows you to choose the number of comments on each page of this list.

    Modify or add a comment

    Author:
    Author name. This field is mandatory.
    Email:
    Author's email address.
    Web site:
    URL of the comment author's blog or website.
    Status:
    • junk:
    • pending:
    • unpublished: offline
    • published: online
    Comment:
    Comment's content. This field is html formated.
    dotclear-2.6.2+dfsg/locales/en/help/core_dashboard.html000066400000000000000000000034001230033266200230300ustar00rootroot00000000000000 Dashboard

    Header

    If there are several blogs you can access on this instance, a dropdown list allows you to pick the one you want to work on. If there is only one blog, it simply displays its name.

    The following link allows to go on the current blog (opens in a new tab).

    The other links allow you to go back to this dashboard, to access your preferences and to logout.

    Personalisation of the dashboard

    Favorites
    The big icons in the middle of the page allow you to quickly access your favorite admin pages.
    Dashboard modules
    The modules displayed under the favorites are installed by default or added by plugins.

    You can personalize the display of favorites and modules by going in the My dashboard tab in the My preferences page.

    The main menu

    You can display or hide this menu at any time by clicking on its right side.

    The first part of the menu lists all the favorite pages of the user. You can select to display this list or not in the My dashboard tab in the My preferences page.

    The rest of the menu lists the administration pages. It is divided in three sections:

    • Blog for everything relative to the current blog content and parameters.
    • System settings to manage the global installation.
    • Plugins for extensions affecting the whole system.
    dotclear-2.6.2+dfsg/locales/en/help/core_langs.html000066400000000000000000000017321230033266200222130ustar00rootroot00000000000000 Languages

    Installed languages

    You will find here the list of installed languages available for your administration profile and for your blog. Each of these languages can be removed.

    In the case where no language would be present, English would be used by default for the administration part as well as for the blog.

    Install or upgrade languages

    Available languages

    You will find here a list of languages available on Dotclear website. To install one of these languages, select it in the dropdown list, enter your password and press Install language.

    The selected language will then be downloaded and installed on your system.

    Upload a zip file

    You can also use a compressed archive (zip format) to install a language. Select the corresponding file on your computer, enter your password and press Upload language.

    dotclear-2.6.2+dfsg/locales/en/help/core_media.html000066400000000000000000000102061230033266200221620ustar00rootroot00000000000000 Media manager

    Media list

    The main page of the media manager displays a list of available files (media) for the currently selected blog.

    You can click the icons or names of the media in the folder or any subfolder to display them.

    Selecting a MP3 sound file displays a player to immediately play the file. The Flash plugin must be installed on your browser for this player to operate.

    The images are displayed with a thumbnail when possible.

    Add files

    Choose a file
    Here you can select one of your local files to send it on your blog. Should the file be bigger than the maximum size, it will not be sent.
    Title
    Optional title for the file you want to send.
    Private
    Check this if you want the file to be private, i.e. accessible only by its owner and not accessible from the blog (until published).
    Enhanced uploader
    Allows to select one or several of your local files to send them on your blog. Should any file be bigger than the maximum size, it will not be sent.
    When you select several local files, they are added to the queue. You can add more files by clicking again on Choose files. You can also remove files from the queue by clicking on the corresponding red cross-shaped icon.
    When you are ready, click on Upload.

    Delete files

    To delete a file, check its checkbox and click on Remove selected media. You can delete several files at once.

    New folder

    This form allows you to create a new subfolder in the currently displayed folder. Just choose a name for it as you would do on your own computer.

    Media details

    This page displays a set of information about the currently selected file and allows you to perform a several operations on it.

    File name
    Change the file name of the current file.
    File title
    Give a title to the file or change the current one.
    File date
    Change the file date.
    Private
    Specify that the file will be hidden to anyone but its owner in the media manager.
    New directory
    Allows you to move the file in another folder.
    Change file
    With this form, you can replace the file while keeping all the attributes (name, title...). As always, you have to respect the maximum file size.

    Specific case: images

    When you add an image, depending of its size, up to four versions will be made available (depending on the original image size):

    • Square: A 48x48 pixels square thumbnail.
    • Thumbnail: The image reduced to 100 pixels on its longest side.
    • Small: The longest side is reduced to 240 pixels.
    • Medium: The longest side is reduced to 500 pixels.
    • Original: The original, unchanged image.

    Default sizes for the thumbnail, small and medium versions can be modified in your blog settings.

    Attach a file to an entry

    You can easily attach a file to one of your posts. First, create a new post and save it. Then click on "Add files to this entry" to open the media manager.

    Just click on the [+] icon (Attach this file to entry). The file will then be attached to the post.

    The attached files will be shown on the post page, as a list after the post content. The MP3 files will be made available through a Flash player, so that they can be easily played by your visitors.

    Podcast and broadcasting of music files

    All attached files will be included in your blog feeds, allowing an easy podcasting of any type of file.

    dotclear-2.6.2+dfsg/locales/en/help/core_plugins.html000066400000000000000000000035041230033266200225670ustar00rootroot00000000000000 Plugins management

    Installed plugins

    Each line starts with the plugin logo you will find in the menu (on the left of your screen).

    A Dotclear logo next to the action buttons indicates that the plugin comes directly with Dotclear and is one of its components.

    Activated plugins

    This list displays information about activated plugins: Name, version, short description. Two actions are possible: Deactivate (temporary operation) or Delete (permanent operation).

    Deactivated plugins

    This list shows the plugins that have been deactivated by the user. For each one, two actions are possible: Activate or Delete (permanent operation).

    Add plugins

    This page allows you to browse the DotAddict repository and to install a plugin directly from it.

    Two search methods are available:

    • By typing the plugin name in the Search in repository field,
    • By browsing the index

    In the index, unfolding a plugin by clicking on the arrow next to its name will allow you to access its DotAddict page or to go to a support website if the plugin author picked one.

    Install or upgrade manually

    You can install your own plugins or plugins that are not available on DotAddict using this page.

    There are two ways to install them:

    • Upload a zip file from your computer. Click on Browse to select the file, enter your password, and press Upload.
    • Download a zip file directly from the Web by entering its URL, then enter your password and press Download.
    dotclear-2.6.2+dfsg/locales/en/help/core_post.html000066400000000000000000000115171230033266200220760ustar00rootroot00000000000000 Editing an entry

    Editing an entry

    Entry title
    Type in the entry title. This field is mandatory.
    Excerpt
    The content of this field will be shown in pages showing entries as a list, such as the homepage or categories pages, followed by a "continue reading" link. It will also be visible at the beginning of the page showing the whole post. Should you leave it blank, the content field will be shown entirely on the homepage and other entry list pages.
    Content
    The content of your entry. This field is mandatory.
    Personal notes
    This text area is for personal use, for notes or memos. What you enter here will never be displayed on the blog.
    Entry status
    Allows you to choose your entry's status:
    • Pending: The publication status has not yet been decided.
    • Scheduled: The post will be set online at the time and date set in the Published on field.
    • Unpublished: The post is offline.
    • Published: The post is online.
    Publication date and hour
    Here you can change the entry's publication date and time. If the entry's status is Scheduled, it will be online at the given date and time.
    Entry language
    Select the language code of your entry. It defaults to your (as a user) language but you can change it to whatever language code you want, e.g. "en" or "es-ar". This code is used for the entry's display.
    Text formatting
    Choose the entry's syntax. Wiki is a simplified syntax and will be converted to valid XHTML. Unless you have a perfect understanding of XHTML, we advise you to choose the Wiki syntax. See the Wiki syntax reference for more information.
    Selected entry
    The selected entries will be listed on your blog menu, under the title "Best of me".
    Category
    Your entry's category. To create a new category, please see the Categories section. You can choose to leave you entry without a category by selecting the (none) item.
    Add a new category
    You can create a new category by entering its title and selecting its parent category (or select (none) to create a top level category).
    Tags
    Add tags separated by commas, and press ok when done. You can also select existing tags by clicking on Choose from list.
    Attachments
    Attachments are media files added to the entry. You can use the Add files to this entry button to select media files to add to the entry.
    This option will appear after you save your entry.
    Please check the Media manager help for more information.
    Accept comments
    Check this box to allow your visitors to comment on this entry. The corresponding global setting can be found in the blog settings.
    Accept trackbacks
    A trackback is a way to let a portion of your entry as a comment on another blog. Check this box to allow others to trackback your entry. The corresponding global setting is to be found in the blog settings.
    Password
    You can enter a password for your entry. A password protected entry will not be displayed on your blog, it will only be accessible to those you will give the entry URL to (see the view entry link) and password.
    Basename
    You can unprotect this field by clicking on the little lock on its right and choose another URL for your entry. If the URL you're trying to use is already used by another entry, a number will be added to it.

    Comments

    Comment list
    On the Comments tab, you can read and change the status of your entry's comments (and trackbacks). If you're allowed to by the blog administrator, you will be able to set your comments (and trackbacks) online or offline, to delete them or to mark them as junk.
    Add a comment
    On the Add a comment tab, you can reply to one of your entry's comments without leaving your blog's backend. The syntax to be used here is plain, unlimited XHTML. Use the fields as if you were modifying a comment.

    Add a comment

    Name
    Comment author's name. This field is mandatory.
    Email
    Comment author's e-mail address.
    Website
    Comment author's Website URL.
    Comment
    Comment content. This field uses XHTML syntax.
    dotclear-2.6.2+dfsg/locales/en/help/core_posts.html000066400000000000000000000047351230033266200222650ustar00rootroot00000000000000 Entries management

    Entries list filter

    Author
    Filters entries by author.
    Category
    Filters entries by category.
    Status
    Filters entries by status:
    • Pending: Pending entries.
    • Scheduled: Scheduled entries.
    • Unpublished: Offline entries.
    • Published: Online entries.
    Selected
    Filters entries that have the Selected status or not.
    Attachments
    Filters entries based on if they have attachments or not.
    Month
    Filters entries from the given month of a given year.
    Language
    Filters entries based on the language set in the Language field of an entry.
    Order by
    Allows you to order the result by date, title, category, author, publication status, selected status, number of comments or number of trackbacks.
    Sort
    Allows you to sort the results ascending or descending.
    Entries per page
    Number of entries to display per page.

    Batch actions

    It is possible to make a batch of actions on several articles. The possible actions depend on the user's permissions:

    • Publish: Publish the selected entries online.
    • Unpublish: Pull the selected entries offline.
    • Schedule: Schedule the selected entries to be set online at publication date.
    • Mark as pending: Mark selected entries as pending.
    • Mark as selected/unselected: Set the selected entries as Selected/Unselected./li>
    • Change category: Modify the category of the selected entries.
    • Change language: Modify the language of the selected entries.
    • Change author: Modify the selected entries' author by entering the new author's ID.
    • Delete: Delete the selected entries (this operation cannot be cancelled).
    • Add/Remove tags: Add or remove tags on the selected entries.

    The above list might contain other items if additional actions have been added by plugins active on your system.

    dotclear-2.6.2+dfsg/locales/en/help/core_search.html000066400000000000000000000035751230033266200223630ustar00rootroot00000000000000 Search

    Search options

    Specify the words or terms you're looking for in the text field and select the search scope:

    Search in entries
    Search will only be done on Article title, Summary and Content fields of an entry.
    Search in comments
    Search will only be done on comments.

    Search results

    Result

    A search result allows you to click on one of the article's link to edit it.

    Batch actions

    It is possible to make a batch of actions on several articles in one time. The possible actions depend on the user's permissions:

    • Publish: Publish the article.
    • Unpublish: Put the article offline.
    • Schedule: Schedule the entries to be put online at the publication date.
    • Mark as pending: Pending to be published.
    • Mark as selected: Highlight the selected entries.
    • Mark as unselected: Remove the highlight (if any) on selected entries.
    • Change category: Redirect on the categories list to change the category of the selected articles.
    • Change language: Redirect on the languages list to modify the entries languages.
    • Change author: Allows to modify the entries author by specifying the user ID of the new author.
    • Delete: Delete the entries. A pop-up window will be displayed to confirm your choice.
    • Add tags: Add tags to the selected entries.
    • Remove tags: Remove one or more tags from the selected entries.
      • dotclear-2.6.2+dfsg/locales/en/help/core_trackbacks.html000066400000000000000000000014451230033266200232200ustar00rootroot00000000000000 Editing an entry

        Trackbacks

        To make a trackback, click on the Ping blogs link. If you don't see this link, make sure your entry status is set to published.

        URLs to ping
        Paste here the trackback URLs you found in the posts you want to ping.
        Excerpt to send
        By default, this field contains the beginning of your entry. This is what will be sent to the blog you're pinging, along with a link to your post. You can modify the excerpt by editing this field.
        Auto discover ping URLs
        If your entry links to specific posts and if the blog hosting those posts is set to allow it, this tool will find the URLs to ping for you.
        dotclear-2.6.2+dfsg/locales/en/help/core_update.html000066400000000000000000000027271230033266200223760ustar00rootroot00000000000000 Update

        Update

        This page allows you to update Dotclear automatically. If a new version is available, you will be asked if you want to update. Before doing so, you can check what changes do this update bring by clicking on Information about this version.

        You can force the new version check by clicking on Force Dotclear update checking.

        If everything is OK, i.e. if you didn't manually modified any installation files, the update procedure will:

        • Create a backup of your current installation in the current working directory named backup-x.y.z.zip (where x.y.z are the version numbers, e.g. 2.5.3).
        • Download the new version.

        Once this is done, a message such as the following will be displayed: "Congratulations, you're one click away from the end of the update."
        Click on Finish the update. You will be logged out. The database will be updated, if needed, when you will log back in.

        If you manually modified some files, they will be listed and you will be advised to manually update them.

        Manage backup files

        From this tab, you can remove old backup files.

        You can also rollback to a previous version. Only consider rolling back if you have serious troubles with the new version.

        dotclear-2.6.2+dfsg/locales/en/help/core_user.html000066400000000000000000000054741230033266200220740ustar00rootroot00000000000000 User

        User profile

        User ID
        At least 2 characters using letters, numbers or symbols (no space). This field is mandatory.
        New password
        If you want to change your password, enter the new password twice in New password and Confirm password fields. Passwords must contain at least 6 characters. Both fields are mandatory.
        Password change required to connect
        Check this box so that a new user will have to choose his own password when he will connect.
        Super administrator
        This will give the current user all the permissions on all the blogs hosted on the system.
        Last name, First name
        If no display name is provided, the displayed author's name will contain the last name and first name entered in these two fields.
        Display name
        You can select the nickname you want to use to sign your articles. If not empty, this field will be used instead of the last name and first name fields.
        Email
        This e-mail address will be used if you need to recover your password from Dotclear's authentication screen.
        URL
        Indicates the user's website. If this field is not empty, the author's name will become a clickable link to this website.

        Options

        Interface
        Language
        Set the default language for new entries. If a translation is available for this language, the blog interface will be translated in this language as well.
        Timezone
        This option impacts the way the entries' publication time is displayed.
        Edition
        Preferred format
        Choose the entry's syntax. Wiki is a simplified syntax and will be converted to valid XHTML. Unless you have a perfect understanding of XHTML, we advise you to choose the Wiki syntax. See the Wiki syntax reference for more information.
        Default entry status
        The default status for new entries can be set to:
        • Pending: The publication status has not been yet decided.
        • Scheduled: The entry will be set online at the time and date provided in the Published on field.
        • Unpublished: Offline entry.
        • Published: Online entry.
        Entry edit field height
        Sets the height of the edition field of an entry. By default, this parameter is set to 24.
        Tags list format
        You can select if you want to see, while editing an entry, all the tags used (Extended) or only the most used ones (Short).
        dotclear-2.6.2+dfsg/locales/en/help/core_user_pref.html000066400000000000000000000136021230033266200231000ustar00rootroot00000000000000 My preferences

        My profile

        Last name, First name
        If the display name is empty, the author's name will be displayed as his first name and last name as set here.
        Display name
        Here you can choose a nickname that will be displayed in your posts instead of your last name and first name.
        Email
        E-mail address used when you request a new password.
        New comment notifications will be sent to this address as well.(If you update this field, you must enter your current password in the appropriate field at the bottom of the form)
        URL
        The user's website. If set, the author name will be displayed as a link to the said website.
        Language for my interface
        The language used when publishing entries. If the translation is available, the interface will also be displayed in that language.
        My timezone
        That choice will define the time displayed on post publication.
        Change your password
        To change your password, write down twice your password in the fields New password and Confirm password. The minimal password length is 6 characters. If no new password is provided, the current one is kept. (If you update this field, you must enter your current password in the appropriate field at the bottom of the form)

        My options

        Interface
        Activate enhanced uploader in media manager
        Allows to activate the advanced interface in media manager that enables to upload multiple files at a time (Note: Your Web browser must support Javascript to be able to use this feature).
        Disable Javascript powered drag and drop for ordering items
        Allows to disable "drag and drop" for item ordering. Drag and drop will be replaced by numeric fields that will let you enter fields position instead.
        Number of elements displayed per page in media manager
        Defines the number of media that will be displayed in media manager (folders are not taken into account when counting items).
        Do not use standard favicon
        Allows to disable default favicon in the Web browser address bar.
        Edition
        Preferred format
        Choose the entry's syntax. Wiki is a simplified syntax and will be converted to valid XHTML. Unless you have a perfect understanding of XHTML, we advise you to choose the Wiki syntax. See the Wiki syntax reference for more information.
        Default entry status
        The default status for new entries can be set to:
        • Pending: The publication status has not been yet decided.
        • Scheduled: The entry will be set online at the time and date provided in the Published on field.
        • Unpublished: Offline entry.
        • Published: Online entry.
        Entry edit field height
        Sets the height of the edition field of an entry. By default, this parameter is set to 24.
        Enable WYSIWYG mode
        Allows the use of the visual editor (WYSIWYG: What You See Is What You Get) for the entries, pages and categories description fields.
        Other options
        Tags list format
        You can select if you want to see, while editing an entry, all the tags used (Extended) or only the most used ones (Short).
        Syntax highlighting in theme editor
        Enables syntax highlighting when using the theme editor (HTML and CSS files)

        My dashboard

        My favorites
        This zone displays the chosen favorites on the blog's dashboard. They can be reordered with your mouse if Javascript is activated in your browser. Otherwise, a field allows to give them an ordering number. When you are done, do not forget to save your changes by pressing Save order.
        You may also delete favorites by selecting them and pressing Delete selected favorites.
        Define as default favorites (super administrator)
        Enable to set currently defined favorites list as default favorites list for all users. This list will be proposed to users if they don't have defined their own favorites yet.
        Other available favorites
        All plugins allowing to be put as favorites are diplayed here. Check the corresponding boxes and add them to the dashboard by pressing Add tp my favorites.
        Display favorites at the top of the menu
        If enabled, displays favorites at the top of the menu.
        Icon set
        If several iconsets are installed, enables to choose which icon set to use for admin.
        Dashboard modules
        Choices made in this zone will be reflected on your blog's dashboard.
        Display documentation links
        Enable to display documentation links on dashboard landing page.
        Display Dotclear news
        Enable to display Dotclear news on dashboard landing page.
        Display quick entry form
        Enable to display "quick entry" form on dashboard landing page.
        Display overdue tasks counter on maintenance dashboard icon
        Enables to display the number of overdue tasks (i.e. that should be processed) under the Maintenance icon. Maintenance icon has to be set in your favorites to use this feature.
        Display overdue tasks list on dashboard items
        Enable to display the list of overdue tasks (i.e. that should be processed) in a dedicated section on the Dashboard landing page.
        dotclear-2.6.2+dfsg/locales/en/help/core_users.html000066400000000000000000000056501230033266200222530ustar00rootroot00000000000000 Users

        This page lists all the users on the system.

        To add (or modify) users' permissions, your password will be required in the Your password field.

        Users list filter

        Search
        Search is based on the user ID. The * wildcard can be used to look only for a part of the user ID.
        Order by
        The users list can be ordered by their ID, their Last Name, their First Name, their Display Name (nickname) or the Number of Entries they created.
        Sort
        Indicates the sorting method that will be applied to the result list (Ascending or Descending).
        Users per page
        Sets the number of users displayed in each page of the result list.

        Users batch actions

        It is possible to make a batch of actions on several users at one time.

        • Set permissions: Set permissions for one or more blog(s).
        • Delete: Remove the selected user(s) from the system. A user who created entries cannot be deleted.

        If you decide to set users' permissions, you will be redirected to a new page listing the blogs available on your system. Check the blogs you want to set the permissions on, and press Set permissions.

        Users permissions

        For each blog, you can set the following permissions:

        • Administrator: Can administrate the blog entirely.
        • Manage their own entries and comments: The user can create entries and manage the comments on entries he created.
        • Publish entries and comments: The user can modify the publication status of his own entries and of his entries' comments.
        • Delete entries and comments: The user can delete his own entries as well as his entries' comments.
        • Manage all entries and comments: The user can manage all the entries of this blog, no matter if he's the author or not.
        • Manage categories: The user can create, modify and delete categories.
        • Manage their own media items: The user can add media items and modifye or delete his own media.
        • Manage all media items: The user can manage the media items from any user.
        • Manage pages: The user can add and modify pages.
        • Manage blogroll: The user can manage the blogroll of the current blog.

        The Super administrator status is set in the user profile.

        dotclear-2.6.2+dfsg/locales/en/help/core_wiki.html000066400000000000000000000055411230033266200220540ustar00rootroot00000000000000 Wiki syntax reference

        Wiki syntax reference

        The Wiki syntax is a way to enhance your text with a minimal set of tags studied to cover the basic needs (titles, paragraphs, quotes, lists...).

        Block elements
        • Leave an empty line between two similar blocks.
        • Paragraph: Free text, ended by an empty line if another paragraph is to follow.
        • Title: !!! title, !! title or ! title, allowing you to use three different levels of heading.
        • Horizontal line: ----
        • Lists: Start each line with * or # for unnumbered or numbered lists respectively. List imbrication is done by mixing list markers this way:
          * item 1
          ** item 1.1
          * item 2
          *# item 2.1
          ...
          
        • Preformatted text: Each line must start with a space.
        • Block quote: Each line must start with a >.
        Formatting tags
        • Emphasis: Two quotes ''text''
        • Strong emphasis: Two underscores __text__
        • New line: %%%
        • Insertion: Two plusses ++text++
        • Deletion: Two minuses --text--
        • Link: [url], [name|url], [name|url|language] or [name|url|language|title]
        • Image: ((url|alternative text)), ((url|alternative text|position)) or ((url|alternative text|position|long description)).
          The position can be either L (left), R (right) or C (centered).
        • Anchor: ~anchor~
        • Acronym: ??acronym|title??
        • Inline HTML: Two backquotes ``html code``
        • Inline quote: {{quote}}, {{quote|language}} or {{quote|language|url}}
        • Code: @@code@@
        • Footnotes: $$footnote$$
        Unformatted text
        If you don't want one formatting character to be interpreted as such, add a \ just before it. For instance: \[Text in brackets without being a link\]
        HTML code
        Even if you chose the Wiki syntax, you may sometimes need a more powerful formatting, i.e. HTML syntax. Do it the following way:
        ///html
        <p style="color:red">my text in red</p>
        ///
        
        dotclear-2.6.2+dfsg/locales/en/help/index.html000066400000000000000000000415701230033266200212120ustar00rootroot00000000000000

        Interface discovery

        First steps

        In addition to the global help pages, several administration pages have an online help. If javascript is enabled on your browser, you can see online help at the upper-right position of the page, by clicking on the Need Help? link. If Javascript is disabled, the help is displayed at the bottom of the page.

        Each administration page will display the same top heading, main menu and footer. (The order given here is what is shown on a computer screen. For mobile devices or tablets, it may vary according to the space available.)

        Top heading

        The top heading is composed of three elements:

        Logo

        By default, this logo is the Dotclear logo and links to the administration landing page. However, a platform manager can choose another logo and redirect towards something else (generally, the service landing page).

        Blog(s)

        The first element located after the logo shows the active blog, i.e. the blog on which you are acting. If your installation is composed of several blogs, these informations are available in a combo menu, which lets you switch to another blog.

        The link following the blog name opens your current blog in another window or another tab.

        User

        The link My dashboard gets you back to the blog administration landing page.

        The link My preferences leads to the page where you can modify your personal informations, setup the dashboard and choose your interface and editing options.

        Surprisingly, the link Disconnect [your login] disconnects you from the administration of your blog (at Dotclear's, we are ergonomy champions!).

        Main menu

        The main menu is located on the left side of the screen. It can be collapsed by clicking on its right border (and then uncollapsed by clicking again on it).

        It leads to the different administration pages, according to your permissions on the current blog. It is composed of four blocks:

        • My favorites lists the pages that you have selected as favorites in the My preferences/My Dashboard tab. If you have not selected any favorite yet, this list will contain the default Dotclear set, or the set that has been defined by the platform manager. If you do not want to display this block, you can uncheck the matching checkbox in your dashboard options.
        • Blog lists all the pages that enable to feed and setup the current blog, from editing an entry, managing media, choosing the blog appearance or other parameters.
          If you do not have administrator rights on the current blog, there will be no other block below that one in the main menu.
        • System settings links to the pages that allow you to manage the Dotclear installation: blogs management, users and available languages, plugins installation, system settings. If you have rights on several blogs, but no superadministrator rights, you will only see the Blogs entry.
        • Plugins enables you to setup the installed plugins. If the plugin settings only impact one blog at a time, its administration page is available from the Blog block, but if they impact the whole installation, they are located here, and only available for super-admin users.

        Footer

        A free version of Dotclear will be offered to any user who will discover the secret hidden in the footer.

        Help for great beginners

        If you are not familiar with blogs, we recommend that you have a look at our documentation (the whole table of contents is available in the Documentation tab of this page) as well as tutorials such as:

        The Dotclear forum is a welcoming place where there is no such thing as a stupid question. Don't hesitate to participate if you need help and, why not, to help people in return.

        We try our best to use a vocabulary that is easy to understand without specific knowledge. However, if we end up using a technical term, you will probably find its definition in the glossary of our online documentation.

        User manual

        Managing the content

        • Entries
          • Creating and editing
          • Entry details
          • Entry-related actions
          • Comments and trackbacks
          • Batch management of entries
        • Comments and trackbacks
          • Follow-up
          • Management
        • Categories
          • Creating a category
          • Editing a category
          • Deleting a category
          • Sotring the category list
        • Tags (keywords)
          • Adding tags
          • Tag management
        • Media and attachments
          • Creating a sub-directory
          • Adding files
          • Downloading a zip archive of the current directory
          • Change of fill in file details
          • Adding files directly
          • Special file types
          • Attachments
        • Blog menu content (widgets)
          • Navigation sidebar, Extra sidebar
          • Default widgets
          • Adding/removing a widget
          • Widgets options
        • Blogroll
          • Blogroll
          • Adding a link
          • Adding a category
          • XFN
          • Importing links from an OPML or XBEL file

        Settings and customization

        • Blog settings
          • Blog details
          • Blog configuration
          • Comments and trackbacks
          • Blog presentation
          • Media and images
          • Search engine robot policy
          • Antispam
          • LightBox
          • Save
        • User preferences
          • My profile
          • My options
          • My dashboard
        • Blog appearance
          • Choose a theme
          • Install a theme
          • Personnalize a theme
          • Theme editor

        Documentation for administrators

        Installation and update

        Hosting Annex

        Administration

        Maintenance

        Developer and Designer resources

        Design & Themes

        • Themes
          • User guide for themes
          • The template tags
          • Appendix
        • Themes inheritance
          • Principle
          • Limitations
          • Set up
        • Template tags
          • Generalities / utilities
          • Blog
          • Entries
          • Entries pagination
          • Comments
          • Comment preview
          • Pings
          • Attachments
          • Categories
          • Tags
          • Archives
          • Languages
          • System
          • Widgets

        Code & Plugins

        Contribution & Support

        Accessibility and ergonomy

        The Dotclear interface fulfills almost all the WCAG 2.0 criterion. We are working towards making Dotclear compatible with ATAG 2.0 guidelines.

        Accessibility and ergonomy are one of our main concern. We regularly run analysis with the help of experts and continuously provide fixes and enhancements.

        You can help us by opening tickets or by participating on the forum. You can also participate in user testing or join our team!

        dotclear-2.6.2+dfsg/locales/en/main.lang.php000066400000000000000000002051501230033266200206360ustar00rootroot00000000000000%s
        return a %s status).'] = ''; $GLOBALS['__l10n']['The URL of blog or the URL scan method might not be well set (%s does not return an ATOM feed).'] = ''; $GLOBALS['__l10n']['Blog status:'] = ''; $GLOBALS['__l10n']['Blog configuration'] = ''; $GLOBALS['__l10n']['Blog editor name:'] = ''; $GLOBALS['__l10n']['Default language:'] = ''; $GLOBALS['__l10n']['Blog timezone:'] = ''; $GLOBALS['__l10n']['Copyright notice:'] = ''; $GLOBALS['__l10n']['New post URL format:'] = ''; $GLOBALS['__l10n']['HTML tag for the title of the notes on the blog:'] = ''; $GLOBALS['__l10n']['Enable XML/RPC interface'] = ''; $GLOBALS['__l10n']['XML/RPC interface allows you to edit your blog with an external client.'] = ''; $GLOBALS['__l10n']['XML/RPC interface is active. You should set the following parameters on your XML/RPC client:'] = ''; $GLOBALS['__l10n']['Server URL:'] = ''; $GLOBALS['__l10n']['Blogging system:'] = ''; $GLOBALS['__l10n']['User name:'] = ''; $GLOBALS['__l10n']['your password'] = ''; $GLOBALS['__l10n']['Comments and trackbacks'] = ''; $GLOBALS['__l10n']['Accept comments'] = ''; $GLOBALS['__l10n']['Moderate comments'] = ''; $GLOBALS['__l10n']['Leave comments open for %s days'] = ''; $GLOBALS['__l10n']['No limit: leave blank.'] = ''; $GLOBALS['__l10n']['Wiki syntax for comments'] = ''; $GLOBALS['__l10n']['Accept trackbacks'] = ''; $GLOBALS['__l10n']['Moderate trackbacks'] = ''; $GLOBALS['__l10n']['Leave trackbacks open for %s days'] = ''; $GLOBALS['__l10n']['Add "nofollow" relation on comments and trackbacks links'] = ''; $GLOBALS['__l10n']['Blog presentation'] = ''; $GLOBALS['__l10n']['Date format:'] = ''; $GLOBALS['__l10n']['Pattern of date'] = ''; $GLOBALS['__l10n']['Sample:'] = ''; $GLOBALS['__l10n']['Time format:'] = ''; $GLOBALS['__l10n']['Pattern of time'] = ''; $GLOBALS['__l10n']['Display smilies on entries and comments'] = ''; $GLOBALS['__l10n']['Display %s entries per page'] = ''; $GLOBALS['__l10n']['Display %s entries per feed'] = ''; $GLOBALS['__l10n']['Display %s comments per feed'] = ''; $GLOBALS['__l10n']['Truncate feeds'] = ''; $GLOBALS['__l10n']['Include sub-categories in category page and category posts feed'] = ''; $GLOBALS['__l10n']['Media and images'] = ''; $GLOBALS['__l10n']['Please note that if you change current settings bellow, they will now apply to all new images in the media manager.'] = ''; $GLOBALS['__l10n']['Be carefull if you share it with other blogs in your installation.'] = ''; $GLOBALS['__l10n']['Generated image sizes (in pixels)'] = ''; $GLOBALS['__l10n']['Default image insertion attributes'] = ''; $GLOBALS['__l10n']['Inserted image title'] = ''; $GLOBALS['__l10n']['Use original media date if possible'] = ''; $GLOBALS['__l10n']['It is retrieved from the picture\'s metadata.'] = ''; $GLOBALS['__l10n']['Size of inserted image:'] = ''; $GLOBALS['__l10n']['Image alignment:'] = ''; $GLOBALS['__l10n']['Insert a link to the original image'] = ''; $GLOBALS['__l10n']['Search engines robots policy'] = ''; $GLOBALS['__l10n']['Save'] = ''; $GLOBALS['__l10n']['The current blog cannot be deleted.'] = ''; $GLOBALS['__l10n']['Only superadmin can delete a blog.'] = ''; $GLOBALS['__l10n']['Users'] = ''; $GLOBALS['__l10n']['Users on this blog'] = ''; $GLOBALS['__l10n']['No users'] = ''; $GLOBALS['__l10n']['Publications on this blog:'] = ''; $GLOBALS['__l10n']['%1$s: %2$s'] = ''; $GLOBALS['__l10n']['Permissions:'] = ''; $GLOBALS['__l10n']['Super administrator'] = ''; $GLOBALS['__l10n']['All rights on all blogs.'] = ''; $GLOBALS['__l10n']['[%s] (unreferenced permission)'] = ''; $GLOBALS['__l10n']['All rights on this blog.'] = ''; $GLOBALS['__l10n']['Change permissions'] = ''; $GLOBALS['__l10n']['Blog appearance'] = ''; $GLOBALS['__l10n']['Theme configuration'] = ''; $GLOBALS['__l10n']['Themes management'] = ''; $GLOBALS['__l10n']['Update themes'] = ''; $GLOBALS['__l10n']['There is one theme to update available from repository.'][0] = ''; $GLOBALS['__l10n']['There is one theme to update available from repository.'][1] = ''; $GLOBALS['__l10n']['Visit %s repository, the resources center for Dotclear.'] = ''; $GLOBALS['__l10n']['Installed themes'] = ''; $GLOBALS['__l10n']['You can configure and manage installed themes from this list.'] = ''; $GLOBALS['__l10n']['Deactivated themes'] = ''; $GLOBALS['__l10n']['Deactivated themes are installed but not usable. You can activate them from here.'] = ''; $GLOBALS['__l10n']['Add themes'] = ''; $GLOBALS['__l10n']['Add themes from repository'] = ''; $GLOBALS['__l10n']['Install or upgrade manually'] = ''; $GLOBALS['__l10n']['Add themes from a package'] = ''; $GLOBALS['__l10n']['You can install themes by uploading or downloading zip files.'] = ''; $GLOBALS['__l10n']['Last update'] = ''; $GLOBALS['__l10n']['Blog name'] = ''; $GLOBALS['__l10n']['Blog ID'] = ''; $GLOBALS['__l10n']['Descending'] = ''; $GLOBALS['__l10n']['Ascending'] = ''; $GLOBALS['__l10n']['Show filters and display options'] = ''; $GLOBALS['__l10n']['Cancel filters and display options'] = ''; $GLOBALS['__l10n']['List of blogs'] = ''; $GLOBALS['__l10n']['Blog has been successfully deleted.'] = ''; $GLOBALS['__l10n']['Create a new blog'] = ''; $GLOBALS['__l10n']['Filter blogs list'] = ''; $GLOBALS['__l10n']['Filters'] = ''; $GLOBALS['__l10n']['Search:'] = ''; $GLOBALS['__l10n']['Display options'] = ''; $GLOBALS['__l10n']['Order by:'] = ''; $GLOBALS['__l10n']['Sort:'] = ''; $GLOBALS['__l10n']['Show'] = ''; $GLOBALS['__l10n']['blogs per page'] = ''; $GLOBALS['__l10n']['Apply filters and display options'] = ''; $GLOBALS['__l10n']['No blog matches the filter'] = ''; $GLOBALS['__l10n']['No blog'] = ''; $GLOBALS['__l10n']['%d blog matches the filter.'][0] = ''; $GLOBALS['__l10n']['%d blog matches the filter.'][1] = ''; $GLOBALS['__l10n']['Blogs list'] = ''; $GLOBALS['__l10n']['Blog id'] = ''; $GLOBALS['__l10n']['Entries (all types)'] = 'Entries'; $GLOBALS['__l10n']['Status'] = ''; $GLOBALS['__l10n']['Edit blog settings for %s'] = ''; $GLOBALS['__l10n']['Edit blog settings'] = ''; $GLOBALS['__l10n']['Switch to blog %s'] = ''; $GLOBALS['__l10n']['This category does not exist.'] = ''; $GLOBALS['__l10n']['The category "%s" has been successfully deleted.'] = ''; $GLOBALS['__l10n']['Category where to move posts does not exist'] = ''; $GLOBALS['__l10n']['The entries have been successfully moved to category "%s"'] = ''; $GLOBALS['__l10n']['Categories have been successfully reordered.'] = ''; $GLOBALS['__l10n']['Categories order has been successfully reset.'] = ''; $GLOBALS['__l10n']['Categories'] = ''; $GLOBALS['__l10n']['The category has been successfully removed.'][0] = ''; $GLOBALS['__l10n']['The category has been successfully removed.'][1] = ''; $GLOBALS['__l10n']['Entries have been successfully moved to the category you choose.'] = ''; $GLOBALS['__l10n']['New category'] = ''; $GLOBALS['__l10n']['No category so far.'] = ''; $GLOBALS['__l10n']['%d entries'] = ''; $GLOBALS['__l10n']['%d entry'][0] = ''; $GLOBALS['__l10n']['%d entry'][1] = ''; $GLOBALS['__l10n']['total:'] = ''; $GLOBALS['__l10n']['URL:'] = ''; $GLOBALS['__l10n']['Move entries to'] = ''; $GLOBALS['__l10n']['OK'] = ''; $GLOBALS['__l10n']['Delete category'] = ''; $GLOBALS['__l10n']['To rearrange categories order, move items by drag and drop, then click on “Save categories order” button.'] = ''; $GLOBALS['__l10n']['Save categories order'] = ''; $GLOBALS['__l10n']['Reorder all categories on the top level'] = ''; $GLOBALS['__l10n']['Top level'] = ''; $GLOBALS['__l10n']['The category has been successfully moved'] = ''; $GLOBALS['__l10n']['The category has been successfully updated.'] = ''; $GLOBALS['__l10n']['The category "%s" has been successfully created.'] = ''; $GLOBALS['__l10n']['Category has been successfully updated.'] = ''; $GLOBALS['__l10n']['Category information'] = ''; $GLOBALS['__l10n']['Name:'] = ''; $GLOBALS['__l10n']['Parent:'] = ''; $GLOBALS['__l10n']['Warning: If you set the URL manually, it may conflict with another category.'] = ''; $GLOBALS['__l10n']['Description:'] = ''; $GLOBALS['__l10n']['Move this category'] = ''; $GLOBALS['__l10n']['Category parent'] = ''; $GLOBALS['__l10n']['Category sibling'] = ''; $GLOBALS['__l10n']['Move current category'] = ''; $GLOBALS['__l10n']['after'] = ''; $GLOBALS['__l10n']['before'] = ''; $GLOBALS['__l10n']['position: '] = ''; $GLOBALS['__l10n']['Entry does not exist.'] = ''; $GLOBALS['__l10n']['Comment has been successfully created.'] = ''; $GLOBALS['__l10n']['No comment'] = ''; $GLOBALS['__l10n']['Comment has been successfully updated.'] = ''; $GLOBALS['__l10n']['Comment has been successfully deleted.'] = ''; $GLOBALS['__l10n']['You can\'t edit this comment.'] = ''; $GLOBALS['__l10n']['Edit comment'] = ''; $GLOBALS['__l10n']['Your comment on my blog %s'] = ''; $GLOBALS['__l10n']['Hi! You wrote a comment on: %s '] = ''; $GLOBALS['__l10n']['Send an e-mail'] = ''; $GLOBALS['__l10n']['Information collected'] = ''; $GLOBALS['__l10n']['IP address:'] = ''; $GLOBALS['__l10n']['Date:'] = ''; $GLOBALS['__l10n']['Comment submitted'] = ''; $GLOBALS['__l10n']['Author:'] = ''; $GLOBALS['__l10n']['Web site:'] = ''; $GLOBALS['__l10n']['Status:'] = ''; $GLOBALS['__l10n']['Comment:'] = ''; $GLOBALS['__l10n']['Delete'] = ''; $GLOBALS['__l10n']['Comment'] = ''; $GLOBALS['__l10n']['Trackback'] = ''; $GLOBALS['__l10n']['Date'] = ''; $GLOBALS['__l10n']['Entry title'] = ''; $GLOBALS['__l10n']['Author'] = ''; $GLOBALS['__l10n']['Selected comments have been successfully updated.'] = ''; $GLOBALS['__l10n']['Selected comments have been successfully deleted.'] = ''; $GLOBALS['__l10n']['Spam comments have been successfully deleted.'] = ''; $GLOBALS['__l10n']['You have one spam comment.'] = ''; $GLOBALS['__l10n']['Show it.'] = ''; $GLOBALS['__l10n']['You have %s spam comments.'] = ''; $GLOBALS['__l10n']['Show them.'] = ''; $GLOBALS['__l10n']['Delete all spams'] = ''; $GLOBALS['__l10n']['Filter comments and trackbacks list'] = ''; $GLOBALS['__l10n']['Type:'] = ''; $GLOBALS['__l10n']['comments per page'] = ''; $GLOBALS['__l10n']['Selected comments action:'] = ''; $GLOBALS['__l10n']['Actions'] = ''; $GLOBALS['__l10n']['ok'] = ''; $GLOBALS['__l10n']['Global help'] = ''; $GLOBALS['__l10n']['An update is available'][0] = ''; $GLOBALS['__l10n']['An update is available'][1] = ''; $GLOBALS['__l10n']['Dotclear news'] = ''; $GLOBALS['__l10n']['%d %B %Y:'] = ''; $GLOBALS['__l10n']['Documentation and support'] = ''; $GLOBALS['__l10n']['Dashboard'] = ''; $GLOBALS['__l10n']['Dotclear %s is available!'] = ''; $GLOBALS['__l10n']['Upgrade now'] = ''; $GLOBALS['__l10n']['Remind me later'] = ''; $GLOBALS['__l10n']['Information about this version'] = ''; $GLOBALS['__l10n']['Make this blog my default blog'] = ''; $GLOBALS['__l10n']['This blog is offline'] = ''; $GLOBALS['__l10n']['This blog is removed'] = ''; $GLOBALS['__l10n']['%s is not defined, you should edit your configuration file.'] = ''; $GLOBALS['__l10n']['See documentation for more information.'] = ''; $GLOBALS['__l10n']['The cache directory does not exist or is not writable. You must create this directory with sufficient rights and affect this location to "DC_TPL_CACHE" in inc/config.php file.'] = ''; $GLOBALS['__l10n']['The cache directory does not exist or is not writable. You should contact your administrator.'] = ''; $GLOBALS['__l10n']['There is no writable directory /public/ at the location set in about:config "public_path". You must create this directory with sufficient rights (or change this setting).'] = ''; $GLOBALS['__l10n']['There is no writable root directory for the media manager. You should contact your administrator.'] = ''; $GLOBALS['__l10n']['Following plugins have been installed:'] = ''; $GLOBALS['__l10n']['Following plugins have not been installed:'] = ''; $GLOBALS['__l10n']['Errors have occured with following plugins:'] = ''; $GLOBALS['__l10n']['Quick entry'] = ''; $GLOBALS['__l10n']['New entry'] = ''; $GLOBALS['__l10n']['Title:'] = ''; $GLOBALS['__l10n']['Content:'] = ''; $GLOBALS['__l10n']['Category:'] = ''; $GLOBALS['__l10n']['Add a new category'] = ''; $GLOBALS['__l10n']['This category will be created when you will save your post.'] = ''; $GLOBALS['__l10n']['Save and publish'] = ''; $GLOBALS['__l10n']['PHP version is %s (5.0 or earlier needed).'] = ''; $GLOBALS['__l10n']['Multibyte string module (mbstring) is not available.'] = ''; $GLOBALS['__l10n']['Iconv module is not available.'] = ''; $GLOBALS['__l10n']['Output control functions are not available.'] = ''; $GLOBALS['__l10n']['SimpleXML module is not available.'] = ''; $GLOBALS['__l10n']['DOM XML module is not available.'] = ''; $GLOBALS['__l10n']['PCRE engine does not support UTF-8 strings.'] = ''; $GLOBALS['__l10n']['SPL module is not available.'] = ''; $GLOBALS['__l10n']['MySQL version is %s (4.1 or earlier needed).'] = ''; $GLOBALS['__l10n']['MySQL InnoDB engine is not available.'] = ''; $GLOBALS['__l10n']['PostgreSQL version is %s (8.0 or earlier needed).'] = ''; $GLOBALS['__l10n']['Please set a master key (DC_MASTER_KEY) in configuration file.'] = ''; $GLOBALS['__l10n']['Dotclear is already installed.'] = ''; $GLOBALS['__l10n']['Dotclear cannot be installed.'] = ''; $GLOBALS['__l10n']['No user ID given'] = ''; $GLOBALS['__l10n']['User ID must contain at least 2 characters using letters, numbers or symbols.'] = ''; $GLOBALS['__l10n']['Invalid email address'] = ''; $GLOBALS['__l10n']['No password given'] = ''; $GLOBALS['__l10n']['Password must contain at least 6 characters.'] = ''; $GLOBALS['__l10n']['My first blog'] = ''; $GLOBALS['__l10n']['%A, %B %e %Y'] = ''; $GLOBALS['__l10n']['Welcome to Dotclear!'] = ''; $GLOBALS['__l10n']['This is your first entry. When you\'re ready to blog, log in to edit or delete it.'] = ''; $GLOBALS['__l10n']['Dotclear Team'] = ''; $GLOBALS['__l10n']['

        This is a comment.

        To delete it, log in and view your blog\'s comments. Then you might remove or edit it.

        '] = ''; $GLOBALS['__l10n']['Dotclear Install'] = ''; $GLOBALS['__l10n']['Password strength: %s'] = ''; $GLOBALS['__l10n']['very weak'] = ''; $GLOBALS['__l10n']['weak'] = ''; $GLOBALS['__l10n']['mediocre'] = ''; $GLOBALS['__l10n']['strong'] = ''; $GLOBALS['__l10n']['very strong'] = ''; $GLOBALS['__l10n']['show'] = ''; $GLOBALS['__l10n']['Dotclear installation'] = ''; $GLOBALS['__l10n']['Cache directory %s is not writable.'] = ''; $GLOBALS['__l10n']['Errors:'] = ''; $GLOBALS['__l10n']['Configuration file has been successfully created.'] = ''; $GLOBALS['__l10n']['User information'] = ''; $GLOBALS['__l10n']['Please provide the following information needed to create the first user.'] = ''; $GLOBALS['__l10n']['First Name:'] = ''; $GLOBALS['__l10n']['Last Name:'] = ''; $GLOBALS['__l10n']['Username and password'] = ''; $GLOBALS['__l10n']['All done!'] = ''; $GLOBALS['__l10n']['Dotclear has been successfully installed. Here is some useful information you should keep.'] = ''; $GLOBALS['__l10n']['Your account'] = ''; $GLOBALS['__l10n']['Your blog'] = ''; $GLOBALS['__l10n']['Blog address:'] = ''; $GLOBALS['__l10n']['Administration interface:'] = ''; $GLOBALS['__l10n']['Manage your blog now'] = ''; $GLOBALS['__l10n']['Installation can not be completed'] = ''; $GLOBALS['__l10n']['For the said reasons, Dotclear can not be installed. Please refer to the documentation to learn how to correct the problem.'] = ''; $GLOBALS['__l10n']['Path %s is not writable.'] = ''; $GLOBALS['__l10n']['Dotclear installation wizard could not create configuration file for you. You must change folder right or create the config.php file manually, please refer to the documentation to learn how to do this.'] = ''; $GLOBALS['__l10n']['File %s does not exist.'] = ''; $GLOBALS['__l10n']['Cannot write %s file.'] = ''; $GLOBALS['__l10n']['Dotclear installation wizard'] = ''; $GLOBALS['__l10n']['Welcome'] = ''; $GLOBALS['__l10n']['To complete your Dotclear installation and start writing on your blog, we just need to know how to access your database and who you are. Just fill this two steps wizard with this information and we will be done.'] = ''; $GLOBALS['__l10n']['Attention:'] = ''; $GLOBALS['__l10n']['this wizard may not function on every host. If it does not work for you, please refer to the documentation to learn how to create the config.php file manually.'] = ''; $GLOBALS['__l10n']['System information'] = ''; $GLOBALS['__l10n']['Please provide the following information needed to create your configuration file.'] = ''; $GLOBALS['__l10n']['Database type:'] = ''; $GLOBALS['__l10n']['MySQL (deprecated)'] = ''; $GLOBALS['__l10n']['MySQLi'] = ''; $GLOBALS['__l10n']['PostgreSQL'] = ''; $GLOBALS['__l10n']['Database Host Name:'] = ''; $GLOBALS['__l10n']['Database Name:'] = ''; $GLOBALS['__l10n']['Database User Name:'] = ''; $GLOBALS['__l10n']['Database Password:'] = ''; $GLOBALS['__l10n']['Database Tables Prefix:'] = ''; $GLOBALS['__l10n']['Continue'] = ''; $GLOBALS['__l10n']['No such installed language'] = ''; $GLOBALS['__l10n']['You can\'t remove English language.'] = ''; $GLOBALS['__l10n']['Permissions to delete language denied.'] = ''; $GLOBALS['__l10n']['Language has been successfully deleted.'] = ''; $GLOBALS['__l10n']['Invalid language file URL.'] = ''; $GLOBALS['__l10n']['Language has been successfully upgraded'] = ''; $GLOBALS['__l10n']['Language has been successfully installed.'] = ''; $GLOBALS['__l10n']['Unable to move uploaded file.'] = ''; $GLOBALS['__l10n']['Languages management'] = ''; $GLOBALS['__l10n']['Here you can install, upgrade or remove languages for your Dotclear installation.'] = ''; $GLOBALS['__l10n']['You can change your user language in your preferences or change your blog\'s main language in your blog settings.'] = ''; $GLOBALS['__l10n']['Installed languages'] = ''; $GLOBALS['__l10n']['No additional language is installed.'] = ''; $GLOBALS['__l10n']['Language'] = ''; $GLOBALS['__l10n']['Action'] = ''; $GLOBALS['__l10n']['Install or upgrade languages'] = ''; $GLOBALS['__l10n']['You can install or remove a language by adding or removing the relevant directory in your %s folder.'] = ''; $GLOBALS['__l10n']['Available languages'] = ''; $GLOBALS['__l10n']['You can download and install a additional language directly from Dotclear.net. Proposed languages are based on your version: %s.'] = ''; $GLOBALS['__l10n']['Language:'] = ''; $GLOBALS['__l10n']['Install language'] = ''; $GLOBALS['__l10n']['Upload a zip file'] = ''; $GLOBALS['__l10n']['You can install languages by uploading zip files.'] = ''; $GLOBALS['__l10n']['Language zip file:'] = ''; $GLOBALS['__l10n']['Upload language'] = ''; $GLOBALS['__l10n']['Invalid language zip file.'] = ''; $GLOBALS['__l10n']['The zip file does not appear to be a valid Dotclear language pack.'] = ''; $GLOBALS['__l10n']['An error occurred during language upgrade.'] = ''; $GLOBALS['__l10n']['By names, in ascending order'] = ''; $GLOBALS['__l10n']['By names, in descending order'] = ''; $GLOBALS['__l10n']['By dates, in ascending order'] = ''; $GLOBALS['__l10n']['By dates, in descending order'] = ''; $GLOBALS['__l10n']['Directory "%s" has been successfully created.'] = ''; $GLOBALS['__l10n']['Files have been successfully uploaded.'] = ''; $GLOBALS['__l10n']['Successfully delete one media.'][0] = ''; $GLOBALS['__l10n']['Successfully delete one media.'][1] = ''; $GLOBALS['__l10n']['File has been successfully removed.'] = ''; $GLOBALS['__l10n']['Directory "%s" has been successfully rebuilt.'] = ''; $GLOBALS['__l10n']['Media manager'] = ''; $GLOBALS['__l10n']['confirm removal'] = ''; $GLOBALS['__l10n']['Are you sure you want to remove %s?'] = ''; $GLOBALS['__l10n']['Cancel'] = ''; $GLOBALS['__l10n']['Yes'] = ''; $GLOBALS['__l10n']['You do not have sufficient permissions to write to this folder.'] = ''; $GLOBALS['__l10n']['Directory has been successfully created.'] = ''; $GLOBALS['__l10n']['Directory has been successfully removed.'] = ''; $GLOBALS['__l10n']['Directory has been successfully rebuilt.'] = ''; $GLOBALS['__l10n']['Zip file has been successfully extracted.'] = ''; $GLOBALS['__l10n']['Choose a file to attach to entry %s by clicking on %s.'] = ''; $GLOBALS['__l10n']['Attach this file to entry'] = ''; $GLOBALS['__l10n']['Choose a file to insert into entry by clicking on %s.'] = ''; $GLOBALS['__l10n']['Remove selected medias'] = ''; $GLOBALS['__l10n']['No file.'] = ''; $GLOBALS['__l10n']['Sort files:'] = ''; $GLOBALS['__l10n']['Number of elements displayed per page:'] = ''; $GLOBALS['__l10n']['In %s:'] = ''; $GLOBALS['__l10n']['Create new directory'] = ''; $GLOBALS['__l10n']['Directory Name:'] = ''; $GLOBALS['__l10n']['Backup content of %s'] = ''; $GLOBALS['__l10n']['Download zip file'] = ''; $GLOBALS['__l10n']['Add files'] = ''; $GLOBALS['__l10n']['Please take care to publish media that you own and that are not protected by copyright.'] = ''; $GLOBALS['__l10n']['Choose file'] = ''; $GLOBALS['__l10n']['Choose files'] = ''; $GLOBALS['__l10n']['Maximum file size allowed:'] = ''; $GLOBALS['__l10n']['Private'] = ''; $GLOBALS['__l10n']['To send several files at the same time, you can activate the enhanced uploader in'] = ''; $GLOBALS['__l10n']['My preferences'] = ''; $GLOBALS['__l10n']['Refresh'] = ''; $GLOBALS['__l10n']['Clear all'] = ''; $GLOBALS['__l10n']['Upload'] = ''; $GLOBALS['__l10n']['Current settings for medias and images are defined in %s'] = ''; $GLOBALS['__l10n']['Blog parameters'] = ''; $GLOBALS['__l10n']['open'] = ''; $GLOBALS['__l10n']['Insert this file into entry'] = ''; $GLOBALS['__l10n']['delete'] = ''; $GLOBALS['__l10n']['Not a valid file'] = ''; $GLOBALS['__l10n']['File has been successfully updated.'] = ''; $GLOBALS['__l10n']['Thumbnails have been successfully updated.'] = ''; $GLOBALS['__l10n']['Default media insertion settings have been successfully updated.'] = ''; $GLOBALS['__l10n']['Are you sure to delete this media?'] = ''; $GLOBALS['__l10n']['Insert media item'] = ''; $GLOBALS['__l10n']['Image size:'] = ''; $GLOBALS['__l10n']['Image alignment'] = ''; $GLOBALS['__l10n']['Image insertion'] = ''; $GLOBALS['__l10n']['As a single image'] = ''; $GLOBALS['__l10n']['As a link to the original image'] = ''; $GLOBALS['__l10n']['MP3 disposition'] = ''; $GLOBALS['__l10n']['Please note that you cannot insert mp3 files with visual editor.'] = ''; $GLOBALS['__l10n']['Please note that you cannot insert video files with visual editor.'] = ''; $GLOBALS['__l10n']['Video size'] = ''; $GLOBALS['__l10n']['Width:'] = ''; $GLOBALS['__l10n']['Height:'] = ''; $GLOBALS['__l10n']['Video disposition'] = ''; $GLOBALS['__l10n']['Media item will be inserted as a link.'] = ''; $GLOBALS['__l10n']['Insert'] = ''; $GLOBALS['__l10n']['Make current settings as default'] = ''; $GLOBALS['__l10n']['Media details'] = ''; $GLOBALS['__l10n']['Available sizes:'] = ''; $GLOBALS['__l10n']['File owner:'] = ''; $GLOBALS['__l10n']['File type:'] = ''; $GLOBALS['__l10n']['File size:'] = ''; $GLOBALS['__l10n']['File URL:'] = ''; $GLOBALS['__l10n']['Show entries containing this media'] = ''; $GLOBALS['__l10n']['Entries containing this media'] = ''; $GLOBALS['__l10n']['No entry seems contain this media.'] = ''; $GLOBALS['__l10n']['published'] = ''; $GLOBALS['__l10n']['unpublished'] = ''; $GLOBALS['__l10n']['scheduled'] = ''; $GLOBALS['__l10n']['pending'] = ''; $GLOBALS['__l10n']['Image details'] = ''; $GLOBALS['__l10n']['No detail'] = ''; $GLOBALS['__l10n']['Updates and modifications'] = ''; $GLOBALS['__l10n']['Update thumbnails'] = ''; $GLOBALS['__l10n']['This will create or update thumbnails for this image.'] = ''; $GLOBALS['__l10n']['Extract in a new directory'] = ''; $GLOBALS['__l10n']['Extract in current directory'] = ''; $GLOBALS['__l10n']['Extract archive'] = ''; $GLOBALS['__l10n']['This will extract archive in a new directory that should not exist yet.'] = ''; $GLOBALS['__l10n']['This will extract archive in current directory and will overwrite existing files or directory.'] = ''; $GLOBALS['__l10n']['Extract mode:'] = ''; $GLOBALS['__l10n']['Extract'] = ''; $GLOBALS['__l10n']['Change media properties'] = ''; $GLOBALS['__l10n']['File name:'] = ''; $GLOBALS['__l10n']['File title:'] = ''; $GLOBALS['__l10n']['File date:'] = ''; $GLOBALS['__l10n']['New directory:'] = ''; $GLOBALS['__l10n']['Change file'] = ''; $GLOBALS['__l10n']['Choose a file:'] = ''; $GLOBALS['__l10n']['Maximum size %s'] = ''; $GLOBALS['__l10n']['Send'] = ''; $GLOBALS['__l10n']['Delete this media'] = ''; $GLOBALS['__l10n']['No content found on this plugin.'] = ''; $GLOBALS['__l10n']['Plugin not found'] = ''; $GLOBALS['__l10n']['The plugin you reached does not exist or does not have an admin page.'] = ''; $GLOBALS['__l10n']['Plugins management'] = ''; $GLOBALS['__l10n']['Plugin configuration'] = ''; $GLOBALS['__l10n']['Update plugins'] = ''; $GLOBALS['__l10n']['There is one plugin to update available from repository.'][0] = ''; $GLOBALS['__l10n']['There is one plugin to update available from repository.'][1] = ''; $GLOBALS['__l10n']['Installed plugins'] = ''; $GLOBALS['__l10n']['Activated plugins'] = ''; $GLOBALS['__l10n']['You can configure and manage installed plugins from this list.'] = ''; $GLOBALS['__l10n']['Deactivated plugins'] = ''; $GLOBALS['__l10n']['Deactivated plugins are installed but not usable. You can activate them from here.'] = ''; $GLOBALS['__l10n']['Add plugins'] = ''; $GLOBALS['__l10n']['Add plugins from repository'] = ''; $GLOBALS['__l10n']['Add plugins from a package'] = ''; $GLOBALS['__l10n']['You can install plugins by uploading or downloading zip files.'] = ''; $GLOBALS['__l10n']['Some functions are disabled, please give write access to your plugins directory to enable them.'] = ''; $GLOBALS['__l10n']['Add a link'] = ''; $GLOBALS['__l10n']['Link URL:'] = ''; $GLOBALS['__l10n']['Link title:'] = ''; $GLOBALS['__l10n']['Link language:'] = ''; $GLOBALS['__l10n']['Add a link to an entry'] = ''; $GLOBALS['__l10n']['Entry type:'] = ''; $GLOBALS['__l10n']['Ok'] = ''; $GLOBALS['__l10n']['Search entry:'] = ''; $GLOBALS['__l10n']['Search'] = ''; $GLOBALS['__l10n']['cancel'] = ''; $GLOBALS['__l10n']['Edit entry'] = ''; $GLOBALS['__l10n']['This entry does not exist.'] = ''; $GLOBALS['__l10n']['Next entry'] = ''; $GLOBALS['__l10n']['Previous entry'] = ''; $GLOBALS['__l10n']['All pings sent.'] = ''; $GLOBALS['__l10n']['Invalid publication date'] = ''; $GLOBALS['__l10n']['The post "%s" has been successfully updated'] = ''; $GLOBALS['__l10n']['Entry has been successfully created.'] = ''; $GLOBALS['__l10n']['Published'] = ''; $GLOBALS['__l10n']['Unpublished'] = ''; $GLOBALS['__l10n']['Scheduled'] = ''; $GLOBALS['__l10n']['Pending'] = ''; $GLOBALS['__l10n']['“%s”'] = ''; $GLOBALS['__l10n']['Entries'] = ''; $GLOBALS['__l10n']['Entry has been successfully updated.'] = ''; $GLOBALS['__l10n']['File has been successfully attached.'] = ''; $GLOBALS['__l10n']['Attachment has been successfully removed.'] = ''; $GLOBALS['__l10n']['Don\'t forget to validate your XHTML conversion by saving your post.'] = ''; $GLOBALS['__l10n']['Go to this entry on the site'] = ''; $GLOBALS['__l10n']['Entry status'] = ''; $GLOBALS['__l10n']['Publication date and hour'] = ''; $GLOBALS['__l10n']['Entry language'] = ''; $GLOBALS['__l10n']['Text formatting'] = ''; $GLOBALS['__l10n']['Convert to XHTML'] = ''; $GLOBALS['__l10n']['Filing'] = ''; $GLOBALS['__l10n']['Selected entry'] = ''; $GLOBALS['__l10n']['Category'] = ''; $GLOBALS['__l10n']['Options'] = ''; $GLOBALS['__l10n']['Comments and trackbacks list'] = ''; $GLOBALS['__l10n']['Warning: Comments are not more accepted for this entry.'] = ''; $GLOBALS['__l10n']['Comments are not accepted on this blog so far.'] = ''; $GLOBALS['__l10n']['Warning: Trackbacks are not more accepted for this entry.'] = ''; $GLOBALS['__l10n']['Trackbacks are not accepted on this blog so far.'] = ''; $GLOBALS['__l10n']['Password'] = ''; $GLOBALS['__l10n']['Edit basename'] = ''; $GLOBALS['__l10n']['Warning: If you set the URL manually, it may conflict with another entry.'] = ''; $GLOBALS['__l10n']['Excerpt:'] = ''; $GLOBALS['__l10n']['Introduction to the post.'] = ''; $GLOBALS['__l10n']['Personal notes:'] = ''; $GLOBALS['__l10n']['Unpublished notes.'] = ''; $GLOBALS['__l10n']['Edit post'] = ''; $GLOBALS['__l10n']['Preview'] = ''; $GLOBALS['__l10n']['Comments'] = ''; $GLOBALS['__l10n']['Add a comment'] = ''; $GLOBALS['__l10n']['Trackbacks'] = ''; $GLOBALS['__l10n']['Trackbacks received'] = ''; $GLOBALS['__l10n']['No trackback'] = ''; $GLOBALS['__l10n']['Selected trackbacks action:'] = ''; $GLOBALS['__l10n']['Ping blogs'] = ''; $GLOBALS['__l10n']['URLs to ping:'] = ''; $GLOBALS['__l10n']['Excerpt to send:'] = ''; $GLOBALS['__l10n']['Auto discover ping URLs'] = ''; $GLOBALS['__l10n']['Previously sent pings'] = ''; $GLOBALS['__l10n']['IP address'] = ''; $GLOBALS['__l10n']['Edit'] = ''; $GLOBALS['__l10n']['Junk'] = ''; $GLOBALS['__l10n']['select this comment'] = ''; $GLOBALS['__l10n']['select this trackback'] = ''; $GLOBALS['__l10n']['Edit this comment'] = ''; $GLOBALS['__l10n']['This attachment does not exist'] = ''; $GLOBALS['__l10n']['Remove attachment'] = ''; $GLOBALS['__l10n']['Attachment'] = ''; $GLOBALS['__l10n']['Are you sure you want to remove this attachment?'] = ''; $GLOBALS['__l10n']['(No cat)'] = '(none)'; $GLOBALS['__l10n']['Selected'] = ''; $GLOBALS['__l10n']['Not selected'] = ''; $GLOBALS['__l10n']['With attachments'] = ''; $GLOBALS['__l10n']['Without attachments'] = ''; $GLOBALS['__l10n']['Number of comments'] = ''; $GLOBALS['__l10n']['Number of trackbacks'] = ''; $GLOBALS['__l10n']['Selected entries have been successfully updated.'] = ''; $GLOBALS['__l10n']['Selected entries have been successfully deleted.'] = ''; $GLOBALS['__l10n']['Selected:'] = ''; $GLOBALS['__l10n']['Attachments:'] = ''; $GLOBALS['__l10n']['Month:'] = ''; $GLOBALS['__l10n']['Lang:'] = ''; $GLOBALS['__l10n']['entries per page'] = ''; $GLOBALS['__l10n']['Selected entries action:'] = ''; $GLOBALS['__l10n']['Default'] = ''; $GLOBALS['__l10n']['If you want to change your email or password you must provide your current password.'] = ''; $GLOBALS['__l10n']['Personal information has been successfully updated.'] = ''; $GLOBALS['__l10n']['Personal options has been successfully updated.'] = ''; $GLOBALS['__l10n']['Dashboard options has been successfully updated.'] = ''; $GLOBALS['__l10n']['No favorite selected'] = ''; $GLOBALS['__l10n']['Favorites have been successfully added.'] = ''; $GLOBALS['__l10n']['Favorites have been successfully removed.'] = ''; $GLOBALS['__l10n']['Favorites have been successfully updated.'] = ''; $GLOBALS['__l10n']['Default favorites have been successfully updated.'] = ''; $GLOBALS['__l10n']['My profile'] = ''; $GLOBALS['__l10n']['Display name:'] = ''; $GLOBALS['__l10n']['Language for my interface:'] = ''; $GLOBALS['__l10n']['My timezone:'] = ''; $GLOBALS['__l10n']['Change my password'] = ''; $GLOBALS['__l10n']['Confirm new password:'] = ''; $GLOBALS['__l10n']['Your current password:'] = ''; $GLOBALS['__l10n']['If you have changed your email or password you must provide your current password to save these modifications.'] = ''; $GLOBALS['__l10n']['Update my profile'] = ''; $GLOBALS['__l10n']['My options'] = ''; $GLOBALS['__l10n']['Interface'] = ''; $GLOBALS['__l10n']['Activate enhanced uploader in media manager'] = ''; $GLOBALS['__l10n']['Disable javascript powered drag and drop for ordering items'] = ''; $GLOBALS['__l10n']['If checked, numeric fields will allow to type the elements\' ordering number.'] = ''; $GLOBALS['__l10n']['Number of elements displayed per page in media manager:'] = ''; $GLOBALS['__l10n']['Do not use standard favicon'] = ''; $GLOBALS['__l10n']['This will be applied for all users'] = ''; $GLOBALS['__l10n']['Edition'] = ''; $GLOBALS['__l10n']['Preferred format:'] = ''; $GLOBALS['__l10n']['Default entry status:'] = ''; $GLOBALS['__l10n']['Entry edit field height:'] = ''; $GLOBALS['__l10n']['Enable WYSIWYG mode'] = ''; $GLOBALS['__l10n']['Other options'] = ''; $GLOBALS['__l10n']['Save my options'] = ''; $GLOBALS['__l10n']['My dashboard'] = ''; $GLOBALS['__l10n']['My favorites'] = ''; $GLOBALS['__l10n']['position of %s'] = ''; $GLOBALS['__l10n']['Save order'] = ''; $GLOBALS['__l10n']['Delete selected favorites'] = ''; $GLOBALS['__l10n']['Are you sure you want to remove selected favorites?'] = ''; $GLOBALS['__l10n']['If you are a super administrator, you may define this set of favorites to be used by default on all blogs of this installation.'] = ''; $GLOBALS['__l10n']['Define as default favorites'] = ''; $GLOBALS['__l10n']['Currently no personal favorites.'] = ''; $GLOBALS['__l10n']['Other available favorites'] = ''; $GLOBALS['__l10n']['(default favorite)'] = ''; $GLOBALS['__l10n']['Add to my favorites'] = ''; $GLOBALS['__l10n']['Menu'] = ''; $GLOBALS['__l10n']['Display favorites at the top of the menu'] = ''; $GLOBALS['__l10n']['Dashboard icons'] = ''; $GLOBALS['__l10n']['Iconset:'] = ''; $GLOBALS['__l10n']['Dashboard modules'] = ''; $GLOBALS['__l10n']['Display documentation links'] = ''; $GLOBALS['__l10n']['Display Dotclear news'] = ''; $GLOBALS['__l10n']['Display quick entry form'] = ''; $GLOBALS['__l10n']['Save my dashboard options'] = ''; $GLOBALS['__l10n']['Search options'] = ''; $GLOBALS['__l10n']['Query:'] = ''; $GLOBALS['__l10n']['Search in entries'] = ''; $GLOBALS['__l10n']['Search in comments'] = ''; $GLOBALS['__l10n']['%d entries found'] = ''; $GLOBALS['__l10n']['%d entry found'] = ''; $GLOBALS['__l10n']['%d comment found'] = ''; $GLOBALS['__l10n']['%d comments found'] = ''; $GLOBALS['__l10n']['Dotclear update'] = ''; $GLOBALS['__l10n']['Unable to delete file %s'] = ''; $GLOBALS['__l10n']['Downloaded Dotclear archive seems to be corrupted. Try download it again.'] = ''; $GLOBALS['__l10n']['If this problem persists try to update manually.'] = ''; $GLOBALS['__l10n']['The following files of your Dotclear installation have been modified so we won\'t try to update your installation. Please try to update manually.'] = ''; $GLOBALS['__l10n']['The following files of your Dotclear installation are not readable. Please fix this or try to make a backup file named %s manually.'] = ''; $GLOBALS['__l10n']['The following files of your Dotclear installation cannot be written. Please fix this or try to update manually.'] = ''; $GLOBALS['__l10n']['Manual checking of update done successfully.'] = ''; $GLOBALS['__l10n']['No newer Dotclear version available.'] = ''; $GLOBALS['__l10n']['Force checking update Dotclear'] = ''; $GLOBALS['__l10n']['Dotclear %s is available.'] = ''; $GLOBALS['__l10n']['To upgrade your Dotclear installation simply click on the following button. A backup file of your current installation will be created in your root directory.'] = ''; $GLOBALS['__l10n']['Update Dotclear'] = ''; $GLOBALS['__l10n']['Manage backup files'] = ''; $GLOBALS['__l10n']['Update backup files'] = ''; $GLOBALS['__l10n']['The following files are backups of previously updates. You can revert your previous installation or delete theses files.'] = ''; $GLOBALS['__l10n']['Please note that reverting your Dotclear version may have some unwanted side-effects. Consider reverting only if you experience strong issues with this new version.'] = ''; $GLOBALS['__l10n']['You should not revert to version prior to last one (%s).'] = ''; $GLOBALS['__l10n']['Delete selected file'] = ''; $GLOBALS['__l10n']['Revert to selected file'] = ''; $GLOBALS['__l10n']['Congratulations, you\'re one click away from the end of the update.'] = ''; $GLOBALS['__l10n']['Finish the update.'] = ''; $GLOBALS['__l10n']['New user'] = ''; $GLOBALS['__l10n']['User has been successfully updated.'] = ''; $GLOBALS['__l10n']['User "%s" already exists.'] = ''; $GLOBALS['__l10n']['User has been successfully created.'] = ''; $GLOBALS['__l10n']['User profile'] = ''; $GLOBALS['__l10n']['User ID:'] = ''; $GLOBALS['__l10n']['Warning:'] = ''; $GLOBALS['__l10n']['If you change your username, you will have to log in again.'] = ''; $GLOBALS['__l10n']['Password change required to connect'] = ''; $GLOBALS['__l10n']['Mandatory for password recovering procedure.'] = ''; $GLOBALS['__l10n']['Timezone:'] = ''; $GLOBALS['__l10n']['Save and create another'] = ''; $GLOBALS['__l10n']['Permissions'] = ''; $GLOBALS['__l10n']['Add new permissions'] = ''; $GLOBALS['__l10n']['No permissions so far.'] = ''; $GLOBALS['__l10n']['Blog:'] = ''; $GLOBALS['__l10n']['%s is super admin (all rights on all blogs).'] = ''; $GLOBALS['__l10n']['Username'] = ''; $GLOBALS['__l10n']['Last Name'] = ''; $GLOBALS['__l10n']['First Name'] = ''; $GLOBALS['__l10n']['Display name'] = ''; $GLOBALS['__l10n']['Number of entries'] = ''; $GLOBALS['__l10n']['Set permissions'] = ''; $GLOBALS['__l10n']['User has been successfully removed.'] = ''; $GLOBALS['__l10n']['The permissions have been successfully updated.'] = ''; $GLOBALS['__l10n']['users per page'] = ''; $GLOBALS['__l10n']['Selected users action:'] = ''; $GLOBALS['__l10n']['No blog or user given.'] = ''; $GLOBALS['__l10n']['You cannot delete yourself.'] = ''; $GLOBALS['__l10n']['User has been successfully deleted.'] = ''; $GLOBALS['__l10n']['Back to user profile'] = ''; $GLOBALS['__l10n']['Choose one or more blogs to which you want to give permissions to users %s.'] = ''; $GLOBALS['__l10n']['select'] = ''; $GLOBALS['__l10n']['You are about to change permissions on the following blogs for users %s.'] = ''; $GLOBALS['__l10n']['Validate permissions'] = ''; $GLOBALS['__l10n']['Back to comments list'] = ''; $GLOBALS['__l10n']['Comments actions'] = ''; $GLOBALS['__l10n']['Publish'] = ''; $GLOBALS['__l10n']['Unpublish'] = ''; $GLOBALS['__l10n']['Mark as pending'] = ''; $GLOBALS['__l10n']['Mark as junk'] = ''; $GLOBALS['__l10n']['No comment selected'] = ''; $GLOBALS['__l10n']['Back to entries list'] = ''; $GLOBALS['__l10n']['Entries actions'] = ''; $GLOBALS['__l10n']['Schedule'] = ''; $GLOBALS['__l10n']['Mark'] = ''; $GLOBALS['__l10n']['Mark as selected'] = ''; $GLOBALS['__l10n']['Mark as unselected'] = ''; $GLOBALS['__l10n']['Change'] = ''; $GLOBALS['__l10n']['Change category'] = ''; $GLOBALS['__l10n']['Change language'] = ''; $GLOBALS['__l10n']['Change author'] = ''; $GLOBALS['__l10n']['No entry selected'] = ''; $GLOBALS['__l10n']['%d entry has been successfully updated to status : "%s"'][0] = ''; $GLOBALS['__l10n']['%d entry has been successfully updated to status : "%s"'][1] = ''; $GLOBALS['__l10n']['%d entry has been successfully marked as selected'][0] = ''; $GLOBALS['__l10n']['%d entry has been successfully marked as selected'][1] = ''; $GLOBALS['__l10n']['%d entry has been successfully marked as unselected'][0] = ''; $GLOBALS['__l10n']['%d entry has been successfully marked as unselected'][1] = ''; $GLOBALS['__l10n']['%d entry has been successfully deleted'][0] = ''; $GLOBALS['__l10n']['%d entry has been successfully deleted'][1] = ''; $GLOBALS['__l10n']['%d entry has been successfully moved to category "%s"'][0] = ''; $GLOBALS['__l10n']['%d entry has been successfully moved to category "%s"'][1] = ''; $GLOBALS['__l10n']['Change category for this selection'] = ''; $GLOBALS['__l10n']['Create a new category for the post(s)'] = ''; $GLOBALS['__l10n']['This user does not exist'] = ''; $GLOBALS['__l10n']['%d entry has been successfully set to user "%s"'][0] = ''; $GLOBALS['__l10n']['%d entry has been successfully set to user "%s"'][1] = ''; $GLOBALS['__l10n']['Change author for this selection'] = ''; $GLOBALS['__l10n']['New author (author ID):'] = ''; $GLOBALS['__l10n']['%d entry has been successfully set to language "%s"'][0] = ''; $GLOBALS['__l10n']['%d entry has been successfully set to language "%s"'][1] = ''; $GLOBALS['__l10n']['Change language for this selection'] = ''; $GLOBALS['__l10n']['Available'] = ''; $GLOBALS['__l10n']['Most used'] = ''; $GLOBALS['__l10n']['Entry language:'] = ''; $GLOBALS['__l10n']['Languages'] = ''; $GLOBALS['__l10n']['%d comment'][0] = ''; $GLOBALS['__l10n']['%d comment'][1] = ''; $GLOBALS['__l10n']['Change blog'] = ''; $GLOBALS['__l10n']['Blogs:'] = ''; $GLOBALS['__l10n']['Go to the content'] = ''; $GLOBALS['__l10n']['Go to the menu'] = ''; $GLOBALS['__l10n']['Go to search'] = ''; $GLOBALS['__l10n']['Go to help'] = ''; $GLOBALS['__l10n']['Go to site'] = ''; $GLOBALS['__l10n']['Logout %s'] = ''; $GLOBALS['__l10n']['Hide main menu'] = ''; $GLOBALS['__l10n']['Show main menu'] = ''; $GLOBALS['__l10n']['Safe mode'] = ''; $GLOBALS['__l10n']['You are in safe mode. All plugins have been temporarily disabled. Remind to log out then log in again normally to get back all functionalities'] = ''; $GLOBALS['__l10n']['Error:'] = ''; $GLOBALS['__l10n']['[%H:%M:%S]'] = ''; $GLOBALS['__l10n']['Thank you for using %s.'] = ''; $GLOBALS['__l10n']['Go to dashboard'] = ''; $GLOBALS['__l10n']['Help about this page'] = ''; $GLOBALS['__l10n']['See also %s'] = ''; $GLOBALS['__l10n']['the global help'] = ''; $GLOBALS['__l10n']['uncover'] = ''; $GLOBALS['__l10n']['hide'] = ''; $GLOBALS['__l10n']['Need help?'] = ''; $GLOBALS['__l10n']['new window'] = ''; $GLOBALS['__l10n']['Hide'] = ''; $GLOBALS['__l10n']['Select:'] = ''; $GLOBALS['__l10n']['no selection'] = ''; $GLOBALS['__l10n']['select all'] = ''; $GLOBALS['__l10n']['Invert selection'] = ''; $GLOBALS['__l10n']['view entry'] = ''; $GLOBALS['__l10n']['Are you sure you want to delete selected entries (%s)?'] = ''; $GLOBALS['__l10n']['Are you sure you want to delete selected medias (%d)?'] = ''; $GLOBALS['__l10n']['Are you sure you want to delete selected categories (%s)?'] = ''; $GLOBALS['__l10n']['Are you sure you want to delete this entry?'] = ''; $GLOBALS['__l10n']['Click here to unlock the field'] = ''; $GLOBALS['__l10n']['Are you sure you want to delete all spams?'] = ''; $GLOBALS['__l10n']['Are you sure you want to delete selected comments (%s)?'] = ''; $GLOBALS['__l10n']['Are you sure you want to delete this comment?'] = ''; $GLOBALS['__l10n']['Users with posts cannot be deleted.'] = ''; $GLOBALS['__l10n']['Are you sure you want to delete selected users (%s)?'] = ''; $GLOBALS['__l10n']['Are you sure you want to delete category "%s"?'] = ''; $GLOBALS['__l10n']['Are you sure you want to reorder all categories?'] = ''; $GLOBALS['__l10n']['Are you sure you want to remove media "%s"?'] = ''; $GLOBALS['__l10n']['Are you sure you want to extract archive in current directory?'] = ''; $GLOBALS['__l10n']['Are you sure you want to remove attachment "%s"?'] = ''; $GLOBALS['__l10n']['Are you sure you want to delete "%s" language?'] = ''; $GLOBALS['__l10n']['Are you sure you want to delete "%s" plugin?'] = ''; $GLOBALS['__l10n']['Are you sure you want to delete selected plugins?'] = ''; $GLOBALS['__l10n']['Use this theme'] = ''; $GLOBALS['__l10n']['Remove this theme'] = ''; $GLOBALS['__l10n']['Are you sure you want to delete "%s" theme?'] = ''; $GLOBALS['__l10n']['Are you sure you want to delete selected themes?'] = ''; $GLOBALS['__l10n']['Are you sure you want to delete this backup?'] = ''; $GLOBALS['__l10n']['Zip file content'] = ''; $GLOBALS['__l10n']['XHTML markup validator'] = ''; $GLOBALS['__l10n']['XHTML content is valid.'] = ''; $GLOBALS['__l10n']['There are XHTML markup errors.'] = ''; $GLOBALS['__l10n']['Attention: an audit of a content not yet registered.'] = ''; $GLOBALS['__l10n']['You have unsaved changes. Switch post format will loose these changes. Proceed anyway?'] = ''; $GLOBALS['__l10n']['Warning: post format change will not convert existing content. You will need to apply new format by yourself. Proceed anyway?'] = ''; $GLOBALS['__l10n']['Loading enhanced uploader, please wait.'] = ''; $GLOBALS['__l10n']['Details'] = ''; $GLOBALS['__l10n']['Support'] = ''; $GLOBALS['__l10n']['Help:'] = ''; $GLOBALS['__l10n']['Section:'] = ''; $GLOBALS['__l10n']['Tags:'] = ''; $GLOBALS['__l10n']['You have unsaved changes.'] = ''; $GLOBALS['__l10n']['close'] = ''; $GLOBALS['__l10n']['now'] = ''; $GLOBALS['__l10n']['visual'] = ''; $GLOBALS['__l10n']['source'] = ''; $GLOBALS['__l10n']['You can use the following shortcuts to format your text.'] = ''; $GLOBALS['__l10n']['-- none --'] = ''; $GLOBALS['__l10n']['-- block format --'] = ''; $GLOBALS['__l10n']['Paragraph'] = ''; $GLOBALS['__l10n']['Level 1 header'] = ''; $GLOBALS['__l10n']['Level 2 header'] = ''; $GLOBALS['__l10n']['Level 3 header'] = ''; $GLOBALS['__l10n']['Level 4 header'] = ''; $GLOBALS['__l10n']['Level 5 header'] = ''; $GLOBALS['__l10n']['Level 6 header'] = ''; $GLOBALS['__l10n']['Strong emphasis'] = ''; $GLOBALS['__l10n']['Emphasis'] = ''; $GLOBALS['__l10n']['Inserted'] = ''; $GLOBALS['__l10n']['Deleted'] = ''; $GLOBALS['__l10n']['Inline quote'] = ''; $GLOBALS['__l10n']['Code'] = ''; $GLOBALS['__l10n']['Line break'] = ''; $GLOBALS['__l10n']['Blockquote'] = ''; $GLOBALS['__l10n']['Preformated text'] = ''; $GLOBALS['__l10n']['Unordered list'] = ''; $GLOBALS['__l10n']['Ordered list'] = ''; $GLOBALS['__l10n']['Link'] = ''; $GLOBALS['__l10n']['URL?'] = ''; $GLOBALS['__l10n']['Language?'] = ''; $GLOBALS['__l10n']['External image'] = ''; $GLOBALS['__l10n']['Media chooser'] = ''; $GLOBALS['__l10n']['Link to an entry'] = ''; $GLOBALS['__l10n']['Temporarily activate enhanced uploader'] = ''; $GLOBALS['__l10n']['Temporarily disable enhanced uploader'] = ''; $GLOBALS['__l10n']['Limit exceeded.'] = ''; $GLOBALS['__l10n']['File size exceeds allowed limit.'] = ''; $GLOBALS['__l10n']['Canceled.'] = ''; $GLOBALS['__l10n']['HTTP Error:'] = ''; $GLOBALS['__l10n']['Clean'] = ''; $GLOBALS['__l10n']['File successfully uploaded.'] = ''; $GLOBALS['__l10n']['No file in queue.'] = ''; $GLOBALS['__l10n']['1 file in queue.'] = ''; $GLOBALS['__l10n']['%d files in queue.'] = ''; $GLOBALS['__l10n']['Queue error:'] = ''; $GLOBALS['__l10n']['other'] = ''; $GLOBALS['__l10n']['Search in repository:'] = ''; $GLOBALS['__l10n']['Reset search'] = ''; $GLOBALS['__l10n']['Search is allowed on multiple terms longer than 2 chars, terms must be separated by space.'] = ''; $GLOBALS['__l10n']['Found %d result for search "%s":'][0] = ''; $GLOBALS['__l10n']['Found %d result for search "%s":'][1] = ''; $GLOBALS['__l10n']['current selection'] = ''; $GLOBALS['__l10n']['%d result'][0] = ''; $GLOBALS['__l10n']['%d result'][1] = ''; $GLOBALS['__l10n']['no results'] = ''; $GLOBALS['__l10n']['Browse index:'] = ''; $GLOBALS['__l10n']['Plugins list'] = ''; $GLOBALS['__l10n']['Name'] = ''; $GLOBALS['__l10n']['Score'] = ''; $GLOBALS['__l10n']['Version'] = ''; $GLOBALS['__l10n']['Current version'] = ''; $GLOBALS['__l10n']['Plugin from official distribution'] = ''; $GLOBALS['__l10n']['Configure plugin'] = ''; $GLOBALS['__l10n']['No plugins matched your search.'] = ''; $GLOBALS['__l10n']['Activate'] = ''; $GLOBALS['__l10n']['Deactivate'] = ''; $GLOBALS['__l10n']['Install'] = ''; $GLOBALS['__l10n']['Update'] = ''; $GLOBALS['__l10n']['No such plugin.'] = ''; $GLOBALS['__l10n']['Plugin has been successfully activated.'][0] = ''; $GLOBALS['__l10n']['Plugin has been successfully activated.'][1] = ''; $GLOBALS['__l10n']['You don\'t have permissions to deactivate this plugin.'] = ''; $GLOBALS['__l10n']['Plugin has been successfully deactivated.'][0] = ''; $GLOBALS['__l10n']['Plugin has been successfully deactivated.'][1] = ''; $GLOBALS['__l10n']['You don\'t have permissions to delete this plugin.'] = ''; $GLOBALS['__l10n']['Some plugins have not been deleted.'] = ''; $GLOBALS['__l10n']['Plugin has been successfully deleted.'][0] = ''; $GLOBALS['__l10n']['Plugin has been successfully deleted.'][1] = ''; $GLOBALS['__l10n']['Plugin has been successfully updated.'][0] = ''; $GLOBALS['__l10n']['Plugin has been successfully updated.'][1] = ''; $GLOBALS['__l10n']['Plugin has been successfully installed.'][0] = ''; $GLOBALS['__l10n']['Plugin has been successfully installed.'][1] = ''; $GLOBALS['__l10n']['Activate selected plugins'] = ''; $GLOBALS['__l10n']['Activate all plugins from this list'] = ''; $GLOBALS['__l10n']['Plugins have been successfully activated.'] = ''; $GLOBALS['__l10n']['Deactivate selected plugins'] = ''; $GLOBALS['__l10n']['Deactivate all plugins from this list'] = ''; $GLOBALS['__l10n']['Plugins have been successfully deactivated.'] = ''; $GLOBALS['__l10n']['Some plugins have not been deactivated.'] = ''; $GLOBALS['__l10n']['Update selected plugins'] = ''; $GLOBALS['__l10n']['Update all plugins from this list'] = ''; $GLOBALS['__l10n']['Plugins have been successfully updated.'] = ''; $GLOBALS['__l10n']['Zip file path:'] = ''; $GLOBALS['__l10n']['Download a zip file'] = ''; $GLOBALS['__l10n']['Zip file URL:'] = ''; $GLOBALS['__l10n']['Download'] = ''; $GLOBALS['__l10n']['Unknow plugin ID'] = ''; $GLOBALS['__l10n']['This plugin has no configuration file.'] = ''; $GLOBALS['__l10n']['Configure "%s"'] = ''; $GLOBALS['__l10n']['Back'] = ''; $GLOBALS['__l10n']['Score: %s'] = ''; $GLOBALS['__l10n']['%s screenshot.'] = ''; $GLOBALS['__l10n']['by %s'] = ''; $GLOBALS['__l10n']['version %s'] = ''; $GLOBALS['__l10n']['(current version %s)'] = ''; $GLOBALS['__l10n']['(built on "%s")'] = ''; $GLOBALS['__l10n']['(requires "%s")'] = ''; $GLOBALS['__l10n']['View stylesheet'] = ''; $GLOBALS['__l10n']['Configure theme'] = ''; $GLOBALS['__l10n']['No themes matched your search.'] = ''; $GLOBALS['__l10n']['Use this one'] = ''; $GLOBALS['__l10n']['Update selected themes'] = ''; $GLOBALS['__l10n']['Update all themes from this list'] = ''; $GLOBALS['__l10n']['No such theme.'] = ''; $GLOBALS['__l10n']['Theme has been successfully selected.'] = ''; $GLOBALS['__l10n']['Theme has been successfully activated.'][0] = ''; $GLOBALS['__l10n']['Theme has been successfully activated.'][1] = ''; $GLOBALS['__l10n']['You don\'t have permissions to deactivate this theme.'] = ''; $GLOBALS['__l10n']['Some themes have not been deactivated.'] = ''; $GLOBALS['__l10n']['Theme has been successfully deactivated.'][0] = ''; $GLOBALS['__l10n']['Theme has been successfully deactivated.'][1] = ''; $GLOBALS['__l10n']['You don\'t have permissions to delete this theme.'] = ''; $GLOBALS['__l10n']['Some themes have not been delete.'] = ''; $GLOBALS['__l10n']['Theme has been successfully deleted.'][0] = ''; $GLOBALS['__l10n']['Theme has been successfully deleted.'][1] = ''; $GLOBALS['__l10n']['Theme has been successfully updated.'][0] = ''; $GLOBALS['__l10n']['Theme has been successfully updated.'][1] = ''; $GLOBALS['__l10n']['Update all theme from this list'] = ''; $GLOBALS['__l10n']['Theme has been successfully installed.'][0] = ''; $GLOBALS['__l10n']['Theme has been successfully installed.'][1] = ''; $GLOBALS['__l10n']['First page'] = ''; $GLOBALS['__l10n']['Previous page'] = ''; $GLOBALS['__l10n']['Next page'] = ''; $GLOBALS['__l10n']['Last page'] = ''; $GLOBALS['__l10n']['Page %s / %s'] = ''; $GLOBALS['__l10n']['Direct access page %s'] = ''; $GLOBALS['__l10n']['« prev.'] = ''; $GLOBALS['__l10n']['next »'] = ''; $GLOBALS['__l10n']['No entry matches the filter'] = ''; $GLOBALS['__l10n']['No entry'] = ''; $GLOBALS['__l10n']['List of %s entries match the filter.'] = ''; $GLOBALS['__l10n']['Entries list'] = ''; $GLOBALS['__l10n']['Protected'] = ''; $GLOBALS['__l10n']['%d attachment'] = ''; $GLOBALS['__l10n']['%d attachments'] = ''; $GLOBALS['__l10n']['No comments or trackbacks matches the filter'] = ''; $GLOBALS['__l10n']['Comment or trackback matching the filter.'][0] = ''; $GLOBALS['__l10n']['Comment or trackback matching the filter.'][1] = ''; $GLOBALS['__l10n']['Type'] = ''; $GLOBALS['__l10n']['Entry'] = ''; $GLOBALS['__l10n']['Edit the %1$s from %2$s'] = ''; $GLOBALS['__l10n']['comment'] = ''; $GLOBALS['__l10n']['trackback'] = ''; $GLOBALS['__l10n']['Type and author'] = ''; $GLOBALS['__l10n']['No user matches the filter'] = ''; $GLOBALS['__l10n']['No user'] = ''; $GLOBALS['__l10n']['List of %s users match the filter.'] = ''; $GLOBALS['__l10n']['Users list'] = ''; $GLOBALS['__l10n']['admin'] = ''; $GLOBALS['__l10n']['superadmin'] = ''; $GLOBALS['__l10n']['Database error'] = ''; $GLOBALS['__l10n']['There seems to be no Session table in your database. Is Dotclear completly installed?'] = ''; $GLOBALS['__l10n']['System settings'] = ''; $GLOBALS['__l10n']['Blog'] = ''; $GLOBALS['__l10n']['Plugins'] = ''; $GLOBALS['__l10n']['medium'] = ''; $GLOBALS['__l10n']['small'] = ''; $GLOBALS['__l10n']['thumbnail'] = ''; $GLOBALS['__l10n']['square'] = ''; $GLOBALS['__l10n']['Posts'] = ''; $GLOBALS['__l10n']['Pages'] = ''; $GLOBALS['__l10n']['administrator'] = ''; $GLOBALS['__l10n']['manage their own entries and comments'] = ''; $GLOBALS['__l10n']['publish entries and comments'] = ''; $GLOBALS['__l10n']['delete entries and comments'] = ''; $GLOBALS['__l10n']['manage all entries and comments'] = ''; $GLOBALS['__l10n']['manage categories'] = ''; $GLOBALS['__l10n']['manage their own media items'] = ''; $GLOBALS['__l10n']['manage all media items'] = ''; $GLOBALS['__l10n']['That user does not exist in the database.'] = ''; $GLOBALS['__l10n']['That key does not exist in the database.'] = ''; $GLOBALS['__l10n']['You are not allowed to add categories'] = ''; $GLOBALS['__l10n']['You are not allowed to update categories'] = ''; $GLOBALS['__l10n']['You are not allowed to delete categories'] = ''; $GLOBALS['__l10n']['This category is not empty.'] = ''; $GLOBALS['__l10n']['You are not allowed to reset categories order'] = ''; $GLOBALS['__l10n']['Empty category URL'] = ''; $GLOBALS['__l10n']['You must provide a category title'] = ''; $GLOBALS['__l10n']['You must provide a category URL'] = ''; $GLOBALS['__l10n']['You are not allowed to create an entry'] = ''; $GLOBALS['__l10n']['You are not allowed to update entries'] = ''; $GLOBALS['__l10n']['No such entry ID'] = ''; $GLOBALS['__l10n']['You are not allowed to edit this entry'] = ''; $GLOBALS['__l10n']['You are not allowed to change this entry status'] = ''; $GLOBALS['__l10n']['You are not allowed to change this entry category'] = ''; $GLOBALS['__l10n']['You are not allowed to change entries category'] = ''; $GLOBALS['__l10n']['You are not allowed to delete entries'] = ''; $GLOBALS['__l10n']['No entry title'] = ''; $GLOBALS['__l10n']['No entry content'] = ''; $GLOBALS['__l10n']['Notes'] = ''; $GLOBALS['__l10n']['Note'] = ''; $GLOBALS['__l10n']['Empty entry URL'] = ''; $GLOBALS['__l10n']['You are not allowed to update comments'] = ''; $GLOBALS['__l10n']['No such comment ID'] = ''; $GLOBALS['__l10n']['You are not allowed to update this comment'] = ''; $GLOBALS['__l10n']['You are not allowed to change this comment\'s status'] = ''; $GLOBALS['__l10n']['You are not allowed to delete comments'] = ''; $GLOBALS['__l10n']['You must provide a comment'] = ''; $GLOBALS['__l10n']['You must provide an author name'] = ''; $GLOBALS['__l10n']['Email address is not valid.'] = ''; $GLOBALS['__l10n']['online'] = ''; $GLOBALS['__l10n']['offline'] = ''; $GLOBALS['__l10n']['removed'] = ''; $GLOBALS['__l10n']['You are not an administrator'] = ''; $GLOBALS['__l10n']['Invalid user language code'] = ''; $GLOBALS['__l10n']['Blog ID must contain at least 2 characters using letters, numbers or symbols.'] = ''; $GLOBALS['__l10n']['No blog name'] = ''; $GLOBALS['__l10n']['No blog URL'] = ''; $GLOBALS['__l10n']['No log message'] = ''; $GLOBALS['__l10n']['unknown'] = ''; $GLOBALS['__l10n']['No blog defined.'] = ''; $GLOBALS['__l10n']['You are not a super administrator.'] = ''; $GLOBALS['__l10n']['Permission denied.'] = ''; $GLOBALS['__l10n']['You are not the file owner.'] = ''; $GLOBALS['__l10n']['This file is not allowed.'] = ''; $GLOBALS['__l10n']['New file already exists.'] = ''; $GLOBALS['__l10n']['File does not exist in the database.'] = ''; $GLOBALS['__l10n']['Extract destination directory %s already exists.'] = ''; $GLOBALS['__l10n']['Embedded Audio Player'] = ''; $GLOBALS['__l10n']['Embedded Video Player'] = ''; $GLOBALS['__l10n']['Module "%s" has type "%s" that mismatch required module type "%s".'] = ''; $GLOBALS['__l10n']['Module "%s" is installed twice in "%s" and "%s".'] = ''; $GLOBALS['__l10n']['Empty module zip file.'] = ''; $GLOBALS['__l10n']['The zip file does not appear to be a valid Dotclear module.'] = ''; $GLOBALS['__l10n']['An error occurred during module deletion.'] = ''; $GLOBALS['__l10n']['Unable to upgrade "%s". (older or same version)'] = ''; $GLOBALS['__l10n']['Unable to read new _define.php file'] = ''; $GLOBALS['__l10n']['Cannot remove module files'] = ''; $GLOBALS['__l10n']['Cannot deactivate plugin.'] = ''; $GLOBALS['__l10n']['Cannot activate plugin.'] = ''; $GLOBALS['__l10n']['Invalid setting dcNamespace: %s'] = ''; $GLOBALS['__l10n']['Unable to retrieve settings:'] = ''; $GLOBALS['__l10n']['%s is not a valid setting id'] = ''; $GLOBALS['__l10n']['No namespace specified'] = ''; $GLOBALS['__l10n']['Unable to retrieve workspaces:'] = ''; $GLOBALS['__l10n']['Unable to retrieve namespaces:'] = ''; $GLOBALS['__l10n']['Invalid setting namespace: %s'] = ''; $GLOBALS['__l10n']['Failed to read data feed'] = ''; $GLOBALS['__l10n']['Wrong data feed'] = ''; $GLOBALS['__l10n']['An error occurred while downloading the file.'] = ''; $GLOBALS['__l10n']['%s has still been pinged'] = ''; $GLOBALS['__l10n']['Unable to ping URL'] = ''; $GLOBALS['__l10n']['%s is not a ping URL'] = ''; $GLOBALS['__l10n']['%s, ping error:'] = ''; $GLOBALS['__l10n']['Any chance you ping one of my contents? No? Really?'] = ''; $GLOBALS['__l10n']['Sorry but you can not ping this type of content.'] = ''; $GLOBALS['__l10n']['Oops. Kinda "not found" stuff. Please check the target URL twice.'] = ''; $GLOBALS['__l10n']['Sorry, dude. This entry does not accept pingback at the moment.'] = ''; $GLOBALS['__l10n']['Don\'t repeat yourself, please.'] = ''; $GLOBALS['__l10n']['Your source URL does not look like a supported content type. Sorry. Bye, bye!'] = ''; $GLOBALS['__l10n']['Where\'s your title?'] = ''; $GLOBALS['__l10n']['Sorry, an internal problem has occured.'] = ''; $GLOBALS['__l10n']['Thanks, mate. It was a pleasure.'] = ''; $GLOBALS['__l10n']['Digests file not found.'] = ''; $GLOBALS['__l10n']['No file to download'] = ''; $GLOBALS['__l10n']['Root directory is not writable.'] = ''; $GLOBALS['__l10n']['An error occurred while downloading archive.'] = ''; $GLOBALS['__l10n']['Archive not found.'] = ''; $GLOBALS['__l10n']['Unable to read current digests file.'] = ''; $GLOBALS['__l10n']['Downloaded file does not seem to be a valid archive.'] = ''; $GLOBALS['__l10n']['Incomplete archive.'] = ''; $GLOBALS['__l10n']['Unable to read digests file.'] = ''; $GLOBALS['__l10n']['Invalid digests file.'] = ''; $GLOBALS['__l10n']['Invalid dcWorkspace: %s'] = ''; $GLOBALS['__l10n']['Unable to retrieve prefs:'] = ''; $GLOBALS['__l10n']['%s is not a valid pref id'] = ''; $GLOBALS['__l10n']['No workspace specified'] = ''; $GLOBALS['__l10n']['No valid source URL provided? Try again!'] = ''; $GLOBALS['__l10n']['No valid target URL provided? Try again!'] = ''; $GLOBALS['__l10n']['LOL!'] = ''; $GLOBALS['__l10n']['SQLite Database Schema cannot be upgraded.'] = ''; $GLOBALS['__l10n']['Something went wrong with auto upgrade:'] = ''; $GLOBALS['__l10n']['Unable to open directory.'] = ''; $GLOBALS['__l10n']['Unable to create directory.'] = ''; $GLOBALS['__l10n']['File is not writable.'] = ''; $GLOBALS['__l10n']['Unable to open file.'] = ''; $GLOBALS['__l10n']['Not an uploaded file.'] = ''; $GLOBALS['__l10n']['The uploaded file exceeds the maximum file size allowed.'] = ''; $GLOBALS['__l10n']['The uploaded file was only partially uploaded.'] = ''; $GLOBALS['__l10n']['No file was uploaded.'] = ''; $GLOBALS['__l10n']['Missing a temporary folder.'] = ''; $GLOBALS['__l10n']['Failed to write file to disk.'] = ''; $GLOBALS['__l10n']['%s is not a directory.'] = ''; $GLOBALS['__l10n']['Bad range'] = ''; $GLOBALS['__l10n']['Invalid range'] = ''; $GLOBALS['__l10n']['Invalid line number'] = ''; $GLOBALS['__l10n']['Chunk is out of range'] = ''; $GLOBALS['__l10n']['Bad context'] = ''; $GLOBALS['__l10n']['Bad context (in deletion)'] = ''; $GLOBALS['__l10n']['Invalid diff format'] = ''; $GLOBALS['__l10n']['Uploading this file is not allowed.'] = ''; $GLOBALS['__l10n']['Destination directory is not in jail.'] = ''; $GLOBALS['__l10n']['File already exists.'] = ''; $GLOBALS['__l10n']['Cannot write in this directory.'] = ''; $GLOBALS['__l10n']['An error occurred while writing the file.'] = ''; $GLOBALS['__l10n']['Source file does not exist.'] = ''; $GLOBALS['__l10n']['File is not in jail.'] = ''; $GLOBALS['__l10n']['Destination directory is not writable.'] = ''; $GLOBALS['__l10n']['Unable to rename file.'] = ''; $GLOBALS['__l10n']['File cannot be removed.'] = ''; $GLOBALS['__l10n']['Directory is not in jail.'] = ''; $GLOBALS['__l10n']['Directory cannot be removed.'] = ''; $GLOBALS['__l10n']['Not enough memory to open image.'] = ''; $GLOBALS['__l10n']['singular'][0] = ''; $GLOBALS['__l10n']['singular'][1] = ''; $GLOBALS['__l10n']['File %s is not compressed in the zip.'] = ''; $GLOBALS['__l10n']['Trying to unzip a folder name %s'] = ''; $GLOBALS['__l10n']['Unable to write destination file.'] = ''; $GLOBALS['__l10n']['Unable to write in target directory, permission denied.'] = ''; $GLOBALS['__l10n']['Not enough memory to open file.'] = ''; $GLOBALS['__l10n']['File does not exist'] = ''; $GLOBALS['__l10n']['Cannot read file'] = ''; $GLOBALS['__l10n']['Directory does not exist'] = ''; $GLOBALS['__l10n']['Cannot read directory'] = ''; $GLOBALS['__l10n']['Site temporarily unavailable'] = ''; $GLOBALS['__l10n']['

        We apologize for this temporary unavailability.
        Thank you for your understanding.

        '] = ''; $GLOBALS['__l10n']['Unable to connect to database'] = ''; $GLOBALS['__l10n']['

        This either means that the username and password information in your config.php file is incorrect or we can\'t contact the database server at "%s". This could mean your host\'s database server is down.

        • Are you sure you have the correct username and password?
        • Are you sure that you have typed the correct hostname?
        • Are you sure that the database server is running?

        If you\'re unsure what these terms mean you should probably contact your host. If you still need help you can always visit the Dotclear Support Forums.

        '] = ''; $GLOBALS['__l10n']['The following error was encountered while trying to read the database:'] = ''; dotclear-2.6.2+dfsg/locales/en/main.po000066400000000000000000001646661230033266200175650ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: Dotclear 2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-10-17 09:38+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Dotclear has been upgraded." msgstr "" msgid "Password reset" msgstr "" msgid "Someone has requested to reset the password for the following site and username." msgstr "" msgid "Username:" msgstr "" msgid "To reset your password visit the following address, otherwise just ignore this email and nothing will happen." msgstr "" #, php-format msgid "The e-mail was sent successfully to %s." msgstr "" msgid "Your new password" msgstr "" msgid "Password:" msgstr "" msgid "Your new password is in your mailbox." msgstr "" msgid "Passwords don't match" msgstr "" msgid "You didn't change your password." msgstr "" msgid "You have to change your password before you can login." msgstr "" msgid "In order to login, you have to change your password now." msgstr "" msgid "Safe Mode can only be used for super administrators." msgstr "" msgid "Insufficient permissions" msgstr "" msgid "Wrong username or password" msgstr "" msgid "Back to login screen" msgstr "" msgid "Request a new password" msgstr "" msgid "Email:" msgstr "" msgid "recover" msgstr "" msgid "Change your password" msgstr "" msgid "New password:" msgstr "" msgid "Confirm password:" msgstr "" msgid "change" msgstr "" msgid "Safe mode login" msgstr "" msgid "This mode allows you to login without activating any of your plugins. This may be useful to solve compatibility problems" msgstr "" msgid "Disable or delete any plugin suspected to cause trouble, then log out and log back in normally." msgstr "" msgid "Remember my ID on this computer" msgstr "" msgid "log in" msgstr "" msgid "You must accept cookies in order to use the private area." msgstr "" msgid "Get back to normal authentication" msgstr "" msgid "Connection issue?" msgstr "" msgid "I forgot my password" msgstr "" msgid "I want to log in in safe mode" msgstr "" #, php-format msgid "Blog \"%s\" successfully created" msgstr "" msgid "New blog" msgstr "" msgid "System" msgstr "" msgid "Blogs" msgstr "" msgid "Blog ID:" msgstr "" msgid "Required field" msgstr "" msgid "At least 2 characters using letters, numbers or symbols." msgstr "" msgid "Please note that changing your blog ID may require changes in your public index.php file." msgstr "" msgid "Blog name:" msgstr "" msgid "Blog URL:" msgstr "" msgid "Blog description:" msgstr "" msgid "Create" msgstr "" msgid "No such blog ID" msgstr "" msgid "Password verification failed" msgstr "" #, php-format msgid "Blog \"%s\" successfully deleted" msgstr "" msgid "Delete a blog" msgstr "" msgid "Warning" msgstr "" #, php-format msgid "You are about to delete the blog %s. Every entry, comment and category will be deleted." msgstr "" msgid "Please give your password to confirm the blog deletion." msgstr "" msgid "Your password:" msgstr "" msgid "Delete this blog" msgstr "" msgid "No given blog id." msgstr "" msgid "No such blog." msgstr "" msgid "year/month/day/title" msgstr "" msgid "year/month/title" msgstr "" msgid "year/title" msgstr "" msgid "title" msgstr "" msgid "post id/title" msgstr "" msgid "post id" msgstr "" msgid "H4" msgstr "" msgid "H3" msgstr "" msgid "P" msgstr "" msgid "(none)" msgstr "" msgid "Title" msgstr "" msgid "Title, Date" msgstr "" msgid "Title, Country, Date" msgstr "" msgid "Title, City, Country, Date" msgstr "" msgid "original" msgstr "" msgid "None" msgstr "" msgid "Left" msgstr "" msgid "Right" msgstr "" msgid "Center" msgstr "" msgid "I would like search engines and archivers to index and archive my blog's content." msgstr "" msgid "I would like search engines and archivers to index but not archive my blog's content." msgstr "" msgid "I would like to prevent search engines and archivers from indexing or archiving my blog's content." msgstr "" msgid "This blog ID is already used." msgstr "" msgid "Invalid language code" msgstr "" msgid "Blog has been successfully updated." msgstr "" msgid "Blog settings" msgstr "" msgid "Warning: except for special configurations, it is generally advised to have a trailing \"/\" in your blog URL in PATH_INFO mode." msgstr "" msgid "Warning: except for special configurations, it is generally advised to have a trailing \"?\" in your blog URL in QUERY_STRING mode." msgstr "" msgid "Blog has been successfully created." msgstr "" msgid "Parameters" msgstr "" msgid "Blog details" msgstr "" msgid "URL scan method:" msgstr "" #, php-format msgid "The URL of blog or the URL scan method might not be well set (%s return a %s status)." msgstr "" #, php-format msgid "The URL of blog or the URL scan method might not be well set (%s does not return an ATOM feed)." msgstr "" msgid "Blog status:" msgstr "" msgid "Blog configuration" msgstr "" msgid "Blog editor name:" msgstr "" msgid "Default language:" msgstr "" msgid "Blog timezone:" msgstr "" msgid "Copyright notice:" msgstr "" msgid "New post URL format:" msgstr "" msgid "HTML tag for the title of the notes on the blog:" msgstr "" msgid "Enable XML/RPC interface" msgstr "" msgid "XML/RPC interface allows you to edit your blog with an external client." msgstr "" msgid "XML/RPC interface is active. You should set the following parameters on your XML/RPC client:" msgstr "" msgid "Server URL:" msgstr "" msgid "Blogging system:" msgstr "" msgid "User name:" msgstr "" msgid "your password" msgstr "" msgid "Comments and trackbacks" msgstr "" msgid "Accept comments" msgstr "" msgid "Moderate comments" msgstr "" #, php-format msgid "Leave comments open for %s days" msgstr "" msgid "No limit: leave blank." msgstr "" msgid "Wiki syntax for comments" msgstr "" msgid "Accept trackbacks" msgstr "" msgid "Moderate trackbacks" msgstr "" #, php-format msgid "Leave trackbacks open for %s days" msgstr "" msgid "Add \"nofollow\" relation on comments and trackbacks links" msgstr "" msgid "Blog presentation" msgstr "" msgid "Date format:" msgstr "" msgid "Pattern of date" msgstr "" msgid "Sample:" msgstr "" msgid "Time format:" msgstr "" msgid "Pattern of time" msgstr "" msgid "Display smilies on entries and comments" msgstr "" #, php-format msgid "Display %s entries per page" msgstr "" #, php-format msgid "Display %s entries per feed" msgstr "" #, php-format msgid "Display %s comments per feed" msgstr "" msgid "Truncate feeds" msgstr "" msgid "Include sub-categories in category page and category posts feed" msgstr "" msgid "Media and images" msgstr "" msgid "Please note that if you change current settings bellow, they will now apply to all new images in the media manager." msgstr "" msgid "Be carefull if you share it with other blogs in your installation." msgstr "" msgid "Generated image sizes (in pixels)" msgstr "" msgid "Default image insertion attributes" msgstr "" msgid "Inserted image title" msgstr "" msgid "Use original media date if possible" msgstr "" msgid "It is retrieved from the picture's metadata." msgstr "" msgid "Size of inserted image:" msgstr "" msgid "Image alignment:" msgstr "" msgid "Insert a link to the original image" msgstr "" msgid "Search engines robots policy" msgstr "" msgid "Save" msgstr "" msgid "The current blog cannot be deleted." msgstr "" msgid "Only superadmin can delete a blog." msgstr "" msgid "Users" msgstr "" msgid "Users on this blog" msgstr "" msgid "No users" msgstr "" msgid "Publications on this blog:" msgstr "" #, php-format msgid "%1$s: %2$s" msgstr "" msgid "Permissions:" msgstr "" msgid "Super administrator" msgstr "" msgid "All rights on all blogs." msgstr "" #, php-format msgid "[%s] (unreferenced permission)" msgstr "" msgid "All rights on this blog." msgstr "" msgid "Change permissions" msgstr "" msgid "Blog appearance" msgstr "" msgid "Theme configuration" msgstr "" msgid "Themes management" msgstr "" msgid "Update themes" msgstr "" #, php-format msgid "There is one theme to update available from repository." msgid_plural "There are %s themes to update available from repository." msgstr[0] "" msgstr[1] "" #, php-format msgid "Visit %s repository, the resources center for Dotclear." msgstr "" msgid "Installed themes" msgstr "" msgid "You can configure and manage installed themes from this list." msgstr "" msgid "Deactivated themes" msgstr "" msgid "Deactivated themes are installed but not usable. You can activate them from here." msgstr "" msgid "Add themes" msgstr "" msgid "Add themes from repository" msgstr "" msgid "Install or upgrade manually" msgstr "" msgid "Add themes from a package" msgstr "" msgid "You can install themes by uploading or downloading zip files." msgstr "" msgid "Last update" msgstr "" msgid "Blog name" msgstr "" msgid "Blog ID" msgstr "" msgid "Descending" msgstr "" msgid "Ascending" msgstr "" msgid "Show filters and display options" msgstr "" msgid "Cancel filters and display options" msgstr "" msgid "List of blogs" msgstr "" msgid "Blog has been successfully deleted." msgstr "" msgid "Create a new blog" msgstr "" msgid "Filter blogs list" msgstr "" msgid "Filters" msgstr "" msgid "Search:" msgstr "" msgid "Display options" msgstr "" msgid "Order by:" msgstr "" msgid "Sort:" msgstr "" msgid "Show" msgstr "" msgid "blogs per page" msgstr "" msgid "Apply filters and display options" msgstr "" msgid "No blog matches the filter" msgstr "" msgid "No blog" msgstr "" #, php-format msgid "%d blog matches the filter." msgid_plural "%d blogs match the filter." msgstr[0] "" msgstr[1] "" msgid "Blogs list" msgstr "" msgid "Blog id" msgstr "" msgid "Entries (all types)" msgstr "Entries" msgid "Status" msgstr "" #, php-format msgid "Edit blog settings for %s" msgstr "" msgid "Edit blog settings" msgstr "" #, php-format msgid "Switch to blog %s" msgstr "" msgid "This category does not exist." msgstr "" #, php-format msgid "The category \"%s\" has been successfully deleted." msgstr "" msgid "Category where to move posts does not exist" msgstr "" #, php-format msgid "The entries have been successfully moved to category \"%s\"" msgstr "" msgid "Categories have been successfully reordered." msgstr "" msgid "Categories order has been successfully reset." msgstr "" msgid "Categories" msgstr "" msgid "The category has been successfully removed." msgid_plural "The categories have been successfully removed." msgstr[0] "" msgstr[1] "" msgid "Entries have been successfully moved to the category you choose." msgstr "" msgid "New category" msgstr "" msgid "No category so far." msgstr "" #, php-format msgid "%d entries" msgstr "" #, php-format msgid "%d entry" msgid_plural "%d entries" msgstr[0] "" msgstr[1] "" msgid "total:" msgstr "" msgid "URL:" msgstr "" msgid "Move entries to" msgstr "" msgid "OK" msgstr "" msgid "Delete category" msgstr "" msgid "To rearrange categories order, move items by drag and drop, then click on “Save categories order” button." msgstr "" msgid "Save categories order" msgstr "" msgid "Reorder all categories on the top level" msgstr "" msgid "Top level" msgstr "" msgid "The category has been successfully moved" msgstr "" msgid "The category has been successfully updated." msgstr "" #, php-format msgid "The category \"%s\" has been successfully created." msgstr "" msgid "Category has been successfully updated." msgstr "" msgid "Category information" msgstr "" msgid "Name:" msgstr "" msgid "Parent:" msgstr "" msgid "Warning: If you set the URL manually, it may conflict with another category." msgstr "" msgid "Description:" msgstr "" msgid "Move this category" msgstr "" msgid "Category parent" msgstr "" msgid "Category sibling" msgstr "" msgid "Move current category" msgstr "" msgid "after" msgstr "" msgid "before" msgstr "" msgid "position: " msgstr "" msgid "Entry does not exist." msgstr "" msgid "Comment has been successfully created." msgstr "" msgid "No comment" msgstr "" msgid "Comment has been successfully updated." msgstr "" msgid "Comment has been successfully deleted." msgstr "" msgid "You can't edit this comment." msgstr "" msgid "Edit comment" msgstr "" #, php-format msgid "Your comment on my blog %s" msgstr "" #, php-format msgid "" "Hi!\n" "\n" "You wrote a comment on:\n" "%s\n" "\n" "\n" msgstr "" msgid "Send an e-mail" msgstr "" msgid "Information collected" msgstr "" msgid "IP address:" msgstr "" msgid "Date:" msgstr "" msgid "Comment submitted" msgstr "" msgid "Author:" msgstr "" msgid "Web site:" msgstr "" msgid "Status:" msgstr "" msgid "Comment:" msgstr "" msgid "Delete" msgstr "" msgid "Comment" msgstr "" msgid "Trackback" msgstr "" msgid "Date" msgstr "" msgid "Entry title" msgstr "" msgid "Author" msgstr "" msgid "Selected comments have been successfully updated." msgstr "" msgid "Selected comments have been successfully deleted." msgstr "" msgid "Spam comments have been successfully deleted." msgstr "" msgid "You have one spam comment." msgstr "" msgid "Show it." msgstr "" #, php-format msgid "You have %s spam comments." msgstr "" msgid "Show them." msgstr "" msgid "Delete all spams" msgstr "" msgid "Filter comments and trackbacks list" msgstr "" msgid "Type:" msgstr "" msgid "comments per page" msgstr "" msgid "Selected comments action:" msgstr "" msgid "Actions" msgstr "" msgid "ok" msgstr "" msgid "Global help" msgstr "" #, php-format msgid "An update is available" msgid_plural "%s updates are available." msgstr[0] "" msgstr[1] "" msgid "Dotclear news" msgstr "" msgid "%d %B %Y:" msgstr "" msgid "Documentation and support" msgstr "" msgid "Dashboard" msgstr "" #, php-format msgid "Dotclear %s is available!" msgstr "" msgid "Upgrade now" msgstr "" msgid "Remind me later" msgstr "" msgid "Information about this version" msgstr "" msgid "Make this blog my default blog" msgstr "" msgid "This blog is offline" msgstr "" msgid "This blog is removed" msgstr "" #, php-format msgid "%s is not defined, you should edit your configuration file." msgstr "" msgid "See documentation for more information." msgstr "" msgid "The cache directory does not exist or is not writable. You must create this directory with sufficient rights and affect this location to \"DC_TPL_CACHE\" in inc/config.php file." msgstr "" msgid "The cache directory does not exist or is not writable. You should contact your administrator." msgstr "" msgid "There is no writable directory /public/ at the location set in about:config \"public_path\". You must create this directory with sufficient rights (or change this setting)." msgstr "" msgid "There is no writable root directory for the media manager. You should contact your administrator." msgstr "" msgid "Following plugins have been installed:" msgstr "" msgid "Following plugins have not been installed:" msgstr "" msgid "Errors have occured with following plugins:" msgstr "" msgid "Quick entry" msgstr "" msgid "New entry" msgstr "" msgid "Title:" msgstr "" msgid "Content:" msgstr "" msgid "Category:" msgstr "" msgid "Add a new category" msgstr "" msgid "This category will be created when you will save your post." msgstr "" msgid "Save and publish" msgstr "" #, php-format msgid "PHP version is %s (5.0 or earlier needed)." msgstr "" msgid "Multibyte string module (mbstring) is not available." msgstr "" msgid "Iconv module is not available." msgstr "" msgid "Output control functions are not available." msgstr "" msgid "SimpleXML module is not available." msgstr "" msgid "DOM XML module is not available." msgstr "" msgid "PCRE engine does not support UTF-8 strings." msgstr "" msgid "SPL module is not available." msgstr "" #, php-format msgid "MySQL version is %s (4.1 or earlier needed)." msgstr "" msgid "MySQL InnoDB engine is not available." msgstr "" #, php-format msgid "PostgreSQL version is %s (8.0 or earlier needed)." msgstr "" msgid "Please set a master key (DC_MASTER_KEY) in configuration file." msgstr "" msgid "Dotclear is already installed." msgstr "" msgid "Dotclear cannot be installed." msgstr "" msgid "No user ID given" msgstr "" msgid "User ID must contain at least 2 characters using letters, numbers or symbols." msgstr "" msgid "Invalid email address" msgstr "" msgid "No password given" msgstr "" msgid "Password must contain at least 6 characters." msgstr "" msgid "My first blog" msgstr "" msgid "%A, %B %e %Y" msgstr "" msgid "Welcome to Dotclear!" msgstr "" msgid "This is your first entry. When you're ready to blog, log in to edit or delete it." msgstr "" msgid "Dotclear Team" msgstr "" msgid "" "

        This is a comment.

        \n" "

        To delete it, log in and view your blog's comments. Then you might remove or edit it.

        " msgstr "" msgid "Dotclear Install" msgstr "" #, php-format msgid "Password strength: %s" msgstr "" msgid "very weak" msgstr "" msgid "weak" msgstr "" msgid "mediocre" msgstr "" msgid "strong" msgstr "" msgid "very strong" msgstr "" msgid "show" msgstr "" msgid "Dotclear installation" msgstr "" #, php-format msgid "Cache directory %s is not writable." msgstr "" msgid "Errors:" msgstr "" msgid "Configuration file has been successfully created." msgstr "" msgid "User information" msgstr "" msgid "Please provide the following information needed to create the first user." msgstr "" msgid "First Name:" msgstr "" msgid "Last Name:" msgstr "" msgid "Username and password" msgstr "" msgid "All done!" msgstr "" msgid "Dotclear has been successfully installed. Here is some useful information you should keep." msgstr "" msgid "Your account" msgstr "" msgid "Your blog" msgstr "" msgid "Blog address:" msgstr "" msgid "Administration interface:" msgstr "" msgid "Manage your blog now" msgstr "" msgid "Installation can not be completed" msgstr "" msgid "For the said reasons, Dotclear can not be installed. Please refer to the documentation to learn how to correct the problem." msgstr "" #, php-format msgid "Path %s is not writable." msgstr "" msgid "Dotclear installation wizard could not create configuration file for you. You must change folder right or create the config.php file manually, please refer to the documentation to learn how to do this." msgstr "" #, php-format msgid "File %s does not exist." msgstr "" #, php-format msgid "Cannot write %s file." msgstr "" msgid "Dotclear installation wizard" msgstr "" msgid "Welcome" msgstr "" msgid "To complete your Dotclear installation and start writing on your blog, we just need to know how to access your database and who you are. Just fill this two steps wizard with this information and we will be done." msgstr "" msgid "Attention:" msgstr "" msgid "this wizard may not function on every host. If it does not work for you, please refer to the documentation to learn how to create the config.php file manually." msgstr "" msgid "System information" msgstr "" msgid "Please provide the following information needed to create your configuration file." msgstr "" msgid "Database type:" msgstr "" msgid "MySQL (deprecated)" msgstr "" msgid "MySQLi" msgstr "" msgid "PostgreSQL" msgstr "" msgid "Database Host Name:" msgstr "" msgid "Database Name:" msgstr "" msgid "Database User Name:" msgstr "" msgid "Database Password:" msgstr "" msgid "Database Tables Prefix:" msgstr "" msgid "Continue" msgstr "" msgid "No such installed language" msgstr "" msgid "You can't remove English language." msgstr "" msgid "Permissions to delete language denied." msgstr "" msgid "Language has been successfully deleted." msgstr "" msgid "Invalid language file URL." msgstr "" msgid "Language has been successfully upgraded" msgstr "" msgid "Language has been successfully installed." msgstr "" msgid "Unable to move uploaded file." msgstr "" msgid "Languages management" msgstr "" msgid "Here you can install, upgrade or remove languages for your Dotclear installation." msgstr "" #, php-format msgid "You can change your user language in your preferences or change your blog's main language in your blog settings." msgstr "" msgid "Installed languages" msgstr "" msgid "No additional language is installed." msgstr "" msgid "Language" msgstr "" msgid "Action" msgstr "" msgid "Install or upgrade languages" msgstr "" #, php-format msgid "You can install or remove a language by adding or removing the relevant directory in your %s folder." msgstr "" msgid "Available languages" msgstr "" #, php-format msgid "You can download and install a additional language directly from Dotclear.net. Proposed languages are based on your version: %s." msgstr "" msgid "Language:" msgstr "" msgid "Install language" msgstr "" msgid "Upload a zip file" msgstr "" msgid "You can install languages by uploading zip files." msgstr "" msgid "Language zip file:" msgstr "" msgid "Upload language" msgstr "" msgid "Invalid language zip file." msgstr "" msgid "The zip file does not appear to be a valid Dotclear language pack." msgstr "" msgid "An error occurred during language upgrade." msgstr "" msgid "By names, in ascending order" msgstr "" msgid "By names, in descending order" msgstr "" msgid "By dates, in ascending order" msgstr "" msgid "By dates, in descending order" msgstr "" #, php-format msgid "Directory \"%s\" has been successfully created." msgstr "" msgid "Files have been successfully uploaded." msgstr "" #, php-format msgid "Successfully delete one media." msgid_plural "Successfully delete %d medias." msgstr[0] "" msgstr[1] "" msgid "File has been successfully removed." msgstr "" #, php-format msgid "Directory \"%s\" has been successfully rebuilt." msgstr "" msgid "Media manager" msgstr "" msgid "confirm removal" msgstr "" #, php-format msgid "Are you sure you want to remove %s?" msgstr "" msgid "Cancel" msgstr "" msgid "Yes" msgstr "" msgid "You do not have sufficient permissions to write to this folder." msgstr "" msgid "Directory has been successfully created." msgstr "" msgid "Directory has been successfully removed." msgstr "" msgid "Directory has been successfully rebuilt." msgstr "" msgid "Zip file has been successfully extracted." msgstr "" #, php-format msgid "Choose a file to attach to entry %s by clicking on %s." msgstr "" msgid "Attach this file to entry" msgstr "" #, php-format msgid "Choose a file to insert into entry by clicking on %s." msgstr "" msgid "Remove selected medias" msgstr "" msgid "No file." msgstr "" msgid "Sort files:" msgstr "" msgid "Number of elements displayed per page:" msgstr "" #, php-format msgid "In %s:" msgstr "" msgid "Create new directory" msgstr "" msgid "Directory Name:" msgstr "" #, php-format msgid "Backup content of %s" msgstr "" msgid "Download zip file" msgstr "" msgid "Add files" msgstr "" msgid "Please take care to publish media that you own and that are not protected by copyright." msgstr "" msgid "Choose file" msgstr "" msgid "Choose files" msgstr "" msgid "Maximum file size allowed:" msgstr "" msgid "Private" msgstr "" msgid "To send several files at the same time, you can activate the enhanced uploader in" msgstr "" msgid "My preferences" msgstr "" msgid "Refresh" msgstr "" msgid "Clear all" msgstr "" msgid "Upload" msgstr "" #, php-format msgid "Current settings for medias and images are defined in %s" msgstr "" msgid "Blog parameters" msgstr "" msgid "open" msgstr "" msgid "Insert this file into entry" msgstr "" msgid "delete" msgstr "" msgid "Not a valid file" msgstr "" msgid "File has been successfully updated." msgstr "" msgid "Thumbnails have been successfully updated." msgstr "" msgid "Default media insertion settings have been successfully updated." msgstr "" msgid "Are you sure to delete this media?" msgstr "" msgid "Insert media item" msgstr "" msgid "Image size:" msgstr "" msgid "Image alignment" msgstr "" msgid "Image insertion" msgstr "" msgid "As a single image" msgstr "" msgid "As a link to the original image" msgstr "" msgid "MP3 disposition" msgstr "" msgid "Please note that you cannot insert mp3 files with visual editor." msgstr "" msgid "Please note that you cannot insert video files with visual editor." msgstr "" msgid "Video size" msgstr "" msgid "Width:" msgstr "" msgid "Height:" msgstr "" msgid "Video disposition" msgstr "" msgid "Media item will be inserted as a link." msgstr "" msgid "Insert" msgstr "" msgid "Make current settings as default" msgstr "" msgid "Media details" msgstr "" msgid "Available sizes:" msgstr "" msgid "File owner:" msgstr "" msgid "File type:" msgstr "" msgid "File size:" msgstr "" msgid "File URL:" msgstr "" msgid "Show entries containing this media" msgstr "" msgid "Entries containing this media" msgstr "" msgid "No entry seems contain this media." msgstr "" msgid "published" msgstr "" msgid "unpublished" msgstr "" msgid "scheduled" msgstr "" msgid "pending" msgstr "" msgid "Image details" msgstr "" msgid "No detail" msgstr "" msgid "Updates and modifications" msgstr "" msgid "Update thumbnails" msgstr "" msgid "This will create or update thumbnails for this image." msgstr "" msgid "Extract in a new directory" msgstr "" msgid "Extract in current directory" msgstr "" msgid "Extract archive" msgstr "" msgid "This will extract archive in a new directory that should not exist yet." msgstr "" msgid "This will extract archive in current directory and will overwrite existing files or directory." msgstr "" msgid "Extract mode:" msgstr "" msgid "Extract" msgstr "" msgid "Change media properties" msgstr "" msgid "File name:" msgstr "" msgid "File title:" msgstr "" msgid "File date:" msgstr "" msgid "New directory:" msgstr "" msgid "Change file" msgstr "" msgid "Choose a file:" msgstr "" #, php-format msgid "Maximum size %s" msgstr "" msgid "Send" msgstr "" msgid "Delete this media" msgstr "" msgid "No content found on this plugin." msgstr "" msgid "Plugin not found" msgstr "" msgid "The plugin you reached does not exist or does not have an admin page." msgstr "" msgid "Plugins management" msgstr "" msgid "Plugin configuration" msgstr "" msgid "Update plugins" msgstr "" #, php-format msgid "There is one plugin to update available from repository." msgid_plural "There are %s plugins to update available from repository." msgstr[0] "" msgstr[1] "" msgid "Installed plugins" msgstr "" msgid "Activated plugins" msgstr "" msgid "You can configure and manage installed plugins from this list." msgstr "" msgid "Deactivated plugins" msgstr "" msgid "Deactivated plugins are installed but not usable. You can activate them from here." msgstr "" msgid "Add plugins" msgstr "" msgid "Add plugins from repository" msgstr "" msgid "Add plugins from a package" msgstr "" msgid "You can install plugins by uploading or downloading zip files." msgstr "" msgid "Some functions are disabled, please give write access to your plugins directory to enable them." msgstr "" msgid "Add a link" msgstr "" msgid "Link URL:" msgstr "" msgid "Link title:" msgstr "" msgid "Link language:" msgstr "" msgid "Add a link to an entry" msgstr "" msgid "Entry type:" msgstr "" msgid "Ok" msgstr "" msgid "Search entry:" msgstr "" msgid "Search" msgstr "" msgid "cancel" msgstr "" msgid "Edit entry" msgstr "" msgid "This entry does not exist." msgstr "" msgid "Next entry" msgstr "" msgid "Previous entry" msgstr "" msgid "All pings sent." msgstr "" msgid "Invalid publication date" msgstr "" #, php-format msgid "The post \"%s\" has been successfully updated" msgstr "" msgid "Entry has been successfully created." msgstr "" msgid "Published" msgstr "" msgid "Unpublished" msgstr "" msgid "Scheduled" msgstr "" msgid "Pending" msgstr "" #, php-format msgid "“%s”" msgstr "" msgid "Entries" msgstr "" msgid "Entry has been successfully updated." msgstr "" msgid "File has been successfully attached." msgstr "" msgid "Attachment has been successfully removed." msgstr "" msgid "Don't forget to validate your XHTML conversion by saving your post." msgstr "" msgid "Go to this entry on the site" msgstr "" msgid "Entry status" msgstr "" msgid "Publication date and hour" msgstr "" msgid "Entry language" msgstr "" msgid "Text formatting" msgstr "" msgid "Convert to XHTML" msgstr "" msgid "Filing" msgstr "" msgid "Selected entry" msgstr "" msgid "Category" msgstr "" msgid "Options" msgstr "" msgid "Comments and trackbacks list" msgstr "" msgid "Warning: Comments are not more accepted for this entry." msgstr "" msgid "Comments are not accepted on this blog so far." msgstr "" msgid "Warning: Trackbacks are not more accepted for this entry." msgstr "" msgid "Trackbacks are not accepted on this blog so far." msgstr "" msgid "Password" msgstr "" msgid "Edit basename" msgstr "" msgid "Warning: If you set the URL manually, it may conflict with another entry." msgstr "" msgid "Excerpt:" msgstr "" msgid "Introduction to the post." msgstr "" msgid "Personal notes:" msgstr "" msgid "Unpublished notes." msgstr "" msgid "Edit post" msgstr "" msgid "Preview" msgstr "" msgid "Comments" msgstr "" msgid "Add a comment" msgstr "" msgid "Trackbacks" msgstr "" msgid "Trackbacks received" msgstr "" msgid "No trackback" msgstr "" msgid "Selected trackbacks action:" msgstr "" msgid "Ping blogs" msgstr "" msgid "URLs to ping:" msgstr "" msgid "Excerpt to send:" msgstr "" msgid "Auto discover ping URLs" msgstr "" msgid "Previously sent pings" msgstr "" msgid "IP address" msgstr "" msgid "Edit" msgstr "" msgid "Junk" msgstr "" msgid "select this comment" msgstr "" msgid "select this trackback" msgstr "" msgid "Edit this comment" msgstr "" msgid "This attachment does not exist" msgstr "" msgid "Remove attachment" msgstr "" msgid "Attachment" msgstr "" msgid "Are you sure you want to remove this attachment?" msgstr "" msgid "(No cat)" msgstr "(none)" msgid "Selected" msgstr "" msgid "Not selected" msgstr "" msgid "With attachments" msgstr "" msgid "Without attachments" msgstr "" msgid "Number of comments" msgstr "" msgid "Number of trackbacks" msgstr "" msgid "Selected entries have been successfully updated." msgstr "" msgid "Selected entries have been successfully deleted." msgstr "" msgid "Selected:" msgstr "" msgid "Attachments:" msgstr "" msgid "Month:" msgstr "" msgid "Lang:" msgstr "" msgid "entries per page" msgstr "" msgid "Selected entries action:" msgstr "" msgid "Default" msgstr "" msgid "If you want to change your email or password you must provide your current password." msgstr "" msgid "Personal information has been successfully updated." msgstr "" msgid "Personal options has been successfully updated." msgstr "" msgid "Dashboard options has been successfully updated." msgstr "" msgid "No favorite selected" msgstr "" msgid "Favorites have been successfully added." msgstr "" msgid "Favorites have been successfully removed." msgstr "" msgid "Favorites have been successfully updated." msgstr "" msgid "Default favorites have been successfully updated." msgstr "" msgid "My profile" msgstr "" msgid "Display name:" msgstr "" msgid "Language for my interface:" msgstr "" msgid "My timezone:" msgstr "" msgid "Change my password" msgstr "" msgid "Confirm new password:" msgstr "" msgid "Your current password:" msgstr "" msgid "If you have changed your email or password you must provide your current password to save these modifications." msgstr "" msgid "Update my profile" msgstr "" msgid "My options" msgstr "" msgid "Interface" msgstr "" msgid "Activate enhanced uploader in media manager" msgstr "" msgid "Disable javascript powered drag and drop for ordering items" msgstr "" msgid "If checked, numeric fields will allow to type the elements' ordering number." msgstr "" msgid "Number of elements displayed per page in media manager:" msgstr "" msgid "Do not use standard favicon" msgstr "" msgid "This will be applied for all users" msgstr "" msgid "Edition" msgstr "" msgid "Preferred format:" msgstr "" msgid "Default entry status:" msgstr "" msgid "Entry edit field height:" msgstr "" msgid "Enable WYSIWYG mode" msgstr "" msgid "Other options" msgstr "" msgid "Save my options" msgstr "" msgid "My dashboard" msgstr "" msgid "My favorites" msgstr "" #, php-format msgid "position of %s" msgstr "" msgid "Save order" msgstr "" msgid "Delete selected favorites" msgstr "" msgid "Are you sure you want to remove selected favorites?" msgstr "" msgid "If you are a super administrator, you may define this set of favorites to be used by default on all blogs of this installation." msgstr "" msgid "Define as default favorites" msgstr "" msgid "Currently no personal favorites." msgstr "" msgid "Other available favorites" msgstr "" msgid "(default favorite)" msgstr "" msgid "Add to my favorites" msgstr "" msgid "Menu" msgstr "" msgid "Display favorites at the top of the menu" msgstr "" msgid "Dashboard icons" msgstr "" msgid "Iconset:" msgstr "" msgid "Dashboard modules" msgstr "" msgid "Display documentation links" msgstr "" msgid "Display Dotclear news" msgstr "" msgid "Display quick entry form" msgstr "" msgid "Save my dashboard options" msgstr "" msgid "Search options" msgstr "" msgid "Query:" msgstr "" msgid "Search in entries" msgstr "" msgid "Search in comments" msgstr "" #, php-format msgid "%d entries found" msgstr "" #, php-format msgid "%d entry found" msgstr "" #, php-format msgid "%d comment found" msgstr "" #, php-format msgid "%d comments found" msgstr "" msgid "Dotclear update" msgstr "" #, php-format msgid "Unable to delete file %s" msgstr "" #, php-format msgid "Downloaded Dotclear archive seems to be corrupted. Try download it again." msgstr "" msgid "If this problem persists try to update manually." msgstr "" msgid "The following files of your Dotclear installation have been modified so we won't try to update your installation. Please try to update manually." msgstr "" #, php-format msgid "The following files of your Dotclear installation are not readable. Please fix this or try to make a backup file named %s manually." msgstr "" msgid "The following files of your Dotclear installation cannot be written. Please fix this or try to update manually." msgstr "" msgid "Manual checking of update done successfully." msgstr "" msgid "No newer Dotclear version available." msgstr "" msgid "Force checking update Dotclear" msgstr "" #, php-format msgid "Dotclear %s is available." msgstr "" msgid "To upgrade your Dotclear installation simply click on the following button. A backup file of your current installation will be created in your root directory." msgstr "" msgid "Update Dotclear" msgstr "" msgid "Manage backup files" msgstr "" msgid "Update backup files" msgstr "" msgid "The following files are backups of previously updates. You can revert your previous installation or delete theses files." msgstr "" msgid "Please note that reverting your Dotclear version may have some unwanted side-effects. Consider reverting only if you experience strong issues with this new version." msgstr "" #, php-format msgid "You should not revert to version prior to last one (%s)." msgstr "" msgid "Delete selected file" msgstr "" msgid "Revert to selected file" msgstr "" msgid "Congratulations, you're one click away from the end of the update." msgstr "" msgid "Finish the update." msgstr "" msgid "New user" msgstr "" msgid "User has been successfully updated." msgstr "" #, php-format msgid "User \"%s\" already exists." msgstr "" msgid "User has been successfully created." msgstr "" msgid "User profile" msgstr "" msgid "User ID:" msgstr "" msgid "Warning:" msgstr "" msgid "If you change your username, you will have to log in again." msgstr "" msgid "Password change required to connect" msgstr "" msgid "Mandatory for password recovering procedure." msgstr "" msgid "Timezone:" msgstr "" msgid "Save and create another" msgstr "" msgid "Permissions" msgstr "" msgid "Add new permissions" msgstr "" msgid "No permissions so far." msgstr "" msgid "Blog:" msgstr "" #, php-format msgid "%s is super admin (all rights on all blogs)." msgstr "" msgid "Username" msgstr "" msgid "Last Name" msgstr "" msgid "First Name" msgstr "" msgid "Display name" msgstr "" msgid "Number of entries" msgstr "" msgid "Set permissions" msgstr "" msgid "User has been successfully removed." msgstr "" msgid "The permissions have been successfully updated." msgstr "" msgid "users per page" msgstr "" msgid "Selected users action:" msgstr "" msgid "No blog or user given." msgstr "" msgid "You cannot delete yourself." msgstr "" msgid "User has been successfully deleted." msgstr "" msgid "Back to user profile" msgstr "" #, php-format msgid "Choose one or more blogs to which you want to give permissions to users %s." msgstr "" msgid "select" msgstr "" #, php-format msgid "You are about to change permissions on the following blogs for users %s." msgstr "" msgid "Validate permissions" msgstr "" msgid "Back to comments list" msgstr "" msgid "Comments actions" msgstr "" msgid "Publish" msgstr "" msgid "Unpublish" msgstr "" msgid "Mark as pending" msgstr "" msgid "Mark as junk" msgstr "" msgid "No comment selected" msgstr "" msgid "Back to entries list" msgstr "" msgid "Entries actions" msgstr "" msgid "Schedule" msgstr "" msgid "Mark" msgstr "" msgid "Mark as selected" msgstr "" msgid "Mark as unselected" msgstr "" msgid "Change" msgstr "" msgid "Change category" msgstr "" msgid "Change language" msgstr "" msgid "Change author" msgstr "" msgid "No entry selected" msgstr "" #, php-format msgid "%d entry has been successfully updated to status : \"%s\"" msgid_plural "%d entries have been successfully updated to status : \"%s\"" msgstr[0] "" msgstr[1] "" #, php-format msgid "%d entry has been successfully marked as selected" msgid_plural "%d entries have been successfully marked as selected" msgstr[0] "" msgstr[1] "" #, php-format msgid "%d entry has been successfully marked as unselected" msgid_plural "%d entries have been successfully marked as unselected" msgstr[0] "" msgstr[1] "" #, php-format msgid "%d entry has been successfully deleted" msgid_plural "%d entries have been successfully deleted" msgstr[0] "" msgstr[1] "" #, php-format msgid "%d entry has been successfully moved to category \"%s\"" msgid_plural "%d entries have been successfully moved to category \"%s\"" msgstr[0] "" msgstr[1] "" msgid "Change category for this selection" msgstr "" msgid "Create a new category for the post(s)" msgstr "" msgid "This user does not exist" msgstr "" #, php-format msgid "%d entry has been successfully set to user \"%s\"" msgid_plural "%d entries have been successfully set to user \"%s\"" msgstr[0] "" msgstr[1] "" msgid "Change author for this selection" msgstr "" msgid "New author (author ID):" msgstr "" #, php-format msgid "%d entry has been successfully set to language \"%s\"" msgid_plural "%d entries have been successfully set to language \"%s\"" msgstr[0] "" msgstr[1] "" msgid "Change language for this selection" msgstr "" msgid "Available" msgstr "" msgid "Most used" msgstr "" msgid "Entry language:" msgstr "" msgid "Languages" msgstr "" #, php-format msgid "%d comment" msgid_plural "%d comments" msgstr[0] "" msgstr[1] "" msgid "Change blog" msgstr "" msgid "Blogs:" msgstr "" msgid "Go to the content" msgstr "" msgid "Go to the menu" msgstr "" msgid "Go to search" msgstr "" msgid "Go to help" msgstr "" msgid "Go to site" msgstr "" #, php-format msgid "Logout %s" msgstr "" msgid "Hide main menu" msgstr "" msgid "Show main menu" msgstr "" msgid "Safe mode" msgstr "" msgid "You are in safe mode. All plugins have been temporarily disabled. Remind to log out then log in again normally to get back all functionalities" msgstr "" msgid "Error:" msgstr "" msgid "[%H:%M:%S]" msgstr "" #, php-format msgid "Thank you for using %s." msgstr "" msgid "Go to dashboard" msgstr "" msgid "Help about this page" msgstr "" #, php-format msgid "See also %s" msgstr "" msgid "the global help" msgstr "" msgid "uncover" msgstr "" msgid "hide" msgstr "" msgid "Need help?" msgstr "" msgid "new window" msgstr "" msgid "Hide" msgstr "" msgid "Select:" msgstr "" msgid "no selection" msgstr "" msgid "select all" msgstr "" msgid "Invert selection" msgstr "" msgid "view entry" msgstr "" #, php-format msgid "Are you sure you want to delete selected entries (%s)?" msgstr "" #, php-format msgid "Are you sure you want to delete selected medias (%d)?" msgstr "" #, php-format msgid "Are you sure you want to delete selected categories (%s)?" msgstr "" msgid "Are you sure you want to delete this entry?" msgstr "" msgid "Click here to unlock the field" msgstr "" msgid "Are you sure you want to delete all spams?" msgstr "" #, php-format msgid "Are you sure you want to delete selected comments (%s)?" msgstr "" msgid "Are you sure you want to delete this comment?" msgstr "" msgid "Users with posts cannot be deleted." msgstr "" #, php-format msgid "Are you sure you want to delete selected users (%s)?" msgstr "" #, php-format msgid "Are you sure you want to delete category \"%s\"?" msgstr "" msgid "Are you sure you want to reorder all categories?" msgstr "" #, php-format msgid "Are you sure you want to remove media \"%s\"?" msgstr "" msgid "Are you sure you want to extract archive in current directory?" msgstr "" #, php-format msgid "Are you sure you want to remove attachment \"%s\"?" msgstr "" #, php-format msgid "Are you sure you want to delete \"%s\" language?" msgstr "" #, php-format msgid "Are you sure you want to delete \"%s\" plugin?" msgstr "" msgid "Are you sure you want to delete selected plugins?" msgstr "" msgid "Use this theme" msgstr "" msgid "Remove this theme" msgstr "" #, php-format msgid "Are you sure you want to delete \"%s\" theme?" msgstr "" msgid "Are you sure you want to delete selected themes?" msgstr "" msgid "Are you sure you want to delete this backup?" msgstr "" msgid "Zip file content" msgstr "" msgid "XHTML markup validator" msgstr "" msgid "XHTML content is valid." msgstr "" msgid "There are XHTML markup errors." msgstr "" msgid "Attention: an audit of a content not yet registered." msgstr "" msgid "You have unsaved changes. Switch post format will loose these changes. Proceed anyway?" msgstr "" msgid "Warning: post format change will not convert existing content. You will need to apply new format by yourself. Proceed anyway?" msgstr "" msgid "Loading enhanced uploader, please wait." msgstr "" msgid "Details" msgstr "" msgid "Support" msgstr "" msgid "Help:" msgstr "" msgid "Section:" msgstr "" msgid "Tags:" msgstr "" msgid "You have unsaved changes." msgstr "" msgid "close" msgstr "" msgid "now" msgstr "" msgid "visual" msgstr "" msgid "source" msgstr "" msgid "You can use the following shortcuts to format your text." msgstr "" msgid "-- none --" msgstr "" msgid "-- block format --" msgstr "" msgid "Paragraph" msgstr "" msgid "Level 1 header" msgstr "" msgid "Level 2 header" msgstr "" msgid "Level 3 header" msgstr "" msgid "Level 4 header" msgstr "" msgid "Level 5 header" msgstr "" msgid "Level 6 header" msgstr "" msgid "Strong emphasis" msgstr "" msgid "Emphasis" msgstr "" msgid "Inserted" msgstr "" msgid "Deleted" msgstr "" msgid "Inline quote" msgstr "" msgid "Code" msgstr "" msgid "Line break" msgstr "" msgid "Blockquote" msgstr "" msgid "Preformated text" msgstr "" msgid "Unordered list" msgstr "" msgid "Ordered list" msgstr "" msgid "Link" msgstr "" msgid "URL?" msgstr "" msgid "Language?" msgstr "" msgid "External image" msgstr "" msgid "Media chooser" msgstr "" msgid "Link to an entry" msgstr "" msgid "Temporarily activate enhanced uploader" msgstr "" msgid "Temporarily disable enhanced uploader" msgstr "" msgid "Limit exceeded." msgstr "" msgid "File size exceeds allowed limit." msgstr "" msgid "Canceled." msgstr "" msgid "HTTP Error:" msgstr "" msgid "Clean" msgstr "" msgid "File successfully uploaded." msgstr "" msgid "No file in queue." msgstr "" msgid "1 file in queue." msgstr "" #, php-format msgid "%d files in queue." msgstr "" msgid "Queue error:" msgstr "" msgid "other" msgstr "" msgid "Search in repository:" msgstr "" msgid "Reset search" msgstr "" msgid "Search is allowed on multiple terms longer than 2 chars, terms must be separated by space." msgstr "" #, php-format msgid "Found %d result for search \"%s\":" msgid_plural "Found %d results for search \"%s\":" msgstr[0] "" msgstr[1] "" msgid "current selection" msgstr "" #, php-format msgid "%d result" msgid_plural "%d results" msgstr[0] "" msgstr[1] "" msgid "no results" msgstr "" msgid "Browse index:" msgstr "" msgid "Plugins list" msgstr "" msgid "Name" msgstr "" msgid "Score" msgstr "" msgid "Version" msgstr "" msgid "Current version" msgstr "" msgid "Plugin from official distribution" msgstr "" msgid "Configure plugin" msgstr "" msgid "No plugins matched your search." msgstr "" msgid "Activate" msgstr "" msgid "Deactivate" msgstr "" msgid "Install" msgstr "" msgid "Update" msgstr "" msgid "No such plugin." msgstr "" msgid "Plugin has been successfully activated." msgid_plural "Plugins have been successfully activated." msgstr[0] "" msgstr[1] "" msgid "You don't have permissions to deactivate this plugin." msgstr "" msgid "Plugin has been successfully deactivated." msgid_plural "Plugins have been successfully deactivated." msgstr[0] "" msgstr[1] "" msgid "You don't have permissions to delete this plugin." msgstr "" msgid "Some plugins have not been deleted." msgstr "" msgid "Plugin has been successfully deleted." msgid_plural "Plugins have been successfully deleted." msgstr[0] "" msgstr[1] "" msgid "Plugin has been successfully updated." msgid_plural "Plugins have been successfully updated." msgstr[0] "" msgstr[1] "" msgid "Plugin has been successfully installed." msgid_plural "Plugins have been successfully installed." msgstr[0] "" msgstr[1] "" msgid "Activate selected plugins" msgstr "" msgid "Activate all plugins from this list" msgstr "" msgid "Plugins have been successfully activated." msgstr "" msgid "Deactivate selected plugins" msgstr "" msgid "Deactivate all plugins from this list" msgstr "" msgid "Plugins have been successfully deactivated." msgstr "" msgid "Some plugins have not been deactivated." msgstr "" msgid "Update selected plugins" msgstr "" msgid "Update all plugins from this list" msgstr "" msgid "Plugins have been successfully updated." msgstr "" msgid "Zip file path:" msgstr "" msgid "Download a zip file" msgstr "" msgid "Zip file URL:" msgstr "" msgid "Download" msgstr "" msgid "Unknow plugin ID" msgstr "" msgid "This plugin has no configuration file." msgstr "" #, php-format msgid "Configure \"%s\"" msgstr "" msgid "Back" msgstr "" #, php-format msgid "Score: %s" msgstr "" #, php-format msgid "%s screenshot." msgstr "" #, php-format msgid "by %s" msgstr "" #, php-format msgid "version %s" msgstr "" #, php-format msgid "(current version %s)" msgstr "" #, php-format msgid "(built on \"%s\")" msgstr "" #, php-format msgid "(requires \"%s\")" msgstr "" msgid "View stylesheet" msgstr "" msgid "Configure theme" msgstr "" msgid "No themes matched your search." msgstr "" msgid "Use this one" msgstr "" msgid "Update selected themes" msgstr "" msgid "Update all themes from this list" msgstr "" msgid "No such theme." msgstr "" msgid "Theme has been successfully selected." msgstr "" msgid "Theme has been successfully activated." msgid_plural "Themes have been successfully activated." msgstr[0] "" msgstr[1] "" msgid "You don't have permissions to deactivate this theme." msgstr "" msgid "Some themes have not been deactivated." msgstr "" msgid "Theme has been successfully deactivated." msgid_plural "Themes have been successfully deactivated." msgstr[0] "" msgstr[1] "" msgid "You don't have permissions to delete this theme." msgstr "" msgid "Some themes have not been delete." msgstr "" msgid "Theme has been successfully deleted." msgid_plural "Themes have been successfully deleted." msgstr[0] "" msgstr[1] "" msgid "Theme has been successfully updated." msgid_plural "Themes have been successfully updated." msgstr[0] "" msgstr[1] "" msgid "Update all theme from this list" msgstr "" msgid "Theme has been successfully installed." msgid_plural "Themes have been successfully installed." msgstr[0] "" msgstr[1] "" msgid "First page" msgstr "" msgid "Previous page" msgstr "" msgid "Next page" msgstr "" msgid "Last page" msgstr "" #, php-format msgid "Page %s / %s" msgstr "" #, php-format msgid "Direct access page %s" msgstr "" msgid "« prev." msgstr "" msgid "next »" msgstr "" msgid "No entry matches the filter" msgstr "" msgid "No entry" msgstr "" #, php-format msgid "List of %s entries match the filter." msgstr "" msgid "Entries list" msgstr "" msgid "Protected" msgstr "" #, php-format msgid "%d attachment" msgstr "" #, php-format msgid "%d attachments" msgstr "" msgid "No comments or trackbacks matches the filter" msgstr "" #, php-format msgid "Comment or trackback matching the filter." msgid_plural "List of %s comments or trackbacks matching the filter." msgstr[0] "" msgstr[1] "" msgid "Type" msgstr "" msgid "Entry" msgstr "" #, php-format msgid "Edit the %1$s from %2$s" msgstr "" msgid "comment" msgstr "" msgid "trackback" msgstr "" msgid "Type and author" msgstr "" msgid "No user matches the filter" msgstr "" msgid "No user" msgstr "" #, php-format msgid "List of %s users match the filter." msgstr "" msgid "Users list" msgstr "" msgid "admin" msgstr "" msgid "superadmin" msgstr "" msgid "Database error" msgstr "" msgid "There seems to be no Session table in your database. Is Dotclear completly installed?" msgstr "" msgid "System settings" msgstr "" msgid "Blog" msgstr "" msgid "Plugins" msgstr "" msgid "medium" msgstr "" msgid "small" msgstr "" msgid "thumbnail" msgstr "" msgid "square" msgstr "" msgid "Posts" msgstr "" msgid "Pages" msgstr "" msgid "administrator" msgstr "" msgid "manage their own entries and comments" msgstr "" msgid "publish entries and comments" msgstr "" msgid "delete entries and comments" msgstr "" msgid "manage all entries and comments" msgstr "" msgid "manage categories" msgstr "" msgid "manage their own media items" msgstr "" msgid "manage all media items" msgstr "" msgid "That user does not exist in the database." msgstr "" msgid "That key does not exist in the database." msgstr "" msgid "You are not allowed to add categories" msgstr "" msgid "You are not allowed to update categories" msgstr "" msgid "You are not allowed to delete categories" msgstr "" msgid "This category is not empty." msgstr "" msgid "You are not allowed to reset categories order" msgstr "" msgid "Empty category URL" msgstr "" msgid "You must provide a category title" msgstr "" msgid "You must provide a category URL" msgstr "" msgid "You are not allowed to create an entry" msgstr "" msgid "You are not allowed to update entries" msgstr "" msgid "No such entry ID" msgstr "" msgid "You are not allowed to edit this entry" msgstr "" msgid "You are not allowed to change this entry status" msgstr "" msgid "You are not allowed to change this entry category" msgstr "" msgid "You are not allowed to change entries category" msgstr "" msgid "You are not allowed to delete entries" msgstr "" msgid "No entry title" msgstr "" msgid "No entry content" msgstr "" msgid "Notes" msgstr "" msgid "Note" msgstr "" msgid "Empty entry URL" msgstr "" msgid "You are not allowed to update comments" msgstr "" msgid "No such comment ID" msgstr "" msgid "You are not allowed to update this comment" msgstr "" msgid "You are not allowed to change this comment's status" msgstr "" msgid "You are not allowed to delete comments" msgstr "" msgid "You must provide a comment" msgstr "" msgid "You must provide an author name" msgstr "" msgid "Email address is not valid." msgstr "" msgid "online" msgstr "" msgid "offline" msgstr "" msgid "removed" msgstr "" msgid "You are not an administrator" msgstr "" msgid "Invalid user language code" msgstr "" msgid "Blog ID must contain at least 2 characters using letters, numbers or symbols." msgstr "" msgid "No blog name" msgstr "" msgid "No blog URL" msgstr "" msgid "No log message" msgstr "" msgid "unknown" msgstr "" msgid "No blog defined." msgstr "" msgid "You are not a super administrator." msgstr "" msgid "Permission denied." msgstr "" msgid "You are not the file owner." msgstr "" msgid "This file is not allowed." msgstr "" msgid "New file already exists." msgstr "" msgid "File does not exist in the database." msgstr "" #, php-format msgid "Extract destination directory %s already exists." msgstr "" msgid "Embedded Audio Player" msgstr "" msgid "Embedded Video Player" msgstr "" #, php-format msgid "Module \"%s\" has type \"%s\" that mismatch required module type \"%s\"." msgstr "" #, php-format msgid "Module \"%s\" is installed twice in \"%s\" and \"%s\"." msgstr "" msgid "Empty module zip file." msgstr "" msgid "The zip file does not appear to be a valid Dotclear module." msgstr "" msgid "An error occurred during module deletion." msgstr "" #, php-format msgid "Unable to upgrade \"%s\". (older or same version)" msgstr "" msgid "Unable to read new _define.php file" msgstr "" msgid "Cannot remove module files" msgstr "" msgid "Cannot deactivate plugin." msgstr "" msgid "Cannot activate plugin." msgstr "" #, php-format msgid "Invalid setting dcNamespace: %s" msgstr "" msgid "Unable to retrieve settings:" msgstr "" #, php-format msgid "%s is not a valid setting id" msgstr "" msgid "No namespace specified" msgstr "" msgid "Unable to retrieve workspaces:" msgstr "" msgid "Unable to retrieve namespaces:" msgstr "" #, php-format msgid "Invalid setting namespace: %s" msgstr "" msgid "Failed to read data feed" msgstr "" msgid "Wrong data feed" msgstr "" msgid "An error occurred while downloading the file." msgstr "" #, php-format msgid "%s has still been pinged" msgstr "" msgid "Unable to ping URL" msgstr "" #, php-format msgid "%s is not a ping URL" msgstr "" #, php-format msgid "%s, ping error:" msgstr "" msgid "Any chance you ping one of my contents? No? Really?" msgstr "" msgid "Sorry but you can not ping this type of content." msgstr "" msgid "Oops. Kinda \"not found\" stuff. Please check the target URL twice." msgstr "" msgid "Sorry, dude. This entry does not accept pingback at the moment." msgstr "" msgid "Don't repeat yourself, please." msgstr "" msgid "Your source URL does not look like a supported content type. Sorry. Bye, bye!" msgstr "" msgid "Where's your title?" msgstr "" msgid "Sorry, an internal problem has occured." msgstr "" msgid "Thanks, mate. It was a pleasure." msgstr "" msgid "Digests file not found." msgstr "" msgid "No file to download" msgstr "" msgid "Root directory is not writable." msgstr "" msgid "An error occurred while downloading archive." msgstr "" msgid "Archive not found." msgstr "" msgid "Unable to read current digests file." msgstr "" msgid "Downloaded file does not seem to be a valid archive." msgstr "" msgid "Incomplete archive." msgstr "" msgid "Unable to read digests file." msgstr "" msgid "Invalid digests file." msgstr "" #, php-format msgid "Invalid dcWorkspace: %s" msgstr "" msgid "Unable to retrieve prefs:" msgstr "" #, php-format msgid "%s is not a valid pref id" msgstr "" msgid "No workspace specified" msgstr "" msgid "No valid source URL provided? Try again!" msgstr "" msgid "No valid target URL provided? Try again!" msgstr "" msgid "LOL!" msgstr "" msgid "SQLite Database Schema cannot be upgraded." msgstr "" msgid "Something went wrong with auto upgrade:" msgstr "" msgid "Unable to open directory." msgstr "" msgid "Unable to create directory." msgstr "" msgid "File is not writable." msgstr "" msgid "Unable to open file." msgstr "" msgid "Not an uploaded file." msgstr "" msgid "The uploaded file exceeds the maximum file size allowed." msgstr "" msgid "The uploaded file was only partially uploaded." msgstr "" msgid "No file was uploaded." msgstr "" msgid "Missing a temporary folder." msgstr "" msgid "Failed to write file to disk." msgstr "" #, php-format msgid "%s is not a directory." msgstr "" msgid "Bad range" msgstr "" msgid "Invalid range" msgstr "" msgid "Invalid line number" msgstr "" msgid "Chunk is out of range" msgstr "" msgid "Bad context" msgstr "" msgid "Bad context (in deletion)" msgstr "" msgid "Invalid diff format" msgstr "" msgid "Uploading this file is not allowed." msgstr "" msgid "Destination directory is not in jail." msgstr "" msgid "File already exists." msgstr "" msgid "Cannot write in this directory." msgstr "" msgid "An error occurred while writing the file." msgstr "" msgid "Source file does not exist." msgstr "" msgid "File is not in jail." msgstr "" msgid "Destination directory is not writable." msgstr "" msgid "Unable to rename file." msgstr "" msgid "File cannot be removed." msgstr "" msgid "Directory is not in jail." msgstr "" msgid "Directory cannot be removed." msgstr "" msgid "Not enough memory to open image." msgstr "" msgid "singular" msgid_plural "plural" msgstr[0] "" msgstr[1] "" #, php-format msgid "File %s is not compressed in the zip." msgstr "" #, php-format msgid "Trying to unzip a folder name %s" msgstr "" msgid "Unable to write destination file." msgstr "" msgid "Unable to write in target directory, permission denied." msgstr "" msgid "Not enough memory to open file." msgstr "" msgid "File does not exist" msgstr "" msgid "Cannot read file" msgstr "" msgid "Directory does not exist" msgstr "" msgid "Cannot read directory" msgstr "" msgid "Site temporarily unavailable" msgstr "" msgid "

        We apologize for this temporary unavailability.
        Thank you for your understanding.

        " msgstr "" msgid "Unable to connect to database" msgstr "" #, php-format msgid "

        This either means that the username and password information in your config.php file is incorrect or we can't contact the database server at \"%s\". This could mean your host's database server is down.

        • Are you sure you have the correct username and password?
        • Are you sure that you have typed the correct hostname?
        • Are you sure that the database server is running?

        If you're unsure what these terms mean you should probably contact your host. If you still need help you can always visit the Dotclear Support Forums.

        " msgstr "" msgid "The following error was encountered while trying to read the database:" msgstr "" dotclear-2.6.2+dfsg/locales/en/plugins.lang.php000066400000000000000000001070761230033266200214030ustar00rootroot00000000000000DC1 redirect plugin and activate it in your blog configuration.'] = ''; $GLOBALS['__l10n']['next step'] = ''; $GLOBALS['__l10n']['Depending on the size of your blog, it could take a few minutes.'] = ''; $GLOBALS['__l10n']['Dotclear tables not found'] = ''; $GLOBALS['__l10n']['RSS or Atom feed import'] = ''; $GLOBALS['__l10n']['Add a feed content to the blog.'] = ''; $GLOBALS['__l10n']['Cannot retrieve feed URL.'] = ''; $GLOBALS['__l10n']['No items in feed.'] = ''; $GLOBALS['__l10n']['Content successfully imported.'] = ''; $GLOBALS['__l10n']['Add a feed content to the current blog: %s.'] = ''; $GLOBALS['__l10n']['Feed URL:'] = ''; $GLOBALS['__l10n']['Flat file import'] = ''; $GLOBALS['__l10n']['Imports a blog or a full Dotclear installation from flat file.'] = ''; $GLOBALS['__l10n']['Single blog successfully imported.'] = ''; $GLOBALS['__l10n']['Are you sure you want to import a full backup file?'] = ''; $GLOBALS['__l10n']['This will import a single blog backup as new content in the current blog: %s.'] = ''; $GLOBALS['__l10n']['Upload a backup file'] = ''; $GLOBALS['__l10n']['maximum size %s'] = ''; $GLOBALS['__l10n']['or pick up a local file in your public directory'] = ''; $GLOBALS['__l10n']['This will reset all the content of your database, except users.'] = ''; $GLOBALS['__l10n']['Another file with same name exists.'] = ''; $GLOBALS['__l10n']['Failed to extract backup file.'] = ''; $GLOBALS['__l10n']['No backup in compressed file.'] = ''; $GLOBALS['__l10n']['WordPress import'] = ''; $GLOBALS['__l10n']['Import a WordPress installation into your current blog.'] = ''; $GLOBALS['__l10n']['This will import your WordPress content as new content in the current blog: %s.'] = ''; $GLOBALS['__l10n']['We first need some information about your old WordPress installation.'] = ''; $GLOBALS['__l10n']['WordPress and Dotclear\'s handling of categories are quite different. You can assign several categories to a single post in WordPress. In the Dotclear world, we see it more like "One category, several tags." Therefore Dotclear can only import one category per post and will chose the lowest numbered one. If you want to keep a trace of every category, you can import them as tags, with an optional prefix.'] = ''; $GLOBALS['__l10n']['On the other hand, in WordPress, a post can not be uncategorized, and a default installation has a first category labelised "Uncategorized".If you did not change that category, you can just ignore it while importing your blog, as Dotclear allows you to actually keep your posts uncategorized.'] = ''; $GLOBALS['__l10n']['Ignore the first category:'] = ''; $GLOBALS['__l10n']['Import lowest numbered category on posts:'] = ''; $GLOBALS['__l10n']['Import all categories as tags:'] = ''; $GLOBALS['__l10n']['Prefix such tags with:'] = ''; $GLOBALS['__l10n']['Content filters'] = ''; $GLOBALS['__l10n']['You may want to process your post and/or comment content with the following filters.'] = ''; $GLOBALS['__l10n']['Post content formatter:'] = ''; $GLOBALS['__l10n']['Comment content formatter:'] = ''; $GLOBALS['__l10n']['WordPress tables not found'] = ''; $GLOBALS['__l10n']['No file to read.'] = ''; $GLOBALS['__l10n']['File is not a DotClear backup.'] = ''; $GLOBALS['__l10n']['File is not a single blog export.'] = ''; $GLOBALS['__l10n']['File is not a full export.'] = ''; $GLOBALS['__l10n']['ID of "%3$s" does not match on record "%1$s" at line %2$s of backup file.'] = ''; $GLOBALS['__l10n']['Database export'] = ''; $GLOBALS['__l10n']['Download database of current blog'] = ''; $GLOBALS['__l10n']['Download database of all blogs'] = ''; $GLOBALS['__l10n']['Please wait...'] = ''; $GLOBALS['__l10n']['Export functions are in the page %s.'] = ''; $GLOBALS['__l10n']['Maintenance'] = ''; $GLOBALS['__l10n']['Servicing'] = ''; $GLOBALS['__l10n']['Tools to maintain the performance of your blogs.'] = ''; $GLOBALS['__l10n']['Backup'] = ''; $GLOBALS['__l10n']['Tools to back up your content.'] = ''; $GLOBALS['__l10n']['Development'] = ''; $GLOBALS['__l10n']['Tools to assist in development of plugins, themes and core.'] = ''; $GLOBALS['__l10n']['Optimize'] = ''; $GLOBALS['__l10n']['Count and index'] = ''; $GLOBALS['__l10n']['Purge'] = ''; $GLOBALS['__l10n']['Other'] = ''; $GLOBALS['__l10n']['Current blog'] = ''; $GLOBALS['__l10n']['All blogs'] = ''; $GLOBALS['__l10n']['Maintain translations'] = ''; $GLOBALS['__l10n']['Translations'] = ''; $GLOBALS['__l10n']['One task to execute'][0] = ''; $GLOBALS['__l10n']['One task to execute'][1] = ''; $GLOBALS['__l10n']['This task has never been executed.'] = ''; $GLOBALS['__l10n']['Last execution of this task was on %s.'] = ''; $GLOBALS['__l10n']['There is a task to execute.'][0] = ''; $GLOBALS['__l10n']['There is a task to execute.'][1] = ''; $GLOBALS['__l10n']['Manage tasks'] = ''; $GLOBALS['__l10n']['Display overdue tasks counter on maintenance dashboard icon'] = ''; $GLOBALS['__l10n']['Display overdue tasks list on dashboard items'] = ''; $GLOBALS['__l10n']['Failed to execute task.'] = ''; $GLOBALS['__l10n']['Task successfully executed.'] = ''; $GLOBALS['__l10n']['Empty templates cache directory'] = ''; $GLOBALS['__l10n']['Templates cache directory emptied.'] = ''; $GLOBALS['__l10n']['Failed to empty templates cache directory.'] = ''; $GLOBALS['__l10n']['It may be useful to empty this cache when modifying a theme\'s .html or .css files (or when updating a theme or plugin). Notice : with some hosters, the templates cache cannot be emptied with this plugin. You may then have to delete the directory /cbtpl/ directly on the server with your FTP software.'] = ''; $GLOBALS['__l10n']['Count again comments and trackbacks'] = ''; $GLOBALS['__l10n']['Comments and trackback counted.'] = ''; $GLOBALS['__l10n']['Failed to count comments and trackbacks.'] = ''; $GLOBALS['__l10n']['Count again comments and trackbacks allows to check their exact numbers. This operation can be useful when importing from another blog platform (or when migrating from dotclear 1 to dotclear 2).'] = ''; $GLOBALS['__l10n']['Search engine index'] = ''; $GLOBALS['__l10n']['Index all comments for search engine'] = ''; $GLOBALS['__l10n']['Next'] = ''; $GLOBALS['__l10n']['Indexing comment %d to %d.'] = ''; $GLOBALS['__l10n']['Comments index done.'] = ''; $GLOBALS['__l10n']['Failed to index comments.'] = ''; $GLOBALS['__l10n']['Index all comments and trackbacks in search engine index. This operation is necessary, after importing content in your blog, to use internal search engine, on public and private pages.'] = ''; $GLOBALS['__l10n']['Index all entries for search engine'] = ''; $GLOBALS['__l10n']['Indexing entry %d to %d.'] = ''; $GLOBALS['__l10n']['Entries index done.'] = ''; $GLOBALS['__l10n']['Failed to index entries.'] = ''; $GLOBALS['__l10n']['Index all entries in search engine index. This operation is necessary, after importing content in your blog, to use internal search engine, on public and private pages.'] = ''; $GLOBALS['__l10n']['Delete all logs'] = ''; $GLOBALS['__l10n']['Logs deleted.'] = ''; $GLOBALS['__l10n']['Failed to delete logs.'] = ''; $GLOBALS['__l10n']['Logs record all activity and connection to your blog history. Unless you need to keep this history, consider deleting these logs from time to time.'] = ''; $GLOBALS['__l10n']['Entries metadata'] = ''; $GLOBALS['__l10n']['Synchronize entries metadata'] = ''; $GLOBALS['__l10n']['Synchronize entry %d to %d.'] = ''; $GLOBALS['__l10n']['Entries metadata synchronize done.'] = ''; $GLOBALS['__l10n']['Failed to synchronize entries metadata.'] = ''; $GLOBALS['__l10n']['Synchronize all entries metadata could be useful after importing content in your blog or do bad operation on database tables.'] = ''; $GLOBALS['__l10n']['Optimise database'] = ''; $GLOBALS['__l10n']['optimize tables'] = ''; $GLOBALS['__l10n']['Optimization successful.'] = ''; $GLOBALS['__l10n']['Failed to optimize tables.'] = ''; $GLOBALS['__l10n']['After numerous delete or update operations on Dotclear\'s database, it gets fragmented. Optimizing will allow to defragment it. It has no incidence on your data\'s integrity. It is recommended to optimize before any blog export.'] = ''; $GLOBALS['__l10n']['Download media folder of current blog'] = ''; $GLOBALS['__l10n']['It may be useful to backup your media folder. This compress all content of media folder into a single zip file. Notice : with some hosters, the media folder cannot be compressed with this plugin if it is too big.'] = ''; $GLOBALS['__l10n']['Download active theme of current blog'] = ''; $GLOBALS['__l10n']['It may be useful to backup the active theme before any change or update. This compress theme folder into a single zip file.'] = ''; $GLOBALS['__l10n']['Maintenance plugin has been successfully configured.'] = ''; $GLOBALS['__l10n']['Never'] = ''; $GLOBALS['__l10n']['Every week'] = ''; $GLOBALS['__l10n']['Every two weeks'] = ''; $GLOBALS['__l10n']['Every month'] = ''; $GLOBALS['__l10n']['Every two months'] = ''; $GLOBALS['__l10n']['You have not sufficient permissions to view this page.'] = ''; $GLOBALS['__l10n']['You should execute it now.'] = ''; $GLOBALS['__l10n']['Execute task'] = ''; $GLOBALS['__l10n']['This may take a very long time.'] = ''; $GLOBALS['__l10n']['Alert settings'] = ''; $GLOBALS['__l10n']['Activation'] = ''; $GLOBALS['__l10n']['Display alert messages on late tasks'] = ''; $GLOBALS['__l10n']['You can place list of late tasks on your %s.'] = ''; $GLOBALS['__l10n']['Frequency'] = ''; $GLOBALS['__l10n']['Use one recall time for all tasks'] = ''; $GLOBALS['__l10n']['Recall time for all tasks:'] = ''; $GLOBALS['__l10n']['Use one recall time per task'] = ''; $GLOBALS['__l10n']['New page'] = ''; $GLOBALS['__l10n']['%d page'] = ''; $GLOBALS['__l10n']['%d pages'] = ''; $GLOBALS['__l10n']['manage pages'] = ''; $GLOBALS['__l10n']['My first page'] = ''; $GLOBALS['__l10n']['This is your first page. When you\'re ready to blog, log in to edit or delete it.'] = ''; $GLOBALS['__l10n']['Published on'] = ''; $GLOBALS['__l10n']['This page\'s comments feed'] = ''; $GLOBALS['__l10n']['You must provide a valid email address.'] = ''; $GLOBALS['__l10n']['Page title'] = ''; $GLOBALS['__l10n']['Page position'] = ''; $GLOBALS['__l10n']['Publication date'] = ''; $GLOBALS['__l10n']['Pages actions'] = ''; $GLOBALS['__l10n']['Back to pages list'] = ''; $GLOBALS['__l10n']['Selected pages have been successfully reordered.'] = ''; $GLOBALS['__l10n']['No page'] = ''; $GLOBALS['__l10n']['Hidden'] = ''; $GLOBALS['__l10n']['Select this page'] = ''; $GLOBALS['__l10n']['Are you sure you want to delete selected pages?'] = ''; $GLOBALS['__l10n']['Selected pages have been successfully updated.'] = ''; $GLOBALS['__l10n']['Selected pages have been successfully deleted.'] = ''; $GLOBALS['__l10n']['Selected pages action:'] = ''; $GLOBALS['__l10n']['To rearrange pages order, change number at the begining of the line, then click on “Save pages order” button.'] = ''; $GLOBALS['__l10n']['To rearrange pages order, move items by drag and drop, then click on “Save pages order” button.'] = ''; $GLOBALS['__l10n']['Save pages order'] = ''; $GLOBALS['__l10n']['This page does not exist.'] = ''; $GLOBALS['__l10n']['Edit page'] = ''; $GLOBALS['__l10n']['Are you sure you want to delete this page?'] = ''; $GLOBALS['__l10n']['Page has been successfully updated.'] = ''; $GLOBALS['__l10n']['Page has been successfully created.'] = ''; $GLOBALS['__l10n']['Go to this page on the site'] = ''; $GLOBALS['__l10n']['Page status'] = ''; $GLOBALS['__l10n']['Page language'] = ''; $GLOBALS['__l10n']['Hide in widget Pages'] = ''; $GLOBALS['__l10n']['Warning: If you set the URL manually, it may conflict with another page.'] = ''; $GLOBALS['__l10n']['Introduction to the page.'] = ''; $GLOBALS['__l10n']['Select this comment'] = ''; $GLOBALS['__l10n']['Pings'] = ''; $GLOBALS['__l10n']['Settings have been successfully updated.'] = ''; $GLOBALS['__l10n']['Pings configuration'] = ''; $GLOBALS['__l10n']['Activate pings extension'] = ''; $GLOBALS['__l10n']['Service name:'] = ''; $GLOBALS['__l10n']['Service URI:'] = ''; $GLOBALS['__l10n']['Error'] = ''; $GLOBALS['__l10n']['Test ping services'] = ''; $GLOBALS['__l10n']['Check all'] = ''; $GLOBALS['__l10n']['Simple menu'] = ''; $GLOBALS['__l10n']['All months'] = ''; $GLOBALS['__l10n']['All tags'] = ''; $GLOBALS['__l10n']['Home'] = ''; $GLOBALS['__l10n']['Archive'] = ''; $GLOBALS['__l10n']['Page'] = ''; $GLOBALS['__l10n']['Tags'] = ''; $GLOBALS['__l10n']['User defined'] = ''; $GLOBALS['__l10n']['Label'] = ''; $GLOBALS['__l10n']['Recent posts'] = ''; $GLOBALS['__l10n']['Switch to %s language'] = ''; $GLOBALS['__l10n']['Recent Posts from this category'] = ''; $GLOBALS['__l10n']['Archives'] = ''; $GLOBALS['__l10n']['Posts from %s'] = ''; $GLOBALS['__l10n']['Recent posts for %s tag'] = ''; $GLOBALS['__l10n']['Menu item has been successfully added.'] = ''; $GLOBALS['__l10n']['Label and URL of menu item are mandatory.'] = ''; $GLOBALS['__l10n']['Menu items have been successfully removed.'] = ''; $GLOBALS['__l10n']['No menu items selected.'] = ''; $GLOBALS['__l10n']['Label is mandatory.'] = ''; $GLOBALS['__l10n']['URL is mandatory.'] = ''; $GLOBALS['__l10n']['Menu items have been successfully updated.'] = ''; $GLOBALS['__l10n']['Step #1'] = ''; $GLOBALS['__l10n']['Step #2'] = ''; $GLOBALS['__l10n']['Step #3'] = ''; $GLOBALS['__l10n']['Add item'] = ''; $GLOBALS['__l10n']['Select type'] = ''; $GLOBALS['__l10n']['Type of item menu:'] = ''; $GLOBALS['__l10n']['Continue...'] = 'Continue…'; $GLOBALS['__l10n']['Select language:'] = ''; $GLOBALS['__l10n']['Select category:'] = ''; $GLOBALS['__l10n']['Select month (if necessary):'] = ''; $GLOBALS['__l10n']['Select page:'] = ''; $GLOBALS['__l10n']['Select tag (if necessary):'] = ''; $GLOBALS['__l10n']['Label of item menu:'] = ''; $GLOBALS['__l10n']['Description of item menu:'] = ''; $GLOBALS['__l10n']['URL of item menu:'] = ''; $GLOBALS['__l10n']['Add this item'] = ''; $GLOBALS['__l10n']['Add an item'] = ''; $GLOBALS['__l10n']['Menu items list'] = ''; $GLOBALS['__l10n']['Update menu'] = ''; $GLOBALS['__l10n']['Delete selected menu items'] = ''; $GLOBALS['__l10n']['Are you sure you want to remove selected menu items?'] = ''; $GLOBALS['__l10n']['No menu items so far.'] = ''; $GLOBALS['__l10n']['Add tags'] = ''; $GLOBALS['__l10n']['Remove tags'] = ''; $GLOBALS['__l10n']['Tag has been successfully added to selected entries'][0] = ''; $GLOBALS['__l10n']['Tag has been successfully added to selected entries'][1] = ''; $GLOBALS['__l10n']['Add tags to this selection'] = ''; $GLOBALS['__l10n']['Are you sure you want to remove this %s?'] = ''; $GLOBALS['__l10n']['Add a %s to this entry'] = ''; $GLOBALS['__l10n']['Choose from list'] = ''; $GLOBALS['__l10n']['all'] = ''; $GLOBALS['__l10n']['Enter tags separated by coma'] = ''; $GLOBALS['__l10n']['used in %e - frequency %p%'] = ''; $GLOBALS['__l10n']['entry'] = ''; $GLOBALS['__l10n']['entries'] = ''; $GLOBALS['__l10n']['Tags to add:'] = ''; $GLOBALS['__l10n']['Tag has been successfully removed from selected entries'][0] = ''; $GLOBALS['__l10n']['Tag has been successfully removed from selected entries'][1] = ''; $GLOBALS['__l10n']['No tags for selected entries'] = ''; $GLOBALS['__l10n']['Remove selected tags from this selection'] = ''; $GLOBALS['__l10n']['Following tags have been found in selected entries:'] = ''; $GLOBALS['__l10n']['Tag'] = ''; $GLOBALS['__l10n']['Short'] = ''; $GLOBALS['__l10n']['Extended'] = ''; $GLOBALS['__l10n']['Tags list format:'] = ''; $GLOBALS['__l10n']['This tag\'s comments Atom feed'] = ''; $GLOBALS['__l10n']['This tag\'s entries Atom feed'] = ''; $GLOBALS['__l10n']['Limit (empty means no limit):'] = ''; $GLOBALS['__l10n']['Entries count'] = ''; $GLOBALS['__l10n']['Tag name'] = ''; $GLOBALS['__l10n']['Link to all tags:'] = ''; $GLOBALS['__l10n']['Tag has been successfully renamed'] = ''; $GLOBALS['__l10n']['Tag has been successfully removed'] = ''; $GLOBALS['__l10n']['Are you sure you want to remove tag: “%s”?'] = ''; $GLOBALS['__l10n']['Back to tags list'] = ''; $GLOBALS['__l10n']['Rename'] = ''; $GLOBALS['__l10n']['Delete this tag'] = ''; $GLOBALS['__l10n']['List of entries with the tag “%s”'] = ''; $GLOBALS['__l10n']['No tags on this blog.'] = ''; $GLOBALS['__l10n']['Edit theme files'] = ''; $GLOBALS['__l10n']['Syntax highlighting in theme editor'] = ''; $GLOBALS['__l10n']['No file'] = ''; $GLOBALS['__l10n']['File does not exist.'] = ''; $GLOBALS['__l10n']['File %s is not readable'] = ''; $GLOBALS['__l10n']['Unable to write file %s. Please check your theme files and folders permissions.'] = ''; $GLOBALS['__l10n']['Saving document...'] = ''; $GLOBALS['__l10n']['Document saved'] = ''; $GLOBALS['__l10n']['An error occurred:'] = ''; $GLOBALS['__l10n']['Your current theme on this blog is "%s".'] = ''; $GLOBALS['__l10n']['You can\'t edit default theme.'] = ''; $GLOBALS['__l10n']['Please select a file to edit.'] = ''; $GLOBALS['__l10n']['File editor'] = ''; $GLOBALS['__l10n']['Editing file %s'] = ''; $GLOBALS['__l10n']['This file is not writable. Please check your theme files permissions.'] = ''; $GLOBALS['__l10n']['Templates files'] = ''; $GLOBALS['__l10n']['CSS files'] = ''; $GLOBALS['__l10n']['JavaScript files'] = ''; $GLOBALS['__l10n']['Locales files'] = ''; $GLOBALS['__l10n']['Preferences successfully updated'] = ''; $GLOBALS['__l10n']['user:preferences'] = ''; $GLOBALS['__l10n']['User preferences'] = ''; $GLOBALS['__l10n']['Global preferences'] = ''; $GLOBALS['__l10n']['Presentation widgets'] = ''; $GLOBALS['__l10n']['Search engine'] = ''; $GLOBALS['__l10n']['Navigation links'] = ''; $GLOBALS['__l10n']['Selected entries'] = ''; $GLOBALS['__l10n']['Best of me'] = ''; $GLOBALS['__l10n']['Blog languages'] = ''; $GLOBALS['__l10n']['With entries counts'] = ''; $GLOBALS['__l10n']['Include sub cats in count'] = ''; $GLOBALS['__l10n']['Include empty categories'] = ''; $GLOBALS['__l10n']['Subscribe links'] = ''; $GLOBALS['__l10n']['Subscribe'] = ''; $GLOBALS['__l10n']['Feeds type:'] = ''; $GLOBALS['__l10n']['Feed reader'] = ''; $GLOBALS['__l10n']['Somewhere else'] = ''; $GLOBALS['__l10n']['Entries limit:'] = ''; $GLOBALS['__l10n']['Text'] = ''; $GLOBALS['__l10n']['Text:'] = ''; $GLOBALS['__l10n']['Last entries'] = ''; $GLOBALS['__l10n']['Uncategorized'] = ''; $GLOBALS['__l10n']['Tag:'] = ''; $GLOBALS['__l10n']['Last comments'] = ''; $GLOBALS['__l10n']['Comments limit:'] = ''; $GLOBALS['__l10n']['This blog\'s entries %s feed'] = ''; $GLOBALS['__l10n']['This blog\'s comments %s feed'] = ''; $GLOBALS['__l10n']['Entries feed'] = ''; $GLOBALS['__l10n']['Comments feed'] = ''; $GLOBALS['__l10n']['navigation'] = ''; $GLOBALS['__l10n']['extra'] = ''; $GLOBALS['__l10n']['custom'] = ''; $GLOBALS['__l10n']['empty string'] = ''; $GLOBALS['__l10n']['Widgets'] = ''; $GLOBALS['__l10n']['Are you sure you want to reset sidebars?'] = ''; $GLOBALS['__l10n']['Available widgets'] = ''; $GLOBALS['__l10n']['Drag widgets from this list to one of the sidebars, for add.'] = ''; $GLOBALS['__l10n']['order'] = ''; $GLOBALS['__l10n']['Append to:'] = ''; $GLOBALS['__l10n']['Add widgets to sidebars'] = ''; $GLOBALS['__l10n']['Navigation sidebar'] = ''; $GLOBALS['__l10n']['Extra sidebar'] = ''; $GLOBALS['__l10n']['Custom sidebar'] = ''; $GLOBALS['__l10n']['Update sidebars'] = ''; $GLOBALS['__l10n']['Reset sidebars'] = ''; $GLOBALS['__l10n']['Widget ID:'] = ''; $GLOBALS['__l10n']['No setting for this widget'] = ''; $GLOBALS['__l10n']['boolean'] = ''; $GLOBALS['__l10n']['possible values:'] = ''; $GLOBALS['__l10n']['listitem'] = ''; $GLOBALS['__l10n']['string'] = ''; $GLOBALS['__l10n']['Setting name:'] = ''; $GLOBALS['__l10n']['No widget as far.'] = ''; $GLOBALS['__l10n']['Up the widget'] = ''; $GLOBALS['__l10n']['Down the widget'] = ''; $GLOBALS['__l10n']['Remove widget'] = ''; $GLOBALS['__l10n']['Drag widgets here to remove.'] = ''; dotclear-2.6.2+dfsg/locales/en/plugins.po000066400000000000000000000754361230033266200203160ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: Dotclear 2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-10-17 09:38+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Manage every blog configuration directive" msgstr "" msgid "Akismet interface for Dotclear" msgstr "" msgid "Generic antispam plugin for Dotclear" msgstr "" msgid "Manage post attachments" msgstr "" msgid "Manage your blogroll" msgstr "" msgid "Configure your Blowup Theme" msgstr "" msgid "Legacy modules for dotclear" msgstr "" msgid "Trackback validity check" msgstr "" msgid "Import and Export your blog" msgstr "" msgid "Maintain your installation" msgstr "" msgid "Serve entries as simple web pages" msgstr "" msgid "Ping services" msgstr "" msgid "Simple menu for Dotclear" msgstr "" msgid "Tags for posts" msgstr "" msgid "Theme Editor" msgstr "" msgid "Manage every user preference directive" msgstr "" msgid "Widgets for your blog sidebars" msgstr "" msgid "Search engine form" msgstr "" msgid "List of navigation links" msgstr "" msgid "List of selected entries" msgstr "" msgid "List of available languages" msgstr "" msgid "List of categories" msgstr "" msgid "Feed subscription links (RSS or Atom)" msgstr "" msgid "List of last entries from feed (RSS or Atom)" msgstr "" msgid "Simple text" msgstr "" msgid "List of last entries published" msgstr "" msgid "List of last comments published" msgstr "" msgid "Tags cloud" msgstr "" msgid "List of published pages" msgstr "" msgid "Blogroll list" msgstr "" msgid "List of simple menu items" msgstr "" msgid "Configuration successfully updated" msgstr "" msgid "no" msgstr "" msgid "yes" msgstr "" msgid "about:config" msgstr "" #, php-format msgid "Settings for %s" msgstr "" msgid "Value" msgstr "" msgid "Description" msgstr "" msgid "Goto:" msgstr "" msgid "Global settings" msgstr "" msgid "Akismet spam filter" msgstr "" #, php-format msgid "Filtered by %s." msgstr "" msgid "Filter configuration have been successfully saved." msgstr "" msgid "Akismet API key:" msgstr "" msgid "API key verified" msgstr "" msgid "API key not verified" msgstr "" msgid "Get your own API key" msgstr "" msgid "Antispam" msgstr "" #, php-format msgid "All spam comments older than %s day(s) will be automatically deleted." msgstr "" #, php-format msgid "You can modify this duration in the %s" msgstr "" msgid "Delete junk comments older than" msgstr "" msgid "days" msgstr "" msgid "Set spam filters." msgstr "" msgid "IP Blacklist / Whitelist Filter" msgstr "" #, php-format msgid "Filtered by %1$s with rule %2$s." msgstr "" msgid "IP address has been successfully added." msgstr "" msgid "IP addresses have been successfully removed." msgstr "" msgid "Blacklist" msgstr "" msgid "Whitelist" msgstr "" msgid "Add an IP address: " msgstr "" msgid "Global IP (used for all blogs)" msgstr "" msgid "Add" msgstr "" msgid "No IP address in list." msgstr "" msgid "IP list" msgstr "" msgid "Local IPs (used only for this blog)" msgstr "" msgid "Global IPs (used for all blogs)" msgstr "" msgid "Checks sender IP address against DNSBL servers" msgstr "" #, php-format msgid "Filtered by %1$s with server %2$s." msgstr "" msgid "The list of DNSBL servers has been succesfully updated." msgstr "" msgid "IP Lookup servers" msgstr "" msgid "Add here a coma separated list of servers." msgstr "" msgid "Checks links in comments against surbl.org" msgstr "" msgid "Words Blacklist" msgstr "" #, php-format msgid "Filtered by %1$s with word %2$s." msgstr "" msgid "Words have been successfully added." msgstr "" msgid "Word has been successfully added." msgstr "" msgid "Words have been successfully removed." msgstr "" msgid "Add a word " msgstr "" msgid "Global word (used for all blogs)" msgstr "" msgid "No word in list." msgstr "" msgid "List of bad words" msgstr "" msgid "Local words (used only for this blog)" msgstr "" msgid "Global words (used for all blogs)" msgstr "" msgid "Delete selected words" msgstr "" msgid "Create default wordlist" msgstr "" msgid "This word exists" msgstr "" msgid "No description" msgstr "" #, php-format msgid "Filtered by %1$s (%2$s)" msgstr "" msgid "Unknown filter." msgstr "" msgid "This comment is a spam:" msgstr "" #, php-format msgid "(including %d spam comment)" msgstr "" #, php-format msgid "(including %d spam comments)" msgstr "" msgid "Spam moderation" msgstr "" msgid "Spam" msgstr "" msgid "Ham" msgstr "" msgid "Filter does not exist." msgstr "" msgid "Filter has no user interface." msgstr "" msgid "Filters configuration has been successfully saved." msgstr "" #, php-format msgid "%s configuration" msgstr "" #, php-format msgid "%s filter configuration" msgstr "" msgid "Back to filters list" msgstr "" msgid "Information" msgstr "" msgid "Junk comments:" msgstr "" msgid "Published comments:" msgstr "" msgid "Available spam filters" msgstr "" msgid "Order" msgstr "" msgid "Active" msgstr "" msgid "Auto Del." msgstr "" msgid "Filter name" msgstr "" msgid "Filter configuration" msgstr "" msgid "position" msgstr "" msgid "Syndication" msgstr "" msgid "Junk comments RSS feed" msgstr "" msgid "Published comments RSS feed" msgstr "" msgid "Attachments" msgstr "" #, php-format msgid "Attachments (%d)" msgstr "" msgid "remove" msgstr "" msgid "No attachment." msgstr "" msgid "Add files to this entry" msgstr "" msgid "Blogroll" msgstr "" msgid "manage blogroll" msgstr "" msgid "Links" msgstr "" msgid "Title (optional)" msgstr "" msgid "All categories" msgstr "" msgid "Display on:" msgstr "" msgid "All pages" msgstr "" msgid "Home page only" msgstr "" msgid "Except on home page" msgstr "" msgid "Content only" msgstr "" msgid "CSS class:" msgstr "" msgid "You must provide a link title" msgstr "" msgid "You must provide a link URL" msgstr "" msgid "You need to provide a XBEL or OPML file." msgstr "" msgid "File is not in XML format." msgstr "" msgid "No such link or title" msgstr "" msgid "Link has been successfully updated" msgstr "" msgid "Category has been successfully updated" msgstr "" msgid "Return to blogroll" msgstr "" msgid "Edit category" msgstr "" msgid "Edit link" msgstr "" msgid "XFN information" msgstr "" msgid "_xfn_Me" msgstr "Me" msgid "_xfn_Another link for myself" msgstr "Another link for myself" msgid "_xfn_Friendship" msgstr "Friendship" msgid "_xfn_Contact" msgstr "Contact" msgid "_xfn_Acquaintance" msgstr "Acquaintance" msgid "_xfn_Friend" msgstr "Friend" msgid "_xfn_Physical" msgstr "Physical" msgid "_xfn_Met" msgstr "Met" msgid "_xfn_Professional" msgstr "Professional" msgid "_xfn_Co-worker" msgstr "Co-worker" msgid "_xfn_Colleague" msgstr "Colleague" msgid "_xfn_Geographical" msgstr "Geographical" msgid "_xfn_Co-resident" msgstr "Co-resident" msgid "_xfn_Neighbor" msgstr "Neighbor" msgid "_xfn_Family" msgstr "Family" msgid "_xfn_Child" msgstr "Child" msgid "_xfn_Parent" msgstr "Parent" msgid "_xfn_Sibling" msgstr "Sibling" msgid "_xfn_Spouse" msgstr "Spouse" msgid "_xfn_Kin" msgstr "Kin" msgid "_xfn_Romantic" msgstr "Romantic" msgid "_xfn_Muse" msgstr "Muse" msgid "_xfn_Crush" msgstr "Crush" msgid "_xfn_Date" msgstr "Date" msgid "_xfn_Sweetheart" msgstr "Sweetheart" msgid "Nothing to import" msgstr "" msgid "links have been successfully imported." msgstr "" msgid "Import operation cancelled." msgstr "" msgid "Link has been successfully created." msgstr "" msgid "category has been successfully created." msgstr "" msgid "Items have been successfully removed." msgstr "" msgid "Items order has been successfully updated" msgstr "" msgid "URL" msgstr "" msgid "Lang" msgstr "" msgid "select this link" msgstr "" msgid "Delete selected links" msgstr "" msgid "Are you sure you want to delete selected links?" msgstr "" msgid "The link list is empty." msgstr "" msgid "Add a new link" msgstr "" msgid "Add a category" msgstr "" msgid "Import links" msgstr "" msgid "OPML or XBEL File:" msgstr "" msgid "Import" msgstr "" msgid "Light linear gradient" msgstr "" msgid "Medium linear gradient" msgstr "" msgid "Dark linear gradient" msgstr "" msgid "Solid color" msgstr "" msgid "Custom..." msgstr "" msgid "Theme configuration has been successfully updated." msgstr "" msgid "Blowup configuration" msgstr "" msgid "Predefined styles" msgstr "" msgid "Apply code" msgstr "" msgid "Choose a predefined style" msgstr "" msgid "Back to Blog appearance" msgstr "" msgid "For the following reasons, images cannot be created. You won't be able to change some background properties." msgstr "" msgid "Customization" msgstr "" msgid "General" msgstr "" msgid "Background color:" msgstr "" msgid "Background color fill:" msgstr "" msgid "Main text font:" msgstr "" msgid "Main text font size:" msgstr "" msgid "Main text color:" msgstr "" msgid "Text line height:" msgstr "" msgid "Links color:" msgstr "" msgid "Visited links color:" msgstr "" msgid "Focus links color:" msgstr "" msgid "Page top" msgstr "" msgid "Prelude color:" msgstr "" msgid "Hide main title" msgstr "" msgid "Main title font:" msgstr "" msgid "Main title font size:" msgstr "" msgid "Main title color:" msgstr "" msgid "Main title alignment:" msgstr "" msgid "center" msgstr "" msgid "left" msgstr "" msgid "right" msgstr "" msgid "Main title position (x:y)" msgstr "" msgid "Top image" msgstr "" msgid "Choose \"Custom...\" to upload your own image." msgstr "" msgid "Add your image:" msgstr "" #, php-format msgid "JPEG or PNG file, 800 pixels wide, maximum size %s" msgstr "" msgid "Sidebar" msgstr "" msgid "Sidebar position:" msgstr "" msgid "Sidebar text font:" msgstr "" msgid "Sidebar text font size:" msgstr "" msgid "Sidebar text color:" msgstr "" msgid "Sidebar titles font:" msgstr "" msgid "Sidebar titles font size:" msgstr "" msgid "Sidebar titles color:" msgstr "" msgid "Sidebar 2nd level titles font:" msgstr "" msgid "Sidebar 2nd level titles font size:" msgstr "" msgid "Sidebar 2nd level titles color:" msgstr "" msgid "Sidebar lines color:" msgstr "" msgid "Sidebar links color:" msgstr "" msgid "Sidebar visited links color:" msgstr "" msgid "Sidebar focus links color:" msgstr "" msgid "Date title font:" msgstr "" msgid "Date title font size:" msgstr "" msgid "Date title color:" msgstr "" msgid "Entry title font:" msgstr "" msgid "Entry title font size:" msgstr "" msgid "Entry title color:" msgstr "" msgid "Comment background color:" msgstr "" msgid "Comment text color:" msgstr "" msgid "My comment background color:" msgstr "" msgid "My comment text color:" msgstr "" msgid "Footer" msgstr "" msgid "Footer font:" msgstr "" msgid "Footer font size:" msgstr "" msgid "Footer color:" msgstr "" msgid "Footer links color:" msgstr "" msgid "Footer background color:" msgstr "" msgid "Additional CSS" msgstr "" msgid "Any additional CSS styles (must be written using the CSS syntax):" msgstr "" msgid "Configuration import / export" msgstr "" msgid "You can share your configuration using the following code. To apply a configuration, paste the code, click on \"Apply code\" and save." msgstr "" msgid "Copy this code:" msgstr "" msgid "default" msgstr "" msgid "The 'public' directory does not exist." msgstr "" #, php-format msgid "The '%s' directory cannot be modified." msgstr "" msgid "Unable to create css file." msgstr "" msgid "At least one of the following functions is not available: imagecreatetruecolor, imagepng & imagecreatefrompng." msgstr "" msgid "Unable to create images." msgstr "" msgid "Invalid file type." msgstr "" msgid "Uploaded image is not 800 pixels wide." msgstr "" msgid "Unable to open image." msgstr "" msgid "Checks trackback source for a link to the post" msgstr "" msgid "Import/Export" msgstr "" msgid "Flat file export" msgstr "" msgid "Exports a blog or a full Dotclear installation to flat file." msgstr "" msgid "Export file not found." msgstr "" msgid "Failed to compress export file." msgstr "" msgid "Single blog" msgstr "" #, php-format msgid "This will create an export of your current blog: %s" msgstr "" msgid "Compress file" msgstr "" msgid "You may also want to download your media directory as a zip file" msgstr "" msgid "Export" msgstr "" msgid "Multiple blogs" msgstr "" msgid "This will create an export of all the content of your database." msgstr "" msgid "Congratulation!" msgstr "" msgid "Your blog has been successfully imported. Welcome on Dotclear 2!" msgstr "" msgid "Why don't you blog this now?" msgstr "" msgid "or" msgstr "" msgid "visit your dashboard" msgstr "" msgid "Dotclear 1.2 import" msgstr "" msgid "Import a Dotclear 1.2 installation into your current blog." msgstr "" #, php-format msgid "Import the content of a Dotclear 1.2's blog in the current blog: %s." msgstr "" msgid "Please note that this process will empty your categories, blogroll, entries and comments on the current blog." msgstr "" msgid "General information" msgstr "" msgid "Import my blog now" msgstr "" msgid "We first need some information about your old Dotclear 1.2 installation." msgstr "" msgid "Entries import options" msgstr "" msgid "Number of entries to import at once:" msgstr "" msgid "Importing users" msgstr "" msgid "Importing categories" msgstr "" msgid "Importing blogroll" msgstr "" #, php-format msgid "Importing entries from %d to %d / %d" msgstr "" msgid "Please read carefully" msgstr "" msgid "Every newly imported user has received a random password and will need to ask for a new one by following the \"I forgot my password\" link on the login page (Their registered email address has to be valid.)" msgstr "" #, php-format msgid "Please note that Dotclear 2 has a new URL layout. You can avoid broken links by installing DC1 redirect plugin and activate it in your blog configuration." msgstr "" msgid "next step" msgstr "" msgid "Depending on the size of your blog, it could take a few minutes." msgstr "" msgid "Dotclear tables not found" msgstr "" msgid "RSS or Atom feed import" msgstr "" msgid "Add a feed content to the blog." msgstr "" msgid "Cannot retrieve feed URL." msgstr "" msgid "No items in feed." msgstr "" msgid "Content successfully imported." msgstr "" #, php-format msgid "Add a feed content to the current blog: %s." msgstr "" msgid "Feed URL:" msgstr "" msgid "Flat file import" msgstr "" msgid "Imports a blog or a full Dotclear installation from flat file." msgstr "" msgid "Single blog successfully imported." msgstr "" msgid "Are you sure you want to import a full backup file?" msgstr "" #, php-format msgid "This will import a single blog backup as new content in the current blog: %s." msgstr "" msgid "Upload a backup file" msgstr "" #, php-format msgid "maximum size %s" msgstr "" msgid "or pick up a local file in your public directory" msgstr "" msgid "This will reset all the content of your database, except users." msgstr "" msgid "Another file with same name exists." msgstr "" msgid "Failed to extract backup file." msgstr "" msgid "No backup in compressed file." msgstr "" msgid "WordPress import" msgstr "" msgid "Import a WordPress installation into your current blog." msgstr "" #, php-format msgid "This will import your WordPress content as new content in the current blog: %s." msgstr "" msgid "We first need some information about your old WordPress installation." msgstr "" msgid "WordPress and Dotclear's handling of categories are quite different. You can assign several categories to a single post in WordPress. In the Dotclear world, we see it more like \"One category, several tags.\" Therefore Dotclear can only import one category per post and will chose the lowest numbered one. If you want to keep a trace of every category, you can import them as tags, with an optional prefix." msgstr "" msgid "On the other hand, in WordPress, a post can not be uncategorized, and a default installation has a first category labelised \"Uncategorized\".If you did not change that category, you can just ignore it while importing your blog, as Dotclear allows you to actually keep your posts uncategorized." msgstr "" msgid "Ignore the first category:" msgstr "" msgid "Import lowest numbered category on posts:" msgstr "" msgid "Import all categories as tags:" msgstr "" msgid "Prefix such tags with:" msgstr "" msgid "Content filters" msgstr "" msgid "You may want to process your post and/or comment content with the following filters." msgstr "" msgid "Post content formatter:" msgstr "" msgid "Comment content formatter:" msgstr "" msgid "WordPress tables not found" msgstr "" msgid "No file to read." msgstr "" msgid "File is not a DotClear backup." msgstr "" msgid "File is not a single blog export." msgstr "" msgid "File is not a full export." msgstr "" #, php-format msgid "ID of \"%3$s\" does not match on record \"%1$s\" at line %2$s of backup file." msgstr "" msgid "Database export" msgstr "" msgid "Download database of current blog" msgstr "" msgid "Download database of all blogs" msgstr "" msgid "Please wait..." msgstr "" #, php-format msgid "Export functions are in the page %s." msgstr "" msgid "Maintenance" msgstr "" msgid "Servicing" msgstr "" msgid "Tools to maintain the performance of your blogs." msgstr "" msgid "Backup" msgstr "" msgid "Tools to back up your content." msgstr "" msgid "Development" msgstr "" msgid "Tools to assist in development of plugins, themes and core." msgstr "" msgid "Optimize" msgstr "" msgid "Count and index" msgstr "" msgid "Purge" msgstr "" msgid "Other" msgstr "" msgid "Current blog" msgstr "" msgid "All blogs" msgstr "" msgid "Maintain translations" msgstr "" msgid "Translations" msgstr "" #, php-format msgid "One task to execute" msgid_plural "%s tasks to execute" msgstr[0] "" msgstr[1] "" msgid "This task has never been executed." msgstr "" #, php-format msgid "Last execution of this task was on %s." msgstr "" #, php-format msgid "There is a task to execute." msgid_plural "There are %s tasks to execute." msgstr[0] "" msgstr[1] "" msgid "Manage tasks" msgstr "" msgid "Display overdue tasks counter on maintenance dashboard icon" msgstr "" msgid "Display overdue tasks list on dashboard items" msgstr "" msgid "Failed to execute task." msgstr "" msgid "Task successfully executed." msgstr "" msgid "Empty templates cache directory" msgstr "" msgid "Templates cache directory emptied." msgstr "" msgid "Failed to empty templates cache directory." msgstr "" msgid "It may be useful to empty this cache when modifying a theme's .html or .css files (or when updating a theme or plugin). Notice : with some hosters, the templates cache cannot be emptied with this plugin. You may then have to delete the directory /cbtpl/ directly on the server with your FTP software." msgstr "" msgid "Count again comments and trackbacks" msgstr "" msgid "Comments and trackback counted." msgstr "" msgid "Failed to count comments and trackbacks." msgstr "" msgid "Count again comments and trackbacks allows to check their exact numbers. This operation can be useful when importing from another blog platform (or when migrating from dotclear 1 to dotclear 2)." msgstr "" msgid "Search engine index" msgstr "" msgid "Index all comments for search engine" msgstr "" msgid "Next" msgstr "" #, php-format msgid "Indexing comment %d to %d." msgstr "" msgid "Comments index done." msgstr "" msgid "Failed to index comments." msgstr "" msgid "Index all comments and trackbacks in search engine index. This operation is necessary, after importing content in your blog, to use internal search engine, on public and private pages." msgstr "" msgid "Index all entries for search engine" msgstr "" #, php-format msgid "Indexing entry %d to %d." msgstr "" msgid "Entries index done." msgstr "" msgid "Failed to index entries." msgstr "" msgid "Index all entries in search engine index. This operation is necessary, after importing content in your blog, to use internal search engine, on public and private pages." msgstr "" msgid "Delete all logs" msgstr "" msgid "Logs deleted." msgstr "" msgid "Failed to delete logs." msgstr "" msgid "Logs record all activity and connection to your blog history. Unless you need to keep this history, consider deleting these logs from time to time." msgstr "" msgid "Entries metadata" msgstr "" msgid "Synchronize entries metadata" msgstr "" #, php-format msgid "Synchronize entry %d to %d." msgstr "" msgid "Entries metadata synchronize done." msgstr "" msgid "Failed to synchronize entries metadata." msgstr "" msgid "Synchronize all entries metadata could be useful after importing content in your blog or do bad operation on database tables." msgstr "" msgid "Optimise database" msgstr "" msgid "optimize tables" msgstr "" msgid "Optimization successful." msgstr "" msgid "Failed to optimize tables." msgstr "" msgid "After numerous delete or update operations on Dotclear's database, it gets fragmented. Optimizing will allow to defragment it. It has no incidence on your data's integrity. It is recommended to optimize before any blog export." msgstr "" msgid "Download media folder of current blog" msgstr "" msgid "It may be useful to backup your media folder. This compress all content of media folder into a single zip file. Notice : with some hosters, the media folder cannot be compressed with this plugin if it is too big." msgstr "" msgid "Download active theme of current blog" msgstr "" msgid "It may be useful to backup the active theme before any change or update. This compress theme folder into a single zip file." msgstr "" msgid "Maintenance plugin has been successfully configured." msgstr "" msgid "Never" msgstr "" msgid "Every week" msgstr "" msgid "Every two weeks" msgstr "" msgid "Every month" msgstr "" msgid "Every two months" msgstr "" msgid "You have not sufficient permissions to view this page." msgstr "" msgid "You should execute it now." msgstr "" msgid "Execute task" msgstr "" msgid "This may take a very long time." msgstr "" msgid "Alert settings" msgstr "" msgid "Activation" msgstr "" msgid "Display alert messages on late tasks" msgstr "" #, php-format msgid "You can place list of late tasks on your %s." msgstr "" msgid "Frequency" msgstr "" msgid "Use one recall time for all tasks" msgstr "" msgid "Recall time for all tasks:" msgstr "" msgid "Use one recall time per task" msgstr "" msgid "New page" msgstr "" #, php-format msgid "%d page" msgstr "" #, php-format msgid "%d pages" msgstr "" msgid "manage pages" msgstr "" msgid "My first page" msgstr "" msgid "This is your first page. When you're ready to blog, log in to edit or delete it." msgstr "" msgid "Published on" msgstr "" msgid "This page's comments feed" msgstr "" msgid "You must provide a valid email address." msgstr "" msgid "Page title" msgstr "" msgid "Page position" msgstr "" msgid "Publication date" msgstr "" msgid "Pages actions" msgstr "" msgid "Back to pages list" msgstr "" msgid "Selected pages have been successfully reordered." msgstr "" msgid "No page" msgstr "" msgid "Hidden" msgstr "" msgid "Select this page" msgstr "" msgid "Are you sure you want to delete selected pages?" msgstr "" msgid "Selected pages have been successfully updated." msgstr "" msgid "Selected pages have been successfully deleted." msgstr "" msgid "Selected pages action:" msgstr "" msgid "To rearrange pages order, change number at the begining of the line, then click on “Save pages order” button." msgstr "" msgid "To rearrange pages order, move items by drag and drop, then click on “Save pages order” button." msgstr "" msgid "Save pages order" msgstr "" msgid "This page does not exist." msgstr "" msgid "Edit page" msgstr "" msgid "Are you sure you want to delete this page?" msgstr "" msgid "Page has been successfully updated." msgstr "" msgid "Page has been successfully created." msgstr "" msgid "Go to this page on the site" msgstr "" msgid "Page status" msgstr "" msgid "Page language" msgstr "" msgid "Hide in widget Pages" msgstr "" msgid "Warning: If you set the URL manually, it may conflict with another page." msgstr "" msgid "Introduction to the page." msgstr "" msgid "Select this comment" msgstr "" msgid "Pings" msgstr "" msgid "Settings have been successfully updated." msgstr "" msgid "Pings configuration" msgstr "" msgid "Activate pings extension" msgstr "" msgid "Service name:" msgstr "" msgid "Service URI:" msgstr "" msgid "Error" msgstr "" msgid "Test ping services" msgstr "" msgid "Check all" msgstr "" msgid "Simple menu" msgstr "" msgid "All months" msgstr "" msgid "All tags" msgstr "" msgid "Home" msgstr "" msgid "Archive" msgstr "" msgid "Page" msgstr "" msgid "Tags" msgstr "" msgid "User defined" msgstr "" msgid "Label" msgstr "" msgid "Recent posts" msgstr "" #, php-format msgid "Switch to %s language" msgstr "" msgid "Recent Posts from this category" msgstr "" msgid "Archives" msgstr "" #, php-format msgid "Posts from %s" msgstr "" #, php-format msgid "Recent posts for %s tag" msgstr "" msgid "Menu item has been successfully added." msgstr "" msgid "Label and URL of menu item are mandatory." msgstr "" msgid "Menu items have been successfully removed." msgstr "" msgid "No menu items selected." msgstr "" msgid "Label is mandatory." msgstr "" msgid "URL is mandatory." msgstr "" msgid "Menu items have been successfully updated." msgstr "" msgid "Step #1" msgstr "" msgid "Step #2" msgstr "" msgid "Step #3" msgstr "" msgid "Add item" msgstr "" msgid "Select type" msgstr "" msgid "Type of item menu:" msgstr "" msgid "Continue..." msgstr "Continue…" msgid "Select language:" msgstr "" msgid "Select category:" msgstr "" msgid "Select month (if necessary):" msgstr "" msgid "Select page:" msgstr "" msgid "Select tag (if necessary):" msgstr "" msgid "Label of item menu:" msgstr "" msgid "Description of item menu:" msgstr "" msgid "URL of item menu:" msgstr "" msgid "Add this item" msgstr "" msgid "Add an item" msgstr "" msgid "Menu items list" msgstr "" msgid "Update menu" msgstr "" msgid "Delete selected menu items" msgstr "" msgid "Are you sure you want to remove selected menu items?" msgstr "" msgid "No menu items so far." msgstr "" msgid "Add tags" msgstr "" msgid "Remove tags" msgstr "" msgid "Tag has been successfully added to selected entries" msgid_plural "Tags have been successfully added to selected entries" msgstr[0] "" msgstr[1] "" msgid "Add tags to this selection" msgstr "" #, php-format msgid "Are you sure you want to remove this %s?" msgstr "" #, php-format msgid "Add a %s to this entry" msgstr "" msgid "Choose from list" msgstr "" msgid "all" msgstr "" msgid "Enter tags separated by coma" msgstr "" msgid "used in %e - frequency %p%" msgstr "" msgid "entry" msgstr "" msgid "entries" msgstr "" msgid "Tags to add:" msgstr "" msgid "Tag has been successfully removed from selected entries" msgid_plural "Tags have been successfully removed from selected entries" msgstr[0] "" msgstr[1] "" msgid "No tags for selected entries" msgstr "" msgid "Remove selected tags from this selection" msgstr "" msgid "Following tags have been found in selected entries:" msgstr "" msgid "Tag" msgstr "" msgid "Short" msgstr "" msgid "Extended" msgstr "" msgid "Tags list format:" msgstr "" msgid "This tag's comments Atom feed" msgstr "" msgid "This tag's entries Atom feed" msgstr "" msgid "Limit (empty means no limit):" msgstr "" msgid "Entries count" msgstr "" msgid "Tag name" msgstr "" msgid "Link to all tags:" msgstr "" msgid "Tag has been successfully renamed" msgstr "" msgid "Tag has been successfully removed" msgstr "" #, php-format msgid "Are you sure you want to remove tag: “%s”?" msgstr "" msgid "Back to tags list" msgstr "" msgid "Rename" msgstr "" msgid "Delete this tag" msgstr "" #, php-format msgid "List of entries with the tag “%s”" msgstr "" msgid "No tags on this blog." msgstr "" msgid "Edit theme files" msgstr "" msgid "Syntax highlighting in theme editor" msgstr "" msgid "No file" msgstr "" msgid "File does not exist." msgstr "" #, php-format msgid "File %s is not readable" msgstr "" #, php-format msgid "Unable to write file %s. Please check your theme files and folders permissions." msgstr "" msgid "Saving document..." msgstr "" msgid "Document saved" msgstr "" msgid "An error occurred:" msgstr "" #, php-format msgid "Your current theme on this blog is \"%s\"." msgstr "" msgid "You can't edit default theme." msgstr "" msgid "Please select a file to edit." msgstr "" msgid "File editor" msgstr "" #, php-format msgid "Editing file %s" msgstr "" msgid "This file is not writable. Please check your theme files permissions." msgstr "" msgid "Templates files" msgstr "" msgid "CSS files" msgstr "" msgid "JavaScript files" msgstr "" msgid "Locales files" msgstr "" msgid "Preferences successfully updated" msgstr "" msgid "user:preferences" msgstr "" msgid "User preferences" msgstr "" msgid "Global preferences" msgstr "" msgid "Presentation widgets" msgstr "" msgid "Search engine" msgstr "" msgid "Navigation links" msgstr "" msgid "Selected entries" msgstr "" msgid "Best of me" msgstr "" msgid "Blog languages" msgstr "" msgid "With entries counts" msgstr "" msgid "Include sub cats in count" msgstr "" msgid "Include empty categories" msgstr "" msgid "Subscribe links" msgstr "" msgid "Subscribe" msgstr "" msgid "Feeds type:" msgstr "" msgid "Feed reader" msgstr "" msgid "Somewhere else" msgstr "" msgid "Entries limit:" msgstr "" msgid "Text" msgstr "" msgid "Text:" msgstr "" msgid "Last entries" msgstr "" msgid "Uncategorized" msgstr "" msgid "Tag:" msgstr "" msgid "Last comments" msgstr "" msgid "Comments limit:" msgstr "" #, php-format msgid "This blog's entries %s feed" msgstr "" #, php-format msgid "This blog's comments %s feed" msgstr "" msgid "Entries feed" msgstr "" msgid "Comments feed" msgstr "" msgid "navigation" msgstr "" msgid "extra" msgstr "" msgid "custom" msgstr "" msgid "empty string" msgstr "" msgid "Widgets" msgstr "" msgid "Are you sure you want to reset sidebars?" msgstr "" msgid "Available widgets" msgstr "" msgid "Drag widgets from this list to one of the sidebars, for add." msgstr "" msgid "order" msgstr "" msgid "Append to:" msgstr "" msgid "Add widgets to sidebars" msgstr "" msgid "Navigation sidebar" msgstr "" msgid "Extra sidebar" msgstr "" msgid "Custom sidebar" msgstr "" msgid "Update sidebars" msgstr "" msgid "Reset sidebars" msgstr "" msgid "Widget ID:" msgstr "" msgid "No setting for this widget" msgstr "" msgid "boolean" msgstr "" msgid "possible values:" msgstr "" msgid "listitem" msgstr "" msgid "string" msgstr "" msgid "Setting name:" msgstr "" msgid "No widget as far." msgstr "" msgid "Up the widget" msgstr "" msgid "Down the widget" msgstr "" msgid "Remove widget" msgstr "" msgid "Drag widgets here to remove." msgstr "" dotclear-2.6.2+dfsg/locales/en/public.lang.php000066400000000000000000000103071230033266200211660ustar00rootroot00000000000000%1$s
        returned no result.'] = ''; $GLOBALS['__l10n']['Your search for %1$s returned %2$s result.'] = ''; $GLOBALS['__l10n']['Your search for %1$s returned %2$s results.'] = ''; $GLOBALS['__l10n']['Home'] = ''; $GLOBALS['__l10n']['All keywords'] = ''; $GLOBALS['__l10n']['Best of me'] = ''; $GLOBALS['__l10n']['Languages'] = ''; $GLOBALS['__l10n']['Categories'] = ''; $GLOBALS['__l10n']['Subcategories'] = ''; $GLOBALS['__l10n']['Archives'] = ''; $GLOBALS['__l10n']['Links'] = ''; $GLOBALS['__l10n']['Subscribe'] = ''; $GLOBALS['__l10n']['Entries feed'] = ''; $GLOBALS['__l10n']['Comments feed'] = ''; $GLOBALS['__l10n']['This blog\'s comments Atom feed'] = ''; $GLOBALS['__l10n']['This category\'s entries Atom feed'] = ''; $GLOBALS['__l10n']['This category\'s comments Atom feed'] = ''; $GLOBALS['__l10n']['This post\'s comments feed'] = ''; $GLOBALS['__l10n']['This post\'s comments Atom feed'] = ''; $GLOBALS['__l10n']['Attachments'] = ''; $GLOBALS['__l10n']['Permalink'] = ''; $GLOBALS['__l10n']['Comments'] = ''; $GLOBALS['__l10n']['Your comment'] = ''; $GLOBALS['__l10n']['Your comment has been published.'] = ''; $GLOBALS['__l10n']['Your comment has been submitted and will be reviewed for publication.'] = ''; $GLOBALS['__l10n']['Add a comment'] = ''; $GLOBALS['__l10n']['Name or nickname'] = ''; $GLOBALS['__l10n']['Email address'] = ''; $GLOBALS['__l10n']['Website'] = ''; $GLOBALS['__l10n']['optional'] = ''; $GLOBALS['__l10n']['Comment'] = ''; $GLOBALS['__l10n']['Comments can be formatted using a simple wiki syntax.'] = ''; $GLOBALS['__l10n']['HTML code is displayed as text and web addresses are automatically converted.'] = ''; $GLOBALS['__l10n']['Remember me on this blog'] = ''; $GLOBALS['__l10n']['preview'] = ''; $GLOBALS['__l10n']['send'] = ''; $GLOBALS['__l10n']['They posted on the same topic'] = ''; $GLOBALS['__l10n']['Trackback URL'] = ''; $GLOBALS['__l10n']['You must provide an author name'] = ''; $GLOBALS['__l10n']['You must provide a comment'] = ''; $GLOBALS['__l10n']['Email address is not valid'] = ''; $GLOBALS['__l10n']['Document not found'] = ''; $GLOBALS['__l10n']['The document you are looking for does not exist.'] = ''; $GLOBALS['__l10n']['Powered by %s'] = ''; $GLOBALS['__l10n']['Subscribe to'] = ''; $GLOBALS['__l10n']['What is an RSS feed?'] = ''; $GLOBALS['__l10n']['RSS feed is a free blog summary. It provides content (either posts or comments) or summaries of content, together with links to the full versions, and other metadata. The last published items may then be read by your favorite RSS aggregator.'] = ''; $GLOBALS['__l10n']['Simply copy the following URL into your aggregator:'] = ''; $GLOBALS['__l10n']['Password needed'] = ''; $GLOBALS['__l10n']['You must give a password to access this area.'] = ''; $GLOBALS['__l10n']['Password:'] = ''; $GLOBALS['__l10n']['You must provide a valid email address.'] = ''; $GLOBALS['__l10n']['Read'] = ''; dotclear-2.6.2+dfsg/locales/en/public.po000066400000000000000000000072671230033266200201100ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: Dotclear 2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-10-13 05:22+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" # Not found strings msgid "To content" msgstr "" msgid "To menu" msgstr "" msgid "To search" msgstr "" msgid "By" msgstr "" msgid "by" msgstr "" msgid "on" msgstr "" msgid "On" msgstr "" msgid "Continue reading" msgstr "" msgid "no comment" msgstr "" msgid "one comment" msgstr "" msgid "%d comments" msgstr "" msgid "no trackback" msgstr "" msgid "one trackback" msgstr "" msgid "%d trackbacks" msgstr "" msgid "no attachment" msgstr "" msgid "one attachment" msgstr "" msgid "%d attachments" msgstr "" msgid "previous entries" msgstr "" msgid "page" msgstr "" msgid "of" msgstr "" msgid "next entries" msgstr "" msgid "Search" msgstr "" msgid "Your search for %1$s returned no result." msgstr "" msgid "Your search for %1$s returned %2$s result." msgstr "" msgid "Your search for %1$s returned %2$s results." msgstr "" msgid "Home" msgstr "" msgid "All keywords" msgstr "" msgid "Best of me" msgstr "" msgid "Languages" msgstr "" msgid "Categories" msgstr "" msgid "Subcategories" msgstr "" msgid "Archives" msgstr "" msgid "Links" msgstr "" msgid "Subscribe" msgstr "" msgid "Entries feed" msgstr "" msgid "Comments feed" msgstr "" msgid "This blog's comments Atom feed" msgstr "" msgid "This category's entries Atom feed" msgstr "" msgid "This category's comments Atom feed" msgstr "" msgid "This post's comments feed" msgstr "" msgid "This post's comments Atom feed" msgstr "" msgid "Attachments" msgstr "" msgid "Permalink" msgstr "" msgid "Comments" msgstr "" msgid "Your comment" msgstr "" msgid "Your comment has been published." msgstr "" msgid "Your comment has been submitted and will be reviewed for publication." msgstr "" msgid "Add a comment" msgstr "" msgid "Name or nickname" msgstr "" msgid "Email address" msgstr "" msgid "Website" msgstr "" msgid "optional" msgstr "" msgid "Comment" msgstr "" msgid "Comments can be formatted using a simple wiki syntax." msgstr "" msgid "HTML code is displayed as text and web addresses are automatically converted." msgstr "" msgid "Remember me on this blog" msgstr "" msgid "preview" msgstr "" msgid "send" msgstr "" msgid "They posted on the same topic" msgstr "" msgid "Trackback URL" msgstr "" msgid "You must provide an author name" msgstr "" msgid "You must provide a comment" msgstr "" msgid "Email address is not valid" msgstr "" msgid "Document not found" msgstr "" msgid "The document you are looking for does not exist." msgstr "" msgid "Powered by %s" msgstr "" msgid "Subscribe to" msgstr "" msgid "What is an RSS feed?" msgstr "" msgid "RSS feed is a free blog summary. It provides content (either posts or comments) or summaries of content, together with links to the full versions, and other metadata. The last published items may then be read by your favorite RSS aggregator." msgstr "" msgid "Simply copy the following URL into your aggregator:" msgstr "" msgid "Password needed" msgstr "" msgid "You must give a password to access this area." msgstr "" msgid "Password:" msgstr "" msgid "You must provide a valid email address." msgstr "" msgid "Read" msgstr "" dotclear-2.6.2+dfsg/locales/en/resources.php000066400000000000000000000015721230033266200210060ustar00rootroot00000000000000 'http://dotclear.org/documentation/2.0', 'Dotclear presentation' => 'http://dotclear.org/documentation/2.0/overview/tour', "User manual" => 'http://dotclear.org/documentation/2.0/usage', "Installation and administration guides" => 'http://dotclear.org/documentation/2.0/admin', "Dotclear support forum" => 'http://forum.dotclear.net/' ); ?>dotclear-2.6.2+dfsg/locales/fr/000077500000000000000000000000001230033266200162635ustar00rootroot00000000000000dotclear-2.6.2+dfsg/locales/fr/date.lang.php000066400000000000000000000036601230033266200206360ustar00rootroot00000000000000, 2006. msgid "" msgstr "" "Project-Id-Version: Dotclear 2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-04-15 16:27+0200\n" "PO-Revision-Date: 2008-04-15 16:34+0100\n" "Last-Translator: Olivier Meunier \n" "Language-Team: \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: French\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" msgid "%Y-%m-%d %H:%M" msgstr "%d/%m/%Y %H:%M" msgid "_Jan" msgstr "janv." msgid "_Feb" msgstr "fév." msgid "_Mar" msgstr "mar." msgid "_Apr" msgstr "avr." msgid "_May" msgstr "mai" msgid "_Jun" msgstr "juin" msgid "_Jul" msgstr "juil." msgid "_Aug" msgstr "août" msgid "_Sep" msgstr "sept." msgid "_Oct" msgstr "oct." msgid "_Nov" msgstr "nov." msgid "_Dec" msgstr "déc." msgid "January" msgstr "janvier" msgid "February" msgstr "février" msgid "March" msgstr "mars" msgid "April" msgstr "avril" msgid "May" msgstr "mai" msgid "June" msgstr "juin" msgid "July" msgstr "juillet" msgid "August" msgstr "août" msgid "September" msgstr "septembre" msgid "October" msgstr "octobre" msgid "November" msgstr "novembre" msgid "December" msgstr "décembre" msgid "_Mon" msgstr "lun." msgid "_Tue" msgstr "mar." msgid "_Wed" msgstr "mer." msgid "_Thu" msgstr "jeu." msgid "_Fri" msgstr "ven." msgid "_Sat" msgstr "sam." msgid "_Sun" msgstr "dim." msgid "Monday" msgstr "lundi" msgid "Tuesday" msgstr "mardi" msgid "Wednesday" msgstr "mercredi" msgid "Thursday" msgstr "jeudi" msgid "Friday" msgstr "vendredi" msgid "Saturday" msgstr "samedi" msgid "Sunday" msgstr "dimanche" #~ msgid "%H:%M:%S:" #~ msgstr "%H:%M:%S :" #~ msgid "%A, %B %e %Y" #~ msgstr "%A %e %B %Y" dotclear-2.6.2+dfsg/locales/fr/help/000077500000000000000000000000001230033266200172135ustar00rootroot00000000000000dotclear-2.6.2+dfsg/locales/fr/help/core_blog_new.html000066400000000000000000000013051230033266200227040ustar00rootroot00000000000000 Nouveau blog

        Création d'un nouveau blog

        Identifiant du blog
        Identifiant unique du blog. Obligatoire, ne peut être modifié que par un super administrateur.
        Nom du blog
        Nom du blog, obligatoire. Il peut être modifié à tout moment sans incidence sur le fonctionnement du blog.
        URL du blog
        URL complète du blog. Obligatoire, ne peut être modifiée que par un super administrateur.
        Description du blog
        Texte libre de description du blog. Il s'agit d'un texte simple, sans formatage quelconque.
        dotclear-2.6.2+dfsg/locales/fr/help/core_blog_pref.html000066400000000000000000000275251230033266200230630ustar00rootroot00000000000000 Paramètres du blog

        Informations du blog

        Identifiant du blog
        Identifiant unique du blog. Obligatoire, ne peut être modifié que par un super administrateur.
        Nom du blog
        Nom du blog, obligatoire. Il peut être modifié à tout moment sans incidence sur le fonctionnement du blog.
        URL du blog
        URL complète du blog. Obligatoire, ne peut être modifiée que par un super administrateur.
        Méthode de lecture de l'URL
        Définit le mode de lecture de l'URL. PATH_INFO est conseillé, QUERY_STRING doit être utilisé si le premier ne fonctionne pas. En mode PATH_INFO, l'URL du blog doit se terminer par un "/" et en mode QUERY_STRING, par un "?".
        État du blog
        • En ligne : blog accessible aux visiteurs.
        • Hors ligne : blog inaccessible aux visiteurs mais les rédacteurs peuvent se connecter.
        • Retiré : blog inaccessible aux visiteurs comme aux rédacteurs, seuls les super administrateurs peuvent y accéder.
        Description du blog
        Texte libre de description du blog. Il s'agit d'un texte simple, sans formatage quelconque. Si le thème le prévoit, le contenu de ce champ peut s'afficher sur le blog.

        Configuration du blog

        Nom de l'auteur du blog
        Nom de la personne responsable du contenu du blog. Peut être le propriétaire ou le directeur de publication s'il existe. Cette information sera affichée dans les informations du flux de syndication.
        Langue par défaut
        Langue de l'interface du blog. Si cette langue existe parmi les traductions, l'interface sera traduite dans celle-ci, sinon elle apparaîtra en anglais.
        Fuseau horaire du blog
        Définit le fuseau horaire qui sera utilisé pour dater les entrées, commentaires et trackbacks entrants sur le blog.
        Note de copyright
        Note indiquant les droits de reproduction autorisés pour le blog.
        Format d'URL des nouveaux billets
        Liste déroulante permettant de choisir la forme d'URL souhaitée.
        Balise HTML pour le titre des notes
        Liste déroulante permettant de choisir le niveau de titre ou une balise différente que la valeur par défaut (h4) pour l'intitulé des notes de bas de page d'un billet.
        Interface XML/RPC
        Permet à un client externe d'interagir avec votre blog via le protocole XML/RPC. À l'activation, les paramètres nécessaires au réglage du client externe sont affichés.

        Commentaires et rétroliens

        Accepter les commentaires
        Accepter globalement les commentaires sur le blog. Si cette option est décochée les commentaires ne seront autorisés sur aucun billet même si le réglage individuel d'un billet indique que les commentaires sont permis.
        Modérer les commentaires
        Si cette option est activée, les commentaires ne seront publiés qu'après l'approbation d'un rédacteur.
        Laisser les commentaires ouverts durant x jours
        Permet d'indiquer le nombre de jours durant lesquels les commentaires sont possibles sur un billet après sa publication. Laisser ce champ vide pour ne fixer aucune limite.
        Syntaxe wiki pour les commentaires
        Autoriser quelques éléments de la syntaxe wiki dans les commentaires.
        Accepter les rétroliens
        Accepter globalement les rétroliens sur le blog. Si cette option est décochée les rétroliens ne seront acceptés sur aucun billet même si le réglage individuel d'un billet indique qu'ils sont permis.
        Modérer les rétroliens
        Si cette option est activée, les rétroliens ne seront publiés qu'après l'approbation d'un rédacteur.
        Laisser les rétroliens ouverts durant x jours
        Permet d'indiquer le nombre de jours durant lesquels les rétroliens sont possibles sur un billet après sa publication. Laisser ce champ vide pour ne fixer aucune limite.
        Ajouter la relation "nofollow" aux liens des commentaires et rétroliens
        Ajoute un attribut sur les liens des commentaires et rétroliens indiquant aux robots des moteurs de recherche de ne pas les suivre. Cette mesure est censée permettre de lutter contre le spam mais n'a pas encore vraiment prouvé son efficacité.

        Présentation du blog

        Format des dates
        Indique le format de la date d'un billet sur le blog. Voir la section "Formatage des dates et des heures" pour plus détails.
        Format des heures
        Indique le format de l'heure d'un billet sur le blog. Voir la section "Formatage des dates et des heures" pour plus détails.
        Afficher des émoticônes dans les billets et commentaires
        Remplacer certaines suites de caractères comme :-) ou ;-) par des images.
        Afficher x billets par page
        Le nombre donné sera utilisé comme limite d'affichage des billets sur la page d'accueil et la première page de chaque catégorie.
        Afficher x billets par flux de syndication
        Le nombre donné sera utilisé comme limite d'affichage des billets dans les flux de syndication.
        Afficher x commentaires par flux de syndication
        Le nombre donné sera utilisé comme limite d'affichage des commentaires dans les flux de syndication.
        Tronquer le flux de syndication
        Cette option permet de ne fournir qu'un extrait des billets dans les flux de syndication.
        Inclure les sous-catégories dans la page des catégories et dans les flux de billets pour une catégorie
        Cette option permet d'inclure les sous-catégories de la catégorie courante dans l'affichage coté public d'une catégorie, ou d'un flux de billets pour une catégorie

        Médias et images

        Tailles des miniatures générées (en pixels)
        Lorsque vous ajoutez une image dans la médiathèque, d'autres tailles sont automatiquement générées. Vous pouvez ajuster ici la dimension du plus grand côté de chaque type d'image générée. Laisser le champ de saisie vide pour que la médiathèque ne crée pas le format de miniature correspondante.
        Titres des images insérées
        Ce champ vous permet de définir le modèle des titres ajoutés automatiquement à partir d'éléments des métadonnées des images.
        Attributs par défaut pour l'insertion d'image
        Les réglages choisis s'appliqueront à toutes les nouvelles images insérées.
        Taille de l'image insérée
        Cette option définit la taille sélectionnée par défaut lors de l'insertion d'une image
        Alignement de l'image
        Cette option permet de définir l'alignement par défaut de l'image lors de son insertion (gauche, droite, centré ou aucun)
        Insérer le lien vers l'image originale
        Cette option permet de rendre l'image affichée cliquable, un clic sur l'image en question pointant vers l'image originale

        Paramètres d'indexation par les moteurs de recherche

        Indiquez ici si vous souhaitez ou non que les moteurs de recherche indexent et/ou archivent vos pages. Choisissez la dernière option si vous ne voulez pas que l'on trouve votre blog par le biais d'un moteur de recherche.

        Antispam

        Indiquez ici le nombre de jours après lequel vous souhaitez que les commentaires indésirables soient automatiquement supprimés. Laisser ce champ de saisie vide ou mettre la valeur à 0 pour ne fixer aucune limite dans le temps.

        Formatage des dates et des heures

        Certains champs permettent de formater les dates ou les heures avec des caractères particuliers dont voici la définition :

        • %a : nom abrégé du jour de la semaine (local),
        • %A : nom complet du jour de la semaine (local),
        • %b : nom abrégé du mois (local),
        • %B : nom complet du mois (local),
        • %c : représentation préférée pour les dates et heures, en local,
        • %C : numéro de siècle (l'année, divisée par 100 et arrondie entre 00 et 99),
        • %d : jour du mois en numérique (intervalle 01 à 31),
        • %D : identique à %m/%d/%y,
        • %e : numéro du jour du mois. Les chiffres sont précédés d'un espace (de ' 1' à '31'),
        • %g : identique à %G, sur 2 chiffres,
        • %G : L'année sur 4 chiffres correspondant au numéro de semaine (voir %V). Même format et valeur que %Y, excepté que si le numéro de la semaine appartient à l'année précédente ou suivante, l'année courante sera utilisé à la place,
        • %h : identique à %b,
        • %H : heure de la journée en numérique, et sur 24-heures (intervalle de 00 à 23),
        • %I : heure de la journée en numérique, et sur 12- heures (intervalle 01 à 12),
        • %j : jour de l'année, en numérique (intervalle 001 à 366),
        • %m : mois en numérique (intervalle 1 à 12),
        • %M : minute en numérique,
        • %n : newline character,
        • %p : soit `am' ou `pm' en fonction de l'heure absolue, ou en fonction des valeurs enregistrées en local,
        • %r : l'heure au format a.m. et p.m.,
        • %R : l'heure au format 24h,
        • %S : secondes en numérique,
        • %t : tabulation,
        • %T : l'heure actuelle (égal à %H:%M:%S),
        • %u : le numéro de jour dans la semaine, de 1 à 7. (1 représente Lundi),
        • %U : numéro de semaine dans l'année, en considérant le premier dimanche de l'année comme le premier jour de la première semaine,
        • %V : le numéro de semaine comme défini dans l'ISO 8601:1988, sous forme décimale, de 01 à 53. La semaine 1 est la première semaine qui a plus de 4 jours dans l'année courante, et dont Lundi est le premier jour (utilisez %G ou %g pour les éléments de l'année qui correspondent au numéro de la semaine pour le timestamp donné),
        • %W : numéro de semaine dans l'année, en considérant le premier lundi de l'année comme le premier jour de la première semaine,
        • %w : jour de la semaine, numérique, avec Dimanche = 0,
        • %x : format préféré de représentation de la date sans l'heure,
        • %X : format préféré de représentation de l'heure sans la date,
        • %y : l'année, numérique, sur deux chiffres (de 00 à 99),
        • %Y : l'année, numérique, sur quatre chiffres,
        • %Z ou %z : fuseau horaire, ou nom ou abréviation,
        • %% : un caractère `%' littéral.

        Utilisateurs de ce blog

        Liste les utilisateurs de ce blog, ainsi que leurs permissions. Si l'utilisateur n'est ni super administrateur ni administrateur, le bouton Changer les permissions permet de lui en ajouter ou supprimer.

        dotclear-2.6.2+dfsg/locales/fr/help/core_blog_theme.html000066400000000000000000000041261230033266200232210ustar00rootroot00000000000000 Apparence du blog

        Mise à jour de thèmes

        Lorsque de nouvelles versions des thèmes installés sur votre blog ont été déposées dans le centre de ressources Dotaddict, la page comporte un onglet supplémentaire nommé Mise à jour de thèmes, qui liste les thèmes avec le numéro de version installée et le numéro de version de la mise à jour.

        Il suffit alors d'utiliser le bouton d'action Mise à jour.

        Si plusieurs mises à jour sont disponibles, un bouton d'action en bas de page permet de Mettre à jour tous les thèmes en une seule fois.

        À noter : les modifications que vous auriez pu apporter aux fichiers du thème seront perdues lors de sa mise à jour.

        Thèmes installés

        La liste des thèmes installés apparaît dans cet onglet. Vous pouvez choisir un thème pour le blog courant en cliquant sur Utiliser celui-ci.

        Le thème courant peut être modifié via le bouton Modifier les fichiers du thème. Si le thème sélectionné comporte un configurateur, on y accède par le bouton Personnaliser le thème.

        Vous pouvez également désactiver un thème (s'il pose un problème de compatibilité par exemple). Un onglet "Thèmes désactivés" apparaît alors avec la liste de ceux-ci.

        Ajouter un thème

        Cet onglet permet de parcourir le centre de ressources Dotaddict des thèmes soit par ordre alphabétique, soit en effecturant une recherche dans le champ dédié. Les thèmes déjà installés n'apparaissent pas.

        Installer ou mettre à jour manuellement

        Si le thème que vous voulez installer (ou mettre à jour) ne se trouve pas sur le centre de ressources Dotaddict, vous pouvez l'installer soit en allant le chercher sur votre disque dur, soit en entrant son adresse URL que vous aurez préalablement récupérée sur le site qui le propose. Le thème à télécharger se présente toujours sous la forme d'un fichier zip.

        dotclear-2.6.2+dfsg/locales/fr/help/core_blogs.html000066400000000000000000000012061230033266200222160ustar00rootroot00000000000000 Liste des blogs

        Filtrer la liste des blogs

        Chercher
        La recherche se fait sur l'identifiant du blog. On peut chercher sur une partie du nom en utilisant le caractère joker *.
        Trier par
        Choisir : dernière mise à jour du blog, ou nom du blog, ou identifiant du blog.
        Ordre
        Indique l'ordre dans lequel on souhaite afficher la liste (décroissant ou croissant).
        Blogs par page
        Détermine le nombre de blogs listés par page.
        dotclear-2.6.2+dfsg/locales/fr/help/core_categories.html000066400000000000000000000034731230033266200232450ustar00rootroot00000000000000 Catégories

        Liste des catégories

        Modifier une catégorie
        Cliquer sur l'intitulé d'une catégorie pour accéder à sa page de modification.
        Supprimer une catégorie
        Choisissez la catégorie que vous voulez supprimer en cliquant sur Supprimer la catégorie. Une popup vous demandera de confirmer cette action.
        Une catégorie ne peut être supprimée que si elle ne contient aucun billet.
        Pour vider une catégorie, vous pouvez choisir (liste de sélection) la nouvelle catégorie vers laquelle ils seront déplacés. Cliquez sur OK pour confirmer ce choix.
        Modifier l'ordre des catégories
        Vous pouvez modifier l'ordre des catégories ou déplacer une catégorie dans une catégorie parente par glisser-déposer.
        Quand l'ordre vous convient cliquez sur Enregistrer l'ordre des catégories.
        Cette action n'est disponible que si Javascript est activé dans votre navigateur et que vous n'avez pas désactivé les actions de glisser-déposer dans vos préférences. Sinon, vous pouvez déplacer une catégorie en vous rendant sur sa page puis en indiquant sa nouvelle position.
        Replacer toutes les catégories au premier niveau
        Utilisez cette option pour placer toutes les catégories au premier niveau.
        Si vous voulez modifier l'ordre des catégories plus précisément, vous pouvez
        • soit les déplacer par glisser-déposer
        • soit cliquer sur le nom de chacune d'entre elles pour choisir ensuite sa catégorie parente ou sa position par rapport à ses voisines.
        dotclear-2.6.2+dfsg/locales/fr/help/core_category.html000066400000000000000000000025321230033266200227300ustar00rootroot00000000000000 Catégorie

        Créer ou modifier une nouvelle catégorie

        Nom
        Choisissez le nom que vous souhaitez donner à votre nouvelle catégorie. Ce champ est obligatoire.
        Parent
        Il est possible de créer des sous-catégories. Dans ce cas, il faut choisir la catégorie parente dans le champ Parent.
        URL
        Dotclear crée une url par défaut de la catégorie, qui sera ainsi accessible avec un chemin de la forme http://monblog.tld/category/Ma-categorie. En cliquant sur le petit verrou situé à la droite, vous pouvez la modifier comme il vous plaira.
        Description
        Le contenu de ce champ de description sera affiché lors de la sélection d'une catégorie dans le blog. Vous pouvez le remplir avec toute forme de contenu (paragraphes, listes, etc.) Le format du texte de la description est XHTML.

        Placer ou déplacer une catégorie

        Catégorie parente
        Il est possible de créer des sous-catégories. Dans ce cas, il faut choisir la catégorie parente dans le champ Parent.
        Catégorie voisine
        Vous pouvez aussi spécifier sa position par rapport à ses voisines en la plaçant avant ou après l'une d'elles.
        dotclear-2.6.2+dfsg/locales/fr/help/core_comments.html000066400000000000000000000037301230033266200227410ustar00rootroot00000000000000 Commentaires et rétroliens

        Filtres de la liste des commentaires et rétroliens

        Type
        Aucun ou commentaire ou rétrolien.
        État
        • Indésirable : reconnu comme spam.
        • En attente : en attente de modération.
        • Non publié : hors ligne,
        • Publié : en ligne.
        Auteur du commentaire
        Recherche indifféremment avec des minuscules ou majuscules. On peut chercher sur une partie du nom en utilisant le caractère joker *.
        Adresse IP
        On peut chercher sur une partie de l'adresse IP en utilisant le caractère joker *.
        Trier par
        Choisir : date, ou titre du billet, ou auteur, ou état.
        Ordre
        Indique l'ordre dans lequel on souhaite effectuer le tri (décroissant ou croissant).
        Commentaires par page
        Détermine le nombre de commentaires affichés par page de cette liste.

        Actions par lot sur les commentaires et rétroliens

        Il est possible d'effectuer un ensemble d'actions sur plusieurs commentaires et/ou rétroliens, d'un seul coup. Les actions possibles dépendent des permissions de l'utilisateur.

        • Publier : mettre le commentaire ou rétrolien en ligne.
        • Mettre hors ligne : mettre le commentaire ou rétrolien hors ligne.
        • Mettre en attente : mettre le commentaire ou rétrolien en attente de publication.
        • Mettre en indésirable : classer le commentaire ou rétrolien comme étant un spam.
        • Supprimer : supprime le commentaire ou rétrolien (cette opération est irréversible).
        dotclear-2.6.2+dfsg/locales/fr/help/core_dashboard.html000066400000000000000000000036151230033266200230450ustar00rootroot00000000000000 Tableau de bord

        Entête

        Si l'installation concerne plusieurs blogs auxquels vous avez accès, un menu déroulant permet de choisir le blog sur lequel vous souhaitez travailler. (Sinon il rappelle simplement le nom du blog.)

        Le lien suivant permet d'aller sur le blog courant (dans nouvel onglet).

        Plus loin, les autres liens offrent un accès au retour à ce tableau de bord, aux pages de réglages personnels et à la déconnexion.

        Personnalisation du tableau de bord

        Favoris
        Les grandes icônes placées au milieu de la page permettent d'accéder rapidement à vos pages d'administration favorites.
        Modules du tableau de bord
        Les modules sous les favoris sont livrés de base ou ajoutés par des plugins.

        Le choix des favoris et l'affichage des modules sont personnalisables dans l'onglet Mon tableau de bord de la page Mes préférences.

        Le menu principal

        On peut afficher ou masquer ce menu à tout moment en cliquant sur sa bande extérieure droite.

        Le premier bloc du menu liste toutes les pages favorites de l'utilisateur. On peut choisir de ne pas insérer ce bloc dans l'onglet Mon tableau de bord de la page Mes préférences.

        Ce menu liste les pages d'administration. Il est séparé en trois sections :

        • «Blog» pour tout ce qui relève de l'alimentation et du paramétrage du blog courant.
        • «Réglages système» pour l'administration de l'installation globale.
        • «Plugins» pour les extensions dont l'effet concerne toute l'installation.
        dotclear-2.6.2+dfsg/locales/fr/help/core_langs.html000066400000000000000000000021711230033266200222160ustar00rootroot00000000000000 Langues

        Langues installées

        Vous retrouvez ici la liste des langues installées et disponibles pour votre interface d'administration ou pour définir la langue du blog. Chacune de ces langues peut être supprimée.

        Dans le cas où plus aucune langue ne serait installée, l'anglais serait alors utilisé pour l'interface et pour le blog.

        Installer ou mettre à jour une langue

        Langues disponibles

        Vous retrouvez ici la liste des langues disponibles sur le serveur de Dotclear. Pour installer une de ces langues, sélectionnez-la dans la liste déroulante, indiquez votre mot de passe et cliquez sur le bouton Installer la langue.

        La langue sélectionnée sera alors téléchargée et installée sur votre système.

        Déposer un fichier zip

        Vous pouvez également utiliser une archive compressée (au format Zip) pour installer une langue. Sélectionnez le fichier correspondant sur votre ordinateur, indiquez votre mot de passe et cliquez sur le bouton Déposer la langue.

        dotclear-2.6.2+dfsg/locales/fr/help/core_media.html000066400000000000000000000116141230033266200221730ustar00rootroot00000000000000 Gestionnaire de media

        Liste des médias

        La page principale de la Médiathèque (anciennement gestionnaire de médias) présente la liste des fichiers (médias) disponibles pour le blog en cours d'utilisation.

        Le clic sur l'icône ou le nom d'un répertoire permet d'afficher les sous-répertoires et médias qu'il contient.

        Les fichiers son au format MP3 sont présentés avec un lecteur permettant d'en prendre immédiatement connaissance (sous réserve que le lecteur (ou plugin) Flash soit disponible sur votre navigateur.

        Les images sont affichées avec une miniature quand cela est possible.

        Ajouter des fichiers

        Choisissez un fichier
        Permet de choisir un fichier sur son disque dur pour l'envoyer sur le blog. Si le fichier dépasse la taille maximale, il ne pourra être envoyé.
        Titre
        Titre optionnel du fichier à envoyer.
        Privé
        Indique que le fichier envoyé n'est visible que par son propriétaire tant qu'il n'est pas publié sur le blog.
        Interface avancée
        Permet de choisir plusieurs fichiers à la fois sur son disque dur pour les envoyer sur le blog. Si un des fichiers dépasse la taille maximale, il ne pourra être envoyé.
        Quand vous choisissez plusieurs fichiers sur votre disque dur, ils sont mis en liste d'attente. Vous pouvez en ajouter d'autres, en cliquant de nouveau sur Choisir des fichiers. Vous pouvez aussi retirer des fichiers de la liste d'attente en cliquant sur l'icône rouge correspondante.
        Lorsque vous êtes prêts, cliquez sur Envoyer.

        Supprimer des fichiers

        Pour supprimer un fichier, cochez la case correspondante associée et cliquez sur Supprimer les médias sélectionnés. Vous pouvez choisir de supprimer plusieurs fichiers à la fois.

        Nouveau répertoire

        Ce formulaire permet de créer un nouveau répertoire dans le répertoire en cours d'utilisation. Indiquez simplement un nom comme vous le feriez sur votre ordinateur.

        Détails du média

        La page individuelle d'un média présente un ensemble d'informations sur celui-ci et permet d'effectuer quelques opérations.

        Nom du fichier
        Changer le nom du fichier en cours.
        Titre du fichier
        Changer ou donner un titre au fichier en cours.
        Date du fichier
        Changer la date du fichier.
        Privé
        Changer le caractère privé ou non du média.
        Nouveau répertoire
        Permet de changer l'emplacement du fichier.
        Changer le fichier
        Ce formulaire permet de changer le fichier tout en conservant ses attributs (nom, titre...). Comme toujours, il ne peut dépasser la taille maximale indiquée.

        Cas particulier des images

        Lors de l'ajout d'une image, jusqu'à quatre versions de celle-ci peuvent être disponibles (selon la taille de l'image d'origine) :

        • carrée : image carrée de 48 pixels de côté,
        • miniature : image réduite à 100 pixels sur son plus grand côté,
        • petite : image réduite à 240 pixels sur son plus grand côté,
        • moyenne : image réduite à 500 pixes sur son plus grand côté,
        • originale : image originale non transformée.

        Les tailles par défaut des versions miniature, petite et moyenne, peuvent être modifiées dans les paramètres du blog

        Attacher un fichier à un billet

        Vous pouvez attacher un fichier à un billet très facilement. Commencez par créer un nouveau billet et enregistrez-le. Cliquez alors sur "ajouter un fichier au billet" pour ouvrir le gestionnaire de médias.

        En cliquant sur l'icône [+] (Attacher un fichier au billet) vous pourrez joindre le fichier à votre billet.

        Les fichiers attachés à un billet seront visibles sur la page individuelle du billet, sous la forme d'une liste après le contenu du billet. Les fichiers MP3 seront automatiquement accompagnés d'un lecteur en Flash permettant la lecture directe du fichier.

        Podcast et diffusion de fichiers musicaux

        Tous les fichiers attachés à un billet seront présents dans les fils RSS de vos billets, vous permettant ainsi de réaliser des podcast de n'importe quel type de fichier.

        dotclear-2.6.2+dfsg/locales/fr/help/core_plugins.html000066400000000000000000000044311230033266200225740ustar00rootroot00000000000000 Gestions des plugins

        Mise à jour de plugins

        Lorsque de nouvelles versions des plugins installés sont disponibles sur Dotaddict, un onglet Mise à jour de plugins est disponible listant les plugins concernés avec leur numéro de version installée et celui de leur mise à jour.

        Il suffit alors d'utiliser le bouton d'action Mise à jour.

        Si plusieurs mises à jour sont disponibles, un bouton d'action en bas de page permet de Mettre à jour tous les plugins en une seule fois.

        Plugins installés

        La présence d'un logo Dotclear en début de ligne signifie que le plugin est uniquement disponible avec la distribution officielle et qu'il est un de ses composants.

        Plugins activés

        Cette liste permet de visualiser des informations (nom, version, courte description) des plugins activés. Deux actions sont possibles : Désactiver (opération réversible) ou Supprimer (opération irrévocable).

        Plugins désactivés

        Cette liste permet de visualiser les plugins ayant été désactivés. Deux actions sont possibles : Activer ou Supprimer (opération irrévocable).

        Ajouter des plugins

        Cette page permet d'installer directement un plugin disponible sur Dotaddict.

        Deux moyens de recherche sont possibles : en saisissant son nom dans le champ Rechercher dans le dépot ou en parcourant l'index.

        Depuis la liste, un clic sur le triangle , révèle un lien vers sa fiche sur Dotaddict et le lien de support indiqué par l'auteur.

        Installer ou mettre à jour manuellement

        Pour installer des plugins personnels ou disponibles ailleurs que sur Dotaddict, il existe deux procédures :

        • Déposer un fichier zip depuis votre ordinateur en utilisant le bouton Parcourir puis en sélectionnant le fichier ;
        • Télécharger un fichier zip en indiquant son adresse URL.

        Vous devrez ensuite saisir votre mot de passe pour valider l'installation du plugin.

        dotclear-2.6.2+dfsg/locales/fr/help/core_post.html000066400000000000000000000122021230033266200220730ustar00rootroot00000000000000 Rédaction d'un billet

        Rédaction du billet

        Titre du billet
        Inscrivez le titre du billet. Ce champ est obligatoire.
        Extrait
        Le contenu de ce champ s'affichera dans les pages présentant les listes de billets telles que la page d'accueil ou le tri sur une catégorie, suivi d'un lien « Lire la suite ». Il figurera également au début du billet dans le contexte de l'affichage du billet seul. Si vous ne remplissez pas ce champ, le champ Contenu sera intégralement affiché dès la page d'accueil.
        Contenu
        Le contenu du billet. Ce champ est obligatoire.
        Notes
        Cette zone de texte sert à la prise de notes ou pense-bête divers. Elle ne sera jamais affichée sur le blog.
        Catégorie
        La catégorie de votre billet. Pour créer une nouvelle catégorie, rendez vous dans la section "catégories". Vous pouvez n'affecter votre billet à aucune catégorie en choisissant la ligne vide.
        État du billet
        Permet de choisir l'état du billet après enregistrement :
        • En attente : en attente de publication.
        • Programmé : le billet sera mis en ligne aux date et heure indiquées dans le champ Publié le.
        • Non publié : billet hors ligne.
        • Publié : billet en ligne.
        Publié le
        Permet de modifier la date et l'heure de publication du billet. Si vous avez choisi le statut programmé il sera mis en ligne aux date et heure définis dans ce champ.
        Format du texte
        Permet de choisir la syntaxe de saisie du billet. Le wiki est une syntaxe simplifiée et sera converti en xhtml valide ; à moins que vous maîtrisiez parfaitement le xhtml nous vous conseillons de la choisir de préférence. Consultez la référence de la syntaxe Wiki pour plus d'informations.
        Accepter les commentaires
        Cochez ou décochez la case selon que vous souhaitez permettre ou interdire les commentaires sur le billet en particulier. L'option pour permettre ou autoriser de façon générale les commentaires se situe dans le menu Paramètres du blog.
        Accepter les rétroliens
        Un rétrolien permet de signaler un billet dans les commentaires d'un autre blog. Cochez ou décochez la case selon que vous souhaitez permettre ou interdire les rétroliens sur le billet. L'option pour permettre ou autoriser de façon générale les rétroliens se situe dans le menu Paramètres du blog.
        Billet sélectionné
        Les billets marqués comme sélectionnés apparaîtront dans le menu de votre blog, sous l'intitulé « A retenir ».
        Mot de passe du billet
        Permet de déterminer un mot de passe d'accès à un billet dans le blog. Un billet protégé par mot de passe ne sera visible nulle part sur votre blog, vous pourrez en donner l'adresse à vos lecteurs en vous rendant sur le lien voir le billet.
        URL spécifique
        Ce champ permet de choisir une URL pour un billet autre que celle par défaut après avoir cliqué sur le petit verrou placé à sa droite. Si vous essayez d'utiliser une URL déjà existante, celle-ci se verra incrémentée d'un chiffre.
        Langue du billet
        Code langue de votre billet. Par défaut, il s'agit du code de votre langue. Vous pouvez le changer, par le code d'une autre langue, par exemple "en", "fr-qc". Ce code est libre, il sera utilisé lors de l'affichage des billets.
        Annexes
        Les annexes sont tous les médias attachés au billet. Le lien d'ajout d'une annexee permet de choisir un fichier à ajouter au billet. Pensez à sauvegarder votre billet avant de choisir une annexe. Consultez l'aide du gestionnaire de médias pour plus de détails.

        Commentaires

        Liste les commentaires et rétroliens
        Depuis l'onglet Commentaires vous pouvez lire et changer l'état des commentaires (et rétroliens) de votre billet. Suivant vos permissions, vous pouvez modifier, mettre en ligne ou hors ligne, supprimer ou classer comme commentaire (ou rétrolien) indésirable.
        Ajouter un commentaire
        Depuis l'onglet Ajouter un commentaire vous pouvez répondre directement à un commentaire sans passer par votre blog. Cette interface vous permet également de saisir votre commentaire en xhtml, sans limitation. Vous devrez remplir les champs de la même manière qu'en modifiant un commentaire.

        Ajouter un commentaire

        Nom
        Nom de l'auteur. Ce champ est obligatoire.
        Email
        Adresse mail de l'auteur du commmentaire.
        Site web
        URL du site ou du blog de l'auteur du commentaire.
        Commentaire
        Contenu du commentaire. Ce champ utilise la syntaxe xhtml.
        dotclear-2.6.2+dfsg/locales/fr/help/core_posts.html000066400000000000000000000043641230033266200222700ustar00rootroot00000000000000 Gestion des billets

        Filtres de la liste des billets

        Auteur
        Permet de filtrer les billets par auteur.
        Catégorie
        Filtrer les billets par catégorie.
        État
        • En attente : en attente de publication.
        • Programmé : le billet sera mis en ligne aux date et heure indiquées dans le champ Publié le.
        • Non publié : billet hors ligne.
        • Publié : billet en ligne.
        Sélectionné
        Aucun, billet marqué comme sélectionné ou non sélectionné.
        Mois
        Filtre les billets d'un mois d'une année donné.
        Langue
        Filtre les billets selon la langue indiquée dans le champ langue du billet.
        Trier par
        Permet de trier les résultats de filtrage selon la date, le titre, la catégorie, l'auteur, l'état de publication ou l'état de sélection.
        Trier
        Indique l'ordre dans lequel on souhaite effectuer le tri.
        Billets par page
        Nombre de billets à afficher par page de résultat.

        Actions par lot sur les billets

        Il est possible d'effectuer un ensemble d'actions sur plusieurs billets, d'un seul coup. Les actions possibles dépendent des permissions de l'utilisateur.

        • Publier : mettre le billet en ligne.
        • Hors ligne : mettre le billet hors ligne.
        • Programmer : programmer le billet pour mise en ligne à la date de publication.
        • En attente : en attente de publication.
        • Changer de catégorie : envoie sur la liste des catégories pour changer celle des billets sélectionnés.
        • Changer l'auteur : permet de changer l'auteur du billet en indiquant l'identifiant de l'utilisateur qui deviendra le nouvel auteur.
        • Supprimer : supprime le billet (cette opération est irréversible).
        dotclear-2.6.2+dfsg/locales/fr/help/core_search.html000066400000000000000000000031731230033266200223620ustar00rootroot00000000000000 Recherche

        Options de recherche

        Indiquer les mots ou termes recherchés dans le champ de saisie et choisir l'étendue de la recherche :

        Rechercher dans les billets
        La recherche s'effectue dans le titre des billets, les extraits, le contenu.
        Rechercher dans les commentaires
        La recherche s'effectue dans le contenu des commentaires.

        Résultats d'une recherche

        Résultat

        Depuis la liste des résultats d'une recherche on peut cliquer sur le lien d'un des billets pour accéder à sa page de modification.

        Actions par lots

        Il est possible d'effectuer un ensemble d'actions sur plusieurs billets en une seule fois. Les actions possibles dépendent des permissions de l'utilisateur 

        • Publier : mettre le billet en ligne.
        • Hors ligne : mettre le billet hors ligne.
        • Programmer : programmer le billet pour une mise en ligne à la date de publication choisie.
        • En attente : en attente de publication.
        • Changer de catégorie : dirige vers la liste des catégories pour changer celle des billets sélectionnés.
        • Changer l'auteur : permet de changer l'auteur du billet en indiquant l'identifiant de l'utilisateur qui deviendra le nouvel auteur.
        • Supprimer : supprime le billet (cette opération est irréversible).
        dotclear-2.6.2+dfsg/locales/fr/help/core_trackbacks.html000066400000000000000000000021131230033266200232160ustar00rootroot00000000000000 Rédaction d'un billet

        Rétroliens

        Pour faire un rétrolien cliquez sur le lien Faire des rétroliens. Si vous ne voyez pas ce lien, vérifiez que votre billet est bien à l'état Publié.

        URLs à rétrolier
        Indiquez ici la ou les URL que vous aurez relevée(s) dans le(s) billet(s) vers le(s)quel(s) vous souhaitez envoyer un rétrolien.
        Envoyer l'extrait
        Par défaut, ce champ comporte le début de votre billet. C'est ce qui sera envoyé vers le blog que vous rétroliez avec un lien vers votre billet complet. Vous pouvez modifier le contenu de cette "accroche" en saisissant directement le texte de votre choix dans ce champ.
        Découverte automatique des URLs à rétrolier
        Si votre billet comporte des liens vers des billets précis et si la plate-forme du blog destinataire est configurée pour le permettre, cette fonction détectera automatiquement les URLs spécifiques d'envoi de rétrolien.
        dotclear-2.6.2+dfsg/locales/fr/help/core_update.html000066400000000000000000000036131230033266200223760ustar00rootroot00000000000000 Mise à jour

        Mise à jour

        Cette page permet de mettre à jour Dotclear de manière automatique. Si une version plus récente que la version actuellement installée existe, elle vous sera proposée. Avant de faire la mise à jour vous pouvez regarder ce que cette version va changer en cliquant sur informations sur cette version.

        Si aucune nouvelle version ne vous est proposée, vous pouvez forcer la vérification en cliquant sur Forcer la vérification de mise à jour de Dotclear.

        Si tout est correct, c'est-à-dire si vous n'avez modifié manuellement aucun fichier de l'installation, la procédure de mise à jour va :

        • faire une sauvegarde de votre installation actuelle dans le répertoire courant nommé backup-x.y.x.zip (où x.y.z sont les numéros correspondant à la version ; exemple 2.5.3)
        • télécharger la nouvelle version

        Une fois cela fait vous aurez un message tel que "Félicitations, vous êtes à un clic de la fin de la mise à jour. Finir la mise à jour."
        Cliquez sur Finir la mise à jour. Vous allez être déconnecté. La base de données sera mise à jour, si nécessaire, lorsque vous vous reconnecterez.

        Si vous avez modifié manuellement des fichiers, ceux-ci seront listés et il vous sera conseillé de faire une mise à jour manuelle.

        Gestion des fichiers de sauvegarde

        A partir de cet onglet, vous pouvez supprimer les anciens fichiers de sauvegarde.

        Vous pouvez aussi revenir à une version précédente. Ne revenez à une version précédente que si vous rencontrez d'importantes difficultés avec la nouvelle version.

        dotclear-2.6.2+dfsg/locales/fr/help/core_user.html000066400000000000000000000072261230033266200220760ustar00rootroot00000000000000 Utilisateur

        Cette page permet de créer de nouveaux utilisateurs mais aussi de modifier le profil d'utilisateurs existants.

        Pour créer (ou modifier) un utilisateur votre mot de passe vous sera demandé dans le champ Votre mot de passe.

        Profil utilisateur

        Nom d'utilisateur (Identifiant)
        Il doit être composé d'au moins 2 caractères (lettres non accentuées, chiffres ou symboles, pas d'espace). Ce champ est obligatoire.
        Mot de passe

        Indiquez deux fois le mot de passe dans les champs Mot de passe et Confirmer le mot de passe. Le mot de passe doit être long d'au moins 6 caractères. Ces deux champs sont obligatoires.

        Une indication sur la robustesse de votre mot de passe devrait appaître en regard du champ Mot de passe.

        Changement de mot de passe requis pour la connexion
        Cocher cette case permettra au nouvel utilisateur de choisir par lui-même son mot de passe de connexion.
        Super administrateur
        Ce choix attribuera toutes les permissions au profil utilisateur sur l'ensemble des blogs de l'installation.
        Nom, Prénom
        Si le pseudonyme n'est pas renseigné, le nom de l'auteur qui sera affiché sera composé des noms et prénoms renseignés dans ces champs.
        Pseudonyme
        Vous pouvez choisir ici le pseudonyme sous lequel vos billets seront signés. S'il est renseigné, le pseudonyme se substitue au nom et au prénom.
        Email
        Cette adresse sera utilisée lors de la régénération du mot de passe depuis la fenêtre d'authentification de dotclear.
        URL
        Indique le site web de l'utilisateur. S'il est indiqué, le nom du rédacteur d'un billet sera présenté comme un lien vers le site donné.

        Options utilisateur

        Langue de l'utilisateur
        Indique la langue dans laquelle on souhaite publier ses billets. Si la traduction existe, l'interface sera également traduite dans cette langue.
        Fuseau horaire de l'utilisateur
        Ce choix déterminera l'affichage de l'heure de publication des billets.
        Format d'édition préféré
        Choix de la syntaxe par défaut pour la saisie des billets. Le wiki est une syntaxe simplifiée et sera converti en xhtml valide ; à moins que vous ne maîtrisiez parfaitement le xhtml, nous vous conseillons le choix du wiki.
        État des billets par défaut
        Le statut par défaut des billets peut être déterminé à :
        • En attente : le statut de publication n'a pas encore été décidé.
        • Programmé : le billet sera mis en ligne aux date et heure indiquées dans le champ Publié le.
        • Non publié : billet hors ligne.
        • Publié : billet en ligne.
        Taille de la zone d'édition
        Fixe la hauteur de la zone d'édtion du billet. Par défaut ce paramètre est réglé à la valeur 24.
        Format de la liste des mots-clés
        Ce choix permet, dans la page d'édition d'un billet, d'afficher tous les mots-clés disponibles ou seulement les plus utilisés.
        dotclear-2.6.2+dfsg/locales/fr/help/core_user_pref.html000066400000000000000000000153721230033266200231130ustar00rootroot00000000000000 Préférences utilisateur

        Mon profil

        Nom, Prénom
        Si le pseudonyme n'est pas renseigné, le nom de l'auteur qui sera affiché sera composé des nom et prénom renseignés dans ces champs.
        Pseudonyme
        Vous pouvez choisir ici le pseudonyme avec lequel vos billets seront signés. S'il est renseigné, le pseudonyme se substitue au nom et au prénom.
        Email
        Adresse à laquelle sera envoyé un nouveau mot de passe si vous oubliez le vôtre. Cette à cette adresse également que seront envoyées les notifications de nouveaux commentaires si cette option existe sur votre installation. (Si vous modifiez ce champ, vous devrez indiquer votre mot de passe actuel dans le champ idoine en bas du formulaire pour pouvoir valider ce changement.)
        URL
        Indique le site web de l'utilisateur. S'il est indiqué, le nom du rédacteur d'un billet sera présenté comme un lien vers le site donné. (Cette information sera également utilisée pour la reconnaissance du commentaire de l'auteur d'un billet si le thème le prévoit.)
        Langue de l'utilisateur
        Indique la langue dans laquelle on souhaite publier ses entrées (billets ou pages). Si la traduction existe, l'interface sera également traduite dans cette langue.
        Fuseau horaire de l'utilisateur
        Ce choix déterminera l'affichage de l'heure de publication des entrées.
        Changer le mot de passe
        Pour changer votre mot de passe, indiquez deux fois le nouveau mot de passe dans les champs Nouveau mot de passe et Confirmer le mot de passe. Le mot de passe doit être long d'au moins 6 caractères. Si aucun mot de passe n'est spécifié, il ne sera pas changé. (Si vous modifiez ce champ, vous devez indiquer votre mot de passe actuel dans le champ idoine en bas du formulaire.)

        Mes options

        Activer l'interface avancée de la médiathèque
        Permet d'activer ou non l'interface avancée d'envoi de fichiers multiples dans la médiathèque (NB : votre navigateur doit supporter et accepter le Javascript pour bénéficier de cette fonctionnalité).
        Désactiver le glisser-déposer pour ordonnancer les éléments
        Permet de désactiver les fonctionnalités "glisser/déposer" pour le réordonnancement des éléments. Des champs numériques permettront alors d'indiquer la position des éléments.
        Nombre d'éléments affichés par page dans la médiathèque
        Définit le nombre de médias affichés par page dans la médiathèque (les dossiers sont exclus du décompte).
        Ne pas utiliser le favicon standard de Dotclear
        Permet de désactiver l'affichage du favicon standard de Dotclear dans la barre d'adresse du navigateur.
        Format d'édition préféré
        Choix de la syntaxe par défaut pour la saisie des billets. Le wiki est une syntaxe simplifiée et sera converti en xhtml valide ; à moins que vous ne maîtrisiez parfaitement le xhtml, nous vous conseillons le choix du wiki.
        État des billets par défaut
        Le statut par défaut des billets peut être déterminé à :
        • En attente : le statut de publication n'a pas encore été décidé.
        • Programmé : le billet sera mis en ligne aux date et heure indiquées dans le champ Publié le.
        • Non publié : billet hors ligne.
        • Publié : billet en ligne.
        Taille de la zone d'édition
        Fixe la hauteur de la zone d'édtion du billet. Par défaut ce paramètre est réglé à la valeur 24.
        Activer l'éditeur visuel
        Permet d'activer ou non l'éditeur visuel pour les billets, pages et description des catégories.
        Coloration syntaxique de l'éditeur de thème
        Applique une coloration syntaxique lors de l'édition des thèmes (fichiers html, css).

        Mes favoris

        Mes favoris

        Cette zone affiche les favoris actuellement utilisés. Ils peuvent être réordonnés au moyen de la souris si javascript est activé dans votre navigateur et que vous n'avez pas désactivé le "glisser/déposer" (voir plus haut). Sinon, une case permet d'attribuer à chaque favori un numéro d'ordre.

        Lorsque vous avez terminé, n'oubliez pas d'enregistrer vos modifications. Vous pouvez aussi sélectionner les favoris à supprimer du tableau de bord.

        Définir comme favoris par défaut (super administrateur)
        Permet de tranformer la liste actuelle des favoris en une liste par défaut pour tous les utilisateurs. Cette liste par défaut sera proposée aux utilisateurs s'ils n'ont pas déjà défini leur favoris.
        Favoris disponibles
        Toutes les pages d'administration pouvant être mises en favoris sont listées ici. Cochez les cases correspondantes aux favoris que vous souhaitez utiliser, puis ajoutez-les.
        Afficher les favoris en haut du menu
        Permet d'afficher la liste des favoris dans le menu latéral de gauche.
        Jeu d'icônes
        Si plusieurs jeux d'icônnes sont installés, permet de définir le jeu d'icônes de l'utilisateur.
        Modules du tableau de bord
        Les choix opérés dans cette zone détermineront l'affichage de ces blocs sur le tableau de bord.
        Afficher les liens vers la documentation
        Permet d'afficher ou non des liens rapides vers la documentation de Dotclear sur la page d'accueil du tableau de bord.
        Afficher les nouvelles de Dotclear
        Permet d'afficher ou non les dernières actualités de Dotclear sur la page d'accueil du tableau de bord.
        Afficher le formulaire de billet rapide
        Permet d'afficher ou non le formulaire "Billet rapide" sur la page d'accueil du tableau de bord.
        Afficher le nombre de tâches en retard sur l'icône Maintenance du tableau de bord
        Permet d'afficher ou non le nombre de tâches "en retard" (ie. qu'il est conseillé d'effectuer) sous l'icône "Maintenance" du tableau de bord. L'icône Maintenance doit faire partie des favoris pour que l'affichage soit opérationnel.
        Afficher la liste des tâches en retard dans un module du tableau de bord
        Permet d'afficher ou non la liste des tâches "en retard" (ie. qu'il est conseillé d'effectuer) dans une section dédiée de l'accueil du tableau de bord.
        dotclear-2.6.2+dfsg/locales/fr/help/core_users.html000066400000000000000000000063531230033266200222610ustar00rootroot00000000000000 Utilisateurs

        Cette page liste les utilisateurs sur la plateforme.

        Pour ajouter (ou modifier) les permissions d'un (ou plusieurs) utilisateur(s) votre mot de passe vous sera demandé dans le champ Votre mot de passe.

        Filtre de la liste des utilisateurs

        Chercher
        La recherche se fait sur l'identifiant de l'utilisateur. On peut chercher sur une partie de l'identifiant en utilisant le caractère joker *.
        Trier par
        On peut trier la liste des utilisateurs par leur identifiant, leur Nom, leur Prénom, leur Pseudonyme ou leur Nombre d'entrées.
        Ordre
        Indique l'ordre dans lequel on souhaite effectuer le tri (décroissant ou croissant).
        Utilisateurs par page
        Détermine le nombre d'utisateurs affichés par page de cette liste

        Actions par lots sur les utilisateurs

        Il est possible d'effectuer un ensemble d'actions sur plusieurs utilisateurs, d'un seul coup.

        • Définir les permissions : définir les permissions pour un ou plusieurs blogs.
        • Supprimer : supprimer un utilisateur de la plateforme. On ne peut pas supprimer un utilisateur ayant écrit des billets.

        Si vous choisissez de définir les permissions d'un utilisateur, vous allez être redirigé vers une nouvelle page, présentant la liste des blogs présents sur votre plateforme. Cochez les cases correspondants aux blogs pour lesquels vous voulez définir des permissions. Cliquez sur Définir les permissions.

        Permissions utilisateurs

        Pour chaque blog, vous avez un ensemble de permissions.

        • administrateur : Gestion complète du blog.
        • gérer ses propres billets et commentaires : L'utilisateur a le droit de créer des billets et d'accéder aux commentaires des billets lui appartenant.
        • publier des billets et des commentaires : L'utilisateur peut changer le statut de publication de ses propres billets et des commentaires de ceux-ci.
        • supprimer des billets et des commentaires : L'utilisateur peut supprimer ses propres billets et les commentaires de ceux-ci.
        • gérer tous les billets et commentaires : L'utilisateur peut gérer complètement les billets du blog, quel qu'en soit l'auteur.
        • gérer les catégories : L'utilisateur peut créer, modifier, supprimer des catégories.
        • gérer ses propres médias : L'utilisateur peut ajouter des médias et modifier ou supprimer les siens.
        • gérer tous les médias : L'utilisateur peut gérer les médias de n'importe quel utilisateur.

        Le statut Super administrateur se définit sur le profil de l'utilisateur.

        dotclear-2.6.2+dfsg/locales/fr/help/core_wiki.html000066400000000000000000000067071230033266200220660ustar00rootroot00000000000000 Référence de la syntaxe Wiki

        Référence de la syntaxe Wiki

        La syntaxe Wiki est une manière d'écrire du texte avec un jeu de balises réduit au minimum, permettant de couvrir les besoins les plus courants (titres, paragraphes, citations, listes...).

        Éléments de bloc
        • Laissez une ligne vide entre chaque bloc de même nature.
        • Paragraphe : texte libre, terminé par une ligne vide si suivi d'un second paragraphe.
        • Titre : !!! titre, !! titre ou ! titre pour des titres plus ou moins importants.
        • Trait horizontal : ----
        • Listes : lignes débutant par * pour des listes à puce ou # pour des listes numérotées. Vous pouvez faire des listes imbriquées en mélangeant les codes de liste. Par exemple :
          * item 1
          ** item 1.1
          * item 2
          *# item 2.1
          ...
          
        • Texte préformaté : espace avant chaque ligne de texte.
        • Bloc de citation : > devant chaque ligne de texte.
        Éléments de formatage
        • Emphase : deux apostrophes ''texte''
        • Forte emphase : deux soulignés __texte__
        • Retour forcé à la ligne : %%%
        • Insertion : deux plus ++texte++
        • Suppression : deux moins --texte--
        • Lien : [url], [nom|url], [nom|url|langue] ou [nom|url|langue|titre]
        • Image : ((url|texte alternatif)), ((url|texte alternatif|position)) ou ((url|texte alternatif|position|description longue)).
          La position peut prendre les valeurs L ou G (gauche), R ou D (droite) ou C (centré).
        • Ancre : ~ancre~
        • Acronyme : ??acronyme|titre??
        • Citation en ligne : {{citation}}, {{citation|langue}} ou {{citation|langue|url}}
        • Code : @@code ici@@
        • Note de bas de page : $$Corps de la note$$
        Empêcher le formatage du texte
        Pour insérer un caractère sans que celui-ci soit reconnu comme un caractère de formatage, ajoutez le caractère \ avant celui-ci. Par exemple : \[texte entre crochet qui n'est pas un lien\]
        Insérer du code HTML
        Vous pouvez ponctuellement avoir besoin d'insérer du code HTML dans votre texte au format Wiki. Pour cela, pour insérer du code sous forme de bloc (div, p, …) utilisez le code suivant :
        ///html
        <p style="color:red">mon texte en rouge</p>
        ///
        
        Et pour insérer du code HTML en ligne (span, …) utilisez deux apostrophes inversées comme dans le code suivant :
        ``<span style="color:blue">mon texte en bleu</span>``
        
        dotclear-2.6.2+dfsg/locales/fr/help/index.html000066400000000000000000000461711230033266200212210ustar00rootroot00000000000000

        Découverte de l'interface

        Aides contextuelles

        Outre les présentes pages d'aide générale, de nombreuses pages de l'administration disposent d'une aide contextuelle. Si javascript est disponible sur votre navigateur, elle se présente sur le côté de la page après avoir cliqué sur le lien Besoin d'aide ? (en haut à droite) ; si javascript n'est pas activé elle s'affiche en bas de la page concernée.

        Sur chaque page de l'administration, vous retrouverez les mêmes volet en haut, menu principal et pied de page. (Les emplacements de chacun de ces éléments sont indiqués ici pour une consultation sur ordinateur ; sur un mobile ou une tablette, leur emplacement varie selon la place disponible.)

        Bandeau haut

        Le volet en haut de chaque page est composé de trois éléments :

        Logo

        Par défaut, ce logo est celui de Dotclear et son lien conduit vers l'accueil de l'administration. Toutefois, un gestionnaire de plate-forme peut choisir un autre logo et diriger le lien vers autre chose que l'accueil (en général la page d'accueil du service).

        Blog(s)

        Le premier élément situé après le logo indique le bloc dit actif, c'est-à-dire celui sur lequel vous êtes en train d'agir. Si vous avez plusieurs blogs sur la même installation, cette information figure dans un menu déroulant qui permet de permuter sur un autre blog.

        Le lien suivant le nom du blog permet d'aller voir le blog dans une autre fenêtre ou un autre onglet.

        Utilisateur

        À l'extrême droite du volet haut, le lien Mon tableau de bord permet de revenir à l'accueil du blog.

        Le lien suivant, Mes préférences dirige vers la page où vous pourrez modifier vos informations personnelles, configurer votre tableau de bord et choisir vos options d'interface et d'édition.

        Étonnamment, le lien Déconnecter [votre login] permet de… se déconnecter, si si. (Chez Dotclear, on est trop forts en ergo.)

        Menu principal

        Le menu principal est situé à gauche de l'écran. Il peut être rétracté en cliquant sur sa bordure droite (puis déployé en cliquant sur cette même bordure).

        Il conduit vers les différentes pages d'administration correspondant à vos permissions sur le blog actif. Quatre blocs le composent 

        • Mes Favoris liste les pages que vous avez désignées comme telles dans l'onglet Mon tableau de bord de Mes préférences. Si vous n'avez encore choisi aucun favori, cette liste correspond au set par défaut de Dotclear ou celui du gestionnaire de la plate-forme. Si vous ne souhaitez pas afficher ce bloc, décochez la case correspondante dans vos options de tableau de bord.
        • Blog regroupe la liste de toutes les pages permettant l'alimentation et les réglages du blog actif, de la rédaction d'un article à la gestion de la médiathèque en passant par le choix de la présentation et autres paramétrages.
          Si vous ne possédez pas de droits d'administration sur le blog actif, il n'y a pas d'autre bloc après celui-ci dans le menu principal.
        • Réglages système offre l'accès aux pages permettant d'administrer l'installation Dotclear : gestion des blogs, utilisateurs et langues disponibles, installation d'extensions, réglages système. Si vous possédez des droits sur plusieurs blogs mais ne disposez pas du statut de super administrateur, il est constitué du seul item Blogs.
        • Plugins permet d'effectuer les paramétrages des plugins installés. Si les réglages d'un plugin n'impactent qu'un blog à la fois, sa page d'administration est disponible depuis le bloc Blog, mais si les réglages ont des répercussions sur toutes les pages de l'installation ils figurent ici et ne sont accessibles qu'aux utilisateurs disposant des droits de super admin.

        Pied de page

        Une version gratuite de Dotclear est offerte à tout utilisateur découvrant le secret du pied de page.

        Aide aux grands débutants

        Si vous n'êtes pas familier avec l'univers des blogs, nous vous recommandons notre documentation (sommaire complet dans les onglets Documentation de cette page) ainsi que les tutoriels qui vous sont spécialement dédiés sur le blog abc Dotclear. Par exemple :

        Le forum est un lieu d'entraide convivial où aucune question n'est considérée comme stupide. N'hésitez pas à y participer pour demander de l'aide et – pourquoi pas – aider d'autres utilisateurs à votre tour.

        Nous nous efforçons d'utiliser un vocabulaire compréhensible sans connaissances préalables. Toutefois si nous nous sommes laissés aller à employer un terme de jargon, vous en trouverez sans doute l'explication dans le glossaire de notre documentation en ligne.

        Documentation pour les utilisateurs

        Alimentation du blog

        • Billets
          • Création et édition
          • Informations du billet
          • Actions sur le billet
          • Commentaires et rétroliens d'un billet
          • Traitement par lots des billets
        • Commentaires et rétroliens
          • Suivi
          • Gestion
        • Catégories
          • Créer une catégorie
          • Éditer une catégorie
          • Supprimer une catégorie
          • Ordonner la liste des catégories
        • Mots-clés (Tags)
          • Ajouter des mots-clés
          • Gestion des mots-clés
          • Supprimer des mots-clés
        • Médias et pièces jointes
          • Créer un sous-répertoire
          • Ajouter des fichiers
          • Télécharger une archive zip du dossier courant
          • Modifier ou compléter les informations d'un fichier
          • Ajout direct de fichiers
          • Types de fichier particuliers
          • Pièces jointes
        • Contenu du menu du blog (widgets)
          • Bandeau de navigation, volet d'extra
          • Les widgets par défaut
          • Ajouter/Supprimer un widget
          • Paramétrage des widgets
        • Blogroll
          • Liste des liens
          • Ajouter un lien
          • Ajouter une catégorie de liens
          • XFN
          • Importer depuis un fichier OPML ou XBEL

        Paramétrage et personnalisations

        • Paramètres du blog
          • Informations du blog
          • Configuration du blog
          • Commentaires et rétroliens
          • Présentation du blog
          • Médias et images
          • Paramètres d'indexation
          • Antispam
          • LightBox
          • Enregistrer
          • Configuration avancée
        • Mes préférences
          • Mon profil
          • Mes options
          • Mon tableau de bord
        • Apparence du blog
          • Choisir un thème
          • Installer un thème
          • Personnaliser un thème
          • Éditeur de thème

        Lectures complémentaires

        Glossaire
        Syntaxes de saisie
        Syndication RSS, Atom

        Tutoriels

        • abc dotclear, un blog spécialement dédié aux grands débutants.
        • Tips, des tutoriels pour vous aider à personnaliser votre blog.

        Entraide

        Documentation pour les administrateurs

        Installation et mise à jour

        Annexe hébergeurs
        • Hébergeurs
          • Documentations spécifiques
          • Hébergeurs supportant Dotclear
          • Panels d'installation
          • Tester votre hébergeur

        Administration

        Gestion et maintenance

        Documentation et ressources pour les développeurs

        Design & Thèmes

        • Thèmes
          • Guide d'utilisation des thèmes
          • Les balises template
          • Annexes
        • L'héritage des thèmes
          • L'héritage des thèmes
          • Principe
          • Limitations
          • Mise en œuvre
        • Les balises de template
          • Généralités / utilitaires
          • Blog
          • Billets
          • Pagination des billets
          • Commentaires
          • Prévisualisation d'un commentaire
          • Rétroliens
          • Pièces jointes
          • Categories
          • Tags
          • Archives
          • Langues
          • Système
          • Widgets

        Code & Plugins

        Contribution & Support

        Lectures complémentaires

        • Tips, des tutoriels pour vous aider à développer.

        Conventions

        Accessibilité et ergonomie

        L'interface de Dotclear répond à la quasi totalité des critères WCAG 2.0 ; un reporting précis sera prochainement publié sur le blog du projet. À terme nous aimerions également répondre pleinement aux critères ATAG 2.0.

        L'accessibilité et l'ergonomie sont au cœur des préoccupations de l'équipe Dotclear. Nous menons régulièrement des analyses avec l'aide d'experts et procédons continuellement à des correctifs et améliorations.

        Vous pouvez nous aider dans cette tâche en ouvrant des tickets ou en participant au forum pour nous faire part des difficultés que vous rencontrez pour utiliser l'interface. Vous pouvez également y proposer de participer à des tests utilisateurs ou de rejoindre notre équipe.

        dotclear-2.6.2+dfsg/locales/fr/main.lang.php000066400000000000000000003265261230033266200206560ustar00rootroot00000000000000%s
        return a %s status).'] = 'L\'URL du blog ou la méthode de lecture de l\'URL ne semblent pas être bien réglées (%s retourne un statut %s)'; $GLOBALS['__l10n']['The URL of blog or the URL scan method might not be well set (%s does not return an ATOM feed).'] = 'L\'URL du blog ou la méthode de lecture de l\'URL ne semblent pas être bien réglées (%s ne retourne pas un flux ATOM)'; $GLOBALS['__l10n']['Blog status:'] = 'État du blog :'; $GLOBALS['__l10n']['Blog configuration'] = 'Configuration du blog'; $GLOBALS['__l10n']['Blog editor name:'] = 'Nom de l\'auteur du blog :'; $GLOBALS['__l10n']['Default language:'] = 'Langue par défaut :'; $GLOBALS['__l10n']['Blog timezone:'] = 'Fuseau horaire du blog :'; $GLOBALS['__l10n']['Copyright notice:'] = 'Note de copyright :'; $GLOBALS['__l10n']['New post URL format:'] = 'Format d\'URL des nouveaux billets :'; $GLOBALS['__l10n']['HTML tag for the title of the notes on the blog:'] = 'Balise HTML pour le titre des notes sur le blog :'; $GLOBALS['__l10n']['Enable XML/RPC interface'] = 'Activer l\'interface XML/RPC'; $GLOBALS['__l10n']['XML/RPC interface allows you to edit your blog with an external client.'] = 'L\'interface XML/RPC vous permet de publier sur votre blog avec un client externe.'; $GLOBALS['__l10n']['XML/RPC interface is active. You should set the following parameters on your XML/RPC client:'] = 'L\'interface XML/RPC est active. Vous êtes invités à indiquer les paramètres suivants dans votre client XML/RPC :'; $GLOBALS['__l10n']['Server URL:'] = 'URL du serveur :'; $GLOBALS['__l10n']['Blogging system:'] = 'Système de blog :'; $GLOBALS['__l10n']['User name:'] = 'Nom d\'utilisateur :'; $GLOBALS['__l10n']['your password'] = 'votre mot de passe'; $GLOBALS['__l10n']['Comments and trackbacks'] = 'Commentaires et rétroliens'; $GLOBALS['__l10n']['Accept comments'] = 'Accepter les commentaires'; $GLOBALS['__l10n']['Moderate comments'] = 'Modérer les commentaires'; $GLOBALS['__l10n']['Leave comments open for %s days'] = 'Laisser les commentaires ouverts durant %s jours'; $GLOBALS['__l10n']['No limit: leave blank.'] = 'Aucune limite : laisser vide.'; $GLOBALS['__l10n']['Wiki syntax for comments'] = 'Syntaxe wiki pour les commentaires'; $GLOBALS['__l10n']['Accept trackbacks'] = 'Accepter les rétroliens'; $GLOBALS['__l10n']['Moderate trackbacks'] = 'Modérer les rétroliens'; $GLOBALS['__l10n']['Leave trackbacks open for %s days'] = 'Laisser les rétroliens ouverts durant %s jours'; $GLOBALS['__l10n']['Add "nofollow" relation on comments and trackbacks links'] = 'Ajouter la relation "nofollow" aux liens des commentaires et rétroliens'; $GLOBALS['__l10n']['Blog presentation'] = 'Présentation du blog'; $GLOBALS['__l10n']['Date format:'] = 'Format des dates :'; $GLOBALS['__l10n']['Pattern of date'] = 'Modèle de date'; $GLOBALS['__l10n']['Sample:'] = 'Exemple :'; $GLOBALS['__l10n']['Time format:'] = 'Format des heures :'; $GLOBALS['__l10n']['Pattern of time'] = 'Modèle d\'heure'; $GLOBALS['__l10n']['Display smilies on entries and comments'] = 'Afficher des émoticônes dans les billets, pages et commentaires'; $GLOBALS['__l10n']['Display %s entries per page'] = 'Afficher %s billets par page'; $GLOBALS['__l10n']['Display %s entries per feed'] = 'Afficher %s billets par flux de syndication'; $GLOBALS['__l10n']['Display %s comments per feed'] = 'Afficher %s commentaires par flux de syndication'; $GLOBALS['__l10n']['Truncate feeds'] = 'Tronquer les flux de syndication'; $GLOBALS['__l10n']['Include sub-categories in category page and category posts feed'] = 'Inclure les sous-catégories dans la page des catégories et dans les flux de billets pour une catégorie'; $GLOBALS['__l10n']['Media and images'] = 'Médias et images'; $GLOBALS['__l10n']['Please note that if you change current settings bellow, they will now apply to all new images in the media manager.'] = 'Veuillez noter que si vous changez ces réglages, ils s\'appliqueront désormais à toutes les nouvelles images ajoutées à la médiathèque.'; $GLOBALS['__l10n']['Be carefull if you share it with other blogs in your installation.'] = 'Soyez prudent si plusieurs blogs de l\'installation partagent la même médiathèque.'; $GLOBALS['__l10n']['Generated image sizes (in pixels)'] = 'Tailles des miniatures générées (largeur en pixels)'; $GLOBALS['__l10n']['Default image insertion attributes'] = 'Attributs par défaut pour l\'insertion d\'image'; $GLOBALS['__l10n']['Inserted image title'] = 'Titres des images insérées'; $GLOBALS['__l10n']['Use original media date if possible'] = 'Utiliser la date originelle du média si possible'; $GLOBALS['__l10n']['It is retrieved from the picture\'s metadata.'] = 'Ces informations sont obtenues depuis les métadonnées de l\'image.'; $GLOBALS['__l10n']['Size of inserted image:'] = 'Taille de l\'image insérée :'; $GLOBALS['__l10n']['Image alignment:'] = 'Alignement de l\'image :'; $GLOBALS['__l10n']['Insert a link to the original image'] = 'Insérer le lien vers l\'image originale'; $GLOBALS['__l10n']['Search engines robots policy'] = 'Paramètres d\'indexation par les moteurs de recherche'; $GLOBALS['__l10n']['Save'] = 'Enregistrer'; $GLOBALS['__l10n']['The current blog cannot be deleted.'] = 'Le blog courant ne peut être détruit.'; $GLOBALS['__l10n']['Only superadmin can delete a blog.'] = 'Seul un superadministrateur peut supprimer un blog.'; $GLOBALS['__l10n']['Users'] = 'Utilisateurs'; $GLOBALS['__l10n']['Users on this blog'] = 'Utilisateurs de ce blog'; $GLOBALS['__l10n']['No users'] = 'Aucun utilisateur'; $GLOBALS['__l10n']['Publications on this blog:'] = 'Publications sur ce blog :'; $GLOBALS['__l10n']['%1$s: %2$s'] = '%1$s : %2$s'; $GLOBALS['__l10n']['Permissions:'] = 'Permissions :'; $GLOBALS['__l10n']['Super administrator'] = 'Super administrateur'; $GLOBALS['__l10n']['All rights on all blogs.'] = 'Tous les droits sur tous les blogs.'; $GLOBALS['__l10n']['[%s] (unreferenced permission)'] = '[%s] (permission non référencée)'; $GLOBALS['__l10n']['All rights on this blog.'] = 'Tous les droits sur ce blog.'; $GLOBALS['__l10n']['Change permissions'] = 'Changer les permissions'; $GLOBALS['__l10n']['Blog appearance'] = 'Apparence du blog'; $GLOBALS['__l10n']['Theme configuration'] = 'Personnaliser ce thème'; $GLOBALS['__l10n']['Themes management'] = 'Gestion des thèmes'; $GLOBALS['__l10n']['Update themes'] = 'Mettre à jour les thèmes'; $GLOBALS['__l10n']['There is one theme to update available from repository.'][0] = 'Il y a un thème à mettre à jour depuis le dépôt.'; $GLOBALS['__l10n']['There is one theme to update available from repository.'][1] = 'Il y a %s thèmes à mettre à jour depuis le dépôt.'; $GLOBALS['__l10n']['Visit %s repository, the resources center for Dotclear.'] = 'Visitez le dépôt %s, le centre de ressources pour Dotclear'; $GLOBALS['__l10n']['Installed themes'] = 'Thèmes installés'; $GLOBALS['__l10n']['You can configure and manage installed themes from this list.'] = 'Vous pouvez configurer et gérer les thèmes de cette liste.'; $GLOBALS['__l10n']['Deactivated themes'] = 'Thèmes désactivés'; $GLOBALS['__l10n']['Deactivated themes are installed but not usable. You can activate them from here.'] = 'Les thèmes désactivés sont installés mais non utilisables. Vous pouvez les activer depuis cette page.'; $GLOBALS['__l10n']['Add themes'] = 'Ajouter des thèmes'; $GLOBALS['__l10n']['Add themes from repository'] = 'Ajouter des thèmes depuis le dépôt'; $GLOBALS['__l10n']['Install or upgrade manually'] = 'Installer ou mettre à jour manuellement'; $GLOBALS['__l10n']['Add themes from a package'] = 'Ajouter des thèmes depuis un package'; $GLOBALS['__l10n']['You can install themes by uploading or downloading zip files.'] = 'Vous pouvez installer des thèmes en déposant ou téléchargeant des fichiers zip.'; $GLOBALS['__l10n']['Last update'] = 'Dernière mise à jour'; $GLOBALS['__l10n']['Blog name'] = 'Nom du blog'; $GLOBALS['__l10n']['Blog ID'] = 'Identifiant du blog'; $GLOBALS['__l10n']['Descending'] = 'Décroissant'; $GLOBALS['__l10n']['Ascending'] = 'Croissant'; $GLOBALS['__l10n']['Show filters and display options'] = 'Afficher les filtres et options d\'affichage'; $GLOBALS['__l10n']['Cancel filters and display options'] = 'Annuler les filtres et options d\'affichage'; $GLOBALS['__l10n']['List of blogs'] = 'Liste des blogs'; $GLOBALS['__l10n']['Blog has been successfully deleted.'] = 'Le blog a été supprimé.'; $GLOBALS['__l10n']['Create a new blog'] = 'Créer un nouveau blog'; $GLOBALS['__l10n']['Filter blogs list'] = 'Filtrer la liste des blogs'; $GLOBALS['__l10n']['Filters'] = 'Filtres'; $GLOBALS['__l10n']['Search:'] = 'Chercher :'; $GLOBALS['__l10n']['Display options'] = 'Options d\'affichage'; $GLOBALS['__l10n']['Order by:'] = 'Trier par :'; $GLOBALS['__l10n']['Sort:'] = 'Ordre :'; $GLOBALS['__l10n']['Show'] = 'Afficher'; $GLOBALS['__l10n']['blogs per page'] = 'blogs par page'; $GLOBALS['__l10n']['Apply filters and display options'] = 'Appliquer les filtres et options d\'affichage'; $GLOBALS['__l10n']['No blog matches the filter'] = 'Aucun blog correspondant au filtre'; $GLOBALS['__l10n']['No blog'] = 'Pas de blog'; $GLOBALS['__l10n']['%d blog matches the filter.'][0] = '%d blog correspondant au filtre'; $GLOBALS['__l10n']['%d blog matches the filter.'][1] = '%d blogs correspondants au filtre'; $GLOBALS['__l10n']['Blogs list'] = 'Liste des blogs'; $GLOBALS['__l10n']['Blog id'] = 'Identifiant du blog'; $GLOBALS['__l10n']['Entries (all types)'] = 'Entrées'; $GLOBALS['__l10n']['Status'] = 'État'; $GLOBALS['__l10n']['Edit blog settings for %s'] = 'Modifier les paramètres de %s'; $GLOBALS['__l10n']['Edit blog settings'] = 'Modifier les paramètres du blog'; $GLOBALS['__l10n']['Switch to blog %s'] = 'Passer au blog %s'; $GLOBALS['__l10n']['This category does not exist.'] = 'Cette catégorie n\'existe pas.'; $GLOBALS['__l10n']['The category "%s" has been successfully deleted.'] = 'La catégorie "%s" a été supprimée.'; $GLOBALS['__l10n']['Category where to move posts does not exist'] = 'La catégorie où les entrées seront déplacées n\'existe pas.'; $GLOBALS['__l10n']['The entries have been successfully moved to category "%s"'] = 'Les billets ont été déplacés dans la catégorie "%s".'; $GLOBALS['__l10n']['Categories have been successfully reordered.'] = 'Les catégories ont été réordonnées.'; $GLOBALS['__l10n']['Categories order has been successfully reset.'] = 'Les catégories ont été réordonnées par défaut.'; $GLOBALS['__l10n']['Categories'] = 'Catégories'; $GLOBALS['__l10n']['The category has been successfully removed.'][0] = 'La catégorie a été déplacée.'; $GLOBALS['__l10n']['The category has been successfully removed.'][1] = 'Les catégories ont été déplacées.'; $GLOBALS['__l10n']['Entries have been successfully moved to the category you choose.'] = 'Les billets ont été déplacés dans la catégorie choisie.'; $GLOBALS['__l10n']['New category'] = 'Nouvelle catégorie'; $GLOBALS['__l10n']['No category so far.'] = 'Pas de catégorie pour le moment.'; $GLOBALS['__l10n']['%d entries'] = '%d billets'; $GLOBALS['__l10n']['%d entry'][0] = '%d billet'; $GLOBALS['__l10n']['%d entry'][1] = '%d billets'; $GLOBALS['__l10n']['total:'] = 'total :'; $GLOBALS['__l10n']['URL:'] = 'URL :'; $GLOBALS['__l10n']['Move entries to'] = 'Déplacer les billets vers'; $GLOBALS['__l10n']['OK'] = 'OK'; $GLOBALS['__l10n']['Delete category'] = 'Supprimer la catégorie'; $GLOBALS['__l10n']['To rearrange categories order, move items by drag and drop, then click on “Save categories order” button.'] = 'Pour modifier l\'ordre des catégories, déplacez les items par glisser-déposer puis cliquez sur le bouton "Enregistrer l\'ordre des catégories".'; $GLOBALS['__l10n']['Save categories order'] = 'Enregistrer l\'ordre des catégories'; $GLOBALS['__l10n']['Reorder all categories on the top level'] = 'Replacer toutes les catégories au premier niveau'; $GLOBALS['__l10n']['Top level'] = 'Premier niveau'; $GLOBALS['__l10n']['The category has been successfully moved'] = 'La catégorie a été déplacée.'; $GLOBALS['__l10n']['The category has been successfully updated.'] = 'La catégorie a été mise à jour.'; $GLOBALS['__l10n']['The category "%s" has been successfully created.'] = 'La catégorie "%s" a été créée.'; $GLOBALS['__l10n']['Category has been successfully updated.'] = 'La catégorie a été mise à jour.'; $GLOBALS['__l10n']['Category information'] = 'Détails de la catégorie'; $GLOBALS['__l10n']['Name:'] = 'Nom :'; $GLOBALS['__l10n']['Parent:'] = 'Parent :'; $GLOBALS['__l10n']['Warning: If you set the URL manually, it may conflict with another category.'] = 'Attention : si vous indiquez l\'URL manuellement, celle-ci peut entrer en conflit avec une autre catégorie.'; $GLOBALS['__l10n']['Description:'] = 'Description :'; $GLOBALS['__l10n']['Move this category'] = 'Déplacer cette catégorie'; $GLOBALS['__l10n']['Category parent'] = 'Catégorie parente'; $GLOBALS['__l10n']['Category sibling'] = 'Catégorie voisine'; $GLOBALS['__l10n']['Move current category'] = 'Déplacer la catégorie'; $GLOBALS['__l10n']['after'] = 'après'; $GLOBALS['__l10n']['before'] = 'avant'; $GLOBALS['__l10n']['position: '] = 'position : '; $GLOBALS['__l10n']['Entry does not exist.'] = 'Ce billet n\'existe pas.'; $GLOBALS['__l10n']['Comment has been successfully created.'] = 'Le commentaire a été créé.'; $GLOBALS['__l10n']['No comment'] = 'Aucun commentaire'; $GLOBALS['__l10n']['Comment has been successfully updated.'] = 'Le commentaire a été mis à jour.'; $GLOBALS['__l10n']['Comment has been successfully deleted.'] = 'Le commentaire a été effacé.'; $GLOBALS['__l10n']['You can\'t edit this comment.'] = 'Vous ne pouvez pas modifier ce commentaire.'; $GLOBALS['__l10n']['Edit comment'] = 'Modifier le commentaire'; $GLOBALS['__l10n']['Your comment on my blog %s'] = 'Votre commentaire sur mon blog %s'; $GLOBALS['__l10n']['Hi! You wrote a comment on: %s '] = 'Bonjour, Vous avez déposé un commentaire sur : %s '; $GLOBALS['__l10n']['Send an e-mail'] = 'Envoyer un email'; $GLOBALS['__l10n']['Information collected'] = 'Informations recueillies'; $GLOBALS['__l10n']['IP address:'] = 'Adresse IP :'; $GLOBALS['__l10n']['Date:'] = 'Date :'; $GLOBALS['__l10n']['Comment submitted'] = 'Commentaire déposé'; $GLOBALS['__l10n']['Author:'] = 'Auteur :'; $GLOBALS['__l10n']['Web site:'] = 'Site web :'; $GLOBALS['__l10n']['Status:'] = 'État :'; $GLOBALS['__l10n']['Comment:'] = 'Commentaire :'; $GLOBALS['__l10n']['Delete'] = 'Supprimer'; $GLOBALS['__l10n']['Comment'] = 'Commentaire'; $GLOBALS['__l10n']['Trackback'] = 'Rétrolien'; $GLOBALS['__l10n']['Date'] = 'Date'; $GLOBALS['__l10n']['Entry title'] = 'Titre de l\'entrée'; $GLOBALS['__l10n']['Author'] = 'Auteur'; $GLOBALS['__l10n']['Selected comments have been successfully updated.'] = 'Les entrées sélectionnées ont été modifiées.'; $GLOBALS['__l10n']['Selected comments have been successfully deleted.'] = 'Les commentaires sélectionnés ont été supprimés.'; $GLOBALS['__l10n']['Spam comments have been successfully deleted.'] = 'Les commentaires indésirables ont été supprimés.'; $GLOBALS['__l10n']['You have one spam comment.'] = 'Vous avez un commentaire indésirable.'; $GLOBALS['__l10n']['Show it.'] = 'L\'afficher.'; $GLOBALS['__l10n']['You have %s spam comments.'] = 'Vous avez %s commentaires indésirables.'; $GLOBALS['__l10n']['Show them.'] = 'Les afficher.'; $GLOBALS['__l10n']['Delete all spams'] = 'Supprimer tous les indésirables'; $GLOBALS['__l10n']['Filter comments and trackbacks list'] = 'Filtrer la liste des commentaires et rétroliens'; $GLOBALS['__l10n']['Type:'] = 'Type :'; $GLOBALS['__l10n']['comments per page'] = 'commentaires par page'; $GLOBALS['__l10n']['Selected comments action:'] = 'Action sur les commentaires sélectionnés :'; $GLOBALS['__l10n']['Actions'] = 'Actions'; $GLOBALS['__l10n']['ok'] = 'ok'; $GLOBALS['__l10n']['Global help'] = 'Aide générale'; $GLOBALS['__l10n']['An update is available'][0] = 'Une mise à jour est disponible.'; $GLOBALS['__l10n']['An update is available'][1] = '%s mises à jour sont disponibles.'; $GLOBALS['__l10n']['Dotclear news'] = 'Actualité de Dotclear'; $GLOBALS['__l10n']['%d %B %Y:'] = '%d %B %Y :'; $GLOBALS['__l10n']['Documentation and support'] = 'Documentation et support'; $GLOBALS['__l10n']['Dashboard'] = 'Tableau de bord'; $GLOBALS['__l10n']['Dotclear %s is available!'] = 'Dotclear %s est disponible !'; $GLOBALS['__l10n']['Upgrade now'] = 'Mettre à jour maintenant'; $GLOBALS['__l10n']['Remind me later'] = 'Me le rappeler plus tard'; $GLOBALS['__l10n']['Information about this version'] = 'Informations sur cette version'; $GLOBALS['__l10n']['Make this blog my default blog'] = 'Définir comme blog par défaut'; $GLOBALS['__l10n']['This blog is offline'] = 'Ce blog est hors ligne'; $GLOBALS['__l10n']['This blog is removed'] = 'Ce blog est retiré de la publication'; $GLOBALS['__l10n']['%s is not defined, you should edit your configuration file.'] = '%s n\'est pas défini, vous devriez corriger votre fichier de configuration.'; $GLOBALS['__l10n']['See documentation for more information.'] = 'Voir la documentation pour plus d\'information.'; $GLOBALS['__l10n']['The cache directory does not exist or is not writable. You must create this directory with sufficient rights and affect this location to "DC_TPL_CACHE" in inc/config.php file.'] = 'Le répertoire de cache n\'existe pas ou n\'est pas accessible en écriture. Vous devez créer ce répertoire avec les droits suffisants et affecter celui-ci à "DC_TPL_CACHE" dans le fichier inc/config.php.'; $GLOBALS['__l10n']['The cache directory does not exist or is not writable. You should contact your administrator.'] = 'Le répertoire de cache n\'existe pas ou n\'est pas accessible en écriture. Vous devriez contacter votre administrateur.'; $GLOBALS['__l10n']['There is no writable directory /public/ at the location set in about:config "public_path". You must create this directory with sufficient rights (or change this setting).'] = 'Il n\'existe pas de répertoire /public/ à l\'endroit spécifié pour le réglage "public_path" dans about:config. Vous devez créer ce répertoire avec les droits suffisants (ou changer ce réglage).'; $GLOBALS['__l10n']['There is no writable root directory for the media manager. You should contact your administrator.'] = 'Il n\'existe pas de répertoire principal accessible en écriture pour la médiathèque. Vous devriez contacter votre administrateur.'; $GLOBALS['__l10n']['Following plugins have been installed:'] = 'Les plugins suivants ont été installés :'; $GLOBALS['__l10n']['Following plugins have not been installed:'] = 'Les plugins suivants n\'ont pas été installés :'; $GLOBALS['__l10n']['Errors have occured with following plugins:'] = 'Des erreurs se sont produites avec les plugins suivants :'; $GLOBALS['__l10n']['Quick entry'] = 'Billet rapide'; $GLOBALS['__l10n']['New entry'] = 'Nouveau billet'; $GLOBALS['__l10n']['Title:'] = 'Titre :'; $GLOBALS['__l10n']['Content:'] = 'Contenu :'; $GLOBALS['__l10n']['Category:'] = 'Catégorie :'; $GLOBALS['__l10n']['Add a new category'] = 'Créer une nouvelle catégorie'; $GLOBALS['__l10n']['This category will be created when you will save your post.'] = 'Cette catégorie sera créée lorsque vous enregistrerez votre billet.'; $GLOBALS['__l10n']['Save and publish'] = 'Enregister et publier'; $GLOBALS['__l10n']['PHP version is %s (5.0 or earlier needed).'] = 'La version de PHP est %s (5.0 ou plus récente nécessaire.)'; $GLOBALS['__l10n']['Multibyte string module (mbstring) is not available.'] = 'Le support des chaînes multi-octets (mbstring) n\'est pas disponible.'; $GLOBALS['__l10n']['Iconv module is not available.'] = 'Le module iconv n\'est pas disponible.'; $GLOBALS['__l10n']['Output control functions are not available.'] = 'Les fonctions de bufferisation de sortie ne sont pas disponibles.'; $GLOBALS['__l10n']['SimpleXML module is not available.'] = 'Le module SimpleXML n\'est pas disponible.'; $GLOBALS['__l10n']['DOM XML module is not available.'] = 'Le module DOM XML n\'est pas disponible.'; $GLOBALS['__l10n']['PCRE engine does not support UTF-8 strings.'] = 'Le moteur d\'expressions rationnelles PCRE n\'accepte pas les chaînes UTF-8.'; $GLOBALS['__l10n']['SPL module is not available.'] = 'Le module SPL n\'est pas disponible.'; $GLOBALS['__l10n']['MySQL version is %s (4.1 or earlier needed).'] = 'La version de MySQL est %s (4.1 ou plus récente nécessaire).'; $GLOBALS['__l10n']['MySQL InnoDB engine is not available.'] = 'Le gestionnaire de stockage InnoDB de MySQL n\'est pas disponible.'; $GLOBALS['__l10n']['PostgreSQL version is %s (8.0 or earlier needed).'] = 'La version de PostgreSQL est %s (8.0 ou plus récente nécessaire).'; $GLOBALS['__l10n']['Please set a master key (DC_MASTER_KEY) in configuration file.'] = 'Veuillez indiquer une clé de référence (DC_MASTER_KEY) dans le fichier de configuration.'; $GLOBALS['__l10n']['Dotclear is already installed.'] = 'Dotclear est déjà installé.'; $GLOBALS['__l10n']['Dotclear cannot be installed.'] = 'Dotclear ne peut pas être installé.'; $GLOBALS['__l10n']['No user ID given'] = 'Aucun identifiant utilisateur spécifié'; $GLOBALS['__l10n']['User ID must contain at least 2 characters using letters, numbers or symbols.'] = 'L\'identifiant utilisateur doit contenir au moins 2 caractères composés de lettres, chiffres ou symboles.'; $GLOBALS['__l10n']['Invalid email address'] = 'Adresse email incorrecte'; $GLOBALS['__l10n']['No password given'] = 'Aucun mot de passe spécifié'; $GLOBALS['__l10n']['Password must contain at least 6 characters.'] = 'Le mot de passe doit contenir au moins 6 caractères.'; $GLOBALS['__l10n']['My first blog'] = 'Mon premier blog'; $GLOBALS['__l10n']['%A, %B %e %Y'] = '%A %e %B %Y'; $GLOBALS['__l10n']['Welcome to Dotclear!'] = 'Bienvenue sur Dotclear !'; $GLOBALS['__l10n']['This is your first entry. When you\'re ready to blog, log in to edit or delete it.'] = 'Ceci est votre premier billet. Quand vous serez prêt à bloguer, connectez-vous pour le modifier ou le supprimer.'; $GLOBALS['__l10n']['Dotclear Team'] = 'L\'équipe Dotclear'; $GLOBALS['__l10n']['

        This is a comment.

        To delete it, log in and view your blog\'s comments. Then you might remove or edit it.

        '] = '

        Ceci est un commentaire

        Pour le supprimer, connectez-vous et affichez les commentaires de votre blog. Vous pourrez alors le supprimer ou le modifier.

        '; $GLOBALS['__l10n']['Dotclear Install'] = 'Installation de Dotclear'; $GLOBALS['__l10n']['Password strength: %s'] = 'Force du mot de passe : %s'; $GLOBALS['__l10n']['very weak'] = 'très faible'; $GLOBALS['__l10n']['weak'] = 'faible'; $GLOBALS['__l10n']['mediocre'] = 'moyen'; $GLOBALS['__l10n']['strong'] = 'fort'; $GLOBALS['__l10n']['very strong'] = 'très fort'; $GLOBALS['__l10n']['show'] = 'voir'; $GLOBALS['__l10n']['Dotclear installation'] = 'Installation de Dotclear'; $GLOBALS['__l10n']['Cache directory %s is not writable.'] = 'Le répertoire de cache %s n\'est pas accessible en écriture.'; $GLOBALS['__l10n']['Errors:'] = 'Erreurs :'; $GLOBALS['__l10n']['Configuration file has been successfully created.'] = 'Le fichier de configuration a été créé.'; $GLOBALS['__l10n']['User information'] = 'Informations utilisateur'; $GLOBALS['__l10n']['Please provide the following information needed to create the first user.'] = 'Merci de fournir les informations suivantes pour créer le premier utilisateur.'; $GLOBALS['__l10n']['First Name:'] = 'Prénom :'; $GLOBALS['__l10n']['Last Name:'] = 'Nom :'; $GLOBALS['__l10n']['Username and password'] = 'Identifiant et mot de passe'; $GLOBALS['__l10n']['All done!'] = 'C\'est terminé !'; $GLOBALS['__l10n']['Dotclear has been successfully installed. Here is some useful information you should keep.'] = 'Dotclear est installé. Conservez les informations suivantes précieusement.'; $GLOBALS['__l10n']['Your account'] = 'Votre compte'; $GLOBALS['__l10n']['Your blog'] = 'Votre blog'; $GLOBALS['__l10n']['Blog address:'] = 'Adresse du blog :'; $GLOBALS['__l10n']['Administration interface:'] = 'Interface d\'administration :'; $GLOBALS['__l10n']['Manage your blog now'] = 'Gérez votre blog'; $GLOBALS['__l10n']['Installation can not be completed'] = 'L\'installation ne peut pas être terminée'; $GLOBALS['__l10n']['For the said reasons, Dotclear can not be installed. Please refer to the documentation to learn how to correct the problem.'] = 'Pour les raisons ci-dessus, Dotclear ne peut pas être installé. Référez-vous à la documentation pour savoir comment corriger le problème.'; $GLOBALS['__l10n']['Path %s is not writable.'] = 'Le chemin %s n\'est pas accessible en écriture.'; $GLOBALS['__l10n']['Dotclear installation wizard could not create configuration file for you. You must change folder right or create the config.php file manually, please refer to the documentation to learn how to do this.'] = 'L\'assistant d\'installation Dotclear n\'a pas pu créer le fichier de configuration à votre place. Vous devez changer les droits du répertoire ou créer le fichier config.php manuellement. Référez-vous à la documentation pour voir comment procéder.'; $GLOBALS['__l10n']['File %s does not exist.'] = 'Le fichier %s n\'existe pas.'; $GLOBALS['__l10n']['Cannot write %s file.'] = 'Impossible d\'écrire le fichier %s.'; $GLOBALS['__l10n']['Dotclear installation wizard'] = 'Assistant d\'installation de Dotclear'; $GLOBALS['__l10n']['Welcome'] = 'Bienvenue'; $GLOBALS['__l10n']['To complete your Dotclear installation and start writing on your blog, we just need to know how to access your database and who you are. Just fill this two steps wizard with this information and we will be done.'] = 'Pour achever votre installation de Dotclear, il ne manque plus que les informations concernant votre base de données, puis vos informations personnelles. Remplissez simplement les deux formulaires suivants et vous pourrez commencer à utiliser votre blog.'; $GLOBALS['__l10n']['Attention:'] = 'Attention :'; $GLOBALS['__l10n']['this wizard may not function on every host. If it does not work for you, please refer to the documentation to learn how to create the config.php file manually.'] = 'cet assistant peut ne pas fonctionner chez tous les hébergeurs. Si vous rencontrez un problème, vous trouverez comment créer le fichier de configuration dans la documentation.'; $GLOBALS['__l10n']['System information'] = 'Informations système'; $GLOBALS['__l10n']['Please provide the following information needed to create your configuration file.'] = 'Merci de fournir les informations suivantes qui sont nécessaires pour créer votre fichier de configuration.'; $GLOBALS['__l10n']['Database type:'] = 'Type de base de données :'; $GLOBALS['__l10n']['MySQL (deprecated)'] = 'MySQL (obsolète)'; $GLOBALS['__l10n']['MySQLi'] = 'MySQLi'; $GLOBALS['__l10n']['PostgreSQL'] = 'PostgreSQL'; $GLOBALS['__l10n']['Database Host Name:'] = 'Nom d\'hôte de la base de données :'; $GLOBALS['__l10n']['Database Name:'] = 'Nom de la base de données :'; $GLOBALS['__l10n']['Database User Name:'] = 'Nom d\'utilisateur de la base de données :'; $GLOBALS['__l10n']['Database Password:'] = 'Mot de passe de la base de données :'; $GLOBALS['__l10n']['Database Tables Prefix:'] = 'Préfixe des tables de la base de données :'; $GLOBALS['__l10n']['Continue'] = 'Continuer'; $GLOBALS['__l10n']['No such installed language'] = 'Cette langue n\'est pas installée'; $GLOBALS['__l10n']['You can\'t remove English language.'] = 'Vous ne pouvez pas supprimer la langue anglaise.'; $GLOBALS['__l10n']['Permissions to delete language denied.'] = 'Permission de supprimer la langue refusée.'; $GLOBALS['__l10n']['Language has been successfully deleted.'] = 'La langue a été supprimée.'; $GLOBALS['__l10n']['Invalid language file URL.'] = 'URL de fichier de langue invalide.'; $GLOBALS['__l10n']['Language has been successfully upgraded'] = 'La langue a été mise à jour.'; $GLOBALS['__l10n']['Language has been successfully installed.'] = 'La langue a été installée.'; $GLOBALS['__l10n']['Unable to move uploaded file.'] = 'Impossible de déplacer le fichier téléchargé.'; $GLOBALS['__l10n']['Languages management'] = 'Gestion des langues'; $GLOBALS['__l10n']['Here you can install, upgrade or remove languages for your Dotclear installation.'] = 'Sur cette page, vous pouvez installer, mettre à jour ou supprimer des langues de votre installation de Dotclear.'; $GLOBALS['__l10n']['You can change your user language in your preferences or change your blog\'s main language in your blog settings.'] = 'Vous pouvez changer votre langue d\'utilisateur dans vos préférences ou changer la langue principale de votre blog dans vos Paramètres du blog.'; $GLOBALS['__l10n']['Installed languages'] = 'Langues installées'; $GLOBALS['__l10n']['No additional language is installed.'] = 'Aucune langue supplémentaire n\'est installée.'; $GLOBALS['__l10n']['Language'] = 'Langue'; $GLOBALS['__l10n']['Action'] = 'Action'; $GLOBALS['__l10n']['Install or upgrade languages'] = 'Installer ou mettre à jour une langue'; $GLOBALS['__l10n']['You can install or remove a language by adding or removing the relevant directory in your %s folder.'] = 'Vous pouvez installer ou supprimer une langue en ajoutant ou supprimant le répertoire correspondant dans votre répertoire %s.'; $GLOBALS['__l10n']['Available languages'] = 'Langues disponibles'; $GLOBALS['__l10n']['You can download and install a additional language directly from Dotclear.net. Proposed languages are based on your version: %s.'] = 'Vous pouvez télécharger et installer une langue supplémentaire directement depuis Dotclear.net. Les langues proposées sont basées sur votre version : %s.'; $GLOBALS['__l10n']['Language:'] = 'Langue :'; $GLOBALS['__l10n']['Install language'] = 'Installer la langue'; $GLOBALS['__l10n']['Upload a zip file'] = 'Déposer un fichier zip'; $GLOBALS['__l10n']['You can install languages by uploading zip files.'] = 'Vous pouvez installer des langues en déposant des fichiers zip.'; $GLOBALS['__l10n']['Language zip file:'] = 'Fichier zip de la langue :'; $GLOBALS['__l10n']['Upload language'] = 'Déposer la langue'; $GLOBALS['__l10n']['Invalid language zip file.'] = 'Fichier zip de langue invalide.'; $GLOBALS['__l10n']['The zip file does not appear to be a valid Dotclear language pack.'] = 'Le fichier zip ne semble pas être un fichier de langue Dotclear valide.'; $GLOBALS['__l10n']['An error occurred during language upgrade.'] = 'Une erreur est survenue durant la mise à jour de la langue.'; $GLOBALS['__l10n']['By names, in ascending order'] = 'Par noms croissants'; $GLOBALS['__l10n']['By names, in descending order'] = 'Par noms décroissants'; $GLOBALS['__l10n']['By dates, in ascending order'] = 'Par dates croissantes'; $GLOBALS['__l10n']['By dates, in descending order'] = 'Par dates décroissantes'; $GLOBALS['__l10n']['Directory "%s" has been successfully created.'] = 'Le répertoire "%s" a été créé.'; $GLOBALS['__l10n']['Files have been successfully uploaded.'] = 'Le fichier a été chargé.'; $GLOBALS['__l10n']['Successfully delete one media.'][0] = 'Suppression d\'un média effectuée.'; $GLOBALS['__l10n']['Successfully delete one media.'][1] = 'Suppression de %d médias effectuée.'; $GLOBALS['__l10n']['File has been successfully removed.'] = 'Le fichier a été supprimé.'; $GLOBALS['__l10n']['Directory "%s" has been successfully rebuilt.'] = 'Le répertoire "%s" a été reconstruit.'; $GLOBALS['__l10n']['Media manager'] = 'Médiathèque'; $GLOBALS['__l10n']['confirm removal'] = 'Confirmer la suppression'; $GLOBALS['__l10n']['Are you sure you want to remove %s?'] = 'Êtes-vous certain de vouloir supprimer %s ?'; $GLOBALS['__l10n']['Cancel'] = 'Annuler'; $GLOBALS['__l10n']['Yes'] = 'oui'; $GLOBALS['__l10n']['You do not have sufficient permissions to write to this folder.'] = 'Vous n\'avez pas les droits suffisants pour écrire dans ce répertoire.'; $GLOBALS['__l10n']['Directory has been successfully created.'] = 'Le répertoire a été créé.'; $GLOBALS['__l10n']['Directory has been successfully removed.'] = 'Le répertoire a été supprimé.'; $GLOBALS['__l10n']['Directory has been successfully rebuilt.'] = 'Le répertoire a été reconstruit.'; $GLOBALS['__l10n']['Zip file has been successfully extracted.'] = 'Le fichier zip a été extrait.'; $GLOBALS['__l10n']['Choose a file to attach to entry %s by clicking on %s.'] = 'Choisissez un fichier à attacher au billet %s en cliquant sur %s.'; $GLOBALS['__l10n']['Attach this file to entry'] = 'Attacher ce fichier au billet'; $GLOBALS['__l10n']['Choose a file to insert into entry by clicking on %s.'] = 'Choisissez un fichier à insérer dans le billet en cliquant sur %s.'; $GLOBALS['__l10n']['Remove selected medias'] = 'Supprimer les médias sélectionnés'; $GLOBALS['__l10n']['No file.'] = 'Aucun fichier.'; $GLOBALS['__l10n']['Sort files:'] = 'Trier les fichiers :'; $GLOBALS['__l10n']['Number of elements displayed per page:'] = 'Nombre d\'éléments affichés par page :'; $GLOBALS['__l10n']['In %s:'] = 'Dans %s :'; $GLOBALS['__l10n']['Create new directory'] = 'Créer un répertoire'; $GLOBALS['__l10n']['Directory Name:'] = 'Nom du répertoire :'; $GLOBALS['__l10n']['Backup content of %s'] = 'Sauvegarder le contenu de %s'; $GLOBALS['__l10n']['Download zip file'] = 'Télécharger un fichier zip'; $GLOBALS['__l10n']['Add files'] = 'Ajouter des fichiers'; $GLOBALS['__l10n']['Please take care to publish media that you own and that are not protected by copyright.'] = 'Veuillez prendre garde à ne publier que des médias que vous possédez ou qui ne sont pas protégés par le droit d\'auteur.'; $GLOBALS['__l10n']['Choose file'] = 'Choisir un fichier'; $GLOBALS['__l10n']['Choose files'] = 'Choisir des fichiers'; $GLOBALS['__l10n']['Maximum file size allowed:'] = 'Taille maximale de fichier autorisée :'; $GLOBALS['__l10n']['Private'] = 'Privé'; $GLOBALS['__l10n']['To send several files at the same time, you can activate the enhanced uploader in'] = 'Pour envoyer plusieurs fichiers à la fois, vous pouvez activer l\'interface avancée dans'; $GLOBALS['__l10n']['My preferences'] = 'Mes préférences'; $GLOBALS['__l10n']['Refresh'] = 'Actualiser'; $GLOBALS['__l10n']['Clear all'] = 'Tout annuler'; $GLOBALS['__l10n']['Upload'] = 'Envoyer'; $GLOBALS['__l10n']['Current settings for medias and images are defined in %s'] = 'Les réglages actuels pour les médias et les images sont définis dans les %s'; $GLOBALS['__l10n']['Blog parameters'] = 'Paramètres du blog'; $GLOBALS['__l10n']['open'] = 'ouvrir'; $GLOBALS['__l10n']['Insert this file into entry'] = 'Insérer ce fichier dans le billet'; $GLOBALS['__l10n']['delete'] = 'supprimer'; $GLOBALS['__l10n']['Not a valid file'] = 'Fichier invalide'; $GLOBALS['__l10n']['File has been successfully updated.'] = 'Le fichier a été mis à jour.'; $GLOBALS['__l10n']['Thumbnails have been successfully updated.'] = 'Les miniatures ont été mises à jour.'; $GLOBALS['__l10n']['Default media insertion settings have been successfully updated.'] = 'Les paramètres par défaut d\'insertion des médias ont été mis à jour.'; $GLOBALS['__l10n']['Are you sure to delete this media?'] = 'Êtes-vous sûr de vouloir supprimer ce média ?'; $GLOBALS['__l10n']['Insert media item'] = 'Insérer un média'; $GLOBALS['__l10n']['Image size:'] = 'Taille de l\'image :'; $GLOBALS['__l10n']['Image alignment'] = 'Alignement de l\'image'; $GLOBALS['__l10n']['Image insertion'] = 'Insertion de l\'image'; $GLOBALS['__l10n']['As a single image'] = 'En tant qu\'image uniquement'; $GLOBALS['__l10n']['As a link to the original image'] = 'En tant que lien vers l\'image originale'; $GLOBALS['__l10n']['MP3 disposition'] = 'Disposition du MP3'; $GLOBALS['__l10n']['Please note that you cannot insert mp3 files with visual editor.'] = 'Merci de noter que vous ne pouvez pas insérer de fichier mp3 avec l\'éditeur visuel.'; $GLOBALS['__l10n']['Please note that you cannot insert video files with visual editor.'] = 'Merci de noter que vous ne pouvez pas insérer de fichier vidéo avec l\'éditeur visuel.'; $GLOBALS['__l10n']['Video size'] = 'Taille de la vidéo'; $GLOBALS['__l10n']['Width:'] = 'Largeur :'; $GLOBALS['__l10n']['Height:'] = 'Hauteur :'; $GLOBALS['__l10n']['Video disposition'] = 'Disposition de la vidéo'; $GLOBALS['__l10n']['Media item will be inserted as a link.'] = 'Le média sera inséré en tant que lien.'; $GLOBALS['__l10n']['Insert'] = 'Insérer'; $GLOBALS['__l10n']['Make current settings as default'] = 'Mémoriser ces réglages d\'insertion'; $GLOBALS['__l10n']['Media details'] = 'Détails du média'; $GLOBALS['__l10n']['Available sizes:'] = 'Tailles disponibles :'; $GLOBALS['__l10n']['File owner:'] = 'Propriétaire du fichier :'; $GLOBALS['__l10n']['File type:'] = 'Type de fichier :'; $GLOBALS['__l10n']['File size:'] = 'Taille du fichier :'; $GLOBALS['__l10n']['File URL:'] = 'URL du fichier :'; $GLOBALS['__l10n']['Show entries containing this media'] = 'Afficher les entrées contenant ce média'; $GLOBALS['__l10n']['Entries containing this media'] = 'Entrées contenant ce média'; $GLOBALS['__l10n']['No entry seems contain this media.'] = 'Aucune entrée ne semble contenir ce média.'; $GLOBALS['__l10n']['published'] = 'publié'; $GLOBALS['__l10n']['unpublished'] = 'non publié'; $GLOBALS['__l10n']['scheduled'] = 'programmé'; $GLOBALS['__l10n']['pending'] = 'en attente'; $GLOBALS['__l10n']['Image details'] = 'Détails de l\'image'; $GLOBALS['__l10n']['No detail'] = 'Aucun détail'; $GLOBALS['__l10n']['Updates and modifications'] = 'Mises à jour et modifications'; $GLOBALS['__l10n']['Update thumbnails'] = 'Mettre à jour les miniatures'; $GLOBALS['__l10n']['This will create or update thumbnails for this image.'] = 'Ceci va créer ou mettre à jour les miniatures pour cette image.'; $GLOBALS['__l10n']['Extract in a new directory'] = 'Extraire dans un nouveau répertoire'; $GLOBALS['__l10n']['Extract in current directory'] = 'Extraire dans le répertoire actuel'; $GLOBALS['__l10n']['Extract archive'] = 'Extraire l\'archive'; $GLOBALS['__l10n']['This will extract archive in a new directory that should not exist yet.'] = 'Ceci va extraire l\'archive dans un nouveau répertoire qui ne doit pas encore exister.'; $GLOBALS['__l10n']['This will extract archive in current directory and will overwrite existing files or directory.'] = 'Ceci va extraire l\'archive dans le répertoire actuel et écrasera les fichiers ou répertoires existants.'; $GLOBALS['__l10n']['Extract mode:'] = 'Mode d\'extraction :'; $GLOBALS['__l10n']['Extract'] = 'Extraire'; $GLOBALS['__l10n']['Change media properties'] = 'Changer les propriétés du média'; $GLOBALS['__l10n']['File name:'] = 'Nom du fichier :'; $GLOBALS['__l10n']['File title:'] = 'Titre du fichier :'; $GLOBALS['__l10n']['File date:'] = 'Date du fichier :'; $GLOBALS['__l10n']['New directory:'] = 'Nouveau répertoire :'; $GLOBALS['__l10n']['Change file'] = 'Changer le fichier'; $GLOBALS['__l10n']['Choose a file:'] = 'Choisir un fichier :'; $GLOBALS['__l10n']['Maximum size %s'] = 'Taille maximale %s'; $GLOBALS['__l10n']['Send'] = 'Envoyer'; $GLOBALS['__l10n']['Delete this media'] = 'Supprimer ce média'; $GLOBALS['__l10n']['No content found on this plugin.'] = 'Aucun contenu pour ce plugin.'; $GLOBALS['__l10n']['Plugin not found'] = 'Plugin introuvable'; $GLOBALS['__l10n']['The plugin you reached does not exist or does not have an admin page.'] = 'Le plugin que vous essayez d\'atteindre n\'existe pas ou n\'a pas de page d\'administration.'; $GLOBALS['__l10n']['Plugins management'] = 'Gestion des plugins'; $GLOBALS['__l10n']['Plugin configuration'] = 'Configuration du plugin'; $GLOBALS['__l10n']['Update plugins'] = 'Mise à jour des plugins'; $GLOBALS['__l10n']['There is one plugin to update available from repository.'][0] = 'Il y a un plugin à mettre à jour depuis le dépôt.'; $GLOBALS['__l10n']['There is one plugin to update available from repository.'][1] = 'Il y a %s plugins à mettre à jour depuis le dépôt.'; $GLOBALS['__l10n']['Installed plugins'] = 'Plugins installés'; $GLOBALS['__l10n']['Activated plugins'] = 'Plugins activés'; $GLOBALS['__l10n']['You can configure and manage installed plugins from this list.'] = 'Vous pouvez configurer et gérer les plugins installés depuis cette liste.'; $GLOBALS['__l10n']['Deactivated plugins'] = 'Plugins désactivés'; $GLOBALS['__l10n']['Deactivated plugins are installed but not usable. You can activate them from here.'] = 'Les plugins désactivés sont installés mais non utilisables. Vous pouvez les activer depuis cette page.'; $GLOBALS['__l10n']['Add plugins'] = 'Ajouter des plugins'; $GLOBALS['__l10n']['Add plugins from repository'] = 'Ajouter des plugins depuis le dépôt'; $GLOBALS['__l10n']['Add plugins from a package'] = 'Ajouter des plugins depuis un package'; $GLOBALS['__l10n']['You can install plugins by uploading or downloading zip files.'] = 'Vous pouvez installer des plugins en déposant ou téléchargeant des fichiers zip.'; $GLOBALS['__l10n']['Some functions are disabled, please give write access to your plugins directory to enable them.'] = 'Certaines fonctions sont désactivées, donnez un accès en écriture à votre répertoire de plugins pour les activer.'; $GLOBALS['__l10n']['Add a link'] = 'Ajouter un lien'; $GLOBALS['__l10n']['Link URL:'] = 'URL du lien :'; $GLOBALS['__l10n']['Link title:'] = 'Titre du lien :'; $GLOBALS['__l10n']['Link language:'] = 'Langue du lien :'; $GLOBALS['__l10n']['Add a link to an entry'] = 'Ajouter un lien vers une entrée'; $GLOBALS['__l10n']['Entry type:'] = 'Type d\'entrées :'; $GLOBALS['__l10n']['Ok'] = 'Ok'; $GLOBALS['__l10n']['Search entry:'] = 'Rechercher une entrée :'; $GLOBALS['__l10n']['Search'] = 'Rechercher'; $GLOBALS['__l10n']['cancel'] = 'annuler'; $GLOBALS['__l10n']['Edit entry'] = 'Modifier le billet'; $GLOBALS['__l10n']['This entry does not exist.'] = 'Ce billet n\'existe pas.'; $GLOBALS['__l10n']['Next entry'] = 'Billet suivant'; $GLOBALS['__l10n']['Previous entry'] = 'Billet précédent'; $GLOBALS['__l10n']['All pings sent.'] = 'Tous les rétroliens ont été envoyés.'; $GLOBALS['__l10n']['Invalid publication date'] = 'Date de publication invalide'; $GLOBALS['__l10n']['The post "%s" has been successfully updated'] = 'Le billet "%s" a été mis à jour.'; $GLOBALS['__l10n']['Entry has been successfully created.'] = 'Le billet a été créé.'; $GLOBALS['__l10n']['Published'] = 'Publié'; $GLOBALS['__l10n']['Unpublished'] = 'Non publié'; $GLOBALS['__l10n']['Scheduled'] = 'Programmé'; $GLOBALS['__l10n']['Pending'] = 'En attente'; $GLOBALS['__l10n']['“%s”'] = '“%s”'; $GLOBALS['__l10n']['Entries'] = 'Billets'; $GLOBALS['__l10n']['Entry has been successfully updated.'] = 'Le billet a été mis à jour.'; $GLOBALS['__l10n']['File has been successfully attached.'] = 'Le fichier a été attaché.'; $GLOBALS['__l10n']['Attachment has been successfully removed.'] = 'L\'annexe a été retirée.'; $GLOBALS['__l10n']['Don\'t forget to validate your XHTML conversion by saving your post.'] = 'Enregistrez votre billet pour valider la transformation en XHTML.'; $GLOBALS['__l10n']['Go to this entry on the site'] = 'Voir ce billet sur le site'; $GLOBALS['__l10n']['Entry status'] = 'État du billet'; $GLOBALS['__l10n']['Publication date and hour'] = 'Date et heure de publication'; $GLOBALS['__l10n']['Entry language'] = 'Langue du billet'; $GLOBALS['__l10n']['Text formatting'] = 'Formatage du texte'; $GLOBALS['__l10n']['Convert to XHTML'] = 'Convertir en XHTML'; $GLOBALS['__l10n']['Filing'] = 'Classement'; $GLOBALS['__l10n']['Selected entry'] = 'Billet sélectionné'; $GLOBALS['__l10n']['Category'] = 'Catégorie'; $GLOBALS['__l10n']['Options'] = 'Options'; $GLOBALS['__l10n']['Comments and trackbacks list'] = 'Liste des commentaires et des rétroliens'; $GLOBALS['__l10n']['Warning: Comments are not more accepted for this entry.'] = 'Attention : les commentaires ne sont plus acceptés pour ce billet.'; $GLOBALS['__l10n']['Comments are not accepted on this blog so far.'] = 'Les commentaires ne sont pas acceptés sur ce blog pour le moment.'; $GLOBALS['__l10n']['Warning: Trackbacks are not more accepted for this entry.'] = 'Attention : les rétroliens ne sont plus acceptés pour ce billet.'; $GLOBALS['__l10n']['Trackbacks are not accepted on this blog so far.'] = 'Les rétroliens sont fermés sur ce blog pour le moment.'; $GLOBALS['__l10n']['Password'] = 'Mot de passe'; $GLOBALS['__l10n']['Edit basename'] = 'URL spécifique'; $GLOBALS['__l10n']['Warning: If you set the URL manually, it may conflict with another entry.'] = 'Attention : si vous indiquez l\'URL manuellement, celle-ci peut entrer en conflit avec un autre billet.'; $GLOBALS['__l10n']['Excerpt:'] = 'Extrait :'; $GLOBALS['__l10n']['Introduction to the post.'] = 'Introduction au billet.'; $GLOBALS['__l10n']['Personal notes:'] = 'Notes personnelles :'; $GLOBALS['__l10n']['Unpublished notes.'] = 'Notes non publiées.'; $GLOBALS['__l10n']['Edit post'] = 'Modifier le billet'; $GLOBALS['__l10n']['Preview'] = 'Prévisualiser'; $GLOBALS['__l10n']['Comments'] = 'Commentaires'; $GLOBALS['__l10n']['Add a comment'] = 'Ajouter un commentaire'; $GLOBALS['__l10n']['Trackbacks'] = 'Rétroliens'; $GLOBALS['__l10n']['Trackbacks received'] = 'Rétroliens reçus'; $GLOBALS['__l10n']['No trackback'] = 'Aucun rétrolien'; $GLOBALS['__l10n']['Selected trackbacks action:'] = 'Action sur les rétroliens sélectionnés :'; $GLOBALS['__l10n']['Ping blogs'] = 'Envoyer des rétroliens'; $GLOBALS['__l10n']['URLs to ping:'] = 'URLs à rétrolier :'; $GLOBALS['__l10n']['Excerpt to send:'] = 'Extrait à envoyer :'; $GLOBALS['__l10n']['Auto discover ping URLs'] = 'Découverte automatique des URL à rétrolier'; $GLOBALS['__l10n']['Previously sent pings'] = 'Rétroliens déjà envoyés'; $GLOBALS['__l10n']['IP address'] = 'Adresse IP'; $GLOBALS['__l10n']['Edit'] = 'Modifier'; $GLOBALS['__l10n']['Junk'] = 'Indésirable'; $GLOBALS['__l10n']['select this comment'] = 'Sélectionner ce commentaire'; $GLOBALS['__l10n']['select this trackback'] = 'Sélectionner ce rétrolien'; $GLOBALS['__l10n']['Edit this comment'] = 'Modifier ce commentaire'; $GLOBALS['__l10n']['This attachment does not exist'] = 'Cette annexe n\'existe pas'; $GLOBALS['__l10n']['Remove attachment'] = 'Supprimer l\'annexe'; $GLOBALS['__l10n']['Attachment'] = 'Annexe'; $GLOBALS['__l10n']['Are you sure you want to remove this attachment?'] = 'Êtes-vous certain de vouloir supprimer cette annexe ?'; $GLOBALS['__l10n']['(No cat)'] = '(aucune)'; $GLOBALS['__l10n']['Selected'] = 'Sélectionné'; $GLOBALS['__l10n']['Not selected'] = 'Non sélectionné'; $GLOBALS['__l10n']['With attachments'] = 'Avec annexe(s)'; $GLOBALS['__l10n']['Without attachments'] = 'Sans annexes'; $GLOBALS['__l10n']['Number of comments'] = 'Nombre de commentaires'; $GLOBALS['__l10n']['Number of trackbacks'] = 'Nombre de rétroliens'; $GLOBALS['__l10n']['Selected entries have been successfully updated.'] = 'Les entrées sélectionnées ont été modifiées.'; $GLOBALS['__l10n']['Selected entries have been successfully deleted.'] = 'Les entrées sélectionnées ont été supprimées.'; $GLOBALS['__l10n']['Selected:'] = 'Sélectionné :'; $GLOBALS['__l10n']['Attachments:'] = 'Annexes :'; $GLOBALS['__l10n']['Month:'] = 'Mois :'; $GLOBALS['__l10n']['Lang:'] = 'Langue :'; $GLOBALS['__l10n']['entries per page'] = 'billets par page'; $GLOBALS['__l10n']['Selected entries action:'] = 'Action sur les billets sélectionnés :'; $GLOBALS['__l10n']['Default'] = 'Défaut'; $GLOBALS['__l10n']['If you want to change your email or password you must provide your current password.'] = 'Si vous voulez modifier votre adresse email ou votre mot de passe, vous devez indiquer votre mot de passe actuel.'; $GLOBALS['__l10n']['Personal information has been successfully updated.'] = 'Vos informations personnelles ont été enregistrées.'; $GLOBALS['__l10n']['Personal options has been successfully updated.'] = 'Vos options personnelles ont été enregistrées.'; $GLOBALS['__l10n']['Dashboard options has been successfully updated.'] = 'Vos options du tableau de bord ont été enregistrées.'; $GLOBALS['__l10n']['No favorite selected'] = 'Aucun favori sélectionné'; $GLOBALS['__l10n']['Favorites have been successfully added.'] = 'Les favoris ont été ajoutés.'; $GLOBALS['__l10n']['Favorites have been successfully removed.'] = 'Les favoris ont été retirés.'; $GLOBALS['__l10n']['Favorites have been successfully updated.'] = 'Les favoris ont été mis à jour.'; $GLOBALS['__l10n']['Default favorites have been successfully updated.'] = 'Les favoris par défaut ont été enregistrés.'; $GLOBALS['__l10n']['My profile'] = 'Mon profil'; $GLOBALS['__l10n']['Display name:'] = 'Pseudonyme :'; $GLOBALS['__l10n']['Language for my interface:'] = 'Langue de mon interface :'; $GLOBALS['__l10n']['My timezone:'] = 'Mon fuseau horaire :'; $GLOBALS['__l10n']['Change my password'] = 'Changer mon mot de passe'; $GLOBALS['__l10n']['Confirm new password:'] = 'Confirmer le nouveau mot de passe :'; $GLOBALS['__l10n']['Your current password:'] = 'Votre mot de passe actuel :'; $GLOBALS['__l10n']['If you have changed your email or password you must provide your current password to save these modifications.'] = 'Si vous avez modifié votre adresse email ou votre mot de passe, vous devez indiquer votre mot de passe actuel pour enregistrer ces modifications.'; $GLOBALS['__l10n']['Update my profile'] = 'Mettre à jour mon profil'; $GLOBALS['__l10n']['My options'] = 'Mes options'; $GLOBALS['__l10n']['Interface'] = 'Interface'; $GLOBALS['__l10n']['Activate enhanced uploader in media manager'] = 'Activer l\'interface avancée de la médiathèque'; $GLOBALS['__l10n']['Disable javascript powered drag and drop for ordering items'] = 'Désactiver le glisser-déposer pour ordonnancer les éléments'; $GLOBALS['__l10n']['If checked, numeric fields will allow to type the elements\' ordering number.'] = 'Si cette option est cochée, des champs numériques permettront d\'indiquer la position des éléments.'; $GLOBALS['__l10n']['Number of elements displayed per page in media manager:'] = 'Nombre d\'éléments affichés par page dans la médiathèque :'; $GLOBALS['__l10n']['Do not use standard favicon'] = 'Ne pas utiliser le favicon standard de Dotclear'; $GLOBALS['__l10n']['This will be applied for all users'] = 'Ce choix sera appliqué pour tous les utilisateurs'; $GLOBALS['__l10n']['Edition'] = 'Édition'; $GLOBALS['__l10n']['Preferred format:'] = 'Format d\'édition préféré :'; $GLOBALS['__l10n']['Default entry status:'] = 'État des billets par défaut :'; $GLOBALS['__l10n']['Entry edit field height:'] = 'Taille de la zone d\'édition :'; $GLOBALS['__l10n']['Enable WYSIWYG mode'] = 'Activer l\'éditeur visuel'; $GLOBALS['__l10n']['Other options'] = 'Autres options'; $GLOBALS['__l10n']['Save my options'] = 'Enregistrer mes options'; $GLOBALS['__l10n']['My dashboard'] = 'Mon tableau de bord'; $GLOBALS['__l10n']['My favorites'] = 'Mes favoris'; $GLOBALS['__l10n']['position of %s'] = 'position de %s'; $GLOBALS['__l10n']['Save order'] = 'Enregistrer l\'ordre'; $GLOBALS['__l10n']['Delete selected favorites'] = 'Retirer les favoris sélectionnés'; $GLOBALS['__l10n']['Are you sure you want to remove selected favorites?'] = 'Êtes-vous sûr de vouloir retirer les favoris sélectionnés ?'; $GLOBALS['__l10n']['If you are a super administrator, you may define this set of favorites to be used by default on all blogs of this installation.'] = 'Si vous êtes super administrateur, vous pouvez faire de ces favoris le jeu par défaut pour tous les blogs de l\'installation.'; $GLOBALS['__l10n']['Define as default favorites'] = 'Définir comme favoris par défaut'; $GLOBALS['__l10n']['Currently no personal favorites.'] = 'La liste de vos favoris est vide pour le moment.'; $GLOBALS['__l10n']['Other available favorites'] = 'Autres favoris disponibles'; $GLOBALS['__l10n']['(default favorite)'] = '(favori par défaut)'; $GLOBALS['__l10n']['Add to my favorites'] = 'Ajouter à mes favoris'; $GLOBALS['__l10n']['Menu'] = 'Menu'; $GLOBALS['__l10n']['Display favorites at the top of the menu'] = 'Afficher les favoris en haut du menu'; $GLOBALS['__l10n']['Dashboard icons'] = 'Icônes du tableau de bord'; $GLOBALS['__l10n']['Iconset:'] = 'Jeu d\'icônes :'; $GLOBALS['__l10n']['Dashboard modules'] = 'Modules du tableau de bord'; $GLOBALS['__l10n']['Display documentation links'] = 'Afficher les liens vers la documentation'; $GLOBALS['__l10n']['Display Dotclear news'] = 'Afficher les nouvelles de Dotclear'; $GLOBALS['__l10n']['Display quick entry form'] = 'Afficher le formulaire de billet rapide'; $GLOBALS['__l10n']['Save my dashboard options'] = 'Enregistrer les options de mon tableau de bord'; $GLOBALS['__l10n']['Search options'] = 'Options de recherche'; $GLOBALS['__l10n']['Query:'] = 'Requête :'; $GLOBALS['__l10n']['Search in entries'] = 'Rechercher dans les billets'; $GLOBALS['__l10n']['Search in comments'] = 'Rechercher dans les commentaires'; $GLOBALS['__l10n']['%d entries found'] = '%d billets trouvés'; $GLOBALS['__l10n']['%d entry found'] = '%d billet trouvé'; $GLOBALS['__l10n']['%d comment found'] = '%d commentaire trouvé'; $GLOBALS['__l10n']['%d comments found'] = '%d commentaires trouvés'; $GLOBALS['__l10n']['Dotclear update'] = 'Mise à jour de Dotclear'; $GLOBALS['__l10n']['Unable to delete file %s'] = 'Impossible de supprimer le fichier %s'; $GLOBALS['__l10n']['Downloaded Dotclear archive seems to be corrupted. Try download it again.'] = 'L\'archive de Dotclear téléchargée semble être corrompue. Essayer de la télécharger à nouveau.'; $GLOBALS['__l10n']['If this problem persists try to update manually.'] = 'Si le problème persiste essayer de mettre à jour manuellement.'; $GLOBALS['__l10n']['The following files of your Dotclear installation have been modified so we won\'t try to update your installation. Please try to update manually.'] = 'Comme les fichiers suivants de votre installation de Dotclear ont été modifiés, votre installation ne peut être mise à jour. Merci de mettre à jour manuellement.'; $GLOBALS['__l10n']['The following files of your Dotclear installation are not readable. Please fix this or try to make a backup file named %s manually.'] = 'Les fichiers suivants de votre installation de Dotclear ne peuvent pas être lus. Veuillez corriger ceci ou créer un fichier de backup nommé %s manuellement.'; $GLOBALS['__l10n']['The following files of your Dotclear installation cannot be written. Please fix this or try to update manually.'] = 'Les fichiers suivants de votre installation de Dotclear ne peuvent pas être écrits. Veuillez corriger la situation ou mettre à jour manuellement.'; $GLOBALS['__l10n']['Manual checking of update done successfully.'] = 'La vérification manuelle de mise à jour a été effectuée.'; $GLOBALS['__l10n']['No newer Dotclear version available.'] = 'Aucune nouvelle version de Dotclear n\'est disponible.'; $GLOBALS['__l10n']['Force checking update Dotclear'] = 'Forcer la vérification de mise à jour de Dotclear'; $GLOBALS['__l10n']['Dotclear %s is available.'] = 'Dotclear %s est disponible.'; $GLOBALS['__l10n']['To upgrade your Dotclear installation simply click on the following button. A backup file of your current installation will be created in your root directory.'] = 'Pour mettre à jour votre installation de Dotclear, cliquez sur le bouton suivant. Un fichier de sauvegarde de votre installation actuelle sera créé dans votre répertoire principal.'; $GLOBALS['__l10n']['Update Dotclear'] = 'Mettre à jour Dotclear'; $GLOBALS['__l10n']['Manage backup files'] = 'Gestion des fichiers de sauvegarde'; $GLOBALS['__l10n']['Update backup files'] = 'Sauvegardes des mises à jour'; $GLOBALS['__l10n']['The following files are backups of previously updates. You can revert your previous installation or delete theses files.'] = 'Les fichiers suivants sont des sauvegardes de mises à jour précédentes. Vous pouvez rétablir votre installation précédente ou supprimer ces fichiers.'; $GLOBALS['__l10n']['Please note that reverting your Dotclear version may have some unwanted side-effects. Consider reverting only if you experience strong issues with this new version.'] = 'Merci de noter que rétablir votre version de Dotclear peut avoir des effets indésirables. N\'envisagez ceci que si vous rencontrez d\'importantes difficultés avec cette nouvelle version.'; $GLOBALS['__l10n']['You should not revert to version prior to last one (%s).'] = 'Vous ne devez pas rétablir une version précédant la dernière (%s).'; $GLOBALS['__l10n']['Delete selected file'] = 'Supprimer le fichier sélectionné'; $GLOBALS['__l10n']['Revert to selected file'] = 'Rétablir le fichier sélectionné'; $GLOBALS['__l10n']['Congratulations, you\'re one click away from the end of the update.'] = 'Félicitations, vous êtes à un clic de la fin de la mise à jour.'; $GLOBALS['__l10n']['Finish the update.'] = 'Finir la mise à jour.'; $GLOBALS['__l10n']['New user'] = 'Nouvel utilisateur'; $GLOBALS['__l10n']['User has been successfully updated.'] = 'L\'utilisateur a été mis à jour.'; $GLOBALS['__l10n']['User "%s" already exists.'] = 'L\'utilisateur "%s" existe déjà.'; $GLOBALS['__l10n']['User has been successfully created.'] = 'L\'utilisateur a été créé.'; $GLOBALS['__l10n']['User profile'] = 'Profil utilisateur'; $GLOBALS['__l10n']['User ID:'] = 'Identifiant (login) :'; $GLOBALS['__l10n']['Warning:'] = 'Attention :'; $GLOBALS['__l10n']['If you change your username, you will have to log in again.'] = 'Si vous changez votre login, vous devrez vous identifier à nouveau.'; $GLOBALS['__l10n']['Password change required to connect'] = 'Changement de mot de passe requis à la prochaine connexion'; $GLOBALS['__l10n']['Mandatory for password recovering procedure.'] = 'Indispensable pour la procédure de récupération de mot de passe.'; $GLOBALS['__l10n']['Timezone:'] = 'Fuseau horaire :'; $GLOBALS['__l10n']['Save and create another'] = 'Enregistrer et créer un nouveau'; $GLOBALS['__l10n']['Permissions'] = 'Permissions'; $GLOBALS['__l10n']['Add new permissions'] = 'Ajouter de nouvelles permissions'; $GLOBALS['__l10n']['No permissions so far.'] = 'Aucune permission pour le moment.'; $GLOBALS['__l10n']['Blog:'] = 'Blog :'; $GLOBALS['__l10n']['%s is super admin (all rights on all blogs).'] = '%s est super administrateur (tous les droits sur tous les blogs).'; $GLOBALS['__l10n']['Username'] = 'Identifiant'; $GLOBALS['__l10n']['Last Name'] = 'Nom'; $GLOBALS['__l10n']['First Name'] = 'Prénom'; $GLOBALS['__l10n']['Display name'] = 'Pseudonyme'; $GLOBALS['__l10n']['Number of entries'] = 'Nombre d\'entrées'; $GLOBALS['__l10n']['Set permissions'] = 'Définir les permissions'; $GLOBALS['__l10n']['User has been successfully removed.'] = 'L\'utilisateur a été supprimé.'; $GLOBALS['__l10n']['The permissions have been successfully updated.'] = 'Les permissions ont été mises à jour.'; $GLOBALS['__l10n']['users per page'] = 'utilisateurs par page'; $GLOBALS['__l10n']['Selected users action:'] = 'Action sur les utilisateurs sélectionnés :'; $GLOBALS['__l10n']['No blog or user given.'] = 'Vous n\'avez pas indiqué de blog ou d\'utilisateur'; $GLOBALS['__l10n']['You cannot delete yourself.'] = 'Vous ne pouvez pas vous supprimer vous-même.'; $GLOBALS['__l10n']['User has been successfully deleted.'] = 'L\'utilisateur a été supprimé.'; $GLOBALS['__l10n']['Back to user profile'] = 'Retour au profil utilisateur'; $GLOBALS['__l10n']['Choose one or more blogs to which you want to give permissions to users %s.'] = 'Choisissez un ou plusieurs blogs pour lesquels les utilisateurs suivants auront des permissions : %s.'; $GLOBALS['__l10n']['select'] = 'sélectionner'; $GLOBALS['__l10n']['You are about to change permissions on the following blogs for users %s.'] = 'Vous allez changer les permissions des utilisateurs %s pour ces blogs.'; $GLOBALS['__l10n']['Validate permissions'] = 'Valider les permissions'; $GLOBALS['__l10n']['Back to comments list'] = 'Retour à la liste des commentaires'; $GLOBALS['__l10n']['Comments actions'] = 'Action sur les commentaires'; $GLOBALS['__l10n']['Publish'] = 'Publier'; $GLOBALS['__l10n']['Unpublish'] = 'Mettre hors ligne'; $GLOBALS['__l10n']['Mark as pending'] = 'Mettre en attente'; $GLOBALS['__l10n']['Mark as junk'] = 'Mettre en indésirable'; $GLOBALS['__l10n']['No comment selected'] = 'Aucun commentaire sélectionné.'; $GLOBALS['__l10n']['Back to entries list'] = 'Retour à la liste des billets'; $GLOBALS['__l10n']['Entries actions'] = 'Action sur les entrées'; $GLOBALS['__l10n']['Schedule'] = 'Programmer'; $GLOBALS['__l10n']['Mark'] = 'Marquer'; $GLOBALS['__l10n']['Mark as selected'] = 'Sélectionner'; $GLOBALS['__l10n']['Mark as unselected'] = 'Désélectionner'; $GLOBALS['__l10n']['Change'] = 'Changer'; $GLOBALS['__l10n']['Change category'] = 'Changer la catégorie'; $GLOBALS['__l10n']['Change language'] = 'Changer la langue'; $GLOBALS['__l10n']['Change author'] = 'Changer l\'auteur'; $GLOBALS['__l10n']['No entry selected'] = 'Aucune entrée sélectionnée'; $GLOBALS['__l10n']['%d entry has been successfully updated to status : "%s"'][0] = '%s billet a été positionné au statut "%s".'; $GLOBALS['__l10n']['%d entry has been successfully updated to status : "%s"'][1] = '%s billets ont été positionnés au statut "%s".'; $GLOBALS['__l10n']['%d entry has been successfully marked as selected'][0] = '%s billet a été marqué sélectionné.'; $GLOBALS['__l10n']['%d entry has been successfully marked as selected'][1] = '%s billets ont été marqués sélectionnés.'; $GLOBALS['__l10n']['%d entry has been successfully marked as unselected'][0] = '%s billet a été marqué désélectionné.'; $GLOBALS['__l10n']['%d entry has been successfully marked as unselected'][1] = '%s billets ont été marqués désélectionnés.'; $GLOBALS['__l10n']['%d entry has been successfully deleted'][0] = '%s entrée a été supprimée.'; $GLOBALS['__l10n']['%d entry has been successfully deleted'][1] = '%s entrées ont été supprimées.'; $GLOBALS['__l10n']['%d entry has been successfully moved to category "%s"'][0] = '%s billet a été déplacé dans la catégorie "%s".'; $GLOBALS['__l10n']['%d entry has been successfully moved to category "%s"'][1] = '%s billets ont été déplacés dans la catégorie "%s".'; $GLOBALS['__l10n']['Change category for this selection'] = 'Changer la catégorie pour cette sélection'; $GLOBALS['__l10n']['Create a new category for the post(s)'] = 'Créer une nouvelle catégorie pour ce(s) billet(s)'; $GLOBALS['__l10n']['This user does not exist'] = 'Cet utilisateur n\'existe pas'; $GLOBALS['__l10n']['%d entry has been successfully set to user "%s"'][0] = '%s billet a été affecté à l\'utilisateur "%s".'; $GLOBALS['__l10n']['%d entry has been successfully set to user "%s"'][1] = '%s billets ont été affectés à l\'utilisateur "%s".'; $GLOBALS['__l10n']['Change author for this selection'] = 'Changer l\'auteur pour cette sélection'; $GLOBALS['__l10n']['New author (author ID):'] = 'Nouvel auteur (identifiant utilisateur) :'; $GLOBALS['__l10n']['%d entry has been successfully set to language "%s"'][0] = '%s billet mis à jour avec la langue "%s".'; $GLOBALS['__l10n']['%d entry has been successfully set to language "%s"'][1] = '%s billets mis à jour avec la langue "%s".'; $GLOBALS['__l10n']['Change language for this selection'] = 'Changer la langue de cette sélection'; $GLOBALS['__l10n']['Available'] = 'Disponible'; $GLOBALS['__l10n']['Most used'] = 'Plus utilisées'; $GLOBALS['__l10n']['Entry language:'] = 'Langue du billet :'; $GLOBALS['__l10n']['Languages'] = 'Langues'; $GLOBALS['__l10n']['%d comment'][0] = '%d commentaire'; $GLOBALS['__l10n']['%d comment'][1] = '%d commentaires'; $GLOBALS['__l10n']['Change blog'] = 'Changer de blog'; $GLOBALS['__l10n']['Blogs:'] = 'Blogs :'; $GLOBALS['__l10n']['Go to the content'] = 'Aller au contenu'; $GLOBALS['__l10n']['Go to the menu'] = 'Aller au menu'; $GLOBALS['__l10n']['Go to search'] = 'Aller à la recherche'; $GLOBALS['__l10n']['Go to help'] = 'Aller à l\'aide'; $GLOBALS['__l10n']['Go to site'] = 'Aller sur le site'; $GLOBALS['__l10n']['Logout %s'] = 'Déconnecter %s'; $GLOBALS['__l10n']['Hide main menu'] = 'Masquer le menu principal'; $GLOBALS['__l10n']['Show main menu'] = 'Afficher le menu principal'; $GLOBALS['__l10n']['Safe mode'] = 'Mode de secours'; $GLOBALS['__l10n']['You are in safe mode. All plugins have been temporarily disabled. Remind to log out then log in again normally to get back all functionalities'] = 'Vous êtes en mode de secours. Tous les plugins ont été temporairement désactivés. N\'oubliez-pas de vous déconnecter puis de vous reconnecter normalement pour retrouver toutes les fonctionnalités'; $GLOBALS['__l10n']['Error:'] = 'Erreur :'; $GLOBALS['__l10n']['[%H:%M:%S]'] = '[%H:%M:%S]'; $GLOBALS['__l10n']['Thank you for using %s.'] = 'Merci d\'utiliser %s.'; $GLOBALS['__l10n']['Go to dashboard'] = 'Tableau de bord'; $GLOBALS['__l10n']['Help about this page'] = 'Aide pour cette page'; $GLOBALS['__l10n']['See also %s'] = 'Voir également %s'; $GLOBALS['__l10n']['the global help'] = 'l\'aide générale'; $GLOBALS['__l10n']['uncover'] = 'dévoiler'; $GLOBALS['__l10n']['hide'] = 'cacher'; $GLOBALS['__l10n']['Need help?'] = 'Besoin d\'aide ?'; $GLOBALS['__l10n']['new window'] = 'nouvelle fenêtre'; $GLOBALS['__l10n']['Hide'] = 'Cacher'; $GLOBALS['__l10n']['Select:'] = 'Sélectionner :'; $GLOBALS['__l10n']['no selection'] = 'aucun'; $GLOBALS['__l10n']['select all'] = 'tous'; $GLOBALS['__l10n']['Invert selection'] = 'Inverser la sélection'; $GLOBALS['__l10n']['view entry'] = 'voir le billet'; $GLOBALS['__l10n']['Are you sure you want to delete selected entries (%s)?'] = 'Êtes-vous certain de vouloir supprimer les billets sélectionnés (%s) ?'; $GLOBALS['__l10n']['Are you sure you want to delete selected medias (%d)?'] = 'Êtes-vous sûr de vouloir supprimer les médias sélectionnés (%d) ?'; $GLOBALS['__l10n']['Are you sure you want to delete selected categories (%s)?'] = 'Êtes-vous certain de vouloir supprimer les categories sélectionnées (%s) ?'; $GLOBALS['__l10n']['Are you sure you want to delete this entry?'] = 'Êtes-vous certain de vouloir supprimer ce billet ?'; $GLOBALS['__l10n']['Click here to unlock the field'] = 'Cliquez ici pour déverrouiller ce champ'; $GLOBALS['__l10n']['Are you sure you want to delete all spams?'] = 'Êtes-vous certain de vouloir supprimer tous les indésirables ?'; $GLOBALS['__l10n']['Are you sure you want to delete selected comments (%s)?'] = 'Êtes-vous certain de vouloir supprimer les commentaires sélectionnés (%s) ?'; $GLOBALS['__l10n']['Are you sure you want to delete this comment?'] = 'Êtes-vous certain de vouloir supprimer ce commentaire ?'; $GLOBALS['__l10n']['Users with posts cannot be deleted.'] = 'Les utilisateurs ayant écrit des entrées ne peuvent être supprimés.'; $GLOBALS['__l10n']['Are you sure you want to delete selected users (%s)?'] = 'Êtes-vous certain de vouloir supprimer les utilisateurs sélectionnés (%s) ?'; $GLOBALS['__l10n']['Are you sure you want to delete category "%s"?'] = 'Êtes-vous certain de vouloir supprimer la catégorie "%s" ?'; $GLOBALS['__l10n']['Are you sure you want to reorder all categories?'] = 'Êtes-vous certain de vouloir réinitialiser l\'ordre des catégories ?'; $GLOBALS['__l10n']['Are you sure you want to remove directory "%s"?'] = 'Êtes-vous certain de vouloir supprimer le répertoire "%s" ?'; $GLOBALS['__l10n']['Are you sure you want to remove media "%s"?'] = 'Êtes-vous certain de vouloir supprimer le média "%s" ?'; $GLOBALS['__l10n']['Are you sure you want to extract archive in current directory?'] = 'Êtes-vous certain de vouloir extraire l\'archive dans le répertoire actuel ?'; $GLOBALS['__l10n']['Are you sure you want to remove attachment "%s"?'] = 'Êtes-vous certain de vouloir supprimer l\'annexe "%s" ?'; $GLOBALS['__l10n']['Are you sure you want to delete "%s" language?'] = 'Êtes-vous certain de vouloir supprimer la langue "%s" ?'; $GLOBALS['__l10n']['Are you sure you want to delete "%s" plugin?'] = 'Êtes-vous certain de vouloir supprimer le plugin "%s" ?'; $GLOBALS['__l10n']['Are you sure you want to delete selected plugins?'] = 'Êtes-vous certain de vouloir supprimer les plugins sélectionnés ?'; $GLOBALS['__l10n']['Use this theme'] = 'Utiliser ce thème'; $GLOBALS['__l10n']['Remove this theme'] = 'Supprimer ce thème'; $GLOBALS['__l10n']['Are you sure you want to delete "%s" theme?'] = 'Êtes-vous certain de vouloir supprimer le thème "%s" ?'; $GLOBALS['__l10n']['Are you sure you want to delete selected themes?'] = 'Êtes-vous certain de vouloir supprimer les thèmes sélectionnés ?'; $GLOBALS['__l10n']['Are you sure you want to delete this backup?'] = 'Êtes-vous certain de vouloir supprimer cette sauvegarde ?'; $GLOBALS['__l10n']['Are you sure you want to revert to this backup?'] = 'Êtes-vous certain de vouloir restaurer cette sauvegarde ?'; $GLOBALS['__l10n']['Zip file content'] = 'Contenu du fichier zip'; $GLOBALS['__l10n']['XHTML markup validator'] = 'Vérifier la validité XHTML'; $GLOBALS['__l10n']['XHTML content is valid.'] = 'Le contenu XHTML est valide.'; $GLOBALS['__l10n']['There are XHTML markup errors.'] = 'Il y a des erreurs XHTML.'; $GLOBALS['__l10n']['Attention: an audit of a content not yet registered.'] = 'Attention : la vérification porte sur un contenu non encore enregistré.'; $GLOBALS['__l10n']['You have unsaved changes. Switch post format will loose these changes. Proceed anyway?'] = 'Vous avez des modifications non sauvegardées. Changer de format vous fera perdre ces modifications. Continuer ?'; $GLOBALS['__l10n']['Warning: post format change will not convert existing content. You will need to apply new format by yourself. Proceed anyway?'] = 'Attention : le changement de syntaxe ne transformera pas les balises des contenus déjà saisis. Pensez à les réadapter après cette opération. Confirmez-vous ce changement de syntaxe ?'; $GLOBALS['__l10n']['Loading enhanced uploader, please wait.'] = 'Chargement de l\'interface avancée.'; $GLOBALS['__l10n']['Details'] = 'Détails'; $GLOBALS['__l10n']['Support'] = 'Assistance'; $GLOBALS['__l10n']['Help:'] = 'Aide :'; $GLOBALS['__l10n']['Section:'] = 'Section : '; $GLOBALS['__l10n']['Tags:'] = 'Mots-clés:'; $GLOBALS['__l10n']['You have unsaved changes.'] = 'Vous n\'avez pas enregistré vos modifications.'; $GLOBALS['__l10n']['close'] = 'fermer'; $GLOBALS['__l10n']['now'] = 'maintenant'; $GLOBALS['__l10n']['visual'] = 'visuel'; $GLOBALS['__l10n']['source'] = 'source'; $GLOBALS['__l10n']['You can use the following shortcuts to format your text.'] = 'Vous pouvez utiliser les raccourcis suivants pour formater votre texte.'; $GLOBALS['__l10n']['-- none --'] = '-- aucun --'; $GLOBALS['__l10n']['-- block format --'] = '-- format bloc --'; $GLOBALS['__l10n']['Paragraph'] = 'Paragraphe'; $GLOBALS['__l10n']['Level 1 header'] = 'Titre de niveau 1'; $GLOBALS['__l10n']['Level 2 header'] = 'Titre de niveau 2'; $GLOBALS['__l10n']['Level 3 header'] = 'Titre de niveau 3'; $GLOBALS['__l10n']['Level 4 header'] = 'Titre de niveau 4'; $GLOBALS['__l10n']['Level 5 header'] = 'Titre de niveau 5'; $GLOBALS['__l10n']['Level 6 header'] = 'Titre de niveau 6'; $GLOBALS['__l10n']['Strong emphasis'] = 'Forte emphase'; $GLOBALS['__l10n']['Emphasis'] = 'Emphase'; $GLOBALS['__l10n']['Inserted'] = 'Insertion'; $GLOBALS['__l10n']['Deleted'] = 'Suppression'; $GLOBALS['__l10n']['Inline quote'] = 'Citation en ligne'; $GLOBALS['__l10n']['Code'] = 'Code'; $GLOBALS['__l10n']['Line break'] = 'Passage à la ligne'; $GLOBALS['__l10n']['Blockquote'] = 'Bloc de citation'; $GLOBALS['__l10n']['Preformated text'] = 'Texte préformaté'; $GLOBALS['__l10n']['Unordered list'] = 'Liste à puces'; $GLOBALS['__l10n']['Ordered list'] = 'Liste numérotée'; $GLOBALS['__l10n']['Link'] = 'Lien'; $GLOBALS['__l10n']['URL?'] = 'URL ?'; $GLOBALS['__l10n']['Language?'] = 'Langue ?'; $GLOBALS['__l10n']['External image'] = 'Image externe'; $GLOBALS['__l10n']['Media chooser'] = 'Sélecteur de média'; $GLOBALS['__l10n']['Link to an entry'] = 'Lien vers une entrée'; $GLOBALS['__l10n']['Remove text formating'] = 'Retirer le formatage du texte'; $GLOBALS['__l10n']['Temporarily activate enhanced uploader'] = 'Activer temporairement l\'interface avancée'; $GLOBALS['__l10n']['Temporarily disable enhanced uploader'] = 'Désactiver temporairement l\'interface avancée'; $GLOBALS['__l10n']['Limit exceeded.'] = 'Limite dépassée.'; $GLOBALS['__l10n']['File size exceeds allowed limit.'] = 'La taille du fichier dépasse la limite autorisée.'; $GLOBALS['__l10n']['Canceled.'] = 'Annulé.'; $GLOBALS['__l10n']['HTTP Error:'] = 'Erreur HTTP :'; $GLOBALS['__l10n']['Clean'] = 'Nettoyer'; $GLOBALS['__l10n']['File successfully uploaded.'] = 'Le fichier a été envoyé.'; $GLOBALS['__l10n']['No file in queue.'] = 'Aucun fichier en file d\'attente.'; $GLOBALS['__l10n']['1 file in queue.'] = '1 fichier en attente.'; $GLOBALS['__l10n']['%d files in queue.'] = '%d fichiers en attente.'; $GLOBALS['__l10n']['Queue error:'] = 'Erreur de file d\'attente :'; $GLOBALS['__l10n']['other'] = 'autres'; $GLOBALS['__l10n']['Search in repository:'] = 'Rechercher dans le dépôt :'; $GLOBALS['__l10n']['Reset search'] = 'réinitialiser la recherche'; $GLOBALS['__l10n']['Search is allowed on multiple terms longer than 2 chars, terms must be separated by space.'] = 'La recherche est autorisée sur plusieurs mots de 2 caractères minimum, séparés par un espace.'; $GLOBALS['__l10n']['Found %d result for search "%s":'][0] = '%d résultat trouvé pour la recherche "%s" :'; $GLOBALS['__l10n']['Found %d result for search "%s":'][1] = '%d résultats trouvés pour la recherche "%s" :'; $GLOBALS['__l10n']['current selection'] = 'sélection courante'; $GLOBALS['__l10n']['%d result'][0] = '%d résultat'; $GLOBALS['__l10n']['%d result'][1] = '%d résultats'; $GLOBALS['__l10n']['no results'] = 'pas de résultats'; $GLOBALS['__l10n']['Browse index:'] = 'Parcourir l\'index :'; $GLOBALS['__l10n']['Plugins list'] = 'Liste des plugins'; $GLOBALS['__l10n']['Name'] = 'Nom :'; $GLOBALS['__l10n']['Score'] = 'Score'; $GLOBALS['__l10n']['Version'] = 'Version'; $GLOBALS['__l10n']['Current version'] = 'Version courante'; $GLOBALS['__l10n']['Plugin from official distribution'] = 'Plugin de la distribution officielle'; $GLOBALS['__l10n']['Configure plugin'] = 'Configurer le plugin'; $GLOBALS['__l10n']['No plugins matched your search.'] = 'Aucun plugin ne correspond à votre recherche.'; $GLOBALS['__l10n']['Activate'] = 'Activer'; $GLOBALS['__l10n']['Deactivate'] = 'Désactiver'; $GLOBALS['__l10n']['Install'] = 'Installer'; $GLOBALS['__l10n']['Update'] = 'Mise à jour'; $GLOBALS['__l10n']['Activate selected plugins'] = 'Activer les plugins sélectionnés'; $GLOBALS['__l10n']['Activate all plugins from this list'] = 'Activer tous les plugins de cette liste'; $GLOBALS['__l10n']['Deactivate selected plugins'] = 'Désactiver les plugins sélectionnés'; $GLOBALS['__l10n']['Deactivate all plugins from this list'] = 'Désactiver tous les plugins de cette liste'; $GLOBALS['__l10n']['Update selected plugins'] = 'Mettre à jour les plugins sélectionnés'; $GLOBALS['__l10n']['Update all plugins from this list'] = 'Mettre à jour tous les plugins de cette liste'; $GLOBALS['__l10n']['No such plugin.'] = 'Plugin inexistant.'; $GLOBALS['__l10n']['You don\'t have permissions to delete this plugin.'] = 'Vous n\'avez pas les permissions pour supprimer ce plugin.'; $GLOBALS['__l10n']['Some plugins have not been delete.'] = 'Certains plugins n\'ont pas pu être supprimés.'; $GLOBALS['__l10n']['Plugin has been successfully deleted.'][0] = 'Ce plugin a été supprimé.'; $GLOBALS['__l10n']['Plugin has been successfully deleted.'][1] = 'Ces plugins ont été supprimés.'; $GLOBALS['__l10n']['Plugin has been successfully installed.'][0] = 'Ce plugin a été installé.'; $GLOBALS['__l10n']['Plugin has been successfully installed.'][1] = 'Ces plugins ont été installés.'; $GLOBALS['__l10n']['Plugin has been successfully activated.'][0] = 'Ce plugin a été activé.'; $GLOBALS['__l10n']['Plugin has been successfully activated.'][1] = 'Ces plugins ont été activés.'; $GLOBALS['__l10n']['Some plugins have not been deactivated.'] = 'Certains plugins n\'ont pas pu être désactivés.'; $GLOBALS['__l10n']['Plugin has been successfully deactivated.'][0] = 'Ce plugin a été désactivé.'; $GLOBALS['__l10n']['Plugin has been successfully deactivated.'][1] = 'Ces plugins ont été désactivés.'; $GLOBALS['__l10n']['Plugin has been successfully updated.'][0] = 'Ce plugin a été mis à jour.'; $GLOBALS['__l10n']['Plugin has been successfully updated.'][1] = 'Ces plugins ont été mis à jour.'; $GLOBALS['__l10n']['Zip file path:'] = 'Chemin du fichier zip :'; $GLOBALS['__l10n']['Download a zip file'] = 'Télécharger un fichier zip'; $GLOBALS['__l10n']['Zip file URL:'] = 'URL du fichier zip :'; $GLOBALS['__l10n']['Download'] = 'Télécharger'; $GLOBALS['__l10n']['Unknow plugin ID'] = 'ID de plugin inconnu'; $GLOBALS['__l10n']['This plugin has no configuration file.'] = 'Ce plugin n\'a pas de fichier de configuration.'; $GLOBALS['__l10n']['Configure "%s"'] = 'Configurer "%s"'; $GLOBALS['__l10n']['Back'] = 'Retour'; $GLOBALS['__l10n']['Score: %s'] = 'Score: %s'; $GLOBALS['__l10n']['%s screenshot.'] = 'Capture d\'écran de %s.'; $GLOBALS['__l10n']['by %s'] = 'par %s'; $GLOBALS['__l10n']['version %s'] = 'version %s'; $GLOBALS['__l10n']['(current version %s)'] = '(version courante %s)'; $GLOBALS['__l10n']['(built on "%s")'] = '(basé sur "%s")'; $GLOBALS['__l10n']['(requires "%s")'] = '(nécessite "%s")'; $GLOBALS['__l10n']['View stylesheet'] = 'Feuille de style'; $GLOBALS['__l10n']['Configure theme'] = 'Personnaliser le thème'; $GLOBALS['__l10n']['No themes matched your search.'] = 'Aucun thème ne correspond à votre recherche.'; $GLOBALS['__l10n']['Use this one'] = 'Utiliser celui-ci'; $GLOBALS['__l10n']['Update selected themes'] = 'Mettre à jour les thèmes selectionnés'; $GLOBALS['__l10n']['Update all themes from this list'] = 'Mettre à jour tous les thèmes de cette liste'; $GLOBALS['__l10n']['No such theme.'] = 'Thème inexistant.'; $GLOBALS['__l10n']['Theme has been successfully selected.'] = 'Ce thème a été sélectionné.'; $GLOBALS['__l10n']['Theme has been successfully activated.'][0] = 'Ce thème a été activé.'; $GLOBALS['__l10n']['Theme has been successfully activated.'][1] = 'Ces thèmes ont été activé.'; $GLOBALS['__l10n']['Some themes have not been deactivated.'] = 'Certains thèmes n\'ont pas pu être desactivé.'; $GLOBALS['__l10n']['Theme has been successfully deactivated.'][0] = 'Ce thème a été désactivé.'; $GLOBALS['__l10n']['Theme has been successfully deactivated.'][1] = 'Ces thèmes ont été désactivé.'; $GLOBALS['__l10n']['You don\'t have permissions to delete this theme.'] = 'Vous n\'avez pas les permissions pour supprimer ce thème.'; $GLOBALS['__l10n']['Some themes have not been delete.'] = 'Certains thèmes n\'ont pas pu être effacé.'; $GLOBALS['__l10n']['Theme has been successfully deleted.'][0] = 'Ce thème a été supprimé.'; $GLOBALS['__l10n']['Theme has been successfully deleted.'][1] = 'Ces thèmes ont été supprimé.'; $GLOBALS['__l10n']['Theme has been successfully installed.'][0] = 'Ce thème a été installé.'; $GLOBALS['__l10n']['Theme has been successfully installed.'][1] = 'Ces thèmes ont été installé.'; $GLOBALS['__l10n']['Theme has been successfully updated.'][0] = 'Ce thème a été mis à jour.'; $GLOBALS['__l10n']['Theme has been successfully updated.'][1] = 'Ces thèmes ont été mis à jour.'; $GLOBALS['__l10n']['First page'] = 'Première page'; $GLOBALS['__l10n']['Previous page'] = 'Page précédente'; $GLOBALS['__l10n']['Next page'] = 'Page suivante'; $GLOBALS['__l10n']['Last page'] = 'Dernière page'; $GLOBALS['__l10n']['Page %s / %s'] = 'Page %s / %s'; $GLOBALS['__l10n']['Direct access page %s'] = 'Aller à la page : %s'; $GLOBALS['__l10n']['« prev.'] = '« préc.'; $GLOBALS['__l10n']['next »'] = 'suiv. »'; $GLOBALS['__l10n']['No entry matches the filter'] = 'Aucune entrée correspondant au filtre'; $GLOBALS['__l10n']['No entry'] = 'Pas de billet'; $GLOBALS['__l10n']['List of %s entries match the filter.'] = 'Liste des %s billets correspondant au filtre'; $GLOBALS['__l10n']['Entries list'] = 'Liste des entrées'; $GLOBALS['__l10n']['Protected'] = 'Protégé'; $GLOBALS['__l10n']['%d attachment'] = '%d annexe'; $GLOBALS['__l10n']['%d attachments'] = '%d annexes'; $GLOBALS['__l10n']['No comments or trackbacks matches the filter'] = 'aucun commentaire ou rétrolien ne correspond au filtre'; $GLOBALS['__l10n']['Comment or trackback matching the filter.'][0] = 'Commentaire ou rétrolien correspondant au filtre.'; $GLOBALS['__l10n']['Comment or trackback matching the filter.'][1] = 'Liste des %s commentaires ou rétroliens correspondants au filtre.'; $GLOBALS['__l10n']['Type'] = 'Type'; $GLOBALS['__l10n']['Entry'] = 'Billet'; $GLOBALS['__l10n']['Edit the %1$s from %2$s'] = 'Modifier le %1$s de %2$s'; $GLOBALS['__l10n']['comment'] = 'commentaire'; $GLOBALS['__l10n']['trackback'] = 'rétrolien'; $GLOBALS['__l10n']['Type and author'] = 'Type et auteur'; $GLOBALS['__l10n']['No user matches the filter'] = 'Aucun utilisateur correspondant au filtre'; $GLOBALS['__l10n']['No user'] = 'Aucun utilisateur'; $GLOBALS['__l10n']['List of %s users match the filter.'] = '%s utilisateurs correspondent au filtre.'; $GLOBALS['__l10n']['Users list'] = 'Liste des utilisateurs'; $GLOBALS['__l10n']['admin'] = 'Administrateur'; $GLOBALS['__l10n']['superadmin'] = 'Super administrateur'; $GLOBALS['__l10n']['Database error'] = 'Erreur de base de données'; $GLOBALS['__l10n']['There seems to be no Session table in your database. Is Dotclear completly installed?'] = 'Il semble de la table Session n\'existe pas dans votre base de données. Dotclear est-il bien installé correctement?'; $GLOBALS['__l10n']['System settings'] = 'Réglages système'; $GLOBALS['__l10n']['Blog'] = 'Blog'; $GLOBALS['__l10n']['Plugins'] = 'Plugins'; $GLOBALS['__l10n']['medium'] = 'moyenne'; $GLOBALS['__l10n']['small'] = 'petite'; $GLOBALS['__l10n']['thumbnail'] = 'vignettes'; $GLOBALS['__l10n']['square'] = 'carrée'; $GLOBALS['__l10n']['Posts'] = 'Billets'; $GLOBALS['__l10n']['Pages'] = 'Pages'; $GLOBALS['__l10n']['administrator'] = 'administrateur'; $GLOBALS['__l10n']['manage their own entries and comments'] = 'gérer ses propres billets et commentaires'; $GLOBALS['__l10n']['publish entries and comments'] = 'publier des billets et des commentaires'; $GLOBALS['__l10n']['delete entries and comments'] = 'supprimer des billets et des commentaires'; $GLOBALS['__l10n']['manage all entries and comments'] = 'gérer tous les billets et commentaires'; $GLOBALS['__l10n']['manage categories'] = 'gérer les catégories'; $GLOBALS['__l10n']['manage their own media items'] = 'gérer ses propres médias'; $GLOBALS['__l10n']['manage all media items'] = 'gérer tous les médias'; $GLOBALS['__l10n']['That user does not exist in the database.'] = 'Cet utilisateur n\'existe pas dans la base de données.'; $GLOBALS['__l10n']['That key does not exist in the database.'] = 'Cette clé n\'existe pas dans la base de données.'; $GLOBALS['__l10n']['You are not allowed to add categories'] = 'Vous n\'êtes pas autorisé à créer des catégories'; $GLOBALS['__l10n']['You are not allowed to update categories'] = 'Vous n\'êtes pas autorisé à modifier des catégories'; $GLOBALS['__l10n']['You are not allowed to delete categories'] = 'Vous n\'êtes pas autorisé à supprimer des catégories'; $GLOBALS['__l10n']['This category is not empty.'] = 'Cette catégorie n\'est pas vide.'; $GLOBALS['__l10n']['You are not allowed to reset categories order'] = 'Vous n\'êtes pas autorisé à réinitialiser l\'ordre des catégories'; $GLOBALS['__l10n']['Empty category URL'] = 'URL de la catégorie vide'; $GLOBALS['__l10n']['You must provide a category title'] = 'Vous devez indiquer un titre de catégorie'; $GLOBALS['__l10n']['You must provide a category URL'] = 'Vous devez indiquer une URL de catégorie'; $GLOBALS['__l10n']['You are not allowed to create an entry'] = 'Vous n\'êtes pas autorisé à créer des billets'; $GLOBALS['__l10n']['You are not allowed to update entries'] = 'Vous n\'êtes pas autorisé à modifier les billets'; $GLOBALS['__l10n']['No such entry ID'] = 'Identifiant de billet inconnu'; $GLOBALS['__l10n']['You are not allowed to edit this entry'] = 'Vous n\'êtes pas autorisé à modifier ce billet'; $GLOBALS['__l10n']['You are not allowed to change this entry status'] = 'Vous n\'êtes pas autorisé à modifier l\'état de ce billet'; $GLOBALS['__l10n']['You are not allowed to change this entry category'] = 'Vous n\'êtes pas autorisé à modifier la catégorie de ce billet'; $GLOBALS['__l10n']['You are not allowed to change entries category'] = 'Vous n\'êtes pas autorisé à modifier la catégorie des billets'; $GLOBALS['__l10n']['You are not allowed to delete entries'] = 'Vous n\'êtes pas autorisé à supprimer des billets'; $GLOBALS['__l10n']['No entry title'] = 'Pas de titre de billet'; $GLOBALS['__l10n']['No entry content'] = 'Pas de contenu de billet'; $GLOBALS['__l10n']['Notes'] = 'Notes'; $GLOBALS['__l10n']['Note'] = 'Note'; $GLOBALS['__l10n']['Empty entry URL'] = 'URL du billet vide'; $GLOBALS['__l10n']['You are not allowed to update comments'] = 'Vous n\'êtes pas autorisé à modifier des commentaires'; $GLOBALS['__l10n']['No such comment ID'] = 'Identifiant de commentaire inconnu'; $GLOBALS['__l10n']['You are not allowed to update this comment'] = 'Vous n\'êtes pas autorisé à modifier ce commentaire'; $GLOBALS['__l10n']['You are not allowed to change this comment\'s status'] = 'Vous n\'êtes pas autorisé à changer l\'état de ce commentaire'; $GLOBALS['__l10n']['You are not allowed to delete comments'] = 'Vous n\'êtes pas autorisé à supprimer des commentaires'; $GLOBALS['__l10n']['You must provide a comment'] = 'Vous devez écrire un commentaire'; $GLOBALS['__l10n']['You must provide an author name'] = 'Vous devez indiquer un nom'; $GLOBALS['__l10n']['Email address is not valid.'] = 'Adresse email invalide.'; $GLOBALS['__l10n']['online'] = 'en ligne'; $GLOBALS['__l10n']['offline'] = 'hors ligne'; $GLOBALS['__l10n']['removed'] = 'retiré'; $GLOBALS['__l10n']['You are not an administrator'] = 'Vous n\'êtes pas administrateur'; $GLOBALS['__l10n']['Invalid user language code'] = 'Code langue de l\'utilisateur invalide'; $GLOBALS['__l10n']['Blog ID must contain at least 2 characters using letters, numbers or symbols.'] = 'L\'identifiant du blog doit contenir au moins 2 caractères composés de lettres, chiffres ou symboles.'; $GLOBALS['__l10n']['No blog name'] = 'Pas de nom de blog'; $GLOBALS['__l10n']['No blog URL'] = 'Pas d\'URL de blog'; $GLOBALS['__l10n']['No log message'] = 'Pas de message dans le journal'; $GLOBALS['__l10n']['unknown'] = 'inconnu'; $GLOBALS['__l10n']['No blog defined.'] = 'Aucun blog défini.'; $GLOBALS['__l10n']['You are not a super administrator.'] = 'Vous n\'êtes pas super administrateur.'; $GLOBALS['__l10n']['Permission denied.'] = 'Permission refusée.'; $GLOBALS['__l10n']['You are not the file owner.'] = 'Vous n\'êtes pas le propriétaire de ce fichier.'; $GLOBALS['__l10n']['This file is not allowed.'] = 'Ce fichier n\'est pas autorisé.'; $GLOBALS['__l10n']['New file already exists.'] = 'Le nouveau fichier existe déjà.'; $GLOBALS['__l10n']['File does not exist in the database.'] = 'Ce fichier n\'existe pas dans la base de données.'; $GLOBALS['__l10n']['Extract destination directory %s already exists.'] = 'Le répertoire de destination d\'extraction %s existe déjà.'; $GLOBALS['__l10n']['Embedded Audio Player'] = 'Lecteur audio intégré'; $GLOBALS['__l10n']['Embedded Video Player'] = 'Lecteur vidéo intégré'; $GLOBALS['__l10n']['Module "%s" has type "%s" that mismatch required module type "%s".'] = 'Le module "%s" est de type "%s" incompatible avec "%s".'; $GLOBALS['__l10n']['Module "%s" is installed twice in "%s" and "%s".'] = 'Le module "%s" est installé en double dans "%s" et "%s".'; $GLOBALS['__l10n']['Empty module zip file.'] = 'Fichier zip de module vide.'; $GLOBALS['__l10n']['The zip file does not appear to be a valid Dotclear module.'] = 'Le fichier zip ne semble pas être un fichier de module Dotclear valide.'; $GLOBALS['__l10n']['An error occurred during module deletion.'] = 'Une erreur est survenue durant la suppression du module.'; $GLOBALS['__l10n']['Unable to upgrade "%s". (older or same version)'] = 'Impossible de mettre à jour "%s" (plus ancienne ou même version).'; $GLOBALS['__l10n']['Unable to read new _define.php file'] = 'Impossible de lire le nouveau fichier _define.php.'; $GLOBALS['__l10n']['No such module.'] = 'Module inexistant.'; $GLOBALS['__l10n']['Cannot remove module files'] = 'Impossible de supprimer les fichiers du module'; $GLOBALS['__l10n']['Cannot deactivate plugin.'] = 'Le plugin ne peut pas être désactivé.'; $GLOBALS['__l10n']['Cannot activate plugin.'] = 'Le plugin ne peut pas être activé.'; $GLOBALS['__l10n']['Invalid setting dcNamespace: %s'] = 'Espace de nom du paramètre invalide : %s'; $GLOBALS['__l10n']['Unable to retrieve settings:'] = 'Impossible d\'obtenir les paramètres :'; $GLOBALS['__l10n']['%s is not a valid setting id'] = '%s n\'est pas un identifiant de paramètre valide'; $GLOBALS['__l10n']['No namespace specified'] = 'Aucun espace de nom spécifié'; $GLOBALS['__l10n']['Unable to retrieve workspaces:'] = 'Impossible d\'obtenir les espaces de travail :'; $GLOBALS['__l10n']['Unable to retrieve namespaces:'] = 'Impossible d\'obtenir les espaces de nom :'; $GLOBALS['__l10n']['Invalid setting namespace: %s'] = 'Espace de nom du paramètre invalide : %s'; $GLOBALS['__l10n']['Failed to read data feed'] = 'Impossible de lire les données du flux.'; $GLOBALS['__l10n']['Wrong data feed'] = 'Données du flux incorrectes'; $GLOBALS['__l10n']['An error occurred while downloading the file.'] = 'Une erreur est survenue pendant le téléchargement du fichier.'; $GLOBALS['__l10n']['%s has still been pinged'] = 'Un rétrolien vers %s a déjà été fait'; $GLOBALS['__l10n']['Unable to ping URL'] = 'Impossible de réaliser le rétrolien'; $GLOBALS['__l10n']['%s is not a ping URL'] = '%s n\'est pas une URL de rétrolien'; $GLOBALS['__l10n']['%s, ping error:'] = '%s, erreur de rétrolien :'; $GLOBALS['__l10n']['Any chance you ping one of my contents? No? Really?'] = 'Aucune chance que vous pinguiez un de mes contenus ? Non ? Vraiment ?'; $GLOBALS['__l10n']['Sorry but you can not ping this type of content.'] = 'Désolé, vous ne pouvez pas pinguer ce type de contenu.'; $GLOBALS['__l10n']['Oops. Kinda "not found" stuff. Please check the target URL twice.'] = 'Oops, non trouvé. Vérifiez à nouveau l\'URL cible.'; $GLOBALS['__l10n']['Sorry, dude. This entry does not accept pingback at the moment.'] = 'Désolé, cette entrée n\'accepte pas les pingback pour le moment.'; $GLOBALS['__l10n']['Don\'t repeat yourself, please.'] = 'Ne vous répêtez pas, s\'il vous plait.'; $GLOBALS['__l10n']['Your source URL does not look like a supported content type. Sorry. Bye, bye!'] = 'Votre URL source ne semble pas être un contenu supporté. Désolé.'; $GLOBALS['__l10n']['Where\'s your title?'] = 'Où est votre titre ?'; $GLOBALS['__l10n']['Sorry, an internal problem has occured.'] = 'Désolé, une erreur interne est survenue.'; $GLOBALS['__l10n']['Thanks, mate. It was a pleasure.'] = 'Merci, c\'était un plaisir.'; $GLOBALS['__l10n']['Digests file not found.'] = 'Fichier de contrôle introuvable.'; $GLOBALS['__l10n']['No file to download'] = 'Aucun fichier à télécharger'; $GLOBALS['__l10n']['Root directory is not writable.'] = 'Le répertoire principal n\'est pas accessible en écriture.'; $GLOBALS['__l10n']['An error occurred while downloading archive.'] = 'Une erreur est survenue lors du téléchargement de l\'archive.'; $GLOBALS['__l10n']['Archive not found.'] = 'Archive introuvable.'; $GLOBALS['__l10n']['Unable to read current digests file.'] = 'Impossible de lire le fichier de contrôle actuel.'; $GLOBALS['__l10n']['Downloaded file does not seem to be a valid archive.'] = 'Le fichier téléchargé ne semble pas être une archive valide.'; $GLOBALS['__l10n']['Incomplete archive.'] = 'Archive incomplète.'; $GLOBALS['__l10n']['Unable to read digests file.'] = 'Impossible de lire le fichier de contrôle.'; $GLOBALS['__l10n']['Invalid digests file.'] = 'Fichier de contrôle invalide.'; $GLOBALS['__l10n']['Invalid dcWorkspace: %s'] = 'Espace de travail de la préférence invalide : %s'; $GLOBALS['__l10n']['Unable to retrieve prefs:'] = 'Impossible d\'obtenir les préférences :'; $GLOBALS['__l10n']['%s is not a valid pref id'] = '%s n\'est pas un identifiant de préférence valide'; $GLOBALS['__l10n']['No workspace specified'] = 'Aucun espace de travail spécifié'; $GLOBALS['__l10n']['No valid source URL provided? Try again!'] = 'Aucune URL source valide fournie ? Essayez encore !'; $GLOBALS['__l10n']['No valid target URL provided? Try again!'] = 'Aucune URL destinataire valide fournie ? Essayez encore !'; $GLOBALS['__l10n']['LOL!'] = 'MDR !'; $GLOBALS['__l10n']['SQLite Database Schema cannot be upgraded.'] = 'Le schema de base de données SQLite ne peut pas être mis à jour.'; $GLOBALS['__l10n']['Something went wrong with auto upgrade:'] = 'Une erreur est survenue durant la mise à jour automatique :'; $GLOBALS['__l10n']['Unable to open directory.'] = 'Impossible d\'ouvrir le répertoire.'; $GLOBALS['__l10n']['Unable to create directory.'] = 'Impossible de créer le répertoire.'; $GLOBALS['__l10n']['File is not writable.'] = 'Le fichier n\'est pas accessible en écriture.'; $GLOBALS['__l10n']['Unable to open file.'] = 'Impossible d\'ouvrir le fichier.'; $GLOBALS['__l10n']['Not an uploaded file.'] = 'N\'est pas un fichier déposé.'; $GLOBALS['__l10n']['The uploaded file exceeds the maximum file size allowed.'] = 'Le fichier déposé est plus grand que la taille maximale autorisée.'; $GLOBALS['__l10n']['The uploaded file was only partially uploaded.'] = 'Le fichier n\'a été chargé qu\'en partie.'; $GLOBALS['__l10n']['No file was uploaded.'] = 'Aucun fichier chargé.'; $GLOBALS['__l10n']['Missing a temporary folder.'] = 'Il manque un répertoire temporaire.'; $GLOBALS['__l10n']['Failed to write file to disk.'] = 'Impossible d\'écrire le fichier.'; $GLOBALS['__l10n']['%s is not a directory.'] = '%s n\'est pas un répertoire.'; $GLOBALS['__l10n']['Bad range'] = 'Mauvaises limites'; $GLOBALS['__l10n']['Invalid range'] = 'Sélection invalide'; $GLOBALS['__l10n']['Invalid line number'] = 'Numéro de ligne invalide invalide'; $GLOBALS['__l10n']['Chunk is out of range'] = 'L\'extrait est hors limite'; $GLOBALS['__l10n']['Bad context'] = 'Contexte invalide'; $GLOBALS['__l10n']['Bad context (in deletion)'] = 'Contexte invalide (lors de la suppression)'; $GLOBALS['__l10n']['Invalid diff format'] = 'Format de fichier diff invalide.'; $GLOBALS['__l10n']['Uploading this file is not allowed.'] = 'L\'envoi de ce fichier n\'est pas autorisé.'; $GLOBALS['__l10n']['Destination directory is not in jail.'] = 'Le répertoire cible n\'est pas en jail.'; $GLOBALS['__l10n']['File already exists.'] = 'Le nouveau fichier existe déjà.'; $GLOBALS['__l10n']['Cannot write in this directory.'] = 'Impossible d\'écrire dans ce répertoire.'; $GLOBALS['__l10n']['An error occurred while writing the file.'] = 'Une erreur est survenue pendant l\'écriture du fichier.'; $GLOBALS['__l10n']['Source file does not exist.'] = 'Le fichier source n\'existe pas.'; $GLOBALS['__l10n']['File is not in jail.'] = 'Le fichier n\'est pas en jail.'; $GLOBALS['__l10n']['Destination directory is not writable.'] = 'Le répertoire cible n\'est pas accessible en écriture.'; $GLOBALS['__l10n']['Unable to rename file.'] = 'Impossible de renommer le fichier.'; $GLOBALS['__l10n']['File cannot be removed.'] = 'Ce fichier ne peut pas être supprimé.'; $GLOBALS['__l10n']['Directory is not in jail.'] = 'Le répertoire n\'est pas en jail.'; $GLOBALS['__l10n']['Directory cannot be removed.'] = 'Ce répertoire ne peut pas être supprimé.'; $GLOBALS['__l10n']['Not enough memory to open image.'] = 'Mémoire insuffisante pour ouvrir l\'image.'; $GLOBALS['__l10n']['singular'][0] = ''; $GLOBALS['__l10n']['singular'][1] = ''; $GLOBALS['__l10n']['File %s is not compressed in the zip.'] = 'Le fichier %s n\'est pas compressé dans le zip.'; $GLOBALS['__l10n']['Trying to unzip a folder name %s'] = 'Tentative de décompresser un répertoire %s'; $GLOBALS['__l10n']['Unable to write destination file.'] = 'Impossible d\'écrire le fichier de destination'; $GLOBALS['__l10n']['Unable to write in target directory, permission denied.'] = 'Impossible d\'écrire dans le répertoire cible, permission refusée.'; $GLOBALS['__l10n']['Not enough memory to open file.'] = 'Mémoire insuffisante pour ouvrir le fichier.'; $GLOBALS['__l10n']['File does not exist'] = 'Le fichier n\'existe pas'; $GLOBALS['__l10n']['Cannot read file'] = 'Impossible de lire le fichier'; $GLOBALS['__l10n']['Directory does not exist'] = 'Le répertoire n\'existe pas'; $GLOBALS['__l10n']['Cannot read directory'] = 'Impossible de lire le répertoire'; $GLOBALS['__l10n']['Site temporarily unavailable'] = 'Site temporairement indisponible'; $GLOBALS['__l10n']['

        We apologize for this temporary unavailability.
        Thank you for your understanding.

        '] = '

        Veuillez nous excuser pour cette indisponibilité momentanée.
        Merci de votre compréhension.

        '; $GLOBALS['__l10n']['Unable to connect to database'] = 'Connexion à la base de données impossible'; $GLOBALS['__l10n']['

        This either means that the username and password information in your config.php file is incorrect or we can\'t contact the database server at "%s". This could mean your host\'s database server is down.

        • Are you sure you have the correct username and password?
        • Are you sure that you have typed the correct hostname?
        • Are you sure that the database server is running?

        If you\'re unsure what these terms mean you should probably contact your host. If you still need help you can always visit the Dotclear Support Forums.

        '] = '

        Cela signifie soit que les informations d\'identifiant ou de mot de passe de votre fichier config.php sont incorrects, soit que nous ne pouvons pas contacter le serveur de base de données à l\'adresse "%s". Cela peut vouloir dire que le serveur en question est éteint.

        • Êtes-vous sûr que l\'identifiant et le mot de passe sont corrects ?
        • Êtes-vous sûr d\'avoir entré le bon nom de serveur ?
        • Êtes-vous sûr que le serveur fonctionne ?

        Si vous n\'êtes pas sûr de la signification de ces termes, vous devriez probablement contacter votre hébergeur. Si vous avez besoin d\'une aide supplémentaire, vous pouvez vous rendre sur le forum d\'entraide Dotclear.

        '; $GLOBALS['__l10n']['The following error was encountered while trying to read the database:'] = 'L\'erreur suivante a été rencontrée lors de la tentative d\'accès à la base de données :'; dotclear-2.6.2+dfsg/locales/fr/main.po000066400000000000000000003377711230033266200175710ustar00rootroot00000000000000# French translation of DotClear # Copyright (C) 2006. # Olivier Meunier , 2006. # # Translators: # Franck , 2011. # Stéphane Aulery , 2012. # xave , 2012. msgid "" msgstr "" "Project-Id-Version: Dotclear\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-11-01 14:23+0100\n" "PO-Revision-Date: 2012-08-13 07:13+0000\n" "Last-Translator: xave \n" "Language-Team: French (http://www.transifex.com/projects/p/dotclear/language/fr/)\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" msgid "Dotclear has been upgraded." msgstr "Dotclear a été mis à jour." msgid "Password reset" msgstr "Réinitialisation du mot de passe" msgid "Someone has requested to reset the password for the following site and username." msgstr "Quelqu'un a demandé la réinitialisation du mot de passe pour le site et l'utilisateur suivants." msgid "Username:" msgstr "Nom d'utilisateur :" msgid "To reset your password visit the following address, otherwise just ignore this email and nothing will happen." msgstr "Pour réinitialiser votre mot de passe, rendez-vous à l'adresse suivante. Sinon ignorez simplement ce message et rien ne se passera." #, php-format msgid "The e-mail was sent successfully to %s." msgstr "Le message a été envoyé à %s." msgid "Your new password" msgstr "Votre nouveau mot de passe" msgid "Password:" msgstr "Mot de passe :" msgid "Your new password is in your mailbox." msgstr "Votre nouveau mot de passe est dans votre boîte à lettres." msgid "Passwords don't match" msgstr "Les mots de passe ne correspondent pas" msgid "You didn't change your password." msgstr "Vous n'avez pas changé votre mot de passe." msgid "You have to change your password before you can login." msgstr "Vous devez changer de mot de passe avant de vous connecter." msgid "In order to login, you have to change your password now." msgstr "Afin de vous connecter, vous devez changer votre mot de passe." msgid "Safe Mode can only be used for super administrators." msgstr "Le mode sans échec ne peut être utilisé que par un super administrateur." msgid "Insufficient permissions" msgstr "Permissions insuffisantes" msgid "Wrong username or password" msgstr "Nom d'utilisateur ou mot de passe incorrect" msgid "Back to login screen" msgstr "Retour à l'écran de connexion" msgid "Request a new password" msgstr "Demander un nouveau mot de passe" msgid "Email:" msgstr "Email :" msgid "recover" msgstr "récupérer" msgid "Change your password" msgstr "Changer votre mot de passe" msgid "New password:" msgstr "Nouveau mot de passe :" msgid "Confirm password:" msgstr "Confirmer le mot de passe :" msgid "change" msgstr "changer" msgid "Safe mode login" msgstr "Connexion en mode sans échec" msgid "This mode allows you to login without activating any of your plugins. This may be useful to solve compatibility problems" msgstr "Ce mode vous permet de vous connecter sans activer de plugins. Il peut être utile pour résoudre un problème de compatibilité" msgid "Disable or delete any plugin suspected to cause trouble, then log out and log back in normally." msgstr "Désactivez ou supprimez les plugins semblant en être la cause, puis déconnectez-vous et connectez-vous à nouveau normalement." msgid "Remember my ID on this computer" msgstr "Se souvenir de mon identifiant sur cet ordinateur" msgid "log in" msgstr "Se connecter" msgid "You must accept cookies in order to use the private area." msgstr "Vous devez accepter les cookies pour utiliser l'interface privée." msgid "Get back to normal authentication" msgstr "Retour à l'écran de connexion normal" msgid "Connection issue?" msgstr "Problème de connexion ?" msgid "I forgot my password" msgstr "J'ai oublié mon mot de passe" msgid "I want to log in in safe mode" msgstr "Me connecter en mode sans échec" #, php-format msgid "Blog \"%s\" successfully created" msgstr "Le blog \"%s\" a été créé." msgid "New blog" msgstr "Nouveau blog" msgid "System" msgstr "Système" msgid "Blogs" msgstr "Blogs" msgid "Blog ID:" msgstr "Identifiant du blog :" msgid "Required field" msgstr "Champ obligatoire" msgid "At least 2 characters using letters, numbers or symbols." msgstr "Au moins 2 caractères, composés de lettres non accentuées, chiffres ou symboles." msgid "Please note that changing your blog ID may require changes in your public index.php file." msgstr "Veuillez noter que changer l'identifiant de votre blog peut nécessiter des modifications de votre fichier index.php public." msgid "Blog name:" msgstr "Nom du blog :" msgid "Blog URL:" msgstr "URL du blog :" msgid "Blog description:" msgstr "Description du blog :" msgid "Create" msgstr "Créer" msgid "No such blog ID" msgstr "Identifiant de blog inconnu" msgid "Password verification failed" msgstr "La vérification du mot de passe a échoué" #, php-format msgid "Blog \"%s\" successfully deleted" msgstr "Le blog \"%s\" a été supprimé." msgid "Delete a blog" msgstr "Supprimer un blog" msgid "Warning" msgstr "Attention" #, php-format msgid "You are about to delete the blog %s. Every entry, comment and category will be deleted." msgstr "Vous êtes sur le point de supprimer le blog %s. Tous ses billets, pages, commentaires et catégories seront supprimés." msgid "Please give your password to confirm the blog deletion." msgstr "Veuillez indiquer votre mot de passe pour confirmer la suppression du blog." msgid "Your password:" msgstr "Votre mot de passe :" msgid "Delete this blog" msgstr "Supprimer ce blog" msgid "No given blog id." msgstr "Pas d'identifiant de blog." msgid "No such blog." msgstr "Blog inexistant." msgid "year/month/day/title" msgstr "année/mois/jour/titre" msgid "year/month/title" msgstr "année/mois/titre" msgid "year/title" msgstr "année/titre" msgid "title" msgstr "titre" msgid "post id/title" msgstr "identificateur du billet/titre" msgid "post id" msgstr "identificateur du billet" msgid "H4" msgstr "H4" msgid "H3" msgstr "H3" msgid "P" msgstr "P" msgid "(none)" msgstr "(aucun)" msgid "Title" msgstr "Titre" msgid "Title, Date" msgstr "Titre, date" msgid "Title, Country, Date" msgstr "Titre, pays, date" msgid "Title, City, Country, Date" msgstr "Titre, ville, pays, date" msgid "original" msgstr "originale" msgid "None" msgstr "Aucun" msgid "Left" msgstr "Gauche" msgid "Right" msgstr "Droite" msgid "Center" msgstr "Centre" msgid "I would like search engines and archivers to index and archive my blog's content." msgstr "Je souhaite que mon blog soit indexé et archivé par les moteurs de recherche et archiveurs." msgid "I would like search engines and archivers to index but not archive my blog's content." msgstr "Je souhaite que mon blog soit indexé mais pas archivé par les moteurs de recherche et archiveurs." msgid "I would like to prevent search engines and archivers from indexing or archiving my blog's content." msgstr "Je souhaite que mon blog ne soit ni indexé ni archivé par les moteurs de recherche et archiveurs." msgid "This blog ID is already used." msgstr "Cet identifiant est déjà utilisé." msgid "Invalid language code" msgstr "Code langue invalide" msgid "Blog has been successfully updated." msgstr "Le blog a été mis à jour." msgid "Blog settings" msgstr "Paramètres du blog" msgid "Warning: except for special configurations, it is generally advised to have a trailing \"/\" in your blog URL in PATH_INFO mode." msgstr "Attention : sauf cas particulier, il est généralement conseillé de terminer l'URL de votre blog par \"/\" en mode PATH_INFO." msgid "Warning: except for special configurations, it is generally advised to have a trailing \"?\" in your blog URL in QUERY_STRING mode." msgstr "Attention: sauf cas particulier, il est généralement conseillé de terminer l'URL de votre blog par \\\"?\\\" en mode QUERY_STRING." msgid "Blog has been successfully created." msgstr "Le blog a été créé." msgid "Parameters" msgstr "Paramètres" msgid "Blog details" msgstr "Informations du blog" msgid "URL scan method:" msgstr "Méthode de lecture de l'URL :" #, php-format msgid "The URL of blog or the URL scan method might not be well set (%s return a %s status)." msgstr "L'URL du blog ou la méthode de lecture de l'URL ne semblent pas être bien réglées (%s retourne un statut %s)" #, php-format msgid "The URL of blog or the URL scan method might not be well set (%s does not return an ATOM feed)." msgstr "L'URL du blog ou la méthode de lecture de l'URL ne semblent pas être bien réglées (%s ne retourne pas un flux ATOM)" msgid "Blog status:" msgstr "État du blog :" msgid "Blog configuration" msgstr "Configuration du blog" msgid "Blog editor name:" msgstr "Nom de l'auteur du blog :" msgid "Default language:" msgstr "Langue par défaut :" msgid "Blog timezone:" msgstr "Fuseau horaire du blog :" msgid "Copyright notice:" msgstr "Note de copyright :" msgid "New post URL format:" msgstr "Format d'URL des nouveaux billets :" msgid "HTML tag for the title of the notes on the blog:" msgstr "Balise HTML pour le titre des notes sur le blog :" msgid "Enable XML/RPC interface" msgstr "Activer l'interface XML/RPC" msgid "XML/RPC interface allows you to edit your blog with an external client." msgstr "L'interface XML/RPC vous permet de publier sur votre blog avec un client externe." msgid "XML/RPC interface is active. You should set the following parameters on your XML/RPC client:" msgstr "L'interface XML/RPC est active. Vous êtes invités à indiquer les paramètres suivants dans votre client XML/RPC :" msgid "Server URL:" msgstr "URL du serveur :" msgid "Blogging system:" msgstr "Système de blog :" msgid "User name:" msgstr "Nom d'utilisateur :" msgid "your password" msgstr "votre mot de passe" msgid "Comments and trackbacks" msgstr "Commentaires et rétroliens" msgid "Accept comments" msgstr "Accepter les commentaires" msgid "Moderate comments" msgstr "Modérer les commentaires" #, php-format msgid "Leave comments open for %s days" msgstr "Laisser les commentaires ouverts durant %s jours" msgid "No limit: leave blank." msgstr "Aucune limite : laisser vide." msgid "Wiki syntax for comments" msgstr "Syntaxe wiki pour les commentaires" msgid "Accept trackbacks" msgstr "Accepter les rétroliens" msgid "Moderate trackbacks" msgstr "Modérer les rétroliens" #, php-format msgid "Leave trackbacks open for %s days" msgstr "Laisser les rétroliens ouverts durant %s jours" msgid "Add \"nofollow\" relation on comments and trackbacks links" msgstr "Ajouter la relation \"nofollow\" aux liens des commentaires et rétroliens" msgid "Blog presentation" msgstr "Présentation du blog" msgid "Date format:" msgstr "Format des dates :" msgid "Pattern of date" msgstr "Modèle de date" msgid "Sample:" msgstr "Exemple :" msgid "Time format:" msgstr "Format des heures :" msgid "Pattern of time" msgstr "Modèle d'heure" msgid "Display smilies on entries and comments" msgstr "Afficher des émoticônes dans les billets, pages et commentaires" #, php-format msgid "Display %s entries per page" msgstr "Afficher %s billets par page" #, php-format msgid "Display %s entries per feed" msgstr "Afficher %s billets par flux de syndication" #, php-format msgid "Display %s comments per feed" msgstr "Afficher %s commentaires par flux de syndication" msgid "Truncate feeds" msgstr "Tronquer les flux de syndication" msgid "Include sub-categories in category page and category posts feed" msgstr "Inclure les sous-catégories dans la page des catégories et dans les flux de billets pour une catégorie" msgid "Media and images" msgstr "Médias et images" msgid "Please note that if you change current settings bellow, they will now apply to all new images in the media manager." msgstr "Veuillez noter que si vous changez ces réglages, ils s'appliqueront désormais à toutes les nouvelles images ajoutées à la médiathèque." msgid "Be carefull if you share it with other blogs in your installation." msgstr "Soyez prudent si plusieurs blogs de l'installation partagent la même médiathèque." msgid "Generated image sizes (in pixels)" msgstr "Tailles des miniatures générées (largeur en pixels)" msgid "Default image insertion attributes" msgstr "Attributs par défaut pour l'insertion d'image" msgid "Inserted image title" msgstr "Titres des images insérées" msgid "Use original media date if possible" msgstr "Utiliser la date originelle du média si possible" msgid "It is retrieved from the picture's metadata." msgstr "Ces informations sont obtenues depuis les métadonnées de l'image." msgid "Size of inserted image:" msgstr "Taille de l'image insérée :" msgid "Image alignment:" msgstr "Alignement de l'image :" msgid "Insert a link to the original image" msgstr "Insérer le lien vers l'image originale" msgid "Search engines robots policy" msgstr "Paramètres d'indexation par les moteurs de recherche" msgid "Save" msgstr "Enregistrer" msgid "The current blog cannot be deleted." msgstr "Le blog courant ne peut être détruit." msgid "Only superadmin can delete a blog." msgstr "Seul un superadministrateur peut supprimer un blog." msgid "Users" msgstr "Utilisateurs" msgid "Users on this blog" msgstr "Utilisateurs de ce blog" msgid "No users" msgstr "Aucun utilisateur" msgid "Publications on this blog:" msgstr "Publications sur ce blog :" #, php-format msgid "%1$s: %2$s" msgstr "%1$s : %2$s" msgid "Permissions:" msgstr "Permissions :" msgid "Super administrator" msgstr "Super administrateur" msgid "All rights on all blogs." msgstr "Tous les droits sur tous les blogs." #, php-format msgid "[%s] (unreferenced permission)" msgstr "[%s] (permission non référencée)" msgid "All rights on this blog." msgstr "Tous les droits sur ce blog." msgid "Change permissions" msgstr "Changer les permissions" msgid "Blog appearance" msgstr "Apparence du blog" msgid "Theme configuration" msgstr "Personnaliser ce thème" msgid "Themes management" msgstr "Gestion des thèmes" msgid "Update themes" msgstr "Mettre à jour les thèmes" #, php-format msgid "There is one theme to update available from repository." msgid_plural "There are %s themes to update available from repository." msgstr[0] "Il y a un thème à mettre à jour depuis le dépôt." msgstr[1] "Il y a %s thèmes à mettre à jour depuis le dépôt." #, php-format msgid "Visit %s repository, the resources center for Dotclear." msgstr "Visitez le dépôt %s, le centre de ressources pour Dotclear" msgid "Installed themes" msgstr "Thèmes installés" msgid "You can configure and manage installed themes from this list." msgstr "Vous pouvez configurer et gérer les thèmes de cette liste." msgid "Deactivated themes" msgstr "Thèmes désactivés" msgid "Deactivated themes are installed but not usable. You can activate them from here." msgstr "Les thèmes désactivés sont installés mais non utilisables. Vous pouvez les activer depuis cette page." msgid "Add themes" msgstr "Ajouter des thèmes" msgid "Add themes from repository" msgstr "Ajouter des thèmes depuis le dépôt" msgid "Install or upgrade manually" msgstr "Installer ou mettre à jour manuellement" msgid "Add themes from a package" msgstr "Ajouter des thèmes depuis un package" msgid "You can install themes by uploading or downloading zip files." msgstr "Vous pouvez installer des thèmes en déposant ou téléchargeant des fichiers zip." msgid "Last update" msgstr "Dernière mise à jour" msgid "Blog name" msgstr "Nom du blog" msgid "Blog ID" msgstr "Identifiant du blog" msgid "Descending" msgstr "Décroissant" msgid "Ascending" msgstr "Croissant" msgid "Show filters and display options" msgstr "Afficher les filtres et options d'affichage" msgid "Cancel filters and display options" msgstr "Annuler les filtres et options d'affichage" msgid "List of blogs" msgstr "Liste des blogs" msgid "Blog has been successfully deleted." msgstr "Le blog a été supprimé." msgid "Create a new blog" msgstr "Créer un nouveau blog" msgid "Filter blogs list" msgstr "Filtrer la liste des blogs" msgid "Filters" msgstr "Filtres" msgid "Search:" msgstr "Chercher :" msgid "Display options" msgstr "Options d'affichage" msgid "Order by:" msgstr "Trier par :" msgid "Sort:" msgstr "Ordre :" msgid "Show" msgstr "Afficher" msgid "blogs per page" msgstr "blogs par page" msgid "Apply filters and display options" msgstr "Appliquer les filtres et options d'affichage" msgid "No blog matches the filter" msgstr "Aucun blog correspondant au filtre" msgid "No blog" msgstr "Pas de blog" # php-format #, php-format msgid "%d blog matches the filter." msgid_plural "%d blogs match the filter." msgstr[0] "%d blog correspondant au filtre" msgstr[1] "%d blogs correspondants au filtre" msgid "Blogs list" msgstr "Liste des blogs" msgid "Blog id" msgstr "Identifiant du blog" msgid "Entries (all types)" msgstr "Entrées" msgid "Status" msgstr "État" #, php-format msgid "Edit blog settings for %s" msgstr "Modifier les paramètres de %s" msgid "Edit blog settings" msgstr "Modifier les paramètres du blog" #, php-format msgid "Switch to blog %s" msgstr "Passer au blog %s" msgid "This category does not exist." msgstr "Cette catégorie n'existe pas." #, php-format msgid "The category \"%s\" has been successfully deleted." msgstr "La catégorie \"%s\" a été supprimée." msgid "Category where to move posts does not exist" msgstr "La catégorie où les entrées seront déplacées n'existe pas." #, php-format msgid "The entries have been successfully moved to category \"%s\"" msgstr "Les billets ont été déplacés dans la catégorie \"%s\"." msgid "Categories have been successfully reordered." msgstr "Les catégories ont été réordonnées." msgid "Categories order has been successfully reset." msgstr "Les catégories ont été réordonnées par défaut." msgid "Categories" msgstr "Catégories" msgid "The category has been successfully removed." msgid_plural "The categories have been successfully removed." msgstr[0] "La catégorie a été déplacée." msgstr[1] "Les catégories ont été déplacées." msgid "Entries have been successfully moved to the category you choose." msgstr "Les billets ont été déplacés dans la catégorie choisie." msgid "New category" msgstr "Nouvelle catégorie" msgid "No category so far." msgstr "Pas de catégorie pour le moment." #, php-format msgid "%d entries" msgstr "%d billets" #, php-format msgid "%d entry" msgid_plural "%d entries" msgstr[0] "%d billet" msgstr[1] "%d billets" msgid "total:" msgstr "total :" msgid "URL:" msgstr "URL :" msgid "Move entries to" msgstr "Déplacer les billets vers" msgid "OK" msgstr "OK" msgid "Delete category" msgstr "Supprimer la catégorie" msgid "To rearrange categories order, move items by drag and drop, then click on “Save categories order” button." msgstr "Pour modifier l'ordre des catégories, déplacez les items par glisser-déposer puis cliquez sur le bouton \"Enregistrer l'ordre des catégories\"." msgid "Save categories order" msgstr "Enregistrer l'ordre des catégories" msgid "Reorder all categories on the top level" msgstr "Replacer toutes les catégories au premier niveau" msgid "Top level" msgstr "Premier niveau" msgid "The category has been successfully moved" msgstr "La catégorie a été déplacée." msgid "The category has been successfully updated." msgstr "La catégorie a été mise à jour." #, php-format msgid "The category \"%s\" has been successfully created." msgstr "La catégorie \"%s\" a été créée." msgid "Category has been successfully updated." msgstr "La catégorie a été mise à jour." msgid "Category information" msgstr "Détails de la catégorie" msgid "Name:" msgstr "Nom :" msgid "Parent:" msgstr "Parent :" msgid "Warning: If you set the URL manually, it may conflict with another category." msgstr "Attention : si vous indiquez l'URL manuellement, celle-ci peut entrer en conflit avec une autre catégorie." msgid "Description:" msgstr "Description :" msgid "Move this category" msgstr "Déplacer cette catégorie" msgid "Category parent" msgstr "Catégorie parente" msgid "Category sibling" msgstr "Catégorie voisine" msgid "Move current category" msgstr "Déplacer la catégorie" msgid "after" msgstr "après" msgid "before" msgstr "avant" msgid "position: " msgstr "position : " msgid "Entry does not exist." msgstr "Ce billet n'existe pas." msgid "Comment has been successfully created." msgstr "Le commentaire a été créé." msgid "No comment" msgstr "Aucun commentaire" msgid "Comment has been successfully updated." msgstr "Le commentaire a été mis à jour." msgid "Comment has been successfully deleted." msgstr "Le commentaire a été effacé." msgid "You can't edit this comment." msgstr "Vous ne pouvez pas modifier ce commentaire." msgid "Edit comment" msgstr "Modifier le commentaire" #, php-format msgid "Your comment on my blog %s" msgstr "Votre commentaire sur mon blog %s" #, php-format msgid "" "Hi!\n" "\n" "You wrote a comment on:\n" "%s\n" "\n" "\n" msgstr "" "Bonjour,\n" "\n" "Vous avez déposé un commentaire sur :\n" "%s\n" "\n" "\n" msgid "Send an e-mail" msgstr "Envoyer un email" msgid "Information collected" msgstr "Informations recueillies" msgid "IP address:" msgstr "Adresse IP :" msgid "Date:" msgstr "Date :" msgid "Comment submitted" msgstr "Commentaire déposé" msgid "Author:" msgstr "Auteur :" msgid "Web site:" msgstr "Site web :" msgid "Status:" msgstr "État :" msgid "Comment:" msgstr "Commentaire :" msgid "Delete" msgstr "Supprimer" msgid "Comment" msgstr "Commentaire" msgid "Trackback" msgstr "Rétrolien" msgid "Date" msgstr "Date" msgid "Entry title" msgstr "Titre de l'entrée" msgid "Author" msgstr "Auteur" msgid "Selected comments have been successfully updated." msgstr "Les entrées sélectionnées ont été modifiées." msgid "Selected comments have been successfully deleted." msgstr "Les commentaires sélectionnés ont été supprimés." msgid "Spam comments have been successfully deleted." msgstr "Les commentaires indésirables ont été supprimés." msgid "You have one spam comment." msgstr "Vous avez un commentaire indésirable." msgid "Show it." msgstr "L'afficher." #, php-format msgid "You have %s spam comments." msgstr "Vous avez %s commentaires indésirables." msgid "Show them." msgstr "Les afficher." msgid "Delete all spams" msgstr "Supprimer tous les indésirables" msgid "Filter comments and trackbacks list" msgstr "Filtrer la liste des commentaires et rétroliens" msgid "Type:" msgstr "Type :" msgid "comments per page" msgstr "commentaires par page" msgid "Selected comments action:" msgstr "Action sur les commentaires sélectionnés :" msgid "Actions" msgstr "Actions" msgid "ok" msgstr "ok" msgid "Global help" msgstr "Aide générale" #, php-format msgid "An update is available" msgid_plural "%s updates are available." msgstr[0] "Une mise à jour est disponible." msgstr[1] "%s mises à jour sont disponibles." msgid "Dotclear news" msgstr "Actualité de Dotclear" msgid "%d %B %Y:" msgstr "%d %B %Y :" msgid "Documentation and support" msgstr "Documentation et support" msgid "Dashboard" msgstr "Tableau de bord" #, php-format msgid "Dotclear %s is available!" msgstr "Dotclear %s est disponible !" msgid "Upgrade now" msgstr "Mettre à jour maintenant" msgid "Remind me later" msgstr "Me le rappeler plus tard" msgid "Information about this version" msgstr "Informations sur cette version" msgid "Make this blog my default blog" msgstr "Définir comme blog par défaut" msgid "This blog is offline" msgstr "Ce blog est hors ligne" msgid "This blog is removed" msgstr "Ce blog est retiré de la publication" #, php-format msgid "%s is not defined, you should edit your configuration file." msgstr "%s n'est pas défini, vous devriez corriger votre fichier de configuration." msgid "See documentation for more information." msgstr "Voir la documentation pour plus d'information." msgid "The cache directory does not exist or is not writable. You must create this directory with sufficient rights and affect this location to \"DC_TPL_CACHE\" in inc/config.php file." msgstr "Le répertoire de cache n'existe pas ou n'est pas accessible en écriture. Vous devez créer ce répertoire avec les droits suffisants et affecter celui-ci à \"DC_TPL_CACHE\" dans le fichier inc/config.php." msgid "The cache directory does not exist or is not writable. You should contact your administrator." msgstr "Le répertoire de cache n'existe pas ou n'est pas accessible en écriture. Vous devriez contacter votre administrateur." msgid "There is no writable directory /public/ at the location set in about:config \"public_path\". You must create this directory with sufficient rights (or change this setting)." msgstr "Il n'existe pas de répertoire /public/ à l'endroit spécifié pour le réglage \"public_path\" dans about:config. Vous devez créer ce répertoire avec les droits suffisants (ou changer ce réglage)." msgid "There is no writable root directory for the media manager. You should contact your administrator." msgstr "Il n'existe pas de répertoire principal accessible en écriture pour la médiathèque. Vous devriez contacter votre administrateur." msgid "Following plugins have been installed:" msgstr "Les plugins suivants ont été installés :" msgid "Following plugins have not been installed:" msgstr "Les plugins suivants n'ont pas été installés :" msgid "Errors have occured with following plugins:" msgstr "Des erreurs se sont produites avec les plugins suivants :" msgid "Quick entry" msgstr "Billet rapide" msgid "New entry" msgstr "Nouveau billet" msgid "Title:" msgstr "Titre :" msgid "Content:" msgstr "Contenu :" msgid "Category:" msgstr "Catégorie :" msgid "Add a new category" msgstr "Créer une nouvelle catégorie" msgid "This category will be created when you will save your post." msgstr "Cette catégorie sera créée lorsque vous enregistrerez votre billet." msgid "Save and publish" msgstr "Enregister et publier" #, php-format msgid "PHP version is %s (5.0 or earlier needed)." msgstr "La version de PHP est %s (5.0 ou plus récente nécessaire.)" msgid "Multibyte string module (mbstring) is not available." msgstr "Le support des chaînes multi-octets (mbstring) n'est pas disponible." msgid "Iconv module is not available." msgstr "Le module iconv n'est pas disponible." msgid "Output control functions are not available." msgstr "Les fonctions de bufferisation de sortie ne sont pas disponibles." msgid "SimpleXML module is not available." msgstr "Le module SimpleXML n'est pas disponible." msgid "DOM XML module is not available." msgstr "Le module DOM XML n'est pas disponible." msgid "PCRE engine does not support UTF-8 strings." msgstr "Le moteur d'expressions rationnelles PCRE n'accepte pas les chaînes UTF-8." msgid "SPL module is not available." msgstr "Le module SPL n'est pas disponible." #, php-format msgid "MySQL version is %s (4.1 or earlier needed)." msgstr "La version de MySQL est %s (4.1 ou plus récente nécessaire)." msgid "MySQL InnoDB engine is not available." msgstr "Le gestionnaire de stockage InnoDB de MySQL n'est pas disponible." #, php-format msgid "PostgreSQL version is %s (8.0 or earlier needed)." msgstr "La version de PostgreSQL est %s (8.0 ou plus récente nécessaire)." msgid "Please set a master key (DC_MASTER_KEY) in configuration file." msgstr "Veuillez indiquer une clé de référence (DC_MASTER_KEY) dans le fichier de configuration." msgid "Dotclear is already installed." msgstr "Dotclear est déjà installé." msgid "Dotclear cannot be installed." msgstr "Dotclear ne peut pas être installé." msgid "No user ID given" msgstr "Aucun identifiant utilisateur spécifié" msgid "User ID must contain at least 2 characters using letters, numbers or symbols." msgstr "L'identifiant utilisateur doit contenir au moins 2 caractères composés de lettres, chiffres ou symboles." msgid "Invalid email address" msgstr "Adresse email incorrecte" msgid "No password given" msgstr "Aucun mot de passe spécifié" msgid "Password must contain at least 6 characters." msgstr "Le mot de passe doit contenir au moins 6 caractères." msgid "My first blog" msgstr "Mon premier blog" msgid "%A, %B %e %Y" msgstr "%A %e %B %Y" msgid "Welcome to Dotclear!" msgstr "Bienvenue sur Dotclear !" msgid "This is your first entry. When you're ready to blog, log in to edit or delete it." msgstr "Ceci est votre premier billet. Quand vous serez prêt à bloguer, connectez-vous pour le modifier ou le supprimer." msgid "Dotclear Team" msgstr "L'équipe Dotclear" msgid "" "

        This is a comment.

        \n" "

        To delete it, log in and view your blog's comments. Then you might remove or edit it.

        " msgstr "" "

        Ceci est un commentaire

        \n" "

        Pour le supprimer, connectez-vous et affichez les commentaires de votre blog. Vous pourrez alors le supprimer ou le modifier.

        " msgid "Dotclear Install" msgstr "Installation de Dotclear" #, php-format msgid "Password strength: %s" msgstr "Force du mot de passe : %s" msgid "very weak" msgstr "très faible" msgid "weak" msgstr "faible" msgid "mediocre" msgstr "moyen" msgid "strong" msgstr "fort" msgid "very strong" msgstr "très fort" msgid "show" msgstr "voir" msgid "Dotclear installation" msgstr "Installation de Dotclear" #, php-format msgid "Cache directory %s is not writable." msgstr "Le répertoire de cache %s n'est pas accessible en écriture." msgid "Errors:" msgstr "Erreurs :" msgid "Configuration file has been successfully created." msgstr "Le fichier de configuration a été créé." msgid "User information" msgstr "Informations utilisateur" msgid "Please provide the following information needed to create the first user." msgstr "Merci de fournir les informations suivantes pour créer le premier utilisateur." msgid "First Name:" msgstr "Prénom :" msgid "Last Name:" msgstr "Nom :" msgid "Username and password" msgstr "Identifiant et mot de passe" msgid "All done!" msgstr "C'est terminé !" msgid "Dotclear has been successfully installed. Here is some useful information you should keep." msgstr "Dotclear est installé. Conservez les informations suivantes précieusement." msgid "Your account" msgstr "Votre compte" msgid "Your blog" msgstr "Votre blog" msgid "Blog address:" msgstr "Adresse du blog :" msgid "Administration interface:" msgstr "Interface d'administration :" msgid "Manage your blog now" msgstr "Gérez votre blog" msgid "Installation can not be completed" msgstr "L'installation ne peut pas être terminée" msgid "For the said reasons, Dotclear can not be installed. Please refer to the documentation to learn how to correct the problem." msgstr "Pour les raisons ci-dessus, Dotclear ne peut pas être installé. Référez-vous à la documentation pour savoir comment corriger le problème." #, php-format msgid "Path %s is not writable." msgstr "Le chemin %s n'est pas accessible en écriture." msgid "Dotclear installation wizard could not create configuration file for you. You must change folder right or create the config.php file manually, please refer to the documentation to learn how to do this." msgstr "L'assistant d'installation Dotclear n'a pas pu créer le fichier de configuration à votre place. Vous devez changer les droits du répertoire ou créer le fichier config.php manuellement. Référez-vous à la documentation pour voir comment procéder." #, php-format msgid "File %s does not exist." msgstr "Le fichier %s n'existe pas." #, php-format msgid "Cannot write %s file." msgstr "Impossible d'écrire le fichier %s." msgid "Dotclear installation wizard" msgstr "Assistant d'installation de Dotclear" msgid "Welcome" msgstr "Bienvenue" msgid "To complete your Dotclear installation and start writing on your blog, we just need to know how to access your database and who you are. Just fill this two steps wizard with this information and we will be done." msgstr "Pour achever votre installation de Dotclear, il ne manque plus que les informations concernant votre base de données, puis vos informations personnelles. Remplissez simplement les deux formulaires suivants et vous pourrez commencer à utiliser votre blog." msgid "Attention:" msgstr "Attention :" msgid "this wizard may not function on every host. If it does not work for you, please refer to the documentation to learn how to create the config.php file manually." msgstr "cet assistant peut ne pas fonctionner chez tous les hébergeurs. Si vous rencontrez un problème, vous trouverez comment créer le fichier de configuration dans la documentation." msgid "System information" msgstr "Informations système" msgid "Please provide the following information needed to create your configuration file." msgstr "Merci de fournir les informations suivantes qui sont nécessaires pour créer votre fichier de configuration." msgid "Database type:" msgstr "Type de base de données :" msgid "MySQL (deprecated)" msgstr "MySQL (obsolète)" msgid "MySQLi" msgstr "MySQLi" msgid "PostgreSQL" msgstr "PostgreSQL" msgid "Database Host Name:" msgstr "Nom d'hôte de la base de données :" msgid "Database Name:" msgstr "Nom de la base de données :" msgid "Database User Name:" msgstr "Nom d'utilisateur de la base de données :" msgid "Database Password:" msgstr "Mot de passe de la base de données :" msgid "Database Tables Prefix:" msgstr "Préfixe des tables de la base de données :" msgid "Continue" msgstr "Continuer" msgid "No such installed language" msgstr "Cette langue n'est pas installée" msgid "You can't remove English language." msgstr "Vous ne pouvez pas supprimer la langue anglaise." msgid "Permissions to delete language denied." msgstr "Permission de supprimer la langue refusée." msgid "Language has been successfully deleted." msgstr "La langue a été supprimée." msgid "Invalid language file URL." msgstr "URL de fichier de langue invalide." msgid "Language has been successfully upgraded" msgstr "La langue a été mise à jour." msgid "Language has been successfully installed." msgstr "La langue a été installée." msgid "Unable to move uploaded file." msgstr "Impossible de déplacer le fichier téléchargé." msgid "Languages management" msgstr "Gestion des langues" msgid "Here you can install, upgrade or remove languages for your Dotclear installation." msgstr "Sur cette page, vous pouvez installer, mettre à jour ou supprimer des langues de votre installation de Dotclear." #, php-format msgid "You can change your user language in your preferences or change your blog's main language in your blog settings." msgstr "Vous pouvez changer votre langue d'utilisateur dans vos préférences ou changer la langue principale de votre blog dans vos Paramètres du blog." msgid "Installed languages" msgstr "Langues installées" msgid "No additional language is installed." msgstr "Aucune langue supplémentaire n'est installée." msgid "Language" msgstr "Langue" msgid "Action" msgstr "Action" msgid "Install or upgrade languages" msgstr "Installer ou mettre à jour une langue" #, php-format msgid "You can install or remove a language by adding or removing the relevant directory in your %s folder." msgstr "Vous pouvez installer ou supprimer une langue en ajoutant ou supprimant le répertoire correspondant dans votre répertoire %s." msgid "Available languages" msgstr "Langues disponibles" #, php-format msgid "You can download and install a additional language directly from Dotclear.net. Proposed languages are based on your version: %s." msgstr "Vous pouvez télécharger et installer une langue supplémentaire directement depuis Dotclear.net. Les langues proposées sont basées sur votre version : %s." msgid "Language:" msgstr "Langue :" msgid "Install language" msgstr "Installer la langue" msgid "Upload a zip file" msgstr "Déposer un fichier zip" msgid "You can install languages by uploading zip files." msgstr "Vous pouvez installer des langues en déposant des fichiers zip." msgid "Language zip file:" msgstr "Fichier zip de la langue :" msgid "Upload language" msgstr "Déposer la langue" msgid "Invalid language zip file." msgstr "Fichier zip de langue invalide." msgid "The zip file does not appear to be a valid Dotclear language pack." msgstr "Le fichier zip ne semble pas être un fichier de langue Dotclear valide." msgid "An error occurred during language upgrade." msgstr "Une erreur est survenue durant la mise à jour de la langue." msgid "By names, in ascending order" msgstr "Par noms croissants" msgid "By names, in descending order" msgstr "Par noms décroissants" msgid "By dates, in ascending order" msgstr "Par dates croissantes" msgid "By dates, in descending order" msgstr "Par dates décroissantes" #, php-format msgid "Directory \"%s\" has been successfully created." msgstr "Le répertoire \"%s\" a été créé." msgid "Files have been successfully uploaded." msgstr "Le fichier a été chargé." #, php-format msgid "Successfully delete one media." msgid_plural "Successfully delete %d medias." msgstr[0] "Suppression d'un média effectuée." msgstr[1] "Suppression de %d médias effectuée." msgid "File has been successfully removed." msgstr "Le fichier a été supprimé." #, php-format msgid "Directory \"%s\" has been successfully rebuilt." msgstr "Le répertoire \"%s\" a été reconstruit." msgid "Media manager" msgstr "Médiathèque" msgid "confirm removal" msgstr "Confirmer la suppression" #, php-format msgid "Are you sure you want to remove %s?" msgstr "Êtes-vous certain de vouloir supprimer %s ?" msgid "Cancel" msgstr "Annuler" msgid "Yes" msgstr "oui" msgid "You do not have sufficient permissions to write to this folder." msgstr "Vous n'avez pas les droits suffisants pour écrire dans ce répertoire." msgid "Directory has been successfully created." msgstr "Le répertoire a été créé." msgid "Directory has been successfully removed." msgstr "Le répertoire a été supprimé." msgid "Directory has been successfully rebuilt." msgstr "Le répertoire a été reconstruit." msgid "Zip file has been successfully extracted." msgstr "Le fichier zip a été extrait." #, php-format msgid "Choose a file to attach to entry %s by clicking on %s." msgstr "Choisissez un fichier à attacher au billet %s en cliquant sur %s." msgid "Attach this file to entry" msgstr "Attacher ce fichier au billet" #, php-format msgid "Choose a file to insert into entry by clicking on %s." msgstr "Choisissez un fichier à insérer dans le billet en cliquant sur %s." msgid "Remove selected medias" msgstr "Supprimer les médias sélectionnés" msgid "No file." msgstr "Aucun fichier." msgid "Sort files:" msgstr "Trier les fichiers :" msgid "Number of elements displayed per page:" msgstr "Nombre d'éléments affichés par page :" #, php-format msgid "In %s:" msgstr "Dans %s :" msgid "Create new directory" msgstr "Créer un répertoire" msgid "Directory Name:" msgstr "Nom du répertoire :" # php-format #, php-format msgid "Backup content of %s" msgstr "Sauvegarder le contenu de %s" msgid "Download zip file" msgstr "Télécharger un fichier zip" msgid "Add files" msgstr "Ajouter des fichiers" msgid "Please take care to publish media that you own and that are not protected by copyright." msgstr "Veuillez prendre garde à ne publier que des médias que vous possédez ou qui ne sont pas protégés par le droit d'auteur." msgid "Choose file" msgstr "Choisir un fichier" msgid "Choose files" msgstr "Choisir des fichiers" msgid "Maximum file size allowed:" msgstr "Taille maximale de fichier autorisée :" msgid "Private" msgstr "Privé" msgid "To send several files at the same time, you can activate the enhanced uploader in" msgstr "Pour envoyer plusieurs fichiers à la fois, vous pouvez activer l'interface avancée dans" msgid "My preferences" msgstr "Mes préférences" msgid "Refresh" msgstr "Actualiser" msgid "Clear all" msgstr "Tout annuler" msgid "Upload" msgstr "Envoyer" #, php-format msgid "Current settings for medias and images are defined in %s" msgstr "Les réglages actuels pour les médias et les images sont définis dans les %s" msgid "Blog parameters" msgstr "Paramètres du blog" msgid "open" msgstr "ouvrir" msgid "Insert this file into entry" msgstr "Insérer ce fichier dans le billet" msgid "delete" msgstr "supprimer" msgid "Not a valid file" msgstr "Fichier invalide" msgid "File has been successfully updated." msgstr "Le fichier a été mis à jour." msgid "Thumbnails have been successfully updated." msgstr "Les miniatures ont été mises à jour." msgid "Default media insertion settings have been successfully updated." msgstr "Les paramètres par défaut d'insertion des médias ont été mis à jour." msgid "Are you sure to delete this media?" msgstr "Êtes-vous sûr de vouloir supprimer ce média ?" msgid "Insert media item" msgstr "Insérer un média" msgid "Image size:" msgstr "Taille de l'image :" msgid "Image alignment" msgstr "Alignement de l'image" msgid "Image insertion" msgstr "Insertion de l'image" msgid "As a single image" msgstr "En tant qu'image uniquement" msgid "As a link to the original image" msgstr "En tant que lien vers l'image originale" msgid "MP3 disposition" msgstr "Disposition du MP3" msgid "Please note that you cannot insert mp3 files with visual editor." msgstr "Merci de noter que vous ne pouvez pas insérer de fichier mp3 avec l'éditeur visuel." msgid "Please note that you cannot insert video files with visual editor." msgstr "Merci de noter que vous ne pouvez pas insérer de fichier vidéo avec l'éditeur visuel." msgid "Video size" msgstr "Taille de la vidéo" msgid "Width:" msgstr "Largeur :" msgid "Height:" msgstr "Hauteur :" msgid "Video disposition" msgstr "Disposition de la vidéo" msgid "Media item will be inserted as a link." msgstr "Le média sera inséré en tant que lien." msgid "Insert" msgstr "Insérer" msgid "Make current settings as default" msgstr "Mémoriser ces réglages d'insertion" msgid "Media details" msgstr "Détails du média" msgid "Available sizes:" msgstr "Tailles disponibles :" msgid "File owner:" msgstr "Propriétaire du fichier :" msgid "File type:" msgstr "Type de fichier :" msgid "File size:" msgstr "Taille du fichier :" msgid "File URL:" msgstr "URL du fichier :" msgid "Show entries containing this media" msgstr "Afficher les entrées contenant ce média" msgid "Entries containing this media" msgstr "Entrées contenant ce média" msgid "No entry seems contain this media." msgstr "Aucune entrée ne semble contenir ce média." msgid "published" msgstr "publié" msgid "unpublished" msgstr "non publié" msgid "scheduled" msgstr "programmé" msgid "pending" msgstr "en attente" msgid "Image details" msgstr "Détails de l'image" msgid "No detail" msgstr "Aucun détail" msgid "Updates and modifications" msgstr "Mises à jour et modifications" msgid "Update thumbnails" msgstr "Mettre à jour les miniatures" msgid "This will create or update thumbnails for this image." msgstr "Ceci va créer ou mettre à jour les miniatures pour cette image." msgid "Extract in a new directory" msgstr "Extraire dans un nouveau répertoire" msgid "Extract in current directory" msgstr "Extraire dans le répertoire actuel" msgid "Extract archive" msgstr "Extraire l'archive" msgid "This will extract archive in a new directory that should not exist yet." msgstr "Ceci va extraire l'archive dans un nouveau répertoire qui ne doit pas encore exister." msgid "This will extract archive in current directory and will overwrite existing files or directory." msgstr "Ceci va extraire l'archive dans le répertoire actuel et écrasera les fichiers ou répertoires existants." msgid "Extract mode:" msgstr "Mode d'extraction :" msgid "Extract" msgstr "Extraire" msgid "Change media properties" msgstr "Changer les propriétés du média" msgid "File name:" msgstr "Nom du fichier :" msgid "File title:" msgstr "Titre du fichier :" msgid "File date:" msgstr "Date du fichier :" msgid "New directory:" msgstr "Nouveau répertoire :" msgid "Change file" msgstr "Changer le fichier" msgid "Choose a file:" msgstr "Choisir un fichier :" #, php-format msgid "Maximum size %s" msgstr "Taille maximale %s" msgid "Send" msgstr "Envoyer" msgid "Delete this media" msgstr "Supprimer ce média" msgid "No content found on this plugin." msgstr "Aucun contenu pour ce plugin." msgid "Plugin not found" msgstr "Plugin introuvable" msgid "The plugin you reached does not exist or does not have an admin page." msgstr "Le plugin que vous essayez d'atteindre n'existe pas ou n'a pas de page d'administration." msgid "Plugins management" msgstr "Gestion des plugins" msgid "Plugin configuration" msgstr "Configuration du plugin" msgid "Update plugins" msgstr "Mise à jour des plugins" #, php-format msgid "There is one plugin to update available from repository." msgid_plural "There are %s plugins to update available from repository." msgstr[0] "Il y a un plugin à mettre à jour depuis le dépôt." msgstr[1] "Il y a %s plugins à mettre à jour depuis le dépôt." msgid "Installed plugins" msgstr "Plugins installés" msgid "Activated plugins" msgstr "Plugins activés" msgid "You can configure and manage installed plugins from this list." msgstr "Vous pouvez configurer et gérer les plugins installés depuis cette liste." msgid "Deactivated plugins" msgstr "Plugins désactivés" msgid "Deactivated plugins are installed but not usable. You can activate them from here." msgstr "Les plugins désactivés sont installés mais non utilisables. Vous pouvez les activer depuis cette page." msgid "Add plugins" msgstr "Ajouter des plugins" msgid "Add plugins from repository" msgstr "Ajouter des plugins depuis le dépôt" msgid "Add plugins from a package" msgstr "Ajouter des plugins depuis un package" msgid "You can install plugins by uploading or downloading zip files." msgstr "Vous pouvez installer des plugins en déposant ou téléchargeant des fichiers zip." msgid "Some functions are disabled, please give write access to your plugins directory to enable them." msgstr "Certaines fonctions sont désactivées, donnez un accès en écriture à votre répertoire de plugins pour les activer." msgid "Add a link" msgstr "Ajouter un lien" msgid "Link URL:" msgstr "URL du lien :" msgid "Link title:" msgstr "Titre du lien :" msgid "Link language:" msgstr "Langue du lien :" msgid "Add a link to an entry" msgstr "Ajouter un lien vers une entrée" msgid "Entry type:" msgstr "Type d'entrées :" msgid "Ok" msgstr "Ok" msgid "Search entry:" msgstr "Rechercher une entrée :" msgid "Search" msgstr "Rechercher" msgid "cancel" msgstr "annuler" msgid "Edit entry" msgstr "Modifier le billet" msgid "This entry does not exist." msgstr "Ce billet n'existe pas." msgid "Next entry" msgstr "Billet suivant" msgid "Previous entry" msgstr "Billet précédent" msgid "All pings sent." msgstr "Tous les rétroliens ont été envoyés." msgid "Invalid publication date" msgstr "Date de publication invalide" #, php-format msgid "The post \"%s\" has been successfully updated" msgstr "Le billet \"%s\" a été mis à jour." msgid "Entry has been successfully created." msgstr "Le billet a été créé." msgid "Published" msgstr "Publié" msgid "Unpublished" msgstr "Non publié" msgid "Scheduled" msgstr "Programmé" msgid "Pending" msgstr "En attente" #, php-format msgid "“%s”" msgstr "“%s”" msgid "Entries" msgstr "Billets" msgid "Entry has been successfully updated." msgstr "Le billet a été mis à jour." msgid "File has been successfully attached." msgstr "Le fichier a été attaché." msgid "Attachment has been successfully removed." msgstr "L'annexe a été retirée." msgid "Don't forget to validate your XHTML conversion by saving your post." msgstr "Enregistrez votre billet pour valider la transformation en XHTML." msgid "Go to this entry on the site" msgstr "Voir ce billet sur le site" msgid "Entry status" msgstr "État du billet" msgid "Publication date and hour" msgstr "Date et heure de publication" msgid "Entry language" msgstr "Langue du billet" msgid "Text formatting" msgstr "Formatage du texte" msgid "Convert to XHTML" msgstr "Convertir en XHTML" msgid "Filing" msgstr "Classement" msgid "Selected entry" msgstr "Billet sélectionné" msgid "Category" msgstr "Catégorie" msgid "Options" msgstr "Options" msgid "Comments and trackbacks list" msgstr "Liste des commentaires et des rétroliens" msgid "Warning: Comments are not more accepted for this entry." msgstr "Attention : les commentaires ne sont plus acceptés pour ce billet." msgid "Comments are not accepted on this blog so far." msgstr "Les commentaires ne sont pas acceptés sur ce blog pour le moment." msgid "Warning: Trackbacks are not more accepted for this entry." msgstr "Attention : les rétroliens ne sont plus acceptés pour ce billet." msgid "Trackbacks are not accepted on this blog so far." msgstr "Les rétroliens sont fermés sur ce blog pour le moment." msgid "Password" msgstr "Mot de passe" msgid "Edit basename" msgstr "URL spécifique" msgid "Warning: If you set the URL manually, it may conflict with another entry." msgstr "Attention : si vous indiquez l'URL manuellement, celle-ci peut entrer en conflit avec un autre billet." msgid "Excerpt:" msgstr "Extrait :" msgid "Introduction to the post." msgstr "Introduction au billet." msgid "Personal notes:" msgstr "Notes personnelles :" msgid "Unpublished notes." msgstr "Notes non publiées." msgid "Edit post" msgstr "Modifier le billet" msgid "Preview" msgstr "Prévisualiser" msgid "Comments" msgstr "Commentaires" msgid "Add a comment" msgstr "Ajouter un commentaire" msgid "Trackbacks" msgstr "Rétroliens" msgid "Trackbacks received" msgstr "Rétroliens reçus" msgid "No trackback" msgstr "Aucun rétrolien" msgid "Selected trackbacks action:" msgstr "Action sur les rétroliens sélectionnés :" msgid "Ping blogs" msgstr "Envoyer des rétroliens" msgid "URLs to ping:" msgstr "URLs à rétrolier :" msgid "Excerpt to send:" msgstr "Extrait à envoyer :" msgid "Auto discover ping URLs" msgstr "Découverte automatique des URL à rétrolier" msgid "Previously sent pings" msgstr "Rétroliens déjà envoyés" msgid "IP address" msgstr "Adresse IP" msgid "Edit" msgstr "Modifier" msgid "Junk" msgstr "Indésirable" msgid "select this comment" msgstr "Sélectionner ce commentaire" msgid "select this trackback" msgstr "Sélectionner ce rétrolien" msgid "Edit this comment" msgstr "Modifier ce commentaire" msgid "This attachment does not exist" msgstr "Cette annexe n'existe pas" msgid "Remove attachment" msgstr "Supprimer l'annexe" msgid "Attachment" msgstr "Annexe" msgid "Are you sure you want to remove this attachment?" msgstr "Êtes-vous certain de vouloir supprimer cette annexe ?" msgid "(No cat)" msgstr "(aucune)" msgid "Selected" msgstr "Sélectionné" msgid "Not selected" msgstr "Non sélectionné" msgid "With attachments" msgstr "Avec annexe(s)" msgid "Without attachments" msgstr "Sans annexes" msgid "Number of comments" msgstr "Nombre de commentaires" msgid "Number of trackbacks" msgstr "Nombre de rétroliens" msgid "Selected entries have been successfully updated." msgstr "Les entrées sélectionnées ont été modifiées." msgid "Selected entries have been successfully deleted." msgstr "Les entrées sélectionnées ont été supprimées." msgid "Selected:" msgstr "Sélectionné :" msgid "Attachments:" msgstr "Annexes :" msgid "Month:" msgstr "Mois :" msgid "Lang:" msgstr "Langue :" msgid "entries per page" msgstr "billets par page" msgid "Selected entries action:" msgstr "Action sur les billets sélectionnés :" msgid "Default" msgstr "Défaut" msgid "If you want to change your email or password you must provide your current password." msgstr "Si vous voulez modifier votre adresse email ou votre mot de passe, vous devez indiquer votre mot de passe actuel." msgid "Personal information has been successfully updated." msgstr "Vos informations personnelles ont été enregistrées." msgid "Personal options has been successfully updated." msgstr "Vos options personnelles ont été enregistrées." msgid "Dashboard options has been successfully updated." msgstr "Vos options du tableau de bord ont été enregistrées." msgid "No favorite selected" msgstr "Aucun favori sélectionné" msgid "Favorites have been successfully added." msgstr "Les favoris ont été ajoutés." msgid "Favorites have been successfully removed." msgstr "Les favoris ont été retirés." msgid "Favorites have been successfully updated." msgstr "Les favoris ont été mis à jour." msgid "Default favorites have been successfully updated." msgstr "Les favoris par défaut ont été enregistrés." msgid "My profile" msgstr "Mon profil" msgid "Display name:" msgstr "Pseudonyme :" msgid "Language for my interface:" msgstr "Langue de mon interface :" msgid "My timezone:" msgstr "Mon fuseau horaire :" msgid "Change my password" msgstr "Changer mon mot de passe" msgid "Confirm new password:" msgstr "Confirmer le nouveau mot de passe :" msgid "Your current password:" msgstr "Votre mot de passe actuel :" msgid "If you have changed your email or password you must provide your current password to save these modifications." msgstr "Si vous avez modifié votre adresse email ou votre mot de passe, vous devez indiquer votre mot de passe actuel pour enregistrer ces modifications." msgid "Update my profile" msgstr "Mettre à jour mon profil" msgid "My options" msgstr "Mes options" msgid "Interface" msgstr "Interface" msgid "Activate enhanced uploader in media manager" msgstr "Activer l'interface avancée de la médiathèque" msgid "Disable javascript powered drag and drop for ordering items" msgstr "Désactiver le glisser-déposer pour ordonnancer les éléments" msgid "If checked, numeric fields will allow to type the elements' ordering number." msgstr "Si cette option est cochée, des champs numériques permettront d'indiquer la position des éléments." msgid "Number of elements displayed per page in media manager:" msgstr "Nombre d'éléments affichés par page dans la médiathèque :" msgid "Do not use standard favicon" msgstr "Ne pas utiliser le favicon standard de Dotclear" msgid "This will be applied for all users" msgstr "Ce choix sera appliqué pour tous les utilisateurs" msgid "Edition" msgstr "Édition" msgid "Preferred format:" msgstr "Format d'édition préféré :" msgid "Default entry status:" msgstr "État des billets par défaut :" msgid "Entry edit field height:" msgstr "Taille de la zone d'édition :" msgid "Enable WYSIWYG mode" msgstr "Activer l'éditeur visuel" msgid "Other options" msgstr "Autres options" msgid "Save my options" msgstr "Enregistrer mes options" msgid "My dashboard" msgstr "Mon tableau de bord" msgid "My favorites" msgstr "Mes favoris" #, php-format msgid "position of %s" msgstr "position de %s" msgid "Save order" msgstr "Enregistrer l'ordre" msgid "Delete selected favorites" msgstr "Retirer les favoris sélectionnés" msgid "Are you sure you want to remove selected favorites?" msgstr "Êtes-vous sûr de vouloir retirer les favoris sélectionnés ?" msgid "If you are a super administrator, you may define this set of favorites to be used by default on all blogs of this installation." msgstr "Si vous êtes super administrateur, vous pouvez faire de ces favoris le jeu par défaut pour tous les blogs de l'installation." msgid "Define as default favorites" msgstr "Définir comme favoris par défaut" msgid "Currently no personal favorites." msgstr "La liste de vos favoris est vide pour le moment." msgid "Other available favorites" msgstr "Autres favoris disponibles" msgid "(default favorite)" msgstr "(favori par défaut)" msgid "Add to my favorites" msgstr "Ajouter à mes favoris" msgid "Menu" msgstr "Menu" msgid "Display favorites at the top of the menu" msgstr "Afficher les favoris en haut du menu" msgid "Dashboard icons" msgstr "Icônes du tableau de bord" msgid "Iconset:" msgstr "Jeu d'icônes :" msgid "Dashboard modules" msgstr "Modules du tableau de bord" msgid "Display documentation links" msgstr "Afficher les liens vers la documentation" msgid "Display Dotclear news" msgstr "Afficher les nouvelles de Dotclear" msgid "Display quick entry form" msgstr "Afficher le formulaire de billet rapide" msgid "Save my dashboard options" msgstr "Enregistrer les options de mon tableau de bord" msgid "Search options" msgstr "Options de recherche" msgid "Query:" msgstr "Requête :" msgid "Search in entries" msgstr "Rechercher dans les billets" msgid "Search in comments" msgstr "Rechercher dans les commentaires" #, php-format msgid "%d entries found" msgstr "%d billets trouvés" #, php-format msgid "%d entry found" msgstr "%d billet trouvé" #, php-format msgid "%d comment found" msgstr "%d commentaire trouvé" #, php-format msgid "%d comments found" msgstr "%d commentaires trouvés" msgid "Dotclear update" msgstr "Mise à jour de Dotclear" #, php-format msgid "Unable to delete file %s" msgstr "Impossible de supprimer le fichier %s" #, php-format msgid "Downloaded Dotclear archive seems to be corrupted. Try download it again." msgstr "L'archive de Dotclear téléchargée semble être corrompue. Essayer de la télécharger à nouveau." msgid "If this problem persists try to update manually." msgstr "Si le problème persiste essayer de mettre à jour manuellement." msgid "The following files of your Dotclear installation have been modified so we won't try to update your installation. Please try to update manually." msgstr "Comme les fichiers suivants de votre installation de Dotclear ont été modifiés, votre installation ne peut être mise à jour. Merci de mettre à jour manuellement." #, php-format msgid "The following files of your Dotclear installation are not readable. Please fix this or try to make a backup file named %s manually." msgstr "Les fichiers suivants de votre installation de Dotclear ne peuvent pas être lus. Veuillez corriger ceci ou créer un fichier de backup nommé %s manuellement." msgid "The following files of your Dotclear installation cannot be written. Please fix this or try to update manually." msgstr "Les fichiers suivants de votre installation de Dotclear ne peuvent pas être écrits. Veuillez corriger la situation ou mettre à jour manuellement." msgid "Manual checking of update done successfully." msgstr "La vérification manuelle de mise à jour a été effectuée." msgid "No newer Dotclear version available." msgstr "Aucune nouvelle version de Dotclear n'est disponible." msgid "Force checking update Dotclear" msgstr "Forcer la vérification de mise à jour de Dotclear" #, php-format msgid "Dotclear %s is available." msgstr "Dotclear %s est disponible." msgid "To upgrade your Dotclear installation simply click on the following button. A backup file of your current installation will be created in your root directory." msgstr "Pour mettre à jour votre installation de Dotclear, cliquez sur le bouton suivant. Un fichier de sauvegarde de votre installation actuelle sera créé dans votre répertoire principal." msgid "Update Dotclear" msgstr "Mettre à jour Dotclear" msgid "Manage backup files" msgstr "Gestion des fichiers de sauvegarde" msgid "Update backup files" msgstr "Sauvegardes des mises à jour" msgid "The following files are backups of previously updates. You can revert your previous installation or delete theses files." msgstr "Les fichiers suivants sont des sauvegardes de mises à jour précédentes. Vous pouvez rétablir votre installation précédente ou supprimer ces fichiers." msgid "Please note that reverting your Dotclear version may have some unwanted side-effects. Consider reverting only if you experience strong issues with this new version." msgstr "Merci de noter que rétablir votre version de Dotclear peut avoir des effets indésirables. N'envisagez ceci que si vous rencontrez d'importantes difficultés avec cette nouvelle version." #, php-format msgid "You should not revert to version prior to last one (%s)." msgstr "Vous ne devez pas rétablir une version précédant la dernière (%s)." msgid "Delete selected file" msgstr "Supprimer le fichier sélectionné" msgid "Revert to selected file" msgstr "Rétablir le fichier sélectionné" msgid "Congratulations, you're one click away from the end of the update." msgstr "Félicitations, vous êtes à un clic de la fin de la mise à jour." msgid "Finish the update." msgstr "Finir la mise à jour." msgid "New user" msgstr "Nouvel utilisateur" msgid "User has been successfully updated." msgstr "L'utilisateur a été mis à jour." #, php-format msgid "User \"%s\" already exists." msgstr "L'utilisateur \"%s\" existe déjà." msgid "User has been successfully created." msgstr "L'utilisateur a été créé." msgid "User profile" msgstr "Profil utilisateur" msgid "User ID:" msgstr "Identifiant (login) :" msgid "Warning:" msgstr "Attention :" msgid "If you change your username, you will have to log in again." msgstr "Si vous changez votre login, vous devrez vous identifier à nouveau." msgid "Password change required to connect" msgstr "Changement de mot de passe requis à la prochaine connexion" msgid "Mandatory for password recovering procedure." msgstr "Indispensable pour la procédure de récupération de mot de passe." msgid "Timezone:" msgstr "Fuseau horaire :" msgid "Save and create another" msgstr "Enregistrer et créer un nouveau" msgid "Permissions" msgstr "Permissions" msgid "Add new permissions" msgstr "Ajouter de nouvelles permissions" msgid "No permissions so far." msgstr "Aucune permission pour le moment." msgid "Blog:" msgstr "Blog :" #, php-format msgid "%s is super admin (all rights on all blogs)." msgstr "%s est super administrateur (tous les droits sur tous les blogs)." msgid "Username" msgstr "Identifiant" msgid "Last Name" msgstr "Nom" msgid "First Name" msgstr "Prénom" msgid "Display name" msgstr "Pseudonyme" msgid "Number of entries" msgstr "Nombre d'entrées" msgid "Set permissions" msgstr "Définir les permissions" msgid "User has been successfully removed." msgstr "L'utilisateur a été supprimé." msgid "The permissions have been successfully updated." msgstr "Les permissions ont été mises à jour." msgid "users per page" msgstr "utilisateurs par page" msgid "Selected users action:" msgstr "Action sur les utilisateurs sélectionnés :" msgid "No blog or user given." msgstr "Vous n'avez pas indiqué de blog ou d'utilisateur" msgid "You cannot delete yourself." msgstr "Vous ne pouvez pas vous supprimer vous-même." msgid "User has been successfully deleted." msgstr "L'utilisateur a été supprimé." msgid "Back to user profile" msgstr "Retour au profil utilisateur" #, php-format msgid "Choose one or more blogs to which you want to give permissions to users %s." msgstr "Choisissez un ou plusieurs blogs pour lesquels les utilisateurs suivants auront des permissions : %s." msgid "select" msgstr "sélectionner" #, php-format msgid "You are about to change permissions on the following blogs for users %s." msgstr "Vous allez changer les permissions des utilisateurs %s pour ces blogs." msgid "Validate permissions" msgstr "Valider les permissions" msgid "Back to comments list" msgstr "Retour à la liste des commentaires" msgid "Comments actions" msgstr "Action sur les commentaires" msgid "Publish" msgstr "Publier" msgid "Unpublish" msgstr "Mettre hors ligne" msgid "Mark as pending" msgstr "Mettre en attente" msgid "Mark as junk" msgstr "Mettre en indésirable" msgid "No comment selected" msgstr "Aucun commentaire sélectionné." msgid "Back to entries list" msgstr "Retour à la liste des billets" msgid "Entries actions" msgstr "Action sur les entrées" msgid "Schedule" msgstr "Programmer" msgid "Mark" msgstr "Marquer" msgid "Mark as selected" msgstr "Sélectionner" msgid "Mark as unselected" msgstr "Désélectionner" msgid "Change" msgstr "Changer" msgid "Change category" msgstr "Changer la catégorie" msgid "Change language" msgstr "Changer la langue" msgid "Change author" msgstr "Changer l'auteur" msgid "No entry selected" msgstr "Aucune entrée sélectionnée" #, php-format msgid "%d entry has been successfully updated to status : \"%s\"" msgid_plural "%d entries have been successfully updated to status : \"%s\"" msgstr[0] "%s billet a été positionné au statut \"%s\"." msgstr[1] "%s billets ont été positionnés au statut \"%s\"." #, php-format msgid "%d entry has been successfully marked as selected" msgid_plural "%d entries have been successfully marked as selected" msgstr[0] "%s billet a été marqué sélectionné." msgstr[1] "%s billets ont été marqués sélectionnés." #, php-format msgid "%d entry has been successfully marked as unselected" msgid_plural "%d entries have been successfully marked as unselected" msgstr[0] "%s billet a été marqué désélectionné." msgstr[1] "%s billets ont été marqués désélectionnés." #, php-format msgid "%d entry has been successfully deleted" msgid_plural "%d entries have been successfully deleted" msgstr[0] "%s entrée a été supprimée." msgstr[1] "%s entrées ont été supprimées." #, php-format msgid "%d entry has been successfully moved to category \"%s\"" msgid_plural "%d entries have been successfully moved to category \"%s\"" msgstr[0] "%s billet a été déplacé dans la catégorie \"%s\"." msgstr[1] "%s billets ont été déplacés dans la catégorie \"%s\"." msgid "Change category for this selection" msgstr "Changer la catégorie pour cette sélection" msgid "Create a new category for the post(s)" msgstr "Créer une nouvelle catégorie pour ce(s) billet(s)" msgid "This user does not exist" msgstr "Cet utilisateur n'existe pas" #, php-format msgid "%d entry has been successfully set to user \"%s\"" msgid_plural "%d entries have been successfully set to user \"%s\"" msgstr[0] "%s billet a été affecté à l'utilisateur \"%s\"." msgstr[1] "%s billets ont été affectés à l'utilisateur \"%s\"." msgid "Change author for this selection" msgstr "Changer l'auteur pour cette sélection" msgid "New author (author ID):" msgstr "Nouvel auteur (identifiant utilisateur) :" #, php-format msgid "%d entry has been successfully set to language \"%s\"" msgid_plural "%d entries have been successfully set to language \"%s\"" msgstr[0] "%s billet mis à jour avec la langue \"%s\"." msgstr[1] "%s billets mis à jour avec la langue \"%s\"." msgid "Change language for this selection" msgstr "Changer la langue de cette sélection" msgid "Available" msgstr "Disponible" msgid "Most used" msgstr "Plus utilisées" msgid "Entry language:" msgstr "Langue du billet :" msgid "Languages" msgstr "Langues" #, php-format msgid "%d comment" msgid_plural "%d comments" msgstr[0] "%d commentaire" msgstr[1] "%d commentaires" msgid "Change blog" msgstr "Changer de blog" msgid "Blogs:" msgstr "Blogs :" msgid "Go to the content" msgstr "Aller au contenu" msgid "Go to the menu" msgstr "Aller au menu" msgid "Go to search" msgstr "Aller à la recherche" msgid "Go to help" msgstr "Aller à l'aide" msgid "Go to site" msgstr "Aller sur le site" #, php-format msgid "Logout %s" msgstr "Déconnecter %s" msgid "Hide main menu" msgstr "Masquer le menu principal" msgid "Show main menu" msgstr "Afficher le menu principal" msgid "Safe mode" msgstr "Mode de secours" msgid "You are in safe mode. All plugins have been temporarily disabled. Remind to log out then log in again normally to get back all functionalities" msgstr "Vous êtes en mode de secours. Tous les plugins ont été temporairement désactivés. N'oubliez-pas de vous déconnecter puis de vous reconnecter normalement pour retrouver toutes les fonctionnalités" msgid "Error:" msgstr "Erreur :" msgid "[%H:%M:%S]" msgstr "[%H:%M:%S]" #, php-format msgid "Thank you for using %s." msgstr "Merci d'utiliser %s." msgid "Go to dashboard" msgstr "Tableau de bord" msgid "Help about this page" msgstr "Aide pour cette page" #, php-format msgid "See also %s" msgstr "Voir également %s" msgid "the global help" msgstr "l'aide générale" msgid "uncover" msgstr "dévoiler" msgid "hide" msgstr "cacher" msgid "Need help?" msgstr "Besoin d'aide ?" msgid "new window" msgstr "nouvelle fenêtre" msgid "Hide" msgstr "Cacher" msgid "Select:" msgstr "Sélectionner :" msgid "no selection" msgstr "aucun" msgid "select all" msgstr "tous" msgid "Invert selection" msgstr "Inverser la sélection" msgid "view entry" msgstr "voir le billet" #, php-format msgid "Are you sure you want to delete selected entries (%s)?" msgstr "Êtes-vous certain de vouloir supprimer les billets sélectionnés (%s) ?" #, php-format msgid "Are you sure you want to delete selected medias (%d)?" msgstr "Êtes-vous sûr de vouloir supprimer les médias sélectionnés (%d) ?" #, php-format msgid "Are you sure you want to delete selected categories (%s)?" msgstr "Êtes-vous certain de vouloir supprimer les categories sélectionnées (%s) ?" msgid "Are you sure you want to delete this entry?" msgstr "Êtes-vous certain de vouloir supprimer ce billet ?" msgid "Click here to unlock the field" msgstr "Cliquez ici pour déverrouiller ce champ" msgid "Are you sure you want to delete all spams?" msgstr "Êtes-vous certain de vouloir supprimer tous les indésirables ?" #, php-format msgid "Are you sure you want to delete selected comments (%s)?" msgstr "Êtes-vous certain de vouloir supprimer les commentaires sélectionnés (%s) ?" msgid "Are you sure you want to delete this comment?" msgstr "Êtes-vous certain de vouloir supprimer ce commentaire ?" msgid "Users with posts cannot be deleted." msgstr "Les utilisateurs ayant écrit des entrées ne peuvent être supprimés." #, php-format msgid "Are you sure you want to delete selected users (%s)?" msgstr "Êtes-vous certain de vouloir supprimer les utilisateurs sélectionnés (%s) ?" #, php-format msgid "Are you sure you want to delete category \"%s\"?" msgstr "Êtes-vous certain de vouloir supprimer la catégorie \"%s\" ?" msgid "Are you sure you want to reorder all categories?" msgstr "Êtes-vous certain de vouloir réinitialiser l'ordre des catégories ?" #, php-format msgid "Are you sure you want to remove directory \"%s\"?" msgstr "Êtes-vous certain de vouloir supprimer le répertoire \"%s\" ?" #, php-format msgid "Are you sure you want to remove media \"%s\"?" msgstr "Êtes-vous certain de vouloir supprimer le média \"%s\" ?" msgid "Are you sure you want to extract archive in current directory?" msgstr "Êtes-vous certain de vouloir extraire l'archive dans le répertoire actuel ?" #, php-format msgid "Are you sure you want to remove attachment \"%s\"?" msgstr "Êtes-vous certain de vouloir supprimer l'annexe \"%s\" ?" #, php-format msgid "Are you sure you want to delete \"%s\" language?" msgstr "Êtes-vous certain de vouloir supprimer la langue \"%s\" ?" #, php-format msgid "Are you sure you want to delete \"%s\" plugin?" msgstr "Êtes-vous certain de vouloir supprimer le plugin \"%s\" ?" msgid "Are you sure you want to delete selected plugins?" msgstr "Êtes-vous certain de vouloir supprimer les plugins sélectionnés ?" msgid "Use this theme" msgstr "Utiliser ce thème" msgid "Remove this theme" msgstr "Supprimer ce thème" #, php-format msgid "Are you sure you want to delete \"%s\" theme?" msgstr "Êtes-vous certain de vouloir supprimer le thème \"%s\" ?" msgid "Are you sure you want to delete selected themes?" msgstr "Êtes-vous certain de vouloir supprimer les thèmes sélectionnés ?" msgid "Are you sure you want to delete this backup?" msgstr "Êtes-vous certain de vouloir supprimer cette sauvegarde ?" msgid "Are you sure you want to revert to this backup?" msgstr "Êtes-vous certain de vouloir restaurer cette sauvegarde ?" msgid "Zip file content" msgstr "Contenu du fichier zip" msgid "XHTML markup validator" msgstr "Vérifier la validité XHTML" msgid "XHTML content is valid." msgstr "Le contenu XHTML est valide." msgid "There are XHTML markup errors." msgstr "Il y a des erreurs XHTML." msgid "Attention: an audit of a content not yet registered." msgstr "Attention : la vérification porte sur un contenu non encore enregistré." msgid "You have unsaved changes. Switch post format will loose these changes. Proceed anyway?" msgstr "Vous avez des modifications non sauvegardées. Changer de format vous fera perdre ces modifications. Continuer ?" msgid "Warning: post format change will not convert existing content. You will need to apply new format by yourself. Proceed anyway?" msgstr "Attention : le changement de syntaxe ne transformera pas les balises des contenus déjà saisis. Pensez à les réadapter après cette opération. Confirmez-vous ce changement de syntaxe ?" msgid "Loading enhanced uploader, please wait." msgstr "Chargement de l'interface avancée." msgid "Details" msgstr "Détails" msgid "Support" msgstr "Assistance" msgid "Help:" msgstr "Aide :" msgid "Section:" msgstr "Section : " msgid "Tags:" msgstr "Mots-clés:" msgid "You have unsaved changes." msgstr "Vous n'avez pas enregistré vos modifications." msgid "close" msgstr "fermer" msgid "now" msgstr "maintenant" msgid "visual" msgstr "visuel" msgid "source" msgstr "source" msgid "You can use the following shortcuts to format your text." msgstr "Vous pouvez utiliser les raccourcis suivants pour formater votre texte." msgid "-- none --" msgstr "-- aucun --" msgid "-- block format --" msgstr "-- format bloc --" msgid "Paragraph" msgstr "Paragraphe" msgid "Level 1 header" msgstr "Titre de niveau 1" msgid "Level 2 header" msgstr "Titre de niveau 2" msgid "Level 3 header" msgstr "Titre de niveau 3" msgid "Level 4 header" msgstr "Titre de niveau 4" msgid "Level 5 header" msgstr "Titre de niveau 5" msgid "Level 6 header" msgstr "Titre de niveau 6" msgid "Strong emphasis" msgstr "Forte emphase" msgid "Emphasis" msgstr "Emphase" msgid "Inserted" msgstr "Insertion" msgid "Deleted" msgstr "Suppression" msgid "Inline quote" msgstr "Citation en ligne" msgid "Code" msgstr "Code" msgid "Line break" msgstr "Passage à la ligne" msgid "Blockquote" msgstr "Bloc de citation" msgid "Preformated text" msgstr "Texte préformaté" msgid "Unordered list" msgstr "Liste à puces" msgid "Ordered list" msgstr "Liste numérotée" msgid "Link" msgstr "Lien" msgid "URL?" msgstr "URL ?" msgid "Language?" msgstr "Langue ?" msgid "External image" msgstr "Image externe" msgid "Media chooser" msgstr "Sélecteur de média" msgid "Link to an entry" msgstr "Lien vers une entrée" msgid "Remove text formating" msgstr "Retirer le formatage du texte" msgid "Temporarily activate enhanced uploader" msgstr "Activer temporairement l'interface avancée" msgid "Temporarily disable enhanced uploader" msgstr "Désactiver temporairement l'interface avancée" msgid "Limit exceeded." msgstr "Limite dépassée." msgid "File size exceeds allowed limit." msgstr "La taille du fichier dépasse la limite autorisée." msgid "Canceled." msgstr "Annulé." msgid "HTTP Error:" msgstr "Erreur HTTP :" msgid "Clean" msgstr "Nettoyer" msgid "File successfully uploaded." msgstr "Le fichier a été envoyé." msgid "No file in queue." msgstr "Aucun fichier en file d'attente." msgid "1 file in queue." msgstr "1 fichier en attente." #, php-format msgid "%d files in queue." msgstr "%d fichiers en attente." msgid "Queue error:" msgstr "Erreur de file d'attente :" msgid "other" msgstr "autres" msgid "Search in repository:" msgstr "Rechercher dans le dépôt :" msgid "Reset search" msgstr "réinitialiser la recherche" msgid "Search is allowed on multiple terms longer than 2 chars, terms must be separated by space." msgstr "La recherche est autorisée sur plusieurs mots de 2 caractères minimum, séparés par un espace." #, php-format msgid "Found %d result for search \"%s\":" msgid_plural "Found %d results for search \"%s\":" msgstr[0] "%d résultat trouvé pour la recherche \"%s\" :" msgstr[1] "%d résultats trouvés pour la recherche \"%s\" :" msgid "current selection" msgstr "sélection courante" #, php-format msgid "%d result" msgid_plural "%d results" msgstr[0] "%d résultat" msgstr[1] "%d résultats" msgid "no results" msgstr "pas de résultats" msgid "Browse index:" msgstr "Parcourir l'index :" msgid "Plugins list" msgstr "Liste des plugins" msgid "Name" msgstr "Nom :" msgid "Score" msgstr "Score" msgid "Version" msgstr "Version" msgid "Current version" msgstr "Version courante" msgid "Plugin from official distribution" msgstr "Plugin de la distribution officielle" msgid "Configure plugin" msgstr "Configurer le plugin" msgid "No plugins matched your search." msgstr "Aucun plugin ne correspond à votre recherche." msgid "Activate" msgstr "Activer" msgid "Deactivate" msgstr "Désactiver" msgid "Install" msgstr "Installer" msgid "Update" msgstr "Mise à jour" msgid "Activate selected plugins" msgstr "Activer les plugins sélectionnés" msgid "Activate all plugins from this list" msgstr "Activer tous les plugins de cette liste" msgid "Deactivate selected plugins" msgstr "Désactiver les plugins sélectionnés" msgid "Deactivate all plugins from this list" msgstr "Désactiver tous les plugins de cette liste" msgid "Update selected plugins" msgstr "Mettre à jour les plugins sélectionnés" msgid "Update all plugins from this list" msgstr "Mettre à jour tous les plugins de cette liste" msgid "No such plugin." msgstr "Plugin inexistant." msgid "You don't have permissions to delete this plugin." msgstr "Vous n'avez pas les permissions pour supprimer ce plugin." msgid "Some plugins have not been delete." msgstr "Certains plugins n'ont pas pu être supprimés." msgid "Plugin has been successfully deleted." msgid_plural "Plugins have been successuflly deleted." msgstr[0] "Ce plugin a été supprimé." msgstr[1] "Ces plugins ont été supprimés." msgid "Plugin has been successfully installed." msgid_plural "Plugins have been successuflly installed." msgstr[0] "Ce plugin a été installé." msgstr[1] "Ces plugins ont été installés." msgid "Plugin has been successfully activated." msgid_plural "Plugins have been successuflly activated." msgstr[0] "Ce plugin a été activé." msgstr[1] "Ces plugins ont été activés." msgid "Some plugins have not been deactivated." msgstr "Certains plugins n'ont pas pu être désactivés." msgid "Plugin has been successfully deactivated." msgid_plural "Plugins have been successuflly deactivated." msgstr[0] "Ce plugin a été désactivé." msgstr[1] "Ces plugins ont été désactivés." msgid "Plugin has been successfully updated." msgid_plural "Plugins have been successuflly updated." msgstr[0] "Ce plugin a été mis à jour." msgstr[1] "Ces plugins ont été mis à jour." msgid "Zip file path:" msgstr "Chemin du fichier zip :" msgid "Download a zip file" msgstr "Télécharger un fichier zip" msgid "Zip file URL:" msgstr "URL du fichier zip :" msgid "Download" msgstr "Télécharger" msgid "Unknow plugin ID" msgstr "ID de plugin inconnu" msgid "This plugin has no configuration file." msgstr "Ce plugin n'a pas de fichier de configuration." #, php-format msgid "Configure \"%s\"" msgstr "Configurer \"%s\"" msgid "Back" msgstr "Retour" #, php-format msgid "Score: %s" msgstr "Score: %s" #, php-format msgid "%s screenshot." msgstr "Capture d'écran de %s." #, php-format msgid "by %s" msgstr "par %s" #, php-format msgid "version %s" msgstr "version %s" #, php-format msgid "(current version %s)" msgstr "(version courante %s)" #, php-format msgid "(built on \"%s\")" msgstr "(basé sur \"%s\")" #, php-format msgid "(requires \"%s\")" msgstr "(nécessite \"%s\")" msgid "View stylesheet" msgstr "Feuille de style" msgid "Configure theme" msgstr "Personnaliser le thème" msgid "No themes matched your search." msgstr "Aucun thème ne correspond à votre recherche." msgid "Use this one" msgstr "Utiliser celui-ci" msgid "Update selected themes" msgstr "Mettre à jour les thèmes selectionnés" msgid "Update all themes from this list" msgstr "Mettre à jour tous les thèmes de cette liste" msgid "No such theme." msgstr "Thème inexistant." msgid "Theme has been successfully selected." msgstr "Ce thème a été sélectionné." msgid "Theme has been successfully activated." msgid_plural "Themes have been successuflly activated." msgstr[0] "Ce thème a été activé." msgstr[1] "Ces thèmes ont été activé." msgid "Some themes have not been deactivated." msgstr "Certains thèmes n'ont pas pu être desactivé." msgid "Theme has been successfully deactivated." msgid_plural "Themes have been successuflly deactivated." msgstr[0] "Ce thème a été désactivé." msgstr[1] "Ces thèmes ont été désactivé." msgid "You don't have permissions to delete this theme." msgstr "Vous n'avez pas les permissions pour supprimer ce thème." msgid "Some themes have not been delete." msgstr "Certains thèmes n'ont pas pu être effacé." msgid "Theme has been successfully deleted." msgid_plural "Themes have been successuflly deleted." msgstr[0] "Ce thème a été supprimé." msgstr[1] "Ces thèmes ont été supprimé." msgid "Theme has been successfully installed." msgid_plural "Themes have been successuflly installed." msgstr[0] "Ce thème a été installé." msgstr[1] "Ces thèmes ont été installé." msgid "Theme has been successfully updated." msgid_plural "Themes have been successuflly updated." msgstr[0] "Ce thème a été mis à jour." msgstr[1] "Ces thèmes ont été mis à jour." msgid "First page" msgstr "Première page" msgid "Previous page" msgstr "Page précédente" msgid "Next page" msgstr "Page suivante" msgid "Last page" msgstr "Dernière page" #, php-format msgid "Page %s / %s" msgstr "Page %s / %s" #, php-format msgid "Direct access page %s" msgstr "Aller à la page : %s" msgid "« prev." msgstr "« préc." msgid "next »" msgstr "suiv. »" msgid "No entry matches the filter" msgstr "Aucune entrée correspondant au filtre" msgid "No entry" msgstr "Pas de billet" #, php-format msgid "List of %s entries match the filter." msgstr "Liste des %s billets correspondant au filtre" msgid "Entries list" msgstr "Liste des entrées" msgid "Protected" msgstr "Protégé" #, php-format msgid "%d attachment" msgstr "%d annexe" #, php-format msgid "%d attachments" msgstr "%d annexes" msgid "No comments or trackbacks matches the filter" msgstr "aucun commentaire ou rétrolien ne correspond au filtre" #, php-format msgid "Comment or trackback matching the filter." msgid_plural "List of %s comments or trackbacks matching the filter." msgstr[0] "Commentaire ou rétrolien correspondant au filtre." msgstr[1] "Liste des %s commentaires ou rétroliens correspondants au filtre." msgid "Type" msgstr "Type" msgid "Entry" msgstr "Billet" #, php-format msgid "Edit the %1$s from %2$s" msgstr "Modifier le %1$s de %2$s" msgid "comment" msgstr "commentaire" msgid "trackback" msgstr "rétrolien" msgid "Type and author" msgstr "Type et auteur" msgid "No user matches the filter" msgstr "Aucun utilisateur correspondant au filtre" msgid "No user" msgstr "Aucun utilisateur" #, php-format msgid "List of %s users match the filter." msgstr "%s utilisateurs correspondent au filtre." msgid "Users list" msgstr "Liste des utilisateurs" msgid "admin" msgstr "Administrateur" msgid "superadmin" msgstr "Super administrateur" msgid "Database error" msgstr "Erreur de base de données" msgid "There seems to be no Session table in your database. Is Dotclear completly installed?" msgstr "Il semble de la table Session n'existe pas dans votre base de données. Dotclear est-il bien installé correctement?" msgid "System settings" msgstr "Réglages système" msgid "Blog" msgstr "Blog" msgid "Plugins" msgstr "Plugins" msgid "medium" msgstr "moyenne" msgid "small" msgstr "petite" msgid "thumbnail" msgstr "vignettes" msgid "square" msgstr "carrée" msgid "Posts" msgstr "Billets" msgid "Pages" msgstr "Pages" msgid "administrator" msgstr "administrateur" msgid "manage their own entries and comments" msgstr "gérer ses propres billets et commentaires" msgid "publish entries and comments" msgstr "publier des billets et des commentaires" msgid "delete entries and comments" msgstr "supprimer des billets et des commentaires" msgid "manage all entries and comments" msgstr "gérer tous les billets et commentaires" msgid "manage categories" msgstr "gérer les catégories" msgid "manage their own media items" msgstr "gérer ses propres médias" msgid "manage all media items" msgstr "gérer tous les médias" msgid "That user does not exist in the database." msgstr "Cet utilisateur n'existe pas dans la base de données." msgid "That key does not exist in the database." msgstr "Cette clé n'existe pas dans la base de données." msgid "You are not allowed to add categories" msgstr "Vous n'êtes pas autorisé à créer des catégories" msgid "You are not allowed to update categories" msgstr "Vous n'êtes pas autorisé à modifier des catégories" msgid "You are not allowed to delete categories" msgstr "Vous n'êtes pas autorisé à supprimer des catégories" msgid "This category is not empty." msgstr "Cette catégorie n'est pas vide." msgid "You are not allowed to reset categories order" msgstr "Vous n'êtes pas autorisé à réinitialiser l'ordre des catégories" msgid "Empty category URL" msgstr "URL de la catégorie vide" msgid "You must provide a category title" msgstr "Vous devez indiquer un titre de catégorie" msgid "You must provide a category URL" msgstr "Vous devez indiquer une URL de catégorie" msgid "You are not allowed to create an entry" msgstr "Vous n'êtes pas autorisé à créer des billets" msgid "You are not allowed to update entries" msgstr "Vous n'êtes pas autorisé à modifier les billets" msgid "No such entry ID" msgstr "Identifiant de billet inconnu" msgid "You are not allowed to edit this entry" msgstr "Vous n'êtes pas autorisé à modifier ce billet" msgid "You are not allowed to change this entry status" msgstr "Vous n'êtes pas autorisé à modifier l'état de ce billet" msgid "You are not allowed to change this entry category" msgstr "Vous n'êtes pas autorisé à modifier la catégorie de ce billet" msgid "You are not allowed to change entries category" msgstr "Vous n'êtes pas autorisé à modifier la catégorie des billets" msgid "You are not allowed to delete entries" msgstr "Vous n'êtes pas autorisé à supprimer des billets" msgid "No entry title" msgstr "Pas de titre de billet" msgid "No entry content" msgstr "Pas de contenu de billet" msgid "Notes" msgstr "Notes" msgid "Note" msgstr "Note" msgid "Empty entry URL" msgstr "URL du billet vide" msgid "You are not allowed to update comments" msgstr "Vous n'êtes pas autorisé à modifier des commentaires" msgid "No such comment ID" msgstr "Identifiant de commentaire inconnu" msgid "You are not allowed to update this comment" msgstr "Vous n'êtes pas autorisé à modifier ce commentaire" msgid "You are not allowed to change this comment's status" msgstr "Vous n'êtes pas autorisé à changer l'état de ce commentaire" msgid "You are not allowed to delete comments" msgstr "Vous n'êtes pas autorisé à supprimer des commentaires" msgid "You must provide a comment" msgstr "Vous devez écrire un commentaire" msgid "You must provide an author name" msgstr "Vous devez indiquer un nom" msgid "Email address is not valid." msgstr "Adresse email invalide." msgid "online" msgstr "en ligne" msgid "offline" msgstr "hors ligne" msgid "removed" msgstr "retiré" msgid "You are not an administrator" msgstr "Vous n'êtes pas administrateur" msgid "Invalid user language code" msgstr "Code langue de l'utilisateur invalide" msgid "Blog ID must contain at least 2 characters using letters, numbers or symbols." msgstr "L'identifiant du blog doit contenir au moins 2 caractères composés de lettres, chiffres ou symboles." msgid "No blog name" msgstr "Pas de nom de blog" msgid "No blog URL" msgstr "Pas d'URL de blog" msgid "No log message" msgstr "Pas de message dans le journal" msgid "unknown" msgstr "inconnu" msgid "No blog defined." msgstr "Aucun blog défini." msgid "You are not a super administrator." msgstr "Vous n'êtes pas super administrateur." msgid "Permission denied." msgstr "Permission refusée." msgid "You are not the file owner." msgstr "Vous n'êtes pas le propriétaire de ce fichier." msgid "This file is not allowed." msgstr "Ce fichier n'est pas autorisé." msgid "New file already exists." msgstr "Le nouveau fichier existe déjà." msgid "File does not exist in the database." msgstr "Ce fichier n'existe pas dans la base de données." #, php-format msgid "Extract destination directory %s already exists." msgstr "Le répertoire de destination d'extraction %s existe déjà." msgid "Embedded Audio Player" msgstr "Lecteur audio intégré" msgid "Embedded Video Player" msgstr "Lecteur vidéo intégré" #, php-format msgid "Module \"%s\" has type \"%s\" that mismatch required module type \"%s\"." msgstr "Le module \"%s\" est de type \"%s\" incompatible avec \"%s\"." #, php-format msgid "Module \"%s\" is installed twice in \"%s\" and \"%s\"." msgstr "Le module \"%s\" est installé en double dans \"%s\" et \"%s\"." msgid "Empty module zip file." msgstr "Fichier zip de module vide." msgid "The zip file does not appear to be a valid Dotclear module." msgstr "Le fichier zip ne semble pas être un fichier de module Dotclear valide." msgid "An error occurred during module deletion." msgstr "Une erreur est survenue durant la suppression du module." #, php-format msgid "Unable to upgrade \"%s\". (older or same version)" msgstr "Impossible de mettre à jour \"%s\" (plus ancienne ou même version)." msgid "Unable to read new _define.php file" msgstr "Impossible de lire le nouveau fichier _define.php." msgid "No such module." msgstr "Module inexistant." msgid "Cannot remove module files" msgstr "Impossible de supprimer les fichiers du module" msgid "Cannot deactivate plugin." msgstr "Le plugin ne peut pas être désactivé." msgid "Cannot activate plugin." msgstr "Le plugin ne peut pas être activé." #, php-format msgid "Invalid setting dcNamespace: %s" msgstr "Espace de nom du paramètre invalide : %s" msgid "Unable to retrieve settings:" msgstr "Impossible d'obtenir les paramètres :" #, php-format msgid "%s is not a valid setting id" msgstr "%s n'est pas un identifiant de paramètre valide" msgid "No namespace specified" msgstr "Aucun espace de nom spécifié" msgid "Unable to retrieve workspaces:" msgstr "Impossible d'obtenir les espaces de travail :" msgid "Unable to retrieve namespaces:" msgstr "Impossible d'obtenir les espaces de nom :" #, php-format msgid "Invalid setting namespace: %s" msgstr "Espace de nom du paramètre invalide : %s" msgid "Failed to read data feed" msgstr "Impossible de lire les données du flux." msgid "Wrong data feed" msgstr "Données du flux incorrectes" msgid "An error occurred while downloading the file." msgstr "Une erreur est survenue pendant le téléchargement du fichier." #, php-format msgid "%s has still been pinged" msgstr "Un rétrolien vers %s a déjà été fait" msgid "Unable to ping URL" msgstr "Impossible de réaliser le rétrolien" #, php-format msgid "%s is not a ping URL" msgstr "%s n'est pas une URL de rétrolien" #, php-format msgid "%s, ping error:" msgstr "%s, erreur de rétrolien :" msgid "Any chance you ping one of my contents? No? Really?" msgstr "Aucune chance que vous pinguiez un de mes contenus ? Non ? Vraiment ?" msgid "Sorry but you can not ping this type of content." msgstr "Désolé, vous ne pouvez pas pinguer ce type de contenu." msgid "Oops. Kinda \"not found\" stuff. Please check the target URL twice." msgstr "Oops, non trouvé. Vérifiez à nouveau l'URL cible." msgid "Sorry, dude. This entry does not accept pingback at the moment." msgstr "Désolé, cette entrée n'accepte pas les pingback pour le moment." msgid "Don't repeat yourself, please." msgstr "Ne vous répêtez pas, s'il vous plait." msgid "Your source URL does not look like a supported content type. Sorry. Bye, bye!" msgstr "Votre URL source ne semble pas être un contenu supporté. Désolé." msgid "Where's your title?" msgstr "Où est votre titre ?" msgid "Sorry, an internal problem has occured." msgstr "Désolé, une erreur interne est survenue." msgid "Thanks, mate. It was a pleasure." msgstr "Merci, c'était un plaisir." msgid "Digests file not found." msgstr "Fichier de contrôle introuvable." msgid "No file to download" msgstr "Aucun fichier à télécharger" msgid "Root directory is not writable." msgstr "Le répertoire principal n'est pas accessible en écriture." msgid "An error occurred while downloading archive." msgstr "Une erreur est survenue lors du téléchargement de l'archive." msgid "Archive not found." msgstr "Archive introuvable." msgid "Unable to read current digests file." msgstr "Impossible de lire le fichier de contrôle actuel." msgid "Downloaded file does not seem to be a valid archive." msgstr "Le fichier téléchargé ne semble pas être une archive valide." msgid "Incomplete archive." msgstr "Archive incomplète." msgid "Unable to read digests file." msgstr "Impossible de lire le fichier de contrôle." msgid "Invalid digests file." msgstr "Fichier de contrôle invalide." #, php-format msgid "Invalid dcWorkspace: %s" msgstr "Espace de travail de la préférence invalide : %s" msgid "Unable to retrieve prefs:" msgstr "Impossible d'obtenir les préférences :" #, php-format msgid "%s is not a valid pref id" msgstr "%s n'est pas un identifiant de préférence valide" msgid "No workspace specified" msgstr "Aucun espace de travail spécifié" msgid "No valid source URL provided? Try again!" msgstr "Aucune URL source valide fournie ? Essayez encore !" msgid "No valid target URL provided? Try again!" msgstr "Aucune URL destinataire valide fournie ? Essayez encore !" msgid "LOL!" msgstr "MDR !" msgid "SQLite Database Schema cannot be upgraded." msgstr "Le schema de base de données SQLite ne peut pas être mis à jour." msgid "Something went wrong with auto upgrade:" msgstr "Une erreur est survenue durant la mise à jour automatique :" msgid "Unable to open directory." msgstr "Impossible d'ouvrir le répertoire." msgid "Unable to create directory." msgstr "Impossible de créer le répertoire." msgid "File is not writable." msgstr "Le fichier n'est pas accessible en écriture." msgid "Unable to open file." msgstr "Impossible d'ouvrir le fichier." msgid "Not an uploaded file." msgstr "N'est pas un fichier déposé." msgid "The uploaded file exceeds the maximum file size allowed." msgstr "Le fichier déposé est plus grand que la taille maximale autorisée." msgid "The uploaded file was only partially uploaded." msgstr "Le fichier n'a été chargé qu'en partie." msgid "No file was uploaded." msgstr "Aucun fichier chargé." msgid "Missing a temporary folder." msgstr "Il manque un répertoire temporaire." msgid "Failed to write file to disk." msgstr "Impossible d'écrire le fichier." #, php-format msgid "%s is not a directory." msgstr "%s n'est pas un répertoire." msgid "Bad range" msgstr "Mauvaises limites" msgid "Invalid range" msgstr "Sélection invalide" msgid "Invalid line number" msgstr "Numéro de ligne invalide invalide" msgid "Chunk is out of range" msgstr "L'extrait est hors limite" msgid "Bad context" msgstr "Contexte invalide" msgid "Bad context (in deletion)" msgstr "Contexte invalide (lors de la suppression)" msgid "Invalid diff format" msgstr "Format de fichier diff invalide." msgid "Uploading this file is not allowed." msgstr "L'envoi de ce fichier n'est pas autorisé." msgid "Destination directory is not in jail." msgstr "Le répertoire cible n'est pas en jail." msgid "File already exists." msgstr "Le nouveau fichier existe déjà." msgid "Cannot write in this directory." msgstr "Impossible d'écrire dans ce répertoire." msgid "An error occurred while writing the file." msgstr "Une erreur est survenue pendant l'écriture du fichier." msgid "Source file does not exist." msgstr "Le fichier source n'existe pas." msgid "File is not in jail." msgstr "Le fichier n'est pas en jail." msgid "Destination directory is not writable." msgstr "Le répertoire cible n'est pas accessible en écriture." msgid "Unable to rename file." msgstr "Impossible de renommer le fichier." msgid "File cannot be removed." msgstr "Ce fichier ne peut pas être supprimé." msgid "Directory is not in jail." msgstr "Le répertoire n'est pas en jail." msgid "Directory cannot be removed." msgstr "Ce répertoire ne peut pas être supprimé." msgid "Not enough memory to open image." msgstr "Mémoire insuffisante pour ouvrir l'image." msgid "singular" msgid_plural "plural" msgstr[0] "" msgstr[1] "" #, php-format msgid "File %s is not compressed in the zip." msgstr "Le fichier %s n'est pas compressé dans le zip." #, php-format msgid "Trying to unzip a folder name %s" msgstr "Tentative de décompresser un répertoire %s" msgid "Unable to write destination file." msgstr "Impossible d'écrire le fichier de destination" msgid "Unable to write in target directory, permission denied." msgstr "Impossible d'écrire dans le répertoire cible, permission refusée." msgid "Not enough memory to open file." msgstr "Mémoire insuffisante pour ouvrir le fichier." msgid "File does not exist" msgstr "Le fichier n'existe pas" msgid "Cannot read file" msgstr "Impossible de lire le fichier" msgid "Directory does not exist" msgstr "Le répertoire n'existe pas" msgid "Cannot read directory" msgstr "Impossible de lire le répertoire" msgid "Site temporarily unavailable" msgstr "Site temporairement indisponible" msgid "

        We apologize for this temporary unavailability.
        Thank you for your understanding.

        " msgstr "

        Veuillez nous excuser pour cette indisponibilité momentanée.
        Merci de votre compréhension.

        " msgid "Unable to connect to database" msgstr "Connexion à la base de données impossible" #, php-format msgid "

        This either means that the username and password information in your config.php file is incorrect or we can't contact the database server at \"%s\". This could mean your host's database server is down.

        • Are you sure you have the correct username and password?
        • Are you sure that you have typed the correct hostname?
        • Are you sure that the database server is running?

        If you're unsure what these terms mean you should probably contact your host. If you still need help you can always visit the Dotclear Support Forums.

        " msgstr "

        Cela signifie soit que les informations d'identifiant ou de mot de passe de votre fichier config.php sont incorrects, soit que nous ne pouvons pas contacter le serveur de base de données à l'adresse \"%s\". Cela peut vouloir dire que le serveur en question est éteint.

        • Êtes-vous sûr que l'identifiant et le mot de passe sont corrects ?
        • Êtes-vous sûr d'avoir entré le bon nom de serveur ?
        • Êtes-vous sûr que le serveur fonctionne ?

        Si vous n'êtes pas sûr de la signification de ces termes, vous devriez probablement contacter votre hébergeur. Si vous avez besoin d'une aide supplémentaire, vous pouvez vous rendre sur le forum d'entraide Dotclear.

        " msgid "The following error was encountered while trying to read the database:" msgstr "L'erreur suivante a été rencontrée lors de la tentative d'accès à la base de données :" #~ msgid "You don't have permissions to deactivate this plugin." #~ msgstr "Vous n'avez pas les permissions pour désactiver ce plugin." #~ msgid "Plugins have been successfully activated." #~ msgstr "Ces plugins ont été activés." #~ msgid "Plugins have been successfully deactivated." #~ msgstr "Ces plugins ont été désactivés." #~ msgid "Plugins have been successfully updated." #~ msgstr "Ces plugins ont été mis à jour." #~ msgid "You don't have permissions to deactivate this theme." #~ msgstr "Vous n'avez pas les permissions pour désactiver ce thème." #~ msgid "Update all theme from this list" #~ msgstr "Mettre à jour tous les thèmes de cette liste" #~ msgid "Title (optional)" #~ msgstr "Titre (optionnel)" #~ msgid "List of categories" #~ msgstr "Liste des catégories" #~ msgid "List of %s Comments or trackbacks match the filter." #~ msgstr "Liste des %s commentaires ou rétroliens correspondant au filtre" #~ msgid "%d comments" #~ msgid_plural "%d comments" #~ msgstr[0] "%d commentaire" #~ msgstr[1] "%d commentaires" #~ msgid "Configure module \"%s\"" #~ msgstr "Configurer le plugin \"%s\"" #~ msgid "Antispam" #~ msgstr "Antispam" #~ msgid "Import/Export" #~ msgstr "Import/Export" #~ msgid "Blogroll" #~ msgstr "Liste de liens" #~ msgid "Maintenance" #~ msgstr "Maintenance" #~ msgid "Simple menu" #~ msgstr "Menu simple" #~ msgid "Tags" #~ msgstr "Mots-clés" #~ msgid "New page" #~ msgstr "Nouvelle page" #~ msgid "Presentation widgets" #~ msgstr "Widgets de présentation" #~ msgid "Users actions" #~ msgstr "Actions sur les utilisateurs" #~ msgid "No User selected" #~ msgstr "Aucun utilisateur sélectionné" #~ msgid "(no cat)" #~ msgstr "(aucune)" #~ msgid "Commentaires" #~ msgstr "Commentaires" #~ msgid "Current theme has been successfully changed to \"%s\"." #~ msgstr "Le thème courant a été changé en \"%s\"." #~ msgid "You can't remove default theme." #~ msgstr "Vous ne pouvez pas supprimer le thème par défaut." #~ msgid "Theme does not exist." #~ msgstr "Ce thème n'existe pas." #~ msgid "Theme has been successfully upgraded." #~ msgstr "Le thème a été mis à jour." #~ msgid "Theme has been successfully changed." #~ msgstr "Le thème a été changé." #~ msgid "Theme has been successfully upgraded" #~ msgstr "Le thème a été mis à jour." #~ msgid "Available themes in your installation" #~ msgstr "Thèmes disponibles sur votre installation" #~ msgid "You are currently using %s" #~ msgstr "Vous utilisez actuellement %s" #~ msgid "Use selected theme" #~ msgstr "Utiliser le thème sélectionné" #~ msgid "Delete selected theme" #~ msgstr "Supprimer le thème sélectionné" #~ msgid "Install or upgrade a theme" #~ msgstr "Installer ou mettre à jour un thème" #~ msgid "Add themes to your installation" #~ msgstr "Ajouter des thèmes sur votre installation" #~ msgid "You can find additional themes for your blog on %s." #~ msgstr "Vous pouvez trouver d'autres thèmes pour votre blog sur %s." #~ msgid "You can also install themes by uploading or downloading zip files." #~ msgstr "Vous pouvez aussi installer des thèmes en déposant ou en téléchargeant des fichiers zip." #~ msgid "Theme zip file:" #~ msgstr "Fichier zip du thème :" #~ msgid "Download theme" #~ msgstr "Télécharger le thème" #~ msgid "To enable this function, please give write access to your themes directory." #~ msgstr "Pour activer cette fonction, donnez un accès en écriture à votre répertoire de thèmes." #~ msgid "Back to Blog appearance" #~ msgstr "Retour à Apparence du blog" #~ msgid "To install or upgrade a plugin you just need to extract it in your plugins directory." #~ msgstr "Pour installer un plugin il suffit de l'extraire dans votre répertoire de plugins." #~ msgid "Plugin" #~ msgstr "Plugin" #~ msgid "Install or upgrade a plugin" #~ msgstr "Installer ou mettre à jour un plugin" #~ msgid "Plugin zip file:" #~ msgstr "Fichier zip de du plugin :" #~ msgid "Plugin zip file URL:" #~ msgstr "URL du fichier zip du plugin :" #~ msgid "Download plugin" #~ msgstr "Télécharger le plugin" #~ msgid "Manage post attachments" #~ msgstr "Gérer les annexes" #~ msgid "Manage your blogroll" #~ msgstr "Gérez votre listes de liens" #~ msgid "Configure your Blowup Theme" #~ msgstr "Configurer votre thème Blowup" #~ msgid "Maintain your installation" #~ msgstr "Maintenir votre installation" #~ msgid "Simple menu for Dotclear" #~ msgstr "Menu simple sur Dotclear" #~ msgid "Search engine form" #~ msgstr "Formulaire du moteur de recherche" #~ msgid "List of navigation links" #~ msgstr "Liste des liens de navigation" #~ msgid "List of selected entries" #~ msgstr "Entrées sélectionnées" #~ msgid "List of available languages" #~ msgstr "Langues disponibles" #~ msgid "Last entries from feed" #~ msgstr "Derniers billets du flux" #~ msgid "List of last entries published" #~ msgstr "Liste des derniers billets publiés" #~ msgid "List of last comments published" #~ msgstr "Liste des derniers commentaires publiés" #~ msgid "List of published pages" #~ msgstr "Liste des pages publiées" #~ msgid "Blogroll list" #~ msgstr "Liste des liens" #~ msgid "Some plugins are installed twice:" #~ msgstr "Ces plugins sont installés en double :" #~ msgid "Sort" #~ msgstr "Trier" #~ msgid "Filter posts list" #~ msgstr "Filtrer la liste des billets" #~ msgid "Number of media displayed per page:" #~ msgstr "Nombre de médias affichés par page :" #~ msgid "publish" #~ msgstr "publier" #~ msgid "unpublish" #~ msgstr "mettre hors ligne" #~ msgid "schedule" #~ msgstr "programmer" #~ msgid "mark as pending" #~ msgstr "mettre en attente" #~ msgid "change category" #~ msgstr "changer la catégorie" #~ msgid "change author" #~ msgstr "changer l'auteur" #~ msgid "mark as junk" #~ msgstr "mettre en indésirable" #~ msgid "Filter users list" #~ msgstr "Filtrer la liste des utilisateurs" #~ msgid "%s: in [%s] and [%s]" #~ msgstr "%s : dans [%s] et [%s]" #~ msgid "Leave blank to disable this feature." #~ msgstr "Laissez vide pour annuler ce comportement." #~ msgid "Compress this directory with its content as a zip file and download it." #~ msgstr "Compressez ce dossier et son contenu dans un fichier zip et téléchargez-le." #~ msgid "No action specified." #~ msgstr "Aucune action spécifiée." #~ msgid "Ordering" #~ msgstr "Classement" #~ msgid "Category where entries of deleted categories will be moved:" #~ msgstr "Catégorie où seront déplacés les billets des catégories supprimées :" #~ msgid "Delete selected categories" #~ msgstr "Supprimer les catégories sélectionnées" #~ msgid "Reorder all categories on the top level and delete selected categories" #~ msgstr "Replacer toutes les catégories au premier niveau et supprimer les catégories sélectionnées" #~ msgid "The categories have been successfully removed." #~ msgstr "Les catégories ont été supprimées." #~ msgid "more information" #~ msgstr "plus d'informations" #~ msgid "XML/RPC interface" #~ msgstr "Interface XML/RPC" #~ msgid "XML/RPC interface is not active. Change settings to enable it." #~ msgstr "L'interface XML/RPC n'est pas active. Changez vos paramètres pour l'activer." #~ msgid "To install or upgrade a theme you generally just need to upload it in \"Install or upgrade a theme\" section." #~ msgstr "Tout ce que vous avez à faire pour installer ou mettre à jour un thème est généralement de le déposer dans la section \"Installer ou mettre à jour un thème\"." #~ msgid "back" #~ msgstr "retour" #~ msgid "Blogs per page" #~ msgstr "Blogs par page" #~ msgid "Apply filters" #~ msgstr "Appliquer les filtres" #~ msgid "edit" #~ msgstr "modifier" #~ msgid "Remove a category" #~ msgstr "Supprimer une catégorie" #~ msgid "Choose a category to remove:" #~ msgstr "Choisissez une catégorie à supprimer :" #~ msgid "Choose the category which will receive its entries:" #~ msgstr "Sélectionnez la catégorie qui recevra ses éventuels billets :" #~ msgid "This will relocate all categories on the top level" #~ msgstr "Ceci va déplacer toutes les catégories au premier niveau" #~ msgid "Reorder" #~ msgstr "Réordonner" #~ msgid "Comments per page" #~ msgstr "Commentaires par page" #~ msgid "Comment author:" #~ msgstr "Auteur du commentaire :" #~ msgid "Latest news" #~ msgstr "Actualités" #~ msgid "(external link)" #~ msgstr "(lien externe)" #~ msgid "Information about this version." #~ msgstr "Information à propos de cette version." #~ msgid "Go to %s folder" #~ msgstr "Aller au dossier %s" #~ msgid "Media details of %s" #~ msgstr "Détails du média %s" #~ msgid "maximum size %s" #~ msgstr "taille maximale %s" #~ msgid "New directory" #~ msgstr "Nouveau répertoire" #~ msgid "Download this directory as a zip file" #~ msgstr "Télécharger ce répertoire dans un fichier zip" #~ msgid "post" #~ msgstr "billet" #~ msgid "next entry" #~ msgstr "billet suivant" #~ msgid "previous entry" #~ msgstr "billet précédent" #~ msgid "Notes:" #~ msgstr "Notes :" #~ msgid "Entry status:" #~ msgstr "État du billet :" #~ msgid "Published on:" #~ msgstr "Publié le :" #~ msgid "Warning: Comments are not accepted on this blog." #~ msgstr "Les commentaires sont fermés sur ce blog pour le moment." #~ msgid "Entry password:" #~ msgstr "Mot de passe du billet :" #~ msgid "Basename:" #~ msgstr "URL spécifique :" #~ msgid "junk" #~ msgstr "indésirable" #~ msgid "selected" #~ msgstr "sélectionné" #~ msgid "not selected" #~ msgstr "non sélectionné" #~ msgid "Entries per page" #~ msgstr "Billets par page" #~ msgid "Author ID:" #~ msgstr "Identifiant de l'utilisateur :" #~ msgid "User language:" #~ msgstr "Langue de l'utilisateur :" #~ msgid "User timezone:" #~ msgstr "Fuseau horaire de l'utilisateur :" #~ msgid "If you have changed this user email or password you must provide your current password to save these modifications." #~ msgstr "Si vous voulez changer votre adresse email ou votre mot de passe, vous devez indiquer votre mot de passe actuel pour enregistrer ces modifications." #~ msgid "Hide My favorites menu" #~ msgstr "Cacher le menu « Mes favoris »" #~ msgid "Accessibility options" #~ msgstr "Options d'accessibilité" #~ msgid "Numeric fields will allow to type the elements' ordering number." #~ msgstr "Des champs numériques permettront d'indiquer la position des éléments." #~ msgid "Those favorites are displayed when My Favorites list is empty." #~ msgstr "Favoris affichés quand la liste Mes Favoris est vide." #~ msgid "Back to \"%s\"" #~ msgstr "Retour à \"%s\"" #~ msgid "new user" #~ msgstr "nouvel utilisateur" #~ msgid "No permissions." #~ msgstr "Aucune permission." #~ msgid "Create a new user" #~ msgstr "Créer un nouvel utilisateur" #~ msgid "Users per page" #~ msgstr "Utilisateurs par page" #~ msgid "help" #~ msgstr "aide" #~ msgid "protected" #~ msgstr "protégé" #~ msgid "Category URL must be unique." #~ msgstr "L'URL de chaque catégorie doit être unique." #~ msgid "You are not allowed to mark this entry as selected" #~ msgstr "Vous n'êtes pas autorisé à marquer ce billet comme sélectionné" #~ msgid "You are not allowed to delete this entry" #~ msgstr "Vous n'êtes pas autorisé à supprimer ce billet" #~ msgid "You are not allowed to delete this comment" #~ msgstr "Vous n'êtes pas autorisé à supprimer ce commentaire" #~ msgid "Directory %s does not exist." #~ msgstr "Le répertoire %s n'existe pas." #~ msgid "permissions" #~ msgstr "permissions" #~ msgid "choose a blog" #~ msgstr "choisissez un blog" #~ msgid "Choose a blog" #~ msgstr "Choisissez un blog" #~ msgid "users" #~ msgstr "utilisateurs" #~ msgid "The current blog cannot be deleted" #~ msgstr "Le blog courant ne peut être détruit" #~ msgid "Only superadmin can delete a blog" #~ msgstr "Seul un superadministrateur peut supprimer un blog" #~ msgid "Edit basename:" #~ msgstr "Modifier l'URL spécifique :" #~ msgid "Protect with password" #~ msgstr "Protéger par un mot de passe" #~ msgid "Select this comment" #~ msgstr "Sélectionner ce commentaire" #~ msgid "Add an introduction to the page." #~ msgstr "Ajoute une introduction à la page." #~ msgid "Finish the update" #~ msgstr "Finir la mise à jour" #~ msgid "Hidden" #~ msgstr "Masqué" #~ msgid "To rearrange categories order, change position number and click on “Save categories order”." #~ msgstr "Pour changer l'ordre des catégories, modifier leur numéro de position et cliquez sur “Enregistrer l'ordre des catégories”." # test tableau commentaires #~ msgid "trackback from" #~ msgstr "rétrolien de" #~ msgid "comment from" #~ msgstr "commentaire de" #~ msgid "Select" #~ msgstr "Sélectionner" #~ msgid "Accessibility" #~ msgstr "Accessibilité" #~ msgid "Dashboard and menu" #~ msgstr "Tableau de bord et menu" #~ msgid "Favorites" #~ msgstr "Favoris" dotclear-2.6.2+dfsg/locales/fr/plugins.lang.php000066400000000000000000001645511230033266200214110ustar00rootroot00000000000000DC1 redirect plugin and activate it in your blog configuration.'] = 'Notez que Dotclear a un nouveau schéma d\'URL. Vous pouvez éviter les liens brisés en installant le plugin DC1 redirect et en l\'activant dans la configuration de votre blog.'; $GLOBALS['__l10n']['next step'] = 'Étape suivante'; $GLOBALS['__l10n']['Depending on the size of your blog, it could take a few minutes.'] = 'Cela peut prendre plusieurs minutes en fonction de la taille de votre blog.'; $GLOBALS['__l10n']['Dotclear tables not found'] = 'Les tables Dotclear n\'ont pas été trouvées'; $GLOBALS['__l10n']['RSS or Atom feed import'] = 'Importation d\'un flux RSS ou Atom'; $GLOBALS['__l10n']['Add a feed content to the blog.'] = 'Ajouter les contenus d\'un flux au blog.'; $GLOBALS['__l10n']['Cannot retrieve feed URL.'] = 'Impossible de trouver l\'URL du flux.'; $GLOBALS['__l10n']['No items in feed.'] = 'Aucun élément dans le flux'; $GLOBALS['__l10n']['Content successfully imported.'] = 'Le contenu a été importé.'; $GLOBALS['__l10n']['Add a feed content to the current blog: %s.'] = 'Ajouter les contenus d\'un flux au blog courant : %s.'; $GLOBALS['__l10n']['Feed URL:'] = 'URL du flux :'; $GLOBALS['__l10n']['Flat file import'] = 'Importation d\'un fichier « à plat »'; $GLOBALS['__l10n']['Imports a blog or a full Dotclear installation from flat file.'] = 'Importe un blog ou une installation Dotclear complète depuis un fichier « à plat ».'; $GLOBALS['__l10n']['Single blog successfully imported.'] = 'Le blog a été importé.'; $GLOBALS['__l10n']['Are you sure you want to import a full backup file?'] = 'Êtes-vous sûr de vouloir importer un fichier de sauvegarde complet ?'; $GLOBALS['__l10n']['This will import a single blog backup as new content in the current blog: %s.'] = 'Cela importera une sauvegarde d\'un blog comme nouveau contenu du blog courant : %s.'; $GLOBALS['__l10n']['Upload a backup file'] = 'Téléversez un fichier de sauvegarde'; $GLOBALS['__l10n']['maximum size %s'] = 'taille maximum de %s'; $GLOBALS['__l10n']['or pick up a local file in your public directory'] = 'ou sélectionnez un fichier local présent dans votre répertoire de médias'; $GLOBALS['__l10n']['This will reset all the content of your database, except users.'] = 'Attention : Cela supprimera au préalable tout le contenu de votre base de données à l\'exception des utilisateurs.'; $GLOBALS['__l10n']['Another file with same name exists.'] = 'Un autre fichier portant ce nom existe déjà.'; $GLOBALS['__l10n']['Failed to extract backup file.'] = 'Impossible d\'extraire le fichier de sauvegarde.'; $GLOBALS['__l10n']['No backup in compressed file.'] = 'Aucune sauvegarde dans le fichier compressé.'; $GLOBALS['__l10n']['WordPress import'] = 'Importation WordPress'; $GLOBALS['__l10n']['Import a WordPress installation into your current blog.'] = 'Importe une installation WordPress dans le blog courant.'; $GLOBALS['__l10n']['This will import your WordPress content as new content in the current blog: %s.'] = 'Cela importera le contenu WordPress comme un nouveau contenu dans le blog courant : %s.'; $GLOBALS['__l10n']['We first need some information about your old WordPress installation.'] = 'Nous avons besoin au préalable de quelques informations au sujet de votre ancienne installation WordPress.'; $GLOBALS['__l10n']['WordPress and Dotclear\'s handling of categories are quite different. You can assign several categories to a single post in WordPress. In the Dotclear world, we see it more like "One category, several tags." Therefore Dotclear can only import one category per post and will chose the lowest numbered one. If you want to keep a trace of every category, you can import them as tags, with an optional prefix.'] = 'La gestion des catégories chez WordPress et Dotclear est tout à fait différente. Vous pouvez assigner plusieurs catégories à un seul billet dans WordPress. Dans le monde Dotclear, nous le voyons davantage comme « une catégorie, plusieurs mots-clés ». Par conséquent Dotclear peut seulement importer une catégorie par billet et il choisira celui de plus petit numéro. Si vous voulez conserver une trace de chaque catégorie, vous pouvez les importer sous forme de mots-clés, avec un préfixe optionnel.'; $GLOBALS['__l10n']['On the other hand, in WordPress, a post can not be uncategorized, and a default installation has a first category labelised "Uncategorized".If you did not change that category, you can just ignore it while importing your blog, as Dotclear allows you to actually keep your posts uncategorized.'] = 'D\'autre part, dans WordPress, un billet ne peut pas être sans catégorie, et une installation par défaut possède systématiquement une première catégorie nommée « sans catégorie ». Si vous n\'avez pas changé cette catégorie, vous pouvez simplement l\'ignorer lors de l\'importation sur votre blog, puisque Dotclear vous permet réellement de conserver votre message sans catégorie.'; $GLOBALS['__l10n']['Ignore the first category:'] = 'Ignorer la première catégorie :'; $GLOBALS['__l10n']['Import lowest numbered category on posts:'] = 'Importer la catégorie ayant le plus faible numéro dans les billets :'; $GLOBALS['__l10n']['Import all categories as tags:'] = 'Importer toutes les catégories comme des mots-clés :'; $GLOBALS['__l10n']['Prefix such tags with:'] = 'Préfixer les mots-clés avec :'; $GLOBALS['__l10n']['Content filters'] = 'Filtres de contenu'; $GLOBALS['__l10n']['You may want to process your post and/or comment content with the following filters.'] = 'Vous pouvez formater le contenu de vos billets et commentaires avec les filtres suivants.'; $GLOBALS['__l10n']['Post content formatter:'] = 'Formatage du contenu des billets :'; $GLOBALS['__l10n']['Comment content formatter:'] = 'Formatage du contenu des commentaires :'; $GLOBALS['__l10n']['WordPress tables not found'] = 'Les tables WordPress n\'ont pu être trouvées.'; $GLOBALS['__l10n']['No file to read.'] = 'Aucun fichier à lire.'; $GLOBALS['__l10n']['File is not a DotClear backup.'] = 'Ce fichier n\'est pas un fichier de sauvegarde Dotclear.'; $GLOBALS['__l10n']['File is not a single blog export.'] = 'Ce fichier n\'est pas une exportation d\'un blog.'; $GLOBALS['__l10n']['Error raised at line %s'] = 'Erreur détectée ligne %s'; $GLOBALS['__l10n']['File is not a full export.'] = 'Ce fichier n\'est pas un fichier de sauvegarde complet.'; $GLOBALS['__l10n']['ID of "%3$s" does not match on record "%1$s" at line %2$s of backup file.'] = 'L\'ID de "%3$s" ne correspond pas dans l\'enregistrement "%1$s" à la ligne %2$s du fichier de sauvegarde.'; $GLOBALS['__l10n']['Database export'] = 'Exporter la base de données'; $GLOBALS['__l10n']['Download database of current blog'] = 'Télécharger la base de données du blog courant'; $GLOBALS['__l10n']['Download database of all blogs'] = 'Télécharger la base de données de tous les blogs'; $GLOBALS['__l10n']['Please wait...'] = 'Veuillez patientez…'; $GLOBALS['__l10n']['Export functions are in the page %s.'] = 'Les fonctions d\'export sont dans la page de %s.'; $GLOBALS['__l10n']['Maintenance'] = 'Maintenance'; $GLOBALS['__l10n']['Servicing'] = 'Entretien'; $GLOBALS['__l10n']['Tools to maintain the performance of your blogs.'] = 'Outils pour maintenir les performances de vos blogs.'; $GLOBALS['__l10n']['Backup'] = 'Sauvegarde'; $GLOBALS['__l10n']['Tools to back up your content.'] = 'Outils de sauvegarde du contenu'; $GLOBALS['__l10n']['Development'] = 'Développement'; $GLOBALS['__l10n']['Tools to assist in development of plugins, themes and core.'] = 'Outils pour aider au developpement de plugins, thèmes et au core.'; $GLOBALS['__l10n']['Optimize'] = 'Optimiser'; $GLOBALS['__l10n']['Count and index'] = 'Compter et indexer'; $GLOBALS['__l10n']['Purge'] = 'Purger'; $GLOBALS['__l10n']['Other'] = 'Autre'; $GLOBALS['__l10n']['Current blog'] = 'Blog courant'; $GLOBALS['__l10n']['All blogs'] = 'Tous les blogs'; $GLOBALS['__l10n']['Maintain translations'] = 'Maintenir les traductions'; $GLOBALS['__l10n']['Translations'] = 'Traductions'; $GLOBALS['__l10n']['One task to execute'][0] = 'Une tâche à exécuter'; $GLOBALS['__l10n']['One task to execute'][1] = '%s tâches à exécuter'; $GLOBALS['__l10n']['This task has never been executed.'] = 'Cette tâche n\'a jamais été exécutée.'; $GLOBALS['__l10n']['Last execution of this task was on %s.'] = 'La dernière exécution de cette tâches était le %s.'; $GLOBALS['__l10n']['There is a task to execute.'][0] = 'Il y a une tâche à exécuter.'; $GLOBALS['__l10n']['There is a task to execute.'][1] = 'Il y a %s tâches à exécuter.'; $GLOBALS['__l10n']['Manage tasks'] = 'Gérer les tâches'; $GLOBALS['__l10n']['Display overdue tasks counter on maintenance dashboard icon'] = 'Afficher le nombre de tâches en retard sur l\'icône Maintenance du tableau de bord'; $GLOBALS['__l10n']['Display overdue tasks list on dashboard items'] = 'Afficher la liste des tâches en retard dans un module du tableau de bord'; $GLOBALS['__l10n']['Failed to execute task.'] = 'Impossible d\'exécuter la tâche.'; $GLOBALS['__l10n']['Task successfully executed.'] = 'La tâche a été exécutée.'; $GLOBALS['__l10n']['Empty templates cache directory'] = 'Vider le répertoire de cache des « templates »'; $GLOBALS['__l10n']['Templates cache directory emptied.'] = 'Le répertoire de cache des « templates » a été vidé.'; $GLOBALS['__l10n']['Failed to empty templates cache directory.'] = 'Impossible de vider le répertoire de cache des « templates ».'; $GLOBALS['__l10n']['It may be useful to empty this cache when modifying a theme\'s .html or .css files (or when updating a theme or plugin). Notice : with some hosters, the templates cache cannot be emptied with this plugin. You may then have to delete the directory /cbtpl/ directly on the server with your FTP software.'] = 'La suppression du répertoire du cache des templates peut se révéler nécessaire lors de modifications dans les fichiers .html ou .css d\'un thème (voire lors d\'un changement de thème ou de mise à jour de plugin). Attention : chez certains hébergeurs (Free par exemple), le cache du répertoire des templates ne peut pas être vidé grâce à l\'extension Maintenance, il faut supprimer le répertoire cbtpl situé dans le répertoire cache (dotclear/cache par défaut) avec un logiciel FTP.'; $GLOBALS['__l10n']['Count again comments and trackbacks'] = 'Recompter les commentaires et rétroliens'; $GLOBALS['__l10n']['Comments and trackback counted.'] = 'Les commentaires et rétroliens ont été recomptés.'; $GLOBALS['__l10n']['Failed to count comments and trackbacks.'] = 'Impossible de recompter les commentaires et rétroliens.'; $GLOBALS['__l10n']['Count again comments and trackbacks allows to check their exact numbers. This operation can be useful when importing from another blog platform (or when migrating from dotclear 1 to dotclear 2).'] = 'Recompter commentaires et des rétroliens a pour effet de donner le nombre exact de ceux-ci pour chaque billet. Cette opération peut se révéler utile lors de l\'import d\'un blog d\'une autre plateforme (ou d\'une migration de Dotclear 1 vers Dotclear 2).'; $GLOBALS['__l10n']['Search engine index'] = 'Index du moteur de recherche'; $GLOBALS['__l10n']['Index all comments for search engine'] = 'Indexer tous les commentaires pour le moteur de recherche'; $GLOBALS['__l10n']['Next'] = 'Suivant'; $GLOBALS['__l10n']['Indexing comment %d to %d.'] = 'Indexation des commentaires %d à %d.'; $GLOBALS['__l10n']['Comments index done.'] = 'L\'indexation des commentaires a été effectuée.'; $GLOBALS['__l10n']['Failed to index comments.'] = 'Impossible d\'indexer les commentaires.'; $GLOBALS['__l10n']['Index all comments and trackbacks in search engine index. This operation is necessary, after importing content in your blog, to use internal search engine, on public and private pages.'] = 'Indexer tous les commentaires et rétroliens dans le moteur de recherche. Cette opération s\'effectue généralement suite à un import afin d\'obtenir des résultats lors des recherches, aussi bien depuis l\'administration du blog qu\'en partie publique.'; $GLOBALS['__l10n']['Index all entries for search engine'] = 'Indexer tous les billets pour le moteur de recherche'; $GLOBALS['__l10n']['Indexing entry %d to %d.'] = 'Indexation des billets %d à %d.'; $GLOBALS['__l10n']['Entries index done.'] = 'L\'indexation des billets a été effectuée.'; $GLOBALS['__l10n']['Failed to index entries.'] = 'Impossible d\'indexer les billets.'; $GLOBALS['__l10n']['Index all entries in search engine index. This operation is necessary, after importing content in your blog, to use internal search engine, on public and private pages.'] = 'Indexer tous les billets dans le moteur de recherche. Cette opération s\'effectue généralement suite à un import afin d\'obtenir des résultats lors des recherches, aussi bien depuis l\'administration du blog qu\'en partie publique.'; $GLOBALS['__l10n']['Delete all logs'] = 'Supprimer tous les journaux (logs)'; $GLOBALS['__l10n']['Logs deleted.'] = 'Les journaux ont été supprimés.'; $GLOBALS['__l10n']['Failed to delete logs.'] = 'Impossible de supprimer les journaux.'; $GLOBALS['__l10n']['Logs record all activity and connection to your blog history. Unless you need to keep this history, consider deleting these logs from time to time.'] = 'Sauf si vous avez un besoin précis de conservation des activités de connexion sur votre blog, pensez à vider régulièrement la table des journaux : elle contient l\'enregistrement de chaque connexion à l\'administration et des opérations qui s\'y sont déroulées.'; $GLOBALS['__l10n']['Entries metadata'] = 'Métadonnées des billets'; $GLOBALS['__l10n']['Synchronize entries metadata'] = 'Synchroniser les métadonnées des billets'; $GLOBALS['__l10n']['Synchronize entry %d to %d.'] = 'Synchronisation des billets %d à %d.'; $GLOBALS['__l10n']['Entries metadata synchronize done.'] = 'La synchronisation des métadonnées des billets a été effectuée.'; $GLOBALS['__l10n']['Failed to synchronize entries metadata.'] = 'Impossible de synchroniser les métadonnées des billets.'; $GLOBALS['__l10n']['Synchronize all entries metadata could be useful after importing content in your blog or do bad operation on database tables.'] = 'La synchronisation des métadonnées des billets peut être utile après l\'import de contenu dans votre blog ou après une mauvaise opération sur la base de données.'; $GLOBALS['__l10n']['Optimise database'] = 'Optimise la base de données'; $GLOBALS['__l10n']['optimize tables'] = 'Optimiser les tables'; $GLOBALS['__l10n']['Optimization successful.'] = 'L\'optimisation a été effectuée.'; $GLOBALS['__l10n']['Failed to optimize tables.'] = 'Impossible d\'optimiser les tables.'; $GLOBALS['__l10n']['After numerous delete or update operations on Dotclear\'s database, it gets fragmented. Optimizing will allow to defragment it. It has no incidence on your data\'s integrity. It is recommended to optimize before any blog export.'] = 'Au fur at à mesure des suppressions ou modifications dans vos billets, les tables de la base de données se fragmentent. L\'opération d\'optimisation permet de compacter celles-ci. Cette opération n\'a aucun impact sur l\'intégrité de vos données. Il est fortement conseillé d\'optimiser la base de données avant tout export de blog.'; $GLOBALS['__l10n']['Download media folder of current blog'] = 'Télécharger la médiathèque du blog courant'; $GLOBALS['__l10n']['It may be useful to backup your media folder. This compress all content of media folder into a single zip file. Notice : with some hosters, the media folder cannot be compressed with this plugin if it is too big.'] = 'Il peut être utile de sauvegarder votre médiathèque. Ceci comprime tout le contenu du répertoire de média dans un seul fichier Zip. Remarque : chez certains hébergeurs, la médiathèque ne peut pas être compressée avec ce plugin si elle est trop grande.'; $GLOBALS['__l10n']['Download active theme of current blog'] = 'Télécharger le theme actif du blog courant'; $GLOBALS['__l10n']['It may be useful to backup the active theme before any change or update. This compress theme folder into a single zip file.'] = 'Il peut être utile de sauvegarder le thème courant avant tout changement ou mise à jour. Ceci comprime tout le contenu du répertoire du thème dans un seul fichier Zip.'; $GLOBALS['__l10n']['Maintenance plugin has been successfully configured.'] = 'La configuration du plugin de maintenance a été enregistrée.'; $GLOBALS['__l10n']['Never'] = 'Jamais'; $GLOBALS['__l10n']['Every week'] = 'Chaque semaine'; $GLOBALS['__l10n']['Every two weeks'] = 'Toutes les deux semaines'; $GLOBALS['__l10n']['Every month'] = 'Chaque mois'; $GLOBALS['__l10n']['Every two months'] = 'Tous les deux mois'; $GLOBALS['__l10n']['You have not sufficient permissions to view this page.'] = 'Vous n\'avez pas les autorisations suffisantes pour accéder à cette page.'; $GLOBALS['__l10n']['You should execute it now.'] = 'Vous devriez l\'exécuter dès maintenant.'; $GLOBALS['__l10n']['Execute task'] = 'Exécuter cette tâche'; $GLOBALS['__l10n']['This may take a very long time.'] = 'Cela peut prendre un certain temps.'; $GLOBALS['__l10n']['Alert settings'] = 'Réglage des alertes'; $GLOBALS['__l10n']['Activation'] = 'Activation'; $GLOBALS['__l10n']['Display alert messages on late tasks'] = 'Afficher des messages d\'alerte pour les tâches en retard'; $GLOBALS['__l10n']['You can place list of late tasks on your %s.'] = 'Vous pouvez placer la liste des tâches en retard sur votre %s.'; $GLOBALS['__l10n']['Frequency'] = 'Périodicité'; $GLOBALS['__l10n']['Use one recall time for all tasks'] = 'Utiliser le même délai de rappel pour toutes les tâches'; $GLOBALS['__l10n']['Recall time for all tasks:'] = 'Délai de rappel pour toutes les tâches :'; $GLOBALS['__l10n']['Use one recall time per task'] = 'Utiliser un délai de rappel différent pour chaque tâche'; $GLOBALS['__l10n']['New page'] = 'Nouvelle page'; $GLOBALS['__l10n']['%d page'] = '%d page'; $GLOBALS['__l10n']['%d pages'] = '%d pages'; $GLOBALS['__l10n']['manage pages'] = 'gestion des pages'; $GLOBALS['__l10n']['My first page'] = 'Ma première page'; $GLOBALS['__l10n']['This is your first page. When you\'re ready to blog, log in to edit or delete it.'] = 'Ceci est votre première page. Quand vous serez prêt à bloguer, connectez-vous pour l\'éditer ou la supprimer.'; $GLOBALS['__l10n']['Published on'] = 'Publié le'; $GLOBALS['__l10n']['This page\'s comments feed'] = 'Flux des commentaires de cette page'; $GLOBALS['__l10n']['You must provide a valid email address.'] = 'Vous devez indiquer une adresse e-mail valide.'; $GLOBALS['__l10n']['Page title'] = 'Titre de la page'; $GLOBALS['__l10n']['Page position'] = 'Position de la page'; $GLOBALS['__l10n']['Publication date'] = 'Date de publication'; $GLOBALS['__l10n']['Pages actions'] = 'Action sur les pages'; $GLOBALS['__l10n']['Back to pages list'] = 'Retour à la liste des pages'; $GLOBALS['__l10n']['Selected pages have been successfully reordered.'] = 'Les pages sélectionnées ont été réordonnées.'; $GLOBALS['__l10n']['No page'] = 'Aucune page'; $GLOBALS['__l10n']['Hidden'] = 'Masqué'; $GLOBALS['__l10n']['Select this page'] = 'Sélectionner cette page'; $GLOBALS['__l10n']['Are you sure you want to delete selected pages?'] = 'Êtes-vous sûr de vouloir supprimer les pages sélectionnées ?'; $GLOBALS['__l10n']['Selected pages have been successfully updated.'] = 'Les pages sélectionnées ont été modifiées.'; $GLOBALS['__l10n']['Selected pages have been successfully deleted.'] = 'Les pages sélectionnées ont été supprimées.'; $GLOBALS['__l10n']['Selected pages action:'] = 'Action sur les pages sélectionnées :'; $GLOBALS['__l10n']['To rearrange pages order, change number at the begining of the line, then click on “Save pages order” button.'] = 'Pour réordonner les pages, modifier le numéro dans le champ au début de la ligne puis cliquez sur “Enregistrer l\'ordre des pages”.'; $GLOBALS['__l10n']['To rearrange pages order, move items by drag and drop, then click on “Save pages order” button.'] = 'Pour réordonner les pages, déplacez les items par glisser déposer puis cliquez sur “Enregistrer l\'ordre des pages”.'; $GLOBALS['__l10n']['Save pages order'] = 'Enregistrer l\'ordre des pages'; $GLOBALS['__l10n']['This page does not exist.'] = 'Cette page n\'existe pas.'; $GLOBALS['__l10n']['Edit page'] = 'Modifier la page'; $GLOBALS['__l10n']['Are you sure you want to delete this page?'] = 'Êtes-vous sûr de vouloir supprimer cette page ?'; $GLOBALS['__l10n']['Page has been successfully updated.'] = 'La page a été modifiée.'; $GLOBALS['__l10n']['Page has been successfully created.'] = 'La page a été créée.'; $GLOBALS['__l10n']['Go to this page on the site'] = 'Voir cette page sur le site'; $GLOBALS['__l10n']['Page status'] = 'État de la page'; $GLOBALS['__l10n']['Page language'] = 'Langue de la page'; $GLOBALS['__l10n']['Hide in widget Pages'] = 'Ne pas lister dans le widget Pages'; $GLOBALS['__l10n']['Warning: If you set the URL manually, it may conflict with another page.'] = 'Attention : si vous définissez vous-même l\'URL, elle peut entrer en conflit avec celle d\'une autre page.'; $GLOBALS['__l10n']['Introduction to the page.'] = 'Introduction à la page.'; $GLOBALS['__l10n']['Select this comment'] = 'Sélectionner ce commentaire'; $GLOBALS['__l10n']['Pings'] = 'Signalements (pings)'; $GLOBALS['__l10n']['Settings have been successfully updated.'] = 'Les réglages ont été enregistrés.'; $GLOBALS['__l10n']['Pings configuration'] = 'Configuration des signalements'; $GLOBALS['__l10n']['Activate pings extension'] = 'Activer le plugin de signalement'; $GLOBALS['__l10n']['Service name:'] = 'Nom du service :'; $GLOBALS['__l10n']['Service URI:'] = 'URI du service :'; $GLOBALS['__l10n']['Error'] = 'Erreur'; $GLOBALS['__l10n']['Test ping services'] = 'Tester les services de signalement'; $GLOBALS['__l10n']['Check all'] = 'Tout sélectionner'; $GLOBALS['__l10n']['Simple menu'] = 'Menu simple'; $GLOBALS['__l10n']['All months'] = 'Tous les mois'; $GLOBALS['__l10n']['All tags'] = 'Tous les mots-clés'; $GLOBALS['__l10n']['Home'] = 'Accueil'; $GLOBALS['__l10n']['Archive'] = 'Archive'; $GLOBALS['__l10n']['Page'] = 'Page'; $GLOBALS['__l10n']['Tags'] = 'Mots-clés'; $GLOBALS['__l10n']['User defined'] = 'Saisie libre'; $GLOBALS['__l10n']['Label'] = 'Libellé'; $GLOBALS['__l10n']['Recent posts'] = 'Billets récents'; $GLOBALS['__l10n']['Switch to %s language'] = 'Basculer vers le %s'; $GLOBALS['__l10n']['Recent Posts from this category'] = 'Billets récents de cette catégorie'; $GLOBALS['__l10n']['Archives'] = 'Archives'; $GLOBALS['__l10n']['Posts from %s'] = 'Billets de %s'; $GLOBALS['__l10n']['Recent posts for %s tag'] = 'Billets récent pour le mot-clé %s'; $GLOBALS['__l10n']['Menu item has been successfully added.'] = 'L\'item de menu a été ajouté.'; $GLOBALS['__l10n']['Label and URL of menu item are mandatory.'] = 'Les libellés et URL sont obligatoires.'; $GLOBALS['__l10n']['Menu items have been successfully removed.'] = 'Le ou les items de menu ont été supprimés.'; $GLOBALS['__l10n']['No menu items selected.'] = 'Aucun item de menu sélectionné.'; $GLOBALS['__l10n']['Label is mandatory.'] = 'Le libellé est obligatoire.'; $GLOBALS['__l10n']['URL is mandatory.'] = 'l’URL est obligatoire.'; $GLOBALS['__l10n']['Menu items have been successfully updated.'] = 'Le ou les items de menu ont été mis à jour.'; $GLOBALS['__l10n']['Step #1'] = 'Étape 1'; $GLOBALS['__l10n']['Step #2'] = 'Étape 2'; $GLOBALS['__l10n']['Step #3'] = 'Étape 3'; $GLOBALS['__l10n']['Add item'] = 'Ajouter un item de menu'; $GLOBALS['__l10n']['Select type'] = 'Sélection du type'; $GLOBALS['__l10n']['Type of item menu:'] = 'Type d\'item de menu :'; $GLOBALS['__l10n']['Continue...'] = 'Continuer…'; $GLOBALS['__l10n']['Select language:'] = 'Sélectionnez la langue :'; $GLOBALS['__l10n']['Select category:'] = 'Sélectionnez la catégorie :'; $GLOBALS['__l10n']['Select month (if necessary):'] = 'Sélectionnez le mois (si nécessaire) :'; $GLOBALS['__l10n']['Select page:'] = 'Sélectionnez la page :'; $GLOBALS['__l10n']['Select tag (if necessary):'] = 'Sélectionnez le mot clé (si nécessaire) :'; $GLOBALS['__l10n']['Label of item menu:'] = 'Libellé de l\'item de menu :'; $GLOBALS['__l10n']['Description of item menu:'] = 'Description de l\'item de menu :'; $GLOBALS['__l10n']['URL of item menu:'] = 'URL de l\'item de menu :'; $GLOBALS['__l10n']['Add this item'] = 'Ajouter cet item'; $GLOBALS['__l10n']['Add an item'] = 'Ajouter un item de menu'; $GLOBALS['__l10n']['Menu items list'] = 'Liste des items de menu'; $GLOBALS['__l10n']['Update menu'] = 'Mettre à jour le menu'; $GLOBALS['__l10n']['Delete selected menu items'] = 'Supprimer les items de menu sélectionnés'; $GLOBALS['__l10n']['Are you sure you want to remove selected menu items?'] = 'Êtes-vous sûr de vouloir supprimer les items de menu sélectionnés ?'; $GLOBALS['__l10n']['No menu items so far.'] = 'Aucun item de menu pour l\'instant.'; $GLOBALS['__l10n']['Add tags'] = 'Ajouter des mots-clés'; $GLOBALS['__l10n']['Remove tags'] = 'Retirer des mots-clés'; $GLOBALS['__l10n']['Tag has been successfully added to selected entries'][0] = 'Le mot-clé a été ajouté aux entrées sélectionnées'; $GLOBALS['__l10n']['Tag has been successfully added to selected entries'][1] = 'Les mot-clés ont été ajoutés aux entrées sélectionnées'; $GLOBALS['__l10n']['Add tags to this selection'] = 'Ajouter des mots-clés à cette sélection'; $GLOBALS['__l10n']['Are you sure you want to remove this tag?'] = 'Êtes-vous sûr de vouloir supprimer ce mot-clé ?'; $GLOBALS['__l10n']['Add a tag to this entry'] = 'Ajouter un mot-clé à ce billet'; $GLOBALS['__l10n']['Choose from list'] = 'Choisir dans la liste'; $GLOBALS['__l10n']['all'] = 'tous'; $GLOBALS['__l10n']['Enter tags separated by coma'] = 'Séparez les mot-clés par des virgules'; $GLOBALS['__l10n']['used in %e - frequency %p%'] = 'utilisé dans %e - fréquence %p%'; $GLOBALS['__l10n']['entry'] = 'billet'; $GLOBALS['__l10n']['entries'] = 'billets'; $GLOBALS['__l10n']['Tags to add:'] = 'Mots-clés à ajouter :'; $GLOBALS['__l10n']['Tag has been successfully removed from selected entries'][0] = 'Le mot-clé a été retiré des entrées sélectionnées'; $GLOBALS['__l10n']['Tag has been successfully removed from selected entries'][1] = 'Les mot-clés ont été retirés des entrées sélectionnées'; $GLOBALS['__l10n']['No tags for selected entries'] = 'Aucun mot-clé pour les billets sélectionnés'; $GLOBALS['__l10n']['Remove selected tags from this selection'] = 'Retirer les mots-clés de cette sélection'; $GLOBALS['__l10n']['Following tags have been found in selected entries:'] = 'Les mots-clés suivants ont été trouvés pour les billets sélectionnés :'; $GLOBALS['__l10n']['Tag'] = 'Mot-clé'; $GLOBALS['__l10n']['Short'] = 'Court'; $GLOBALS['__l10n']['Extended'] = 'Étendu'; $GLOBALS['__l10n']['Tags list format:'] = 'Format de la liste des mots-clés :'; $GLOBALS['__l10n']['This tag\'s comments Atom feed'] = 'Flux Atom des commentaires associés à ce mot-clé'; $GLOBALS['__l10n']['This tag\'s entries Atom feed'] = 'Flux Atom des billets associés à ce mot-clé'; $GLOBALS['__l10n']['Limit (empty means no limit):'] = 'Limite (laisser vide si pas de limite) :'; $GLOBALS['__l10n']['Entries count'] = 'Nombre de billets'; $GLOBALS['__l10n']['Tag name'] = 'Nom du mot-clé'; $GLOBALS['__l10n']['Link to all tags:'] = 'Lien vers tous les mots-clés :'; $GLOBALS['__l10n']['Tag has been successfully renamed'] = 'Le mot-clé a été renommé.'; $GLOBALS['__l10n']['Tag has been successfully removed'] = 'Le mot-clé a été retiré.'; $GLOBALS['__l10n']['Are you sure you want to remove tag: “%s”?'] = 'Êtes-vous sûr de vouloir supprimer le mot-clé “%s” ?'; $GLOBALS['__l10n']['Back to tags list'] = 'Retour à la liste des mots-clés'; $GLOBALS['__l10n']['Rename'] = 'Renommer'; $GLOBALS['__l10n']['Delete this tag'] = 'Supprimer ce mot-clé'; $GLOBALS['__l10n']['List of entries with the tag “%s”'] = 'Liste des billets avec le mot-clé “%s”'; $GLOBALS['__l10n']['No tags on this blog.'] = 'Aucun mot-clé sur ce blog.'; $GLOBALS['__l10n']['Edit theme files'] = 'Modifier les fichiers du thème'; $GLOBALS['__l10n']['Syntax highlighting in theme editor'] = 'Coloration syntaxique de l\'éditeur de thème'; $GLOBALS['__l10n']['No file'] = 'Aucun fichier'; $GLOBALS['__l10n']['File does not exist.'] = 'Ce fichier n\'existe pas.'; $GLOBALS['__l10n']['File %s is not readable'] = 'Le fichier %s n\'est pas lisible'; $GLOBALS['__l10n']['Unable to write file %s. Please check your theme files and folders permissions.'] = 'Impossible d\'écrire le fichier %s. Contrôlez les permissions des fichiers et des répertoires de votre thème.'; $GLOBALS['__l10n']['Saving document...'] = 'Enregistrement du document…'; $GLOBALS['__l10n']['Document saved'] = 'Document enregistré'; $GLOBALS['__l10n']['An error occurred:'] = 'Une erreur est survenue :'; $GLOBALS['__l10n']['Your current theme on this blog is "%s".'] = 'Actuellement votre thème sur ce blog est « %s ».'; $GLOBALS['__l10n']['You can\'t edit default theme.'] = 'Vous ne pouvez pas modifier le thème par défaut.'; $GLOBALS['__l10n']['Please select a file to edit.'] = 'Sélectionnez un fichier à modifier.'; $GLOBALS['__l10n']['File editor'] = 'Éditeur de fichier'; $GLOBALS['__l10n']['Editing file %s'] = 'Édition du fichier %s'; $GLOBALS['__l10n']['This file is not writable. Please check your theme files permissions.'] = 'Ce fichier n\'est pas modifiable. Contrôlez les permissions de vos fichiers de thème.'; $GLOBALS['__l10n']['Templates files'] = 'Fichiers du thème'; $GLOBALS['__l10n']['CSS files'] = 'Fichiers CSS'; $GLOBALS['__l10n']['JavaScript files'] = 'Fichiers JavaScript'; $GLOBALS['__l10n']['Locales files'] = 'Fichiers de traduction'; $GLOBALS['__l10n']['Preferences successfully updated'] = 'Les préférences ont été mises à jour.'; $GLOBALS['__l10n']['user:preferences'] = 'user:preferences'; $GLOBALS['__l10n']['User preferences'] = 'Préférences utilisateur'; $GLOBALS['__l10n']['Global preferences'] = 'Préférences globales'; $GLOBALS['__l10n']['Presentation widgets'] = 'Widgets de présentation'; $GLOBALS['__l10n']['Search engine'] = 'Moteur de recherche'; $GLOBALS['__l10n']['Navigation links'] = 'Liens de navigation'; $GLOBALS['__l10n']['Selected entries'] = 'Billets sélectionnés'; $GLOBALS['__l10n']['Best of me'] = 'À retenir'; $GLOBALS['__l10n']['Blog languages'] = 'Langues du blog'; $GLOBALS['__l10n']['With entries counts'] = 'Avec le nombre de billets'; $GLOBALS['__l10n']['Include sub cats in count'] = 'Inclure les sous-catégories dans les compteurs'; $GLOBALS['__l10n']['Include empty categories'] = 'Inclure les catégories vides'; $GLOBALS['__l10n']['Subscribe links'] = 'Liens de souscription'; $GLOBALS['__l10n']['Subscribe'] = 'S\'abonner'; $GLOBALS['__l10n']['Feeds type:'] = 'Type de flux :'; $GLOBALS['__l10n']['Feed reader'] = 'Lecteur de flux'; $GLOBALS['__l10n']['Somewhere else'] = 'Autre part'; $GLOBALS['__l10n']['Entries limit:'] = 'Limite du nombre de billets :'; $GLOBALS['__l10n']['Text'] = 'Texte'; $GLOBALS['__l10n']['Text:'] = 'Texte :'; $GLOBALS['__l10n']['Last entries'] = 'Derniers billets'; $GLOBALS['__l10n']['Uncategorized'] = 'Sans catégorie'; $GLOBALS['__l10n']['Tag:'] = 'Mot-clé :'; $GLOBALS['__l10n']['Last comments'] = 'Derniers commentaires'; $GLOBALS['__l10n']['Comments limit:'] = 'Limite du nombre de commentaires :'; $GLOBALS['__l10n']['This blog\'s entries %s feed'] = 'Flux %s des billets de ce blog'; $GLOBALS['__l10n']['This blog\'s comments %s feed'] = 'Flux %s des commentaires de ce blog'; $GLOBALS['__l10n']['Entries feed'] = 'Fil des billets'; $GLOBALS['__l10n']['Comments feed'] = 'Fil des commentaires'; $GLOBALS['__l10n']['navigation'] = 'Volet de navigation'; $GLOBALS['__l10n']['extra'] = 'Volet d\'extra'; $GLOBALS['__l10n']['custom'] = 'Volet supplémentaire'; $GLOBALS['__l10n']['empty string'] = 'chaîne vide'; $GLOBALS['__l10n']['Sidebars and their widgets have been saved.'] = 'Les volets et leurs widgets ont été enregistrés.'; $GLOBALS['__l10n']['Sidebars have been resetting.'] = 'Les volets ont été réinitialisés.'; $GLOBALS['__l10n']['Widgets'] = 'Widgets'; $GLOBALS['__l10n']['Are you sure you want to reset sidebars?'] = 'Êtes-vous sûr de vouloir réinitialiser les volets ?'; $GLOBALS['__l10n']['Available widgets'] = 'Widgets disponibles'; $GLOBALS['__l10n']['Drag widgets from this list to one of the sidebars, for add.'] = 'Déplacez des widgets de cette liste vers l\'un des volets.'; $GLOBALS['__l10n']['order'] = 'ordre'; $GLOBALS['__l10n']['Append to:'] = 'Ajouter à :'; $GLOBALS['__l10n']['Add widgets to sidebars'] = 'Ajouter les widgets aux volets'; $GLOBALS['__l10n']['Navigation sidebar'] = 'Volet de navigation'; $GLOBALS['__l10n']['Extra sidebar'] = 'Volet d\'extra'; $GLOBALS['__l10n']['Custom sidebar'] = 'Volet supplémentaire'; $GLOBALS['__l10n']['Update sidebars'] = 'Mettre à jour les volets'; $GLOBALS['__l10n']['Reset sidebars'] = 'Réinitialiser les volets'; $GLOBALS['__l10n']['Widget ID:'] = 'Identifiant du widget :'; $GLOBALS['__l10n']['No setting for this widget'] = 'Aucun réglage pour ce widget'; $GLOBALS['__l10n']['boolean'] = 'booléen'; $GLOBALS['__l10n']['possible values:'] = 'valeurs possibles :'; $GLOBALS['__l10n']['listitem'] = 'élément de liste'; $GLOBALS['__l10n']['string'] = 'chaîne de caractères'; $GLOBALS['__l10n']['Setting name:'] = 'Nom de l\'élément de réglage :'; $GLOBALS['__l10n']['No widget as far.'] = 'Aucun widget pour le moment.'; $GLOBALS['__l10n']['Up the widget'] = 'Monter le widget'; $GLOBALS['__l10n']['Down the widget'] = 'Descendre le widget'; $GLOBALS['__l10n']['Remove the widget'] = 'Retirer le widget'; $GLOBALS['__l10n']['Remove widget'] = 'Retirer le widget'; $GLOBALS['__l10n']['Drag widgets here to remove.'] = 'Glisser les widgets ici pour les retirer du volet.'; dotclear-2.6.2+dfsg/locales/fr/plugins.po000066400000000000000000001727161230033266200203220ustar00rootroot00000000000000# French translation of DotClear # Copyright (C) 2006. # Olivier Meunier , 2006. # # Translators: # Franck , 2011. # Stéphane Aulery , 2012. # xave , 2012. msgid "" msgstr "" "Project-Id-Version: Dotclear\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-11-01 14:23+0100\n" "PO-Revision-Date: 2012-11-06 10:04+0100\n" "Last-Translator: Franck Paul \n" "Language-Team: French (http://www.transifex.com/projects/p/dotclear/language/fr/)\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 1.5.4\n" msgid "Manage every blog configuration directive" msgstr "Gestion des directives de configuration des blogs" msgid "Akismet interface for Dotclear" msgstr "Interface Akismet pour Dotclear" msgid "Generic antispam plugin for Dotclear" msgstr "Antispam générique pour Dotclear" msgid "Manage post attachments" msgstr "Gestion des fichiers attachés" msgid "Manage your blogroll" msgstr "Gestion de votre liste de liens" msgid "Configure your Blowup Theme" msgstr "Configurer votre thème Blowup" msgid "Legacy modules for dotclear" msgstr "Plugin de compatibilité pour Dotclear" msgid "Trackback validity check" msgstr "Contrôle de validité des rétroliens" msgid "Import and Export your blog" msgstr "Importez et exportez votre blog" msgid "Maintain your installation" msgstr "Maintenez votre installation" msgid "Serve entries as simple web pages" msgstr "Publie des billets comme de simples pages web" msgid "Ping services" msgstr "Services de signalement" msgid "Simple menu for Dotclear" msgstr "Menu simple pour Dotclear" msgid "Tags for posts" msgstr "Mots-clés pour les billets" msgid "Theme Editor" msgstr "Éditeur de thème" msgid "Manage every user preference directive" msgstr "Gestion des préférences utilisateur" msgid "Widgets for your blog sidebars" msgstr "Widgets pour les volets de votre blog" msgid "Search engine form" msgstr "Formulaire de recherche" msgid "List of navigation links" msgstr "Liste des liens de navigation" msgid "List of selected entries" msgstr "Liste des billets sélectionnés" msgid "List of available languages" msgstr "Liste des langues disponibles" msgid "List of categories" msgstr "Liste des catégories" msgid "Feed subscription links (RSS or Atom)" msgstr "Liens de souscription aux flux (RSS ou Atom)" msgid "List of last entries from feed (RSS or Atom)" msgstr "Liste des derniers billets d'un flux (RSS or Atom)" msgid "Simple text" msgstr "Texte simple" msgid "List of last entries published" msgstr "Liste des derniers billets publiés" msgid "List of last comments published" msgstr "Liste des derniers commentaires publiés" msgid "Tags cloud" msgstr "Nuage de mots-clés" msgid "List of published pages" msgstr "Liste des pages publiées" msgid "Blogroll list" msgstr "Liste de liens" msgid "List of simple menu items" msgstr "Liste des éléments de menu simple" msgid "Configuration successfully updated" msgstr "La configuration a été mise à jour" msgid "no" msgstr "non" msgid "yes" msgstr "oui" msgid "about:config" msgstr "about:config" #, php-format msgid "Settings for %s" msgstr "Réglages pour %s" msgid "Value" msgstr "Valeur" msgid "Description" msgstr "Description" msgid "Goto:" msgstr "Aller à : " msgid "Global settings" msgstr "Réglages généraux" msgid "Akismet spam filter" msgstr "Filtre d'indésirable Akismet" #, php-format msgid "Filtered by %s." msgstr "Filtré par %s." msgid "Filter configuration have been successfully saved." msgstr "La configuration du filtre a été enregistrée." msgid "Akismet API key:" msgstr "Clé API Akismet :" msgid "API key verified" msgstr "Clé API vérifiée" msgid "API key not verified" msgstr "Clé API non vérifiée" msgid "Get your own API key" msgstr "Obtenez votre propre clé API" msgid "Antispam" msgstr "Antispam" #, php-format msgid "All spam comments older than %s day(s) will be automatically deleted." msgstr "Tous les commentaires indésirables âgés d'au moins %s jour(s) seront supprimés automatiquement." #, php-format msgid "You can modify this duration in the %s" msgstr "Vous pouvez modifier cette durée dans les %s" msgid "Delete junk comments older than" msgstr "Supprimer les commentaires indésirables âgés de plus de" msgid "days" msgstr "jours" msgid "Set spam filters." msgstr "Régler les filtres de spam." msgid "IP Blacklist / Whitelist Filter" msgstr "Filtre de liste noire et blanche d'IP" #, php-format msgid "Filtered by %1$s with rule %2$s." msgstr "Flitré par %1$s avec la règle %2$s." msgid "IP address has been successfully added." msgstr "L'adresse IP a été ajoutée." msgid "IP addresses have been successfully removed." msgstr "L'adresse IP a été retirée." msgid "Blacklist" msgstr "Liste noire" msgid "Whitelist" msgstr "Liste blanche" msgid "Add an IP address: " msgstr "Ajouter une adresse IP : " msgid "Global IP (used for all blogs)" msgstr "IP globale (valable pour tous les blogs)" msgid "Add" msgstr "Ajouter" msgid "No IP address in list." msgstr "Pas d'adresse IP dans la liste." msgid "IP list" msgstr "Liste IP" msgid "Local IPs (used only for this blog)" msgstr "IP locales (valables seulement pour ce blog)" msgid "Global IPs (used for all blogs)" msgstr "IP globales (valables pour tous les blogs)" msgid "Checks sender IP address against DNSBL servers" msgstr "Contrôle l'adresse IP de l'émetteur via les serveurs DNSBL" #, php-format msgid "Filtered by %1$s with server %2$s." msgstr "Filtré par %1$s par le serveur %2$s." msgid "The list of DNSBL servers has been succesfully updated." msgstr "La liste des serveurs DNSBL a été mise à jour." msgid "IP Lookup servers" msgstr "Serveurs de contrôle d'IP" msgid "Add here a coma separated list of servers." msgstr "Ajouter ici la liste des serveurs séparés par des virgules." msgid "Checks links in comments against surbl.org" msgstr "Contrôle les liens des commentaires via surbl.org" msgid "Words Blacklist" msgstr "Liste de mots interdits" #, php-format msgid "Filtered by %1$s with word %2$s." msgstr "Filtré par %1$s à cause du mot %2$s." msgid "Words have been successfully added." msgstr "Les mots ont été ajoutés." msgid "Word has been successfully added." msgstr "Le mot a été ajouté." msgid "Words have been successfully removed." msgstr "Les mots ont été retirés." msgid "Add a word " msgstr "Ajouter un mot " msgid "Global word (used for all blogs)" msgstr "Mot global (valable pour tous les blogs)" msgid "No word in list." msgstr "Aucun mot dans la liste." msgid "List of bad words" msgstr "Liste de mots interdits" msgid "Local words (used only for this blog)" msgstr "Mots locaux (valables seulement pour ce blog)" msgid "Global words (used for all blogs)" msgstr "Mots globaux (valables pour tous les blogs)" msgid "Delete selected words" msgstr "Supprimer les mots sélectionnés" msgid "Create default wordlist" msgstr "Créer une liste de mots par défaut" msgid "This word exists" msgstr "Ce mot est déjà présent" msgid "No description" msgstr "Pas de description" #, php-format msgid "Filtered by %1$s (%2$s)" msgstr "Filtré par %1$s (%2$s)" msgid "Unknown filter." msgstr "Filtre inconnu." msgid "This comment is a spam:" msgstr "Ce commentaire est indésirable :" #, php-format msgid "(including %d spam comment)" msgstr "(dont %d indésirable)" #, php-format msgid "(including %d spam comments)" msgstr "(dont %d indésirables)" msgid "Spam moderation" msgstr "Modération des indésirables" msgid "Spam" msgstr "Indésirable" msgid "Ham" msgstr "Désirable" msgid "Filter does not exist." msgstr "Ce filtre n'existe pas." msgid "Filter has no user interface." msgstr "Ce filtre n'a pas de réglages." msgid "Filters configuration has been successfully saved." msgstr "La configuration des filtres a été enregistrée." #, php-format msgid "%s configuration" msgstr "Configuration de %s" #, php-format msgid "%s filter configuration" msgstr "Configuration du filtre %s" msgid "Back to filters list" msgstr "Retour à la liste des filtres" msgid "Information" msgstr "Informations" msgid "Junk comments:" msgstr "Commentaires indésirables :" msgid "Published comments:" msgstr "Commentaires publiés :" msgid "Available spam filters" msgstr "Filtres d'indésirable disponibles" msgid "Order" msgstr "Ordre" msgid "Active" msgstr "Actif" msgid "Auto Del." msgstr "Auto suppr." msgid "Filter name" msgstr "Nom du filtre" msgid "Filter configuration" msgstr "Configuration du filtre" msgid "position" msgstr "position" msgid "Syndication" msgstr "Syndication" msgid "Junk comments RSS feed" msgstr "Fil RSS des commentaires indésirables" msgid "Published comments RSS feed" msgstr "Fil RSS des commentaires publiés" msgid "Attachments" msgstr "Annexes" #, php-format msgid "Attachments (%d)" msgstr "Annexes (%d)" msgid "remove" msgstr "supprimer" msgid "No attachment." msgstr "Pas de fichier attaché." msgid "Add files to this entry" msgstr "Ajouter des fichiers à la page" msgid "Blogroll" msgstr "Liste des liens" msgid "manage blogroll" msgstr "Gestion de la liste des liens" msgid "Links" msgstr "Liens" msgid "Title (optional)" msgstr "Titre (optionnel)" msgid "All categories" msgstr "Toutes les catégories" msgid "Display on:" msgstr "Afficher :" msgid "All pages" msgstr "Sur toutes les pages" msgid "Home page only" msgstr "En page d'accueil seulement" msgid "Except on home page" msgstr "Sauf en page d'accueil" msgid "Content only" msgstr "Contenu seul (sans boîte englobante)" msgid "CSS class:" msgstr "Classe CSS supplémentaire pour la boîte englobante :" msgid "You must provide a link title" msgstr "Vous devez fournir un titre de lien" msgid "You must provide a link URL" msgstr "Vous devez fournir une URL de lien" msgid "You need to provide a XBEL or OPML file." msgstr "Vous devez fournir un fichier XBEL ou OPML." msgid "File is not in XML format." msgstr "Ce fichier n'est pas au format XML." msgid "No such link or title" msgstr "Pas de lien ou de titre" msgid "Link has been successfully updated" msgstr "Le lien a été mis à jour." msgid "Category has been successfully updated" msgstr "La catégorie a été mise à jour." msgid "Return to blogroll" msgstr "Retourner à la liste des liens" msgid "Edit category" msgstr "Modifier la catégorie" msgid "Edit link" msgstr "Modifier le lien" msgid "XFN information" msgstr "Informations XFN" msgid "_xfn_Me" msgstr "_xfn_Me" msgid "_xfn_Another link for myself" msgstr "_xfn_Another link for myself" msgid "_xfn_Friendship" msgstr "_xfn_Friendship" msgid "_xfn_Contact" msgstr "_xfn_Contact" msgid "_xfn_Acquaintance" msgstr "_xfn_Acquaintance" msgid "_xfn_Friend" msgstr "_xfn_Friend" msgid "_xfn_Physical" msgstr "_xfn_Physical" msgid "_xfn_Met" msgstr "_xfn_Met" msgid "_xfn_Professional" msgstr "_xfn_Professional" msgid "_xfn_Co-worker" msgstr "_xfn_Co-worker" msgid "_xfn_Colleague" msgstr "_xfn_Colleague" msgid "_xfn_Geographical" msgstr "_xfn_Geographical" msgid "_xfn_Co-resident" msgstr "_xfn_Co-resident" msgid "_xfn_Neighbor" msgstr "_xfn_Neighbor" msgid "_xfn_Family" msgstr "_xfn_Family" msgid "_xfn_Child" msgstr "_xfn_Child" msgid "_xfn_Parent" msgstr "_xfn_Parent" msgid "_xfn_Sibling" msgstr "_xfn_Sibling" msgid "_xfn_Spouse" msgstr "_xfn_Spouse" msgid "_xfn_Kin" msgstr "_xfn_Kin" msgid "_xfn_Romantic" msgstr "_xfn_Romantic" msgid "_xfn_Muse" msgstr "_xfn_Muse" msgid "_xfn_Crush" msgstr "_xfn_Crush" msgid "_xfn_Date" msgstr "_xfn_Date" msgid "_xfn_Sweetheart" msgstr "_xfn_Sweetheart" msgid "Nothing to import" msgstr "Rien à importer" msgid "links have been successfully imported." msgstr "Les liens ont été importés." msgid "Import operation cancelled." msgstr "L'importation a été annulée." msgid "Link has been successfully created." msgstr "Le lien a été créé." msgid "category has been successfully created." msgstr "La catégorie a été créée." msgid "Items have been successfully removed." msgstr "Les éléments ont été retirés." msgid "Items order has been successfully updated" msgstr "L'ordre des éléments a été mis à jour." msgid "URL" msgstr "URL" msgid "Lang" msgstr "Langue" msgid "select this link" msgstr "sélectionner ce lien" msgid "Delete selected links" msgstr "Supprimer les liens sélectionnés" msgid "Are you sure you want to delete selected links?" msgstr "Êtes-vous sûr de vouloir supprimer ces liens ?" msgid "The link list is empty." msgstr "La liste des liens est vide." msgid "Add a new link" msgstr "Ajouter un nouveau lien" msgid "Add a category" msgstr "Ajouter une catégorie" msgid "Import links" msgstr "Importer des liens" msgid "OPML or XBEL File:" msgstr "Fichier OPML ou XBEL :" msgid "Import" msgstr "Importer" msgid "Light linear gradient" msgstr "Dégradé linéaire clair" msgid "Medium linear gradient" msgstr "Dégragé linéaire moyen" msgid "Dark linear gradient" msgstr "Dégradé linéaire foncé" msgid "Solid color" msgstr "Couleur pleine" msgid "Custom..." msgstr "Personnalisé…" msgid "Theme configuration has been successfully updated." msgstr "La configuration du thème a été enregistrée." msgid "Blowup configuration" msgstr "Configuration de Blowup" msgid "Predefined styles" msgstr "Styles prédéfinis" msgid "Apply code" msgstr "Appliquer le code" msgid "Choose a predefined style" msgstr "Sélectionnez un style prédéfini" msgid "Back to Blog appearance" msgstr "Retour à l'apparence du blog" msgid "For the following reasons, images cannot be created. You won't be able to change some background properties." msgstr "Pour les raisons suivantes, les images n'ont pu être créées. Vous ne pourrez pas changer certaines propriétés de fond." msgid "Customization" msgstr "Personnalisation" msgid "General" msgstr "Général" msgid "Background color:" msgstr "Couleur de fond :" msgid "Background color fill:" msgstr "Remplissage de la couleur du fond :" msgid "Main text font:" msgstr "Police du texte principal :" msgid "Main text font size:" msgstr "Taille de police du texte principal :" msgid "Main text color:" msgstr "Couleur du texte principal :" msgid "Text line height:" msgstr "Hauteur des lignes de texte :" msgid "Links color:" msgstr "Couleur des liens :" msgid "Visited links color:" msgstr "Couleur des liens visités :" msgid "Focus links color:" msgstr "Couleur des liens ayant le focus :" msgid "Page top" msgstr "Haut de page" msgid "Prelude color:" msgstr "Couleur du prélude :" msgid "Hide main title" msgstr "Cacher le titre principal" msgid "Main title font:" msgstr "Police du titre principal :" msgid "Main title font size:" msgstr "Taille de police du titre principal :" msgid "Main title color:" msgstr "Couleur du titre principal :" msgid "Main title alignment:" msgstr "Alignement du titre principal :" msgid "center" msgstr "centré" msgid "left" msgstr "à gauche" msgid "right" msgstr "à droite" msgid "Main title position (x:y)" msgstr "Position du titre principal (x:y)" msgid "Top image" msgstr "Image de haut de page" msgid "Choose \"Custom...\" to upload your own image." msgstr "Choisissez « Personnalisé… » pour téléverser votre propre image." msgid "Add your image:" msgstr "Ajouter votre image :" #, php-format msgid "JPEG or PNG file, 800 pixels wide, maximum size %s" msgstr "Fichier JPEG ou PNG, 800 pixels de large maximum, taille maximum de %s" msgid "Sidebar" msgstr "Volet" msgid "Sidebar position:" msgstr "Position du volet :" msgid "Sidebar text font:" msgstr "Police du texte du volet :" msgid "Sidebar text font size:" msgstr "Taille de police du texte du volet :" msgid "Sidebar text color:" msgstr "Couleur du texte du volet :" msgid "Sidebar titles font:" msgstr "Police des titres du volet :" msgid "Sidebar titles font size:" msgstr "Taille de police des titres du volet :" msgid "Sidebar titles color:" msgstr "Couleur des titres du volet :" msgid "Sidebar 2nd level titles font:" msgstr "Police des titres secondaires du volet :" msgid "Sidebar 2nd level titles font size:" msgstr "Taille de police des titres secondaires du volet :" msgid "Sidebar 2nd level titles color:" msgstr "Couleur des titres secondaires du volet :" msgid "Sidebar lines color:" msgstr "Couleur des lignes du volet :" msgid "Sidebar links color:" msgstr "Couleur des liens du volet :" msgid "Sidebar visited links color:" msgstr "Couleur des liens visités du volet :" msgid "Sidebar focus links color:" msgstr "Couleur des liens du volet ayant le focus :" msgid "Date title font:" msgstr "Police du titre des dates :" msgid "Date title font size:" msgstr "Taille de police du titre des dates :" msgid "Date title color:" msgstr "Couleur du titre des dates :" msgid "Entry title font:" msgstr "Police du titre des billets :" msgid "Entry title font size:" msgstr "Taille de police du titre des billets :" msgid "Entry title color:" msgstr "Couleur du titre des billets :" msgid "Comment background color:" msgstr "Couleur de fond des commentaires :" msgid "Comment text color:" msgstr "Couleur du texte des commentaires :" msgid "My comment background color:" msgstr "Couleur de fond de mes commentaires :" msgid "My comment text color:" msgstr "Couleur du texte de mes commentaires :" msgid "Footer" msgstr "Pied de page" msgid "Footer font:" msgstr "Police du pied de page :" msgid "Footer font size:" msgstr "Taille de police du pied de page :" msgid "Footer color:" msgstr "Couleur du pied de page :" msgid "Footer links color:" msgstr "Couleur des liens du pied de page :" msgid "Footer background color:" msgstr "Couleur de fond du pied de page :" msgid "Additional CSS" msgstr "Style additionnel" msgid "Any additional CSS styles (must be written using the CSS syntax):" msgstr "Styles CSS additionnels (doivent être écrits selon la syntaxe CSS) :" msgid "Configuration import / export" msgstr "Configuration de l'import/export" msgid "You can share your configuration using the following code. To apply a configuration, paste the code, click on \"Apply code\" and save." msgstr "Vous pouvez partager votre configuration en utilisant le code suivant. Pour appliquer une configuration, copiez le code, cliquez sur « Appliquer le code », puis sauvegardez." msgid "Copy this code:" msgstr "Copier ce code :" msgid "default" msgstr "défaut" msgid "The 'public' directory does not exist." msgstr "Le répertoire ‘public’ n'existe pas." #, php-format msgid "The '%s' directory cannot be modified." msgstr "Le répertoire ‘%s’ ne peut être modifié." msgid "Unable to create css file." msgstr "Impossible de créer le fichier css." msgid "At least one of the following functions is not available: imagecreatetruecolor, imagepng & imagecreatefrompng." msgstr "Au moins une des fonctions suivantes n'est pas disponible : imagecreatetruecolor, imagepng et imagecreatefrompng." msgid "Unable to create images." msgstr "Impossible de créer des images." msgid "Invalid file type." msgstr "Type de fichier invalide." msgid "Uploaded image is not 800 pixels wide." msgstr "L'image soumise ne fait pas 800 pixels de large." msgid "Unable to open image." msgstr "Impossible d'ouvrir l'image." msgid "Checks trackback source for a link to the post" msgstr "Contrôle si la source du rétrolien comporte un lien vers le billet" msgid "Import/Export" msgstr "Import/Export" msgid "Flat file export" msgstr "Fichier d'exportation « à plat »" msgid "Exports a blog or a full Dotclear installation to flat file." msgstr "Exporte un blog ou une installation Dotclear complète vers un fichier « à plat »." msgid "Export file not found." msgstr "Le fichier d'export n'a pas été trouvé." msgid "Failed to compress export file." msgstr "Impossible de compresser le fichier d'export." msgid "Single blog" msgstr "Blog simple" #, php-format msgid "This will create an export of your current blog: %s" msgstr "Cela créera un export du blog courant : %s" msgid "Compress file" msgstr "Compresser le fichier" msgid "You may also want to download your media directory as a zip file" msgstr "Vous pouvez également télécharger votre répertoire de média sous forme de fichier archive zip" msgid "Export" msgstr "Export" msgid "Multiple blogs" msgstr "Tous les blogs" msgid "This will create an export of all the content of your database." msgstr "Cela créera un export avec tout le contenu de votre base de données." msgid "Congratulation!" msgstr "Bravo !" msgid "Your blog has been successfully imported. Welcome on Dotclear 2!" msgstr "Votre blog a été importé. Bienvenue sur Dotclear 2 !" msgid "Why don't you blog this now?" msgstr "Pourquoi ne bloguez-vous pas cela maintenant ?" msgid "or" msgstr "ou" msgid "visit your dashboard" msgstr "voir votre tableau de bord" msgid "Dotclear 1.2 import" msgstr "Importation depuis Dotclear 1.2" msgid "Import a Dotclear 1.2 installation into your current blog." msgstr "Importer une installation Dotclear 1.2 dans votre blog courant." #, php-format msgid "Import the content of a Dotclear 1.2's blog in the current blog: %s." msgstr "Importer le contenu d'un blog Dotclear 1.2 comme nouveau contenu dans le blog courant : %s." msgid "Please note that this process will empty your categories, blogroll, entries and comments on the current blog." msgstr "Notez que cela supprimera les catégories, liste de liens, billets et commentaires actuels du blog courant. " msgid "General information" msgstr "Informations générales" msgid "Import my blog now" msgstr "Importer mon blog maintenant" msgid "We first need some information about your old Dotclear 1.2 installation." msgstr "Nous avons besoin au préalable de quelques informations à propos de votre installation Dotclear 1.2." msgid "Entries import options" msgstr "Options d'importation des billets" msgid "Number of entries to import at once:" msgstr "Nombre d'éléments à importer à chaque passe :" msgid "Importing users" msgstr "Importation des utilisateurs" msgid "Importing categories" msgstr "Importation des catégories" msgid "Importing blogroll" msgstr "Importation de la liste des liens" #, php-format msgid "Importing entries from %d to %d / %d" msgstr "Importation des éléments %d à %d / %d" msgid "Please read carefully" msgstr "Lisez soigneusement" msgid "Every newly imported user has received a random password and will need to ask for a new one by following the \"I forgot my password\" link on the login page (Their registered email address has to be valid.)" msgstr "Chaque utilisateur nouvellement importé a reçu un mot de passe aléatoire et devra en demander un nouveau en cliquant sur le lien « J'ai oublié mon mot de passe » sur la page d'authentification (son adresse email doit être valide)." #, php-format msgid "Please note that Dotclear 2 has a new URL layout. You can avoid broken links by installing DC1 redirect plugin and activate it in your blog configuration." msgstr "Notez que Dotclear a un nouveau schéma d'URL. Vous pouvez éviter les liens brisés en installant le plugin DC1 redirect et en l'activant dans la configuration de votre blog." msgid "next step" msgstr "Étape suivante" msgid "Depending on the size of your blog, it could take a few minutes." msgstr "Cela peut prendre plusieurs minutes en fonction de la taille de votre blog." msgid "Dotclear tables not found" msgstr "Les tables Dotclear n'ont pas été trouvées" msgid "RSS or Atom feed import" msgstr "Importation d'un flux RSS ou Atom" msgid "Add a feed content to the blog." msgstr "Ajouter les contenus d'un flux au blog." msgid "Cannot retrieve feed URL." msgstr "Impossible de trouver l'URL du flux." msgid "No items in feed." msgstr "Aucun élément dans le flux" msgid "Content successfully imported." msgstr "Le contenu a été importé." #, php-format msgid "Add a feed content to the current blog: %s." msgstr "Ajouter les contenus d'un flux au blog courant : %s." msgid "Feed URL:" msgstr "URL du flux :" msgid "Flat file import" msgstr "Importation d'un fichier « à plat »" msgid "Imports a blog or a full Dotclear installation from flat file." msgstr "Importe un blog ou une installation Dotclear complète depuis un fichier « à plat »." msgid "Single blog successfully imported." msgstr "Le blog a été importé." msgid "Are you sure you want to import a full backup file?" msgstr "Êtes-vous sûr de vouloir importer un fichier de sauvegarde complet ?" #, php-format msgid "This will import a single blog backup as new content in the current blog: %s." msgstr "Cela importera une sauvegarde d'un blog comme nouveau contenu du blog courant : %s." msgid "Upload a backup file" msgstr "Téléversez un fichier de sauvegarde" #, php-format msgid "maximum size %s" msgstr "taille maximum de %s" msgid "or pick up a local file in your public directory" msgstr "ou sélectionnez un fichier local présent dans votre répertoire de médias" msgid "This will reset all the content of your database, except users." msgstr "Attention : Cela supprimera au préalable tout le contenu de votre base de données à l'exception des utilisateurs." msgid "Another file with same name exists." msgstr "Un autre fichier portant ce nom existe déjà." msgid "Failed to extract backup file." msgstr "Impossible d'extraire le fichier de sauvegarde." msgid "No backup in compressed file." msgstr "Aucune sauvegarde dans le fichier compressé." msgid "WordPress import" msgstr "Importation WordPress" msgid "Import a WordPress installation into your current blog." msgstr "Importe une installation WordPress dans le blog courant." #, php-format msgid "This will import your WordPress content as new content in the current blog: %s." msgstr "Cela importera le contenu WordPress comme un nouveau contenu dans le blog courant : %s." msgid "We first need some information about your old WordPress installation." msgstr "Nous avons besoin au préalable de quelques informations au sujet de votre ancienne installation WordPress." msgid "WordPress and Dotclear's handling of categories are quite different. You can assign several categories to a single post in WordPress. In the Dotclear world, we see it more like \"One category, several tags.\" Therefore Dotclear can only import one category per post and will chose the lowest numbered one. If you want to keep a trace of every category, you can import them as tags, with an optional prefix." msgstr "La gestion des catégories chez WordPress et Dotclear est tout à fait différente. Vous pouvez assigner plusieurs catégories à un seul billet dans WordPress. Dans le monde Dotclear, nous le voyons davantage comme « une catégorie, plusieurs mots-clés ». Par conséquent Dotclear peut seulement importer une catégorie par billet et il choisira celui de plus petit numéro. Si vous voulez conserver une trace de chaque catégorie, vous pouvez les importer sous forme de mots-clés, avec un préfixe optionnel." msgid "On the other hand, in WordPress, a post can not be uncategorized, and a default installation has a first category labelised \"Uncategorized\".If you did not change that category, you can just ignore it while importing your blog, as Dotclear allows you to actually keep your posts uncategorized." msgstr "D'autre part, dans WordPress, un billet ne peut pas être sans catégorie, et une installation par défaut possède systématiquement une première catégorie nommée « sans catégorie ». Si vous n'avez pas changé cette catégorie, vous pouvez simplement l'ignorer lors de l'importation sur votre blog, puisque Dotclear vous permet réellement de conserver votre message sans catégorie." msgid "Ignore the first category:" msgstr "Ignorer la première catégorie :" msgid "Import lowest numbered category on posts:" msgstr "Importer la catégorie ayant le plus faible numéro dans les billets :" msgid "Import all categories as tags:" msgstr "Importer toutes les catégories comme des mots-clés :" msgid "Prefix such tags with:" msgstr "Préfixer les mots-clés avec :" msgid "Content filters" msgstr "Filtres de contenu" msgid "You may want to process your post and/or comment content with the following filters." msgstr "Vous pouvez formater le contenu de vos billets et commentaires avec les filtres suivants." msgid "Post content formatter:" msgstr "Formatage du contenu des billets :" msgid "Comment content formatter:" msgstr "Formatage du contenu des commentaires :" msgid "WordPress tables not found" msgstr "Les tables WordPress n'ont pu être trouvées." msgid "No file to read." msgstr "Aucun fichier à lire." msgid "File is not a DotClear backup." msgstr "Ce fichier n'est pas un fichier de sauvegarde Dotclear." msgid "File is not a single blog export." msgstr "Ce fichier n'est pas une exportation d'un blog." #, php-format msgid "Error raised at line %s" msgstr "Erreur détectée ligne %s" msgid "File is not a full export." msgstr "Ce fichier n'est pas un fichier de sauvegarde complet." #, php-format msgid "ID of \"%3$s\" does not match on record \"%1$s\" at line %2$s of backup file." msgstr "L'ID de \"%3$s\" ne correspond pas dans l'enregistrement \"%1$s\" à la ligne %2$s du fichier de sauvegarde." msgid "Database export" msgstr "Exporter la base de données" msgid "Download database of current blog" msgstr "Télécharger la base de données du blog courant" msgid "Download database of all blogs" msgstr "Télécharger la base de données de tous les blogs" msgid "Please wait..." msgstr "Veuillez patientez…" #, php-format msgid "Export functions are in the page %s." msgstr "Les fonctions d'export sont dans la page de %s." msgid "Maintenance" msgstr "Maintenance" msgid "Servicing" msgstr "Entretien" msgid "Tools to maintain the performance of your blogs." msgstr "Outils pour maintenir les performances de vos blogs." msgid "Backup" msgstr "Sauvegarde" msgid "Tools to back up your content." msgstr "Outils de sauvegarde du contenu" msgid "Development" msgstr "Développement" msgid "Tools to assist in development of plugins, themes and core." msgstr "Outils pour aider au developpement de plugins, thèmes et au core." msgid "Optimize" msgstr "Optimiser" msgid "Count and index" msgstr "Compter et indexer" msgid "Purge" msgstr "Purger" msgid "Other" msgstr "Autre" msgid "Current blog" msgstr "Blog courant" msgid "All blogs" msgstr "Tous les blogs" msgid "Maintain translations" msgstr "Maintenir les traductions" msgid "Translations" msgstr "Traductions" #, php-format msgid "One task to execute" msgid_plural "%s tasks to execute" msgstr[0] "Une tâche à exécuter" msgstr[1] "%s tâches à exécuter" msgid "This task has never been executed." msgstr "Cette tâche n'a jamais été exécutée." #, php-format msgid "Last execution of this task was on %s." msgstr "La dernière exécution de cette tâches était le %s." #, php-format msgid "There is a task to execute." msgid_plural "There are %s tasks to execute." msgstr[0] "Il y a une tâche à exécuter." msgstr[1] "Il y a %s tâches à exécuter." msgid "Manage tasks" msgstr "Gérer les tâches" msgid "Display overdue tasks counter on maintenance dashboard icon" msgstr "Afficher le nombre de tâches en retard sur l'icône Maintenance du tableau de bord" msgid "Display overdue tasks list on dashboard items" msgstr "Afficher la liste des tâches en retard dans un module du tableau de bord" msgid "Failed to execute task." msgstr "Impossible d'exécuter la tâche." msgid "Task successfully executed." msgstr "La tâche a été exécutée." msgid "Empty templates cache directory" msgstr "Vider le répertoire de cache des « templates »" msgid "Templates cache directory emptied." msgstr "Le répertoire de cache des « templates » a été vidé." msgid "Failed to empty templates cache directory." msgstr "Impossible de vider le répertoire de cache des « templates »." msgid "It may be useful to empty this cache when modifying a theme's .html or .css files (or when updating a theme or plugin). Notice : with some hosters, the templates cache cannot be emptied with this plugin. You may then have to delete the directory /cbtpl/ directly on the server with your FTP software." msgstr "La suppression du répertoire du cache des templates peut se révéler nécessaire lors de modifications dans les fichiers .html ou .css d'un thème (voire lors d'un changement de thème ou de mise à jour de plugin). Attention : chez certains hébergeurs (Free par exemple), le cache du répertoire des templates ne peut pas être vidé grâce à l'extension Maintenance, il faut supprimer le répertoire cbtpl situé dans le répertoire cache (dotclear/cache par défaut) avec un logiciel FTP." msgid "Count again comments and trackbacks" msgstr "Recompter les commentaires et rétroliens" msgid "Comments and trackback counted." msgstr "Les commentaires et rétroliens ont été recomptés." msgid "Failed to count comments and trackbacks." msgstr "Impossible de recompter les commentaires et rétroliens." msgid "Count again comments and trackbacks allows to check their exact numbers. This operation can be useful when importing from another blog platform (or when migrating from dotclear 1 to dotclear 2)." msgstr "Recompter commentaires et des rétroliens a pour effet de donner le nombre exact de ceux-ci pour chaque billet. Cette opération peut se révéler utile lors de l'import d'un blog d'une autre plateforme (ou d'une migration de Dotclear 1 vers Dotclear 2)." msgid "Search engine index" msgstr "Index du moteur de recherche" msgid "Index all comments for search engine" msgstr "Indexer tous les commentaires pour le moteur de recherche" msgid "Next" msgstr "Suivant" #, php-format msgid "Indexing comment %d to %d." msgstr "Indexation des commentaires %d à %d." msgid "Comments index done." msgstr "L'indexation des commentaires a été effectuée." msgid "Failed to index comments." msgstr "Impossible d'indexer les commentaires." msgid "Index all comments and trackbacks in search engine index. This operation is necessary, after importing content in your blog, to use internal search engine, on public and private pages." msgstr "Indexer tous les commentaires et rétroliens dans le moteur de recherche. Cette opération s'effectue généralement suite à un import afin d'obtenir des résultats lors des recherches, aussi bien depuis l'administration du blog qu'en partie publique." msgid "Index all entries for search engine" msgstr "Indexer tous les billets pour le moteur de recherche" #, php-format msgid "Indexing entry %d to %d." msgstr "Indexation des billets %d à %d." msgid "Entries index done." msgstr "L'indexation des billets a été effectuée." msgid "Failed to index entries." msgstr "Impossible d'indexer les billets." msgid "Index all entries in search engine index. This operation is necessary, after importing content in your blog, to use internal search engine, on public and private pages." msgstr "Indexer tous les billets dans le moteur de recherche. Cette opération s'effectue généralement suite à un import afin d'obtenir des résultats lors des recherches, aussi bien depuis l'administration du blog qu'en partie publique." msgid "Delete all logs" msgstr "Supprimer tous les journaux (logs)" msgid "Logs deleted." msgstr "Les journaux ont été supprimés." msgid "Failed to delete logs." msgstr "Impossible de supprimer les journaux." msgid "Logs record all activity and connection to your blog history. Unless you need to keep this history, consider deleting these logs from time to time." msgstr "Sauf si vous avez un besoin précis de conservation des activités de connexion sur votre blog, pensez à vider régulièrement la table des journaux : elle contient l'enregistrement de chaque connexion à l'administration et des opérations qui s'y sont déroulées." msgid "Entries metadata" msgstr "Métadonnées des billets" msgid "Synchronize entries metadata" msgstr "Synchroniser les métadonnées des billets" #, php-format msgid "Synchronize entry %d to %d." msgstr "Synchronisation des billets %d à %d." msgid "Entries metadata synchronize done." msgstr "La synchronisation des métadonnées des billets a été effectuée." msgid "Failed to synchronize entries metadata." msgstr "Impossible de synchroniser les métadonnées des billets." msgid "Synchronize all entries metadata could be useful after importing content in your blog or do bad operation on database tables." msgstr "La synchronisation des métadonnées des billets peut être utile après l'import de contenu dans votre blog ou après une mauvaise opération sur la base de données." msgid "Optimise database" msgstr "Optimise la base de données" msgid "optimize tables" msgstr "Optimiser les tables" msgid "Optimization successful." msgstr "L'optimisation a été effectuée." msgid "Failed to optimize tables." msgstr "Impossible d'optimiser les tables." msgid "After numerous delete or update operations on Dotclear's database, it gets fragmented. Optimizing will allow to defragment it. It has no incidence on your data's integrity. It is recommended to optimize before any blog export." msgstr "Au fur at à mesure des suppressions ou modifications dans vos billets, les tables de la base de données se fragmentent. L'opération d'optimisation permet de compacter celles-ci. Cette opération n'a aucun impact sur l'intégrité de vos données. Il est fortement conseillé d'optimiser la base de données avant tout export de blog." msgid "Download media folder of current blog" msgstr "Télécharger la médiathèque du blog courant" msgid "It may be useful to backup your media folder. This compress all content of media folder into a single zip file. Notice : with some hosters, the media folder cannot be compressed with this plugin if it is too big." msgstr "Il peut être utile de sauvegarder votre médiathèque. Ceci comprime tout le contenu du répertoire de média dans un seul fichier Zip. Remarque : chez certains hébergeurs, la médiathèque ne peut pas être compressée avec ce plugin si elle est trop grande." msgid "Download active theme of current blog" msgstr "Télécharger le theme actif du blog courant" msgid "It may be useful to backup the active theme before any change or update. This compress theme folder into a single zip file." msgstr "Il peut être utile de sauvegarder le thème courant avant tout changement ou mise à jour. Ceci comprime tout le contenu du répertoire du thème dans un seul fichier Zip." msgid "Maintenance plugin has been successfully configured." msgstr "La configuration du plugin de maintenance a été enregistrée." msgid "Never" msgstr "Jamais" msgid "Every week" msgstr "Chaque semaine" msgid "Every two weeks" msgstr "Toutes les deux semaines" msgid "Every month" msgstr "Chaque mois" msgid "Every two months" msgstr "Tous les deux mois" msgid "You have not sufficient permissions to view this page." msgstr "Vous n'avez pas les autorisations suffisantes pour accéder à cette page." msgid "You should execute it now." msgstr "Vous devriez l'exécuter dès maintenant." msgid "Execute task" msgstr "Exécuter cette tâche" msgid "This may take a very long time." msgstr "Cela peut prendre un certain temps." msgid "Alert settings" msgstr "Réglage des alertes" msgid "Activation" msgstr "Activation" msgid "Display alert messages on late tasks" msgstr "Afficher des messages d'alerte pour les tâches en retard" #, php-format msgid "You can place list of late tasks on your %s." msgstr "Vous pouvez placer la liste des tâches en retard sur votre %s." msgid "Frequency" msgstr "Périodicité" msgid "Use one recall time for all tasks" msgstr "Utiliser le même délai de rappel pour toutes les tâches" msgid "Recall time for all tasks:" msgstr "Délai de rappel pour toutes les tâches :" msgid "Use one recall time per task" msgstr "Utiliser un délai de rappel différent pour chaque tâche" msgid "New page" msgstr "Nouvelle page" #, php-format msgid "%d page" msgstr "%d page" #, php-format msgid "%d pages" msgstr "%d pages" msgid "manage pages" msgstr "gestion des pages" msgid "My first page" msgstr "Ma première page" msgid "This is your first page. When you're ready to blog, log in to edit or delete it." msgstr "Ceci est votre première page. Quand vous serez prêt à bloguer, connectez-vous pour l'éditer ou la supprimer." msgid "Published on" msgstr "Publié le" msgid "This page's comments feed" msgstr "Flux des commentaires de cette page" msgid "You must provide a valid email address." msgstr "Vous devez indiquer une adresse e-mail valide." msgid "Page title" msgstr "Titre de la page" msgid "Page position" msgstr "Position de la page" msgid "Publication date" msgstr "Date de publication" msgid "Pages actions" msgstr "Action sur les pages" msgid "Back to pages list" msgstr "Retour à la liste des pages" msgid "Selected pages have been successfully reordered." msgstr "Les pages sélectionnées ont été réordonnées." msgid "No page" msgstr "Aucune page" msgid "Hidden" msgstr "Masqué" msgid "Select this page" msgstr "Sélectionner cette page" msgid "Are you sure you want to delete selected pages?" msgstr "Êtes-vous sûr de vouloir supprimer les pages sélectionnées ?" msgid "Selected pages have been successfully updated." msgstr "Les pages sélectionnées ont été modifiées." msgid "Selected pages have been successfully deleted." msgstr "Les pages sélectionnées ont été supprimées." msgid "Selected pages action:" msgstr "Action sur les pages sélectionnées :" msgid "To rearrange pages order, change number at the begining of the line, then click on “Save pages order” button." msgstr "Pour réordonner les pages, modifier le numéro dans le champ au début de la ligne puis cliquez sur “Enregistrer l'ordre des pages”." msgid "To rearrange pages order, move items by drag and drop, then click on “Save pages order” button." msgstr "Pour réordonner les pages, déplacez les items par glisser déposer puis cliquez sur “Enregistrer l'ordre des pages”." msgid "Save pages order" msgstr "Enregistrer l'ordre des pages" msgid "This page does not exist." msgstr "Cette page n'existe pas." msgid "Edit page" msgstr "Modifier la page" msgid "Are you sure you want to delete this page?" msgstr "Êtes-vous sûr de vouloir supprimer cette page ?" msgid "Page has been successfully updated." msgstr "La page a été modifiée." msgid "Page has been successfully created." msgstr "La page a été créée." msgid "Go to this page on the site" msgstr "Voir cette page sur le site" msgid "Page status" msgstr "État de la page" msgid "Page language" msgstr "Langue de la page" msgid "Hide in widget Pages" msgstr "Ne pas lister dans le widget Pages" msgid "Warning: If you set the URL manually, it may conflict with another page." msgstr "Attention : si vous définissez vous-même l'URL, elle peut entrer en conflit avec celle d'une autre page." msgid "Introduction to the page." msgstr "Introduction à la page." msgid "Select this comment" msgstr "Sélectionner ce commentaire" msgid "Pings" msgstr "Signalements (pings)" msgid "Settings have been successfully updated." msgstr "Les réglages ont été enregistrés." msgid "Pings configuration" msgstr "Configuration des signalements" msgid "Activate pings extension" msgstr "Activer le plugin de signalement" msgid "Service name:" msgstr "Nom du service :" msgid "Service URI:" msgstr "URI du service :" msgid "Error" msgstr "Erreur" msgid "Test ping services" msgstr "Tester les services de signalement" msgid "Check all" msgstr "Tout sélectionner" msgid "Simple menu" msgstr "Menu simple" msgid "All months" msgstr "Tous les mois" msgid "All tags" msgstr "Tous les mots-clés" msgid "Home" msgstr "Accueil" msgid "Archive" msgstr "Archive" msgid "Page" msgstr "Page" msgid "Tags" msgstr "Mots-clés" msgid "User defined" msgstr "Saisie libre" msgid "Label" msgstr "Libellé" msgid "Recent posts" msgstr "Billets récents" #, php-format msgid "Switch to %s language" msgstr "Basculer vers le %s" msgid "Recent Posts from this category" msgstr "Billets récents de cette catégorie" msgid "Archives" msgstr "Archives" #, php-format msgid "Posts from %s" msgstr "Billets de %s" #, php-format msgid "Recent posts for %s tag" msgstr "Billets récent pour le mot-clé %s" msgid "Menu item has been successfully added." msgstr "L'item de menu a été ajouté." msgid "Label and URL of menu item are mandatory." msgstr "Les libellés et URL sont obligatoires." msgid "Menu items have been successfully removed." msgstr "Le ou les items de menu ont été supprimés." msgid "No menu items selected." msgstr "Aucun item de menu sélectionné." msgid "Label is mandatory." msgstr "Le libellé est obligatoire." msgid "URL is mandatory." msgstr "l’URL est obligatoire." msgid "Menu items have been successfully updated." msgstr "Le ou les items de menu ont été mis à jour." msgid "Step #1" msgstr "Étape 1" msgid "Step #2" msgstr "Étape 2" msgid "Step #3" msgstr "Étape 3" msgid "Add item" msgstr "Ajouter un item de menu" msgid "Select type" msgstr "Sélection du type" msgid "Type of item menu:" msgstr "Type d'item de menu :" msgid "Continue..." msgstr "Continuer…" msgid "Select language:" msgstr "Sélectionnez la langue :" msgid "Select category:" msgstr "Sélectionnez la catégorie :" msgid "Select month (if necessary):" msgstr "Sélectionnez le mois (si nécessaire) :" msgid "Select page:" msgstr "Sélectionnez la page :" msgid "Select tag (if necessary):" msgstr "Sélectionnez le mot clé (si nécessaire) :" msgid "Label of item menu:" msgstr "Libellé de l'item de menu :" msgid "Description of item menu:" msgstr "Description de l'item de menu :" msgid "URL of item menu:" msgstr "URL de l'item de menu :" msgid "Add this item" msgstr "Ajouter cet item" msgid "Add an item" msgstr "Ajouter un item de menu" msgid "Menu items list" msgstr "Liste des items de menu" msgid "Update menu" msgstr "Mettre à jour le menu" msgid "Delete selected menu items" msgstr "Supprimer les items de menu sélectionnés" msgid "Are you sure you want to remove selected menu items?" msgstr "Êtes-vous sûr de vouloir supprimer les items de menu sélectionnés ?" msgid "No menu items so far." msgstr "Aucun item de menu pour l'instant." msgid "Add tags" msgstr "Ajouter des mots-clés" msgid "Remove tags" msgstr "Retirer des mots-clés" msgid "Tag has been successfully added to selected entries" msgid_plural "Tags have been successfully added to selected entries" msgstr[0] "Le mot-clé a été ajouté aux entrées sélectionnées" msgstr[1] "Les mot-clés ont été ajoutés aux entrées sélectionnées" msgid "Add tags to this selection" msgstr "Ajouter des mots-clés à cette sélection" #, php-format msgid "Are you sure you want to remove this tag?" msgstr "Êtes-vous sûr de vouloir supprimer ce mot-clé ?" #, php-format msgid "Add a tag to this entry" msgstr "Ajouter un mot-clé à ce billet" msgid "Choose from list" msgstr "Choisir dans la liste" msgid "all" msgstr "tous" msgid "Enter tags separated by coma" msgstr "Séparez les mot-clés par des virgules" msgid "used in %e - frequency %p%" msgstr "utilisé dans %e - fréquence %p%" msgid "entry" msgstr "billet" msgid "entries" msgstr "billets" msgid "Tags to add:" msgstr "Mots-clés à ajouter :" msgid "Tag has been successfully removed from selected entries" msgid_plural "Tags have been successfully removed from selected entries" msgstr[0] "Le mot-clé a été retiré des entrées sélectionnées" msgstr[1] "Les mot-clés ont été retirés des entrées sélectionnées" msgid "No tags for selected entries" msgstr "Aucun mot-clé pour les billets sélectionnés" msgid "Remove selected tags from this selection" msgstr "Retirer les mots-clés de cette sélection" msgid "Following tags have been found in selected entries:" msgstr "Les mots-clés suivants ont été trouvés pour les billets sélectionnés :" msgid "Tag" msgstr "Mot-clé" msgid "Short" msgstr "Court" msgid "Extended" msgstr "Étendu" msgid "Tags list format:" msgstr "Format de la liste des mots-clés :" msgid "This tag's comments Atom feed" msgstr "Flux Atom des commentaires associés à ce mot-clé" msgid "This tag's entries Atom feed" msgstr "Flux Atom des billets associés à ce mot-clé" msgid "Limit (empty means no limit):" msgstr "Limite (laisser vide si pas de limite) :" msgid "Entries count" msgstr "Nombre de billets" msgid "Tag name" msgstr "Nom du mot-clé" msgid "Link to all tags:" msgstr "Lien vers tous les mots-clés :" msgid "Tag has been successfully renamed" msgstr "Le mot-clé a été renommé." msgid "Tag has been successfully removed" msgstr "Le mot-clé a été retiré." #, php-format msgid "Are you sure you want to remove tag: “%s”?" msgstr "Êtes-vous sûr de vouloir supprimer le mot-clé “%s” ?" msgid "Back to tags list" msgstr "Retour à la liste des mots-clés" msgid "Rename" msgstr "Renommer" msgid "Delete this tag" msgstr "Supprimer ce mot-clé" #, php-format msgid "List of entries with the tag “%s”" msgstr "Liste des billets avec le mot-clé “%s”" msgid "No tags on this blog." msgstr "Aucun mot-clé sur ce blog." msgid "Edit theme files" msgstr "Modifier les fichiers du thème" msgid "Syntax highlighting in theme editor" msgstr "Coloration syntaxique de l'éditeur de thème" msgid "No file" msgstr "Aucun fichier" msgid "File does not exist." msgstr "Ce fichier n'existe pas." #, php-format msgid "File %s is not readable" msgstr "Le fichier %s n'est pas lisible" #, php-format msgid "Unable to write file %s. Please check your theme files and folders permissions." msgstr "Impossible d'écrire le fichier %s. Contrôlez les permissions des fichiers et des répertoires de votre thème." msgid "Saving document..." msgstr "Enregistrement du document…" msgid "Document saved" msgstr "Document enregistré" msgid "An error occurred:" msgstr "Une erreur est survenue :" #, php-format msgid "Your current theme on this blog is \"%s\"." msgstr "Actuellement votre thème sur ce blog est « %s »." msgid "You can't edit default theme." msgstr "Vous ne pouvez pas modifier le thème par défaut." msgid "Please select a file to edit." msgstr "Sélectionnez un fichier à modifier." msgid "File editor" msgstr "Éditeur de fichier" #, php-format msgid "Editing file %s" msgstr "Édition du fichier %s" msgid "This file is not writable. Please check your theme files permissions." msgstr "Ce fichier n'est pas modifiable. Contrôlez les permissions de vos fichiers de thème." msgid "Templates files" msgstr "Fichiers du thème" msgid "CSS files" msgstr "Fichiers CSS" msgid "JavaScript files" msgstr "Fichiers JavaScript" msgid "Locales files" msgstr "Fichiers de traduction" msgid "Preferences successfully updated" msgstr "Les préférences ont été mises à jour." msgid "user:preferences" msgstr "user:preferences" msgid "User preferences" msgstr "Préférences utilisateur" msgid "Global preferences" msgstr "Préférences globales" msgid "Presentation widgets" msgstr "Widgets de présentation" msgid "Search engine" msgstr "Moteur de recherche" msgid "Navigation links" msgstr "Liens de navigation" msgid "Selected entries" msgstr "Billets sélectionnés" msgid "Best of me" msgstr "À retenir" msgid "Blog languages" msgstr "Langues du blog" msgid "With entries counts" msgstr "Avec le nombre de billets" msgid "Include sub cats in count" msgstr "Inclure les sous-catégories dans les compteurs" msgid "Include empty categories" msgstr "Inclure les catégories vides" msgid "Subscribe links" msgstr "Liens de souscription" msgid "Subscribe" msgstr "S'abonner" msgid "Feeds type:" msgstr "Type de flux :" msgid "Feed reader" msgstr "Lecteur de flux" msgid "Somewhere else" msgstr "Autre part" msgid "Entries limit:" msgstr "Limite du nombre de billets :" msgid "Text" msgstr "Texte" msgid "Text:" msgstr "Texte :" msgid "Last entries" msgstr "Derniers billets" msgid "Uncategorized" msgstr "Sans catégorie" msgid "Tag:" msgstr "Mot-clé :" msgid "Last comments" msgstr "Derniers commentaires" msgid "Comments limit:" msgstr "Limite du nombre de commentaires :" #, php-format msgid "This blog's entries %s feed" msgstr "Flux %s des billets de ce blog" #, php-format msgid "This blog's comments %s feed" msgstr "Flux %s des commentaires de ce blog" msgid "Entries feed" msgstr "Fil des billets" msgid "Comments feed" msgstr "Fil des commentaires" msgid "navigation" msgstr "Volet de navigation" msgid "extra" msgstr "Volet d'extra" msgid "custom" msgstr "Volet supplémentaire" msgid "empty string" msgstr "chaîne vide" msgid "Sidebars and their widgets have been saved." msgstr "Les volets et leurs widgets ont été enregistrés." msgid "Sidebars have been resetting." msgstr "Les volets ont été réinitialisés." msgid "Widgets" msgstr "Widgets" msgid "Are you sure you want to reset sidebars?" msgstr "Êtes-vous sûr de vouloir réinitialiser les volets ?" msgid "Available widgets" msgstr "Widgets disponibles" msgid "Drag widgets from this list to one of the sidebars, for add." msgstr "Déplacez des widgets de cette liste vers l'un des volets." msgid "order" msgstr "ordre" msgid "Append to:" msgstr "Ajouter à :" msgid "Add widgets to sidebars" msgstr "Ajouter les widgets aux volets" msgid "Navigation sidebar" msgstr "Volet de navigation" msgid "Extra sidebar" msgstr "Volet d'extra" msgid "Custom sidebar" msgstr "Volet supplémentaire" msgid "Update sidebars" msgstr "Mettre à jour les volets" msgid "Reset sidebars" msgstr "Réinitialiser les volets" msgid "Widget ID:" msgstr "Identifiant du widget :" msgid "No setting for this widget" msgstr "Aucun réglage pour ce widget" msgid "boolean" msgstr "booléen" msgid "possible values:" msgstr "valeurs possibles :" msgid "listitem" msgstr "élément de liste" msgid "string" msgstr "chaîne de caractères" msgid "Setting name:" msgstr "Nom de l'élément de réglage :" msgid "No widget as far." msgstr "Aucun widget pour le moment." msgid "Up the widget" msgstr "Monter le widget" msgid "Down the widget" msgstr "Descendre le widget" msgid "Remove the widget" msgstr "Retirer le widget" msgid "Remove widget" msgstr "Retirer le widget" msgid "Drag widgets here to remove." msgstr "Glisser les widgets ici pour les retirer du volet." #~ msgid "RSS or Atom feed subscription links" #~ msgstr "Liens d'abonnement aux flux RSS ou Atom" #~ msgid "Last entries from feed" #~ msgstr "Flux des derniers billets" #~ msgid "List of last comments posted" #~ msgstr "Liste des derniers commentaires publiés" #~ msgid "Settings successfully updated" #~ msgstr "Les réglages ont été mis à jour." #~ msgid "Widgets may be used to add various blocks of content to be displayed on your public pages. To add a widget, drag it from the Available widgets list on the left to one of the sidebars on the right of this page. You can order your widgets in a sidebar by dragging them up or down. You must update sidebars to apply your changes." #~ msgstr "Les widgets sont utilisés pour ajouter des blocs de contenus divers dans vos pages publiques. Pour ajouter un widget, faites-le glisser depuis la liste des Widgets disponibles à gauche jusqu'à l'un des volets sur la droite de la page. Vous pouvez ré-ordonner vos widgets dans un volet en le faisant glisser vers le haut ou vers le bas. Vous devez mettre à jour les volets pour enregistrer vos modifications." #~ msgid "Once included in a sidebar, widgets have configuration options that you can reach by clicking on the arrow next to their name." #~ msgstr "Une fois inclus dans un volet, les widgets ont généralement des options que vous pouvez configurer. Cliquez sur la flèche à côté de leur nom pour y accéder." #~ msgid "Reset sidebars to get back to default widgets installation." #~ msgstr "Réinitialisez les volets pour retrouver les widgets par défaut de votre installation." #~ msgid "Widget templates tags" #~ msgstr "Balises de widget" #~ msgid "If you are allowed to edit your theme templates, you can directly add widgets as templates tags, with their own configuration." #~ msgstr "Si vous êtes autorisé à modifier vos fichiers de thème, vous pouvez ajouter des widgets sous forme de balise, avec leur propre configuration." #~ msgid "To add a widget in your template, you need to write code like this:" #~ msgstr "Pour ajouter un widget à votre thème, vous devez insérer un code similaire à :" #~ msgid "Widget ID" #~ msgstr "ID du widget" #~ msgid "Setting name" #~ msgstr "Nom de l'élément de réglage" #~ msgid "Setting value" #~ msgstr "Valeur de l'élément de réglage" #~ msgid "Here are the following available widgets for your blog:" #~ msgstr "Voici les widgets disponibles pour votre blog :" #~ msgid "Updates are available" #~ msgstr "Des mises à jour sont disponibles" #~ msgid "Impossible to read data feed" #~ msgstr "Impossible de lire le flux de données" #~ msgid "Quick description" #~ msgstr "Description rapide" #~ msgid "Page(s)" #~ msgstr "Page(s)" #~ msgid "by" #~ msgstr "par" #~ msgid "Update selected modules" #~ msgstr "Mettre à jour les modules sélectionnés" #~ msgid "Support" #~ msgstr "Assistance" #~ msgid "The theme has been successfully installed." #~ msgstr "Le thème a été installé." #~ msgid "Following plugins have not been updated:" #~ msgstr "Les extensions suivantes n'ont pas été mises à jour :" #~ msgid "Following plugins have been updated:" #~ msgstr "Les extensions suivantes ont été mises à jour :" #~ msgid "Following themes have not been updated:" #~ msgstr "Les thèmes suivants n'ont pas été mis à jour :" #~ msgid "Following themes have been updated:" #~ msgstr "Les thèmes suivants ont été mis à jour :" #~ msgid "Available updates" #~ msgstr "Mises à jours disponibles" #~ msgid "Available plugins (%s)" #~ msgstr "Extensions disponibles (%s)" #~ msgid "Available themes (%s)" #~ msgstr "Thèmes disponibles (%s)" #~ msgid "Back" #~ msgstr "Retour" #~ msgid "Save this settings" #~ msgstr "Enregistrer ces réglages" #~ msgid "Pages" #~ msgstr "Pages" #~ msgid "Settings definition successfully updated" #~ msgstr "Les réglages ont été enregistrés." #~ msgid "By" #~ msgstr "Par" #~ msgid "Edit tag name:" #~ msgstr "Renommer ce mot-clé :" #~ msgid "Preferences definition successfully updated" #~ msgstr "La définition des préférences a été enregistrée." #~ msgid "Use different periods for each task" #~ msgstr "Utiliser une périodicité différente pour chaque tâche" #~ msgid "Settings" #~ msgstr "Paramètres" #~ msgid "Recall time per task:" #~ msgstr "Délai de rappel par tâche :" #~ msgid "Add tags to entries" #~ msgstr "Ajouter des mots-clés à des billets" #~ msgid "Help for this page" #~ msgstr "Aide pour cette page" #~ msgid "Show maintenance tasks to update." #~ msgstr "Afficher les tâches de maintenance à mettre à jour." #~ msgid "File is empty or not a compressed file." #~ msgstr "Le fichier est vide ou n'est pas un fichier compressé." #~ msgid "Zip file ready to be downloaded." #~ msgstr "Fichier Zip prêt à être télécharger." #~ msgid "blog settings" #~ msgstr "paramètres du blog" #~ msgid "Ok" #~ msgstr "Ok" #~ msgid "global settings" #~ msgstr "réglages généraux" #~ msgid "Akismet" #~ msgstr "Akismet" #~ msgid "Global IP" #~ msgstr "IP globale" #~ msgid "Global word" #~ msgstr "Mot global" #~ msgid "Are you sure you want to delete all spams?" #~ msgstr "Êtes-vous sûr de vouloir supprimer tous les indésirables ?" #~ msgid "Delete all spams" #~ msgstr "Supprimer tous les indésirables" #~ msgid "Blog preferences" #~ msgstr "Préférences du blog" #~ msgid "XFN" #~ msgstr "XFN" #~ msgid "Blowup Config" #~ msgstr "Configuration de Blowup" #~ msgid "Fair Trackbacks" #~ msgstr "Filtre de rétroliens" #~ msgid "Import / Export" #~ msgstr "Import / Export" #~ msgid "This will import your Dotclear 1.2 content as new content in the current blog: %s." #~ msgstr "Cela importera votre contenu Dotclear 1.2 comme nouveau contenu dans le blog courant : %s." #~ msgid "Feed import" #~ msgstr "Importation de flux" #~ msgid "Imports a feed as new entries." #~ msgstr "Importer un flux comme nouveau contenu" #~ msgid "This will import a feed (RSS or Atom) a as new content in the current blog: %s." #~ msgstr "Cela importera un flux (RSS ou ATOM) comme un nouveau contenu dans le blog courant : %s." #~ msgid "Counters" #~ msgstr "Compteurs" #~ msgid "Vacuum logs" #~ msgstr "Vidage des journaux" #~ msgid "Empty directory" #~ msgstr "Vidage du répertoire" #~ msgid "Warning: Comments are not more accepted for this page." #~ msgstr "Attention : les commentaires ne sont plus acceptés pour cette page." #~ msgid "Warning: Trackbacks are not more accepted for this page." #~ msgstr "Attention : les rétroliens ne sont plus acceptés pour cette page." #~ msgid "next page" #~ msgstr "page suivante" #~ msgid "previous page" #~ msgstr "page précédente" #~ msgid "Hide" #~ msgstr "Masquer" #~ msgid "If checked this page will be active but not listed in widget Pages." #~ msgstr "Si coché cette page sera active mais non listée dans le widget Pages." #~ msgid "page" #~ msgstr "page" #~ msgid "Pings:" #~ msgstr "Signalements :" #~ msgid "Simple Menu" #~ msgstr "Menu simple" #~ msgid "Menu" #~ msgstr "Menu" #~ msgid "Tags:" #~ msgstr "Mots-clés :" #~ msgid "short" #~ msgstr "court" #~ msgid "extended" #~ msgstr "étendu" #~ msgid "Edit tag" #~ msgstr "Modifier le mot-clé" #~ msgid "Actions for this tag" #~ msgstr "Actions sur ce mot-clé" #~ msgid "List of entries with this tag" #~ msgstr "Liste des billets avec ce mot-clé" #~ msgid "Syntax color" #~ msgstr "Coloration syntaxique" #~ msgid "user preferences" #~ msgstr "préférences utilisateur" #~ msgid "global preferences" #~ msgstr "préférences globales" #~ msgid "Export a blog" #~ msgstr "Exporter un blog" #~ msgid "Export all content" #~ msgstr "Exporte tout le contenu" #~ msgid "Import a full backup file" #~ msgstr "Importer un fichier de sauvegarde complet" #~ msgid "The backup file does not appear to be well formed." #~ msgstr "Le fichier de sauvegarde semble mal formaté." #~ msgid "Blog settings" #~ msgstr "Paramètres du blog" dotclear-2.6.2+dfsg/locales/fr/public.lang.php000066400000000000000000000144211230033266200211740ustar00rootroot00000000000000%1$s returned no result.'] = 'Votre recherche de %1$s n\'a donné aucun résultat.'; $GLOBALS['__l10n']['Your search for %1$s returned %2$s result.'] = 'Votre recherche de %1$s a donné %2$s résultat.'; $GLOBALS['__l10n']['Your search for %1$s returned %2$s results.'] = 'Votre recherche de %1$s a donné %2$s résultats.'; $GLOBALS['__l10n']['Home'] = 'Accueil'; $GLOBALS['__l10n']['All keywords'] = 'Tous les mots clés'; $GLOBALS['__l10n']['Best of me'] = 'À retenir'; $GLOBALS['__l10n']['Languages'] = 'Langues'; $GLOBALS['__l10n']['Categories'] = 'Catégories'; $GLOBALS['__l10n']['Subcategories'] = 'Sous-catégories'; $GLOBALS['__l10n']['Archives'] = 'Archives'; $GLOBALS['__l10n']['Links'] = 'Liens'; $GLOBALS['__l10n']['Subscribe'] = 'S\'abonner'; $GLOBALS['__l10n']['Entries feed'] = 'Fil des billets'; $GLOBALS['__l10n']['Comments feed'] = 'Fil des commentaires'; $GLOBALS['__l10n']['This blog\'s comments Atom feed'] = 'Fil Atom des commentaires de ce blog'; $GLOBALS['__l10n']['This category\'s entries Atom feed'] = 'Fil Atom des billets de cette catégorie'; $GLOBALS['__l10n']['This category\'s comments Atom feed'] = 'Fil Atom des commentaires de cette catégorie'; $GLOBALS['__l10n']['This post\'s comments feed'] = 'Fil des commentaires de ce billet'; $GLOBALS['__l10n']['This post\'s comments Atom feed'] = 'Fil Atom des commentaires de ce billet'; $GLOBALS['__l10n']['Attachments'] = 'Annexes'; $GLOBALS['__l10n']['Permalink'] = 'Lien permanent'; $GLOBALS['__l10n']['Comments'] = 'Commentaires'; $GLOBALS['__l10n']['Your comment'] = 'Votre commentaire'; $GLOBALS['__l10n']['Your comment has been published.'] = 'Votre commentaire a été publié.'; $GLOBALS['__l10n']['Your comment has been submitted and will be reviewed for publication.'] = 'Votre commentaire a été enregistré et sera publié après validation.'; $GLOBALS['__l10n']['Add a comment'] = 'Ajouter un commentaire'; $GLOBALS['__l10n']['Name or nickname'] = 'Nom ou pseudo'; $GLOBALS['__l10n']['Email address'] = 'Adresse email'; $GLOBALS['__l10n']['Website'] = 'Site web'; $GLOBALS['__l10n']['optional'] = 'facultatif'; $GLOBALS['__l10n']['Comment'] = 'Commentaire'; $GLOBALS['__l10n']['Comments can be formatted using a simple wiki syntax.'] = 'Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.'; $GLOBALS['__l10n']['HTML code is displayed as text and web addresses are automatically converted.'] = 'Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.'; $GLOBALS['__l10n']['Remember me on this blog'] = 'Se souvenir de moi sur ce blog'; $GLOBALS['__l10n']['preview'] = 'prévisualiser'; $GLOBALS['__l10n']['send'] = 'envoyer'; $GLOBALS['__l10n']['They posted on the same topic'] = 'La discussion continue ailleurs'; $GLOBALS['__l10n']['Trackback URL'] = 'URL de rétrolien'; $GLOBALS['__l10n']['You must provide an author name'] = 'Vous devez indiquer un nom'; $GLOBALS['__l10n']['You must provide a comment'] = 'Vous devez écrire un commentaire'; $GLOBALS['__l10n']['Email address is not valid'] = 'Adresse email incorrecte'; $GLOBALS['__l10n']['Document not found'] = 'Document non trouvé'; $GLOBALS['__l10n']['The document you are looking for does not exist.'] = 'Le document que vous cherchez n\'existe pas.'; $GLOBALS['__l10n']['Powered by %s'] = 'Propulsé par %s'; $GLOBALS['__l10n']['Subscribe to'] = 'S\'abonner à'; $GLOBALS['__l10n']['What is an RSS feed?'] = 'Qu\'est ce qu\'un fil RSS ?'; $GLOBALS['__l10n']['RSS feed is a free blog summary. It provides content (either posts or comments) or summaries of content, together with links to the full versions, and other metadata. The last published items may then be read by your favorite RSS aggregator.'] = 'Un fil RSS recueille les informations de mise à jour d\'un site. Il fournit le contenu des billets ou des commentaires ou un extrait de ceux-ci, ainsi qu\'un lien vers les versions complètes et quelques autres informations. Ce fil a pour vocation d\'être lu par un agrégateur RSS.'; $GLOBALS['__l10n']['Simply copy the following URL into your aggregator:'] = 'Copier simplement l\'adresse suivante dans votre agrégateur :'; $GLOBALS['__l10n']['Password needed'] = 'Mot de passe nécessaire'; $GLOBALS['__l10n']['You must give a password to access this area.'] = 'Vous devez indiquer un mot de passe pour accéder à cette partie.'; $GLOBALS['__l10n']['Password:'] = 'Mot de passe :'; $GLOBALS['__l10n']['You must provide a valid email address.'] = 'Vous devez indiquer une adresse e-mail valide.'; $GLOBALS['__l10n']['Read'] = 'Lire'; $GLOBALS['__l10n']['in'] = 'dans'; $GLOBALS['__l10n']['In'] = 'Dans'; dotclear-2.6.2+dfsg/locales/fr/public.po000066400000000000000000000133161230033266200201050ustar00rootroot00000000000000# French translation of DotClear # Copyright (C) 2006. # Olivier Meunier , 2006. msgid "" msgstr "" "Project-Id-Version: Dotclear 2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-10-13 05:22+0200\n" "PO-Revision-Date: 2011-01-15 22:47+0100\n" "Last-Translator: xave \n" "Language-Team: \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Poedit-Language: French\n" msgid "To content" msgstr "Aller au contenu" msgid "To menu" msgstr "Aller au menu" msgid "To search" msgstr "Aller à la recherche" msgid "By" msgstr "Par" msgid "by" msgstr "par" msgid "on" msgstr "le" msgid "On" msgstr "Le" msgid "Continue reading" msgstr "Lire la suite" msgid "no comment" msgstr "aucun commentaire" msgid "one comment" msgstr "un commentaire" msgid "%d comments" msgstr "%d commentaires" msgid "no trackback" msgstr "aucun rétrolien" msgid "one trackback" msgstr "un rétrolien" msgid "%d trackbacks" msgstr "%d rétroliens" msgid "no attachment" msgstr "aucune annexe" msgid "one attachment" msgstr "une annexe" msgid "%d attachments" msgstr "%d annexes" msgid "previous entries" msgstr "billets précédents" msgid "page" msgstr "page" msgid "of" msgstr "de" msgid "next entries" msgstr "billets suivants" msgid "Search" msgstr "Recherche" msgid "Your search for %1$s returned no result." msgstr "Votre recherche de %1$s n'a donné aucun résultat." msgid "Your search for %1$s returned %2$s result." msgstr "Votre recherche de %1$s a donné %2$s résultat." msgid "Your search for %1$s returned %2$s results." msgstr "Votre recherche de %1$s a donné %2$s résultats." msgid "Home" msgstr "Accueil" msgid "All keywords" msgstr "Tous les mots clés" msgid "Best of me" msgstr "À retenir" msgid "Languages" msgstr "Langues" msgid "Categories" msgstr "Catégories" msgid "Subcategories" msgstr "Sous-catégories" msgid "Archives" msgstr "Archives" msgid "Links" msgstr "Liens" msgid "Subscribe" msgstr "S'abonner" msgid "Entries feed" msgstr "Fil des billets" msgid "Comments feed" msgstr "Fil des commentaires" msgid "This blog's comments Atom feed" msgstr "Fil Atom des commentaires de ce blog" msgid "This category's entries Atom feed" msgstr "Fil Atom des billets de cette catégorie" msgid "This category's comments Atom feed" msgstr "Fil Atom des commentaires de cette catégorie" msgid "This post's comments feed" msgstr "Fil des commentaires de ce billet" msgid "This post's comments Atom feed" msgstr "Fil Atom des commentaires de ce billet" msgid "Attachments" msgstr "Annexes" msgid "Permalink" msgstr "Lien permanent" msgid "Comments" msgstr "Commentaires" msgid "Your comment" msgstr "Votre commentaire" msgid "Your comment has been published." msgstr "Votre commentaire a été publié." msgid "Your comment has been submitted and will be reviewed for publication." msgstr "Votre commentaire a été enregistré et sera publié après validation." msgid "Add a comment" msgstr "Ajouter un commentaire" msgid "Name or nickname" msgstr "Nom ou pseudo" msgid "Email address" msgstr "Adresse email" msgid "Website" msgstr "Site web" msgid "optional" msgstr "facultatif" msgid "Comment" msgstr "Commentaire" msgid "Comments can be formatted using a simple wiki syntax." msgstr "Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée." msgid "HTML code is displayed as text and web addresses are automatically converted." msgstr "Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées." msgid "Remember me on this blog" msgstr "Se souvenir de moi sur ce blog" msgid "preview" msgstr "prévisualiser" msgid "send" msgstr "envoyer" msgid "They posted on the same topic" msgstr "La discussion continue ailleurs" msgid "Trackback URL" msgstr "URL de rétrolien" msgid "You must provide an author name" msgstr "Vous devez indiquer un nom" msgid "You must provide a comment" msgstr "Vous devez écrire un commentaire" msgid "Email address is not valid" msgstr "Adresse email incorrecte" msgid "Document not found" msgstr "Document non trouvé" msgid "The document you are looking for does not exist." msgstr "Le document que vous cherchez n'existe pas." msgid "Powered by %s" msgstr "Propulsé par %s" msgid "Subscribe to" msgstr "S'abonner à" msgid "What is an RSS feed?" msgstr "Qu'est ce qu'un fil RSS ?" msgid "RSS feed is a free blog summary. It provides content (either posts or comments) or summaries of content, together with links to the full versions, and other metadata. The last published items may then be read by your favorite RSS aggregator." msgstr "Un fil RSS recueille les informations de mise à jour d'un site. Il fournit le contenu des billets ou des commentaires ou un extrait de ceux-ci, ainsi qu'un lien vers les versions complètes et quelques autres informations. Ce fil a pour vocation d'être lu par un agrégateur RSS." msgid "Simply copy the following URL into your aggregator:" msgstr "Copier simplement l'adresse suivante dans votre agrégateur :" msgid "Password needed" msgstr "Mot de passe nécessaire" msgid "You must give a password to access this area." msgstr "Vous devez indiquer un mot de passe pour accéder à cette partie." msgid "Password:" msgstr "Mot de passe :" msgid "You must provide a valid email address." msgstr "Vous devez indiquer une adresse e-mail valide." msgid "Read" msgstr "Lire" msgid "in" msgstr "dans" msgid "In" msgstr "Dans" dotclear-2.6.2+dfsg/locales/fr/resources.php000066400000000000000000000015751230033266200210160ustar00rootroot00000000000000 'http://fr.dotclear.org/documentation/2.0', 'Présentation de Dotclear' => 'http://doc.dotclear.net/2.0/overview/tour', "Manuel de l'utilisateur" => 'http://doc.dotclear.net/2.0/usage', "Guide d'installation et d'administration" => 'http://doc.dotclear.net/2.0/admin', "Forum de support de Dotclear" => 'http://forum.dotclear.net/' ); ?>dotclear-2.6.2+dfsg/plugins/000077500000000000000000000000001230033266200157135ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/.htaccess000066400000000000000000000000151230033266200175050ustar00rootroot00000000000000Deny from alldotclear-2.6.2+dfsg/plugins/aboutConfig/000077500000000000000000000000001230033266200201535ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/aboutConfig/_admin.php000066400000000000000000000011621230033266200221130ustar00rootroot00000000000000addItem('about:config','plugin.php?p=aboutConfig','index.php?pf=aboutConfig/icon.png', preg_match('/plugin.php\?p=aboutConfig(&.*)?$/',$_SERVER['REQUEST_URI']), $core->auth->isSuperAdmin()); dotclear-2.6.2+dfsg/plugins/aboutConfig/_define.php000066400000000000000000000011551230033266200222570ustar00rootroot00000000000000registerModule( /* Name */ "about:config", /* Description*/ "Manage every blog configuration directive", /* Author */ "Olivier Meunier", /* Version */ '0.5', array( 'type' => 'plugin' ) ); dotclear-2.6.2+dfsg/plugins/aboutConfig/icon-big.png000066400000000000000000000025721230033266200223560ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<IDATxZ?G #_@"_`I r:.N*RKjA:C HF $]ṋ;)6ߛ=~7oF-`?Y>NÕ5֌q \7V QE_)xDp HG7 sGldb׶ ! + V6Т ]tW{GcEV.W^"ϤO^zc4ݍa|Έ!׌8YlZ-x3800r8Ӹ?0P:>^XPP6v]Y 7*<7:20Wx]L'$iU/Rcn%;3.-=α#];L XקM2vlCTωB dDH-ᅸĐL!&[s63Yy[v\?.־`ĮLAB~^6J,>!A~vVEZfG\2[9%V1P.JSƞjUEzۣ*do)6O.o/~1DuY!IDikb?s&蔒'z\ $s) { $core->blog->settings->addNamespace($ns); foreach ($s as $k => $v) { $core->blog->settings->$ns->put($k,$v); } $core->blog->triggerBlog(); } dcPage::addSuccessNotice(__('Configuration successfully updated')); http::redirect($p_url); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Global settings update if (!empty($_POST['gs']) && is_array($_POST['gs'])) { try { foreach ($_POST['gs'] as $ns => $s) { $core->blog->settings->addNamespace($ns); foreach ($s as $k => $v) { $core->blog->settings->$ns->put($k,$v,null,null,true,true); } $core->blog->triggerBlog(); } dcPage::addSuccessNotice(__('Configuration successfully updated')); http::redirect($p_url.'&part=global'); } catch (Exception $e) { $core->error->add($e->getMessage()); } } $part = !empty($_GET['part']) && $_GET['part'] == 'global' ? 'global' : 'local'; function settingLine($id,$s,$ns,$field_name,$strong_label) { if ($s['type'] == 'boolean') { $field = form::combo(array($field_name.'['.$ns.']['.$id.']',$field_name.'_'.$ns.'_'.$id), array(__('yes') => 1, __('no') => 0),$s['value'] ? 1 : 0); } else { $field = form::field(array($field_name.'['.$ns.']['.$id.']',$field_name.'_'.$ns.'_'.$id),40,null, html::escapeHTML($s['value'])); } $slabel = $strong_label ? '%s' : '%s'; return ''. ''. ''.$field.''. ''.$s['type'].''. ''.html::escapeHTML($s['label']).''. ''; } ?> about:config '', html::escapeHTML($core->blog->name) => '', __('about:config') => '' )). dcPage::notices(); ?>

        blog->name)); ?>

        '. ''. ''."\n". ' '."\n". ' '."\n". ' '."\n". ' '."\n". ''."\n". ''."\n". ''; $table_footer = '
        %s
        Setting ID'.__('Value').''.__('Type').''.__('Description').'
        '; $settings = array(); foreach ($core->blog->settings->dumpNamespaces() as $ns => $namespace) { foreach ($namespace->dumpSettings() as $k => $v) { $settings[$ns][$k] = $v; } } ksort($settings); if (count($settings) > 0) { $ns_combo = array(); foreach ($settings as $ns => $s) { $ns_combo[$ns] = '#l_'.$ns; } echo '
        '. '

        '. ' '.form::combo('ls_nav',$ns_combo). ' '. ''. $core->formNonce().'

        '; } ?>
        $s) { ksort($s); echo sprintf($table_header,'l_'.$ns,$ns); foreach ($s as $k => $v) { echo settingLine($k,$v,$ns,'s',!$v['global']); } echo $table_footer; } ?>

        formNonce(); ?>

        blog->settings->dumpNamespaces() as $ns => $namespace) { foreach ($namespace->dumpGlobalSettings() as $k => $v) { $settings[$ns][$k] = $v; } } ksort($settings); if (count($settings) > 0) { $ns_combo = array(); foreach ($settings as $ns => $s) { $ns_combo[$ns] = '#g_'.$ns; } echo '
        '. '

        '. ' '.form::combo('gs_nav',$ns_combo).' '. ''. ''. $core->formNonce().'

        '; } ?>
        $s) { ksort($s); echo sprintf($table_header,'g_'.$ns,$ns); foreach ($s as $k => $v) { echo settingLine($k,$v,$ns,'gs',false); } echo $table_footer; } ?>

        formNonce(); ?>

        dotclear-2.6.2+dfsg/plugins/aboutConfig/locales/000077500000000000000000000000001230033266200215755ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/aboutConfig/locales/en/000077500000000000000000000000001230033266200221775ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/aboutConfig/locales/en/help/000077500000000000000000000000001230033266200231275ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/aboutConfig/locales/en/help/help.html000066400000000000000000000014651230033266200247530ustar00rootroot00000000000000 About:Config

        About:Config

        This page provides technical information about the configuration of the current blog (as well as configuration common to all the blogs). These parameters are usually managed by other pages in the administration interface.
        Only modify something here if you know what you are doing!

        Some parameters can only be modified on this page.

        The page has two tabs: Settings for the current blog (blog name) and Global settings to manage the current blog settings and the global settings, respectively.

        You can directly access the different page sections using the Goto dropdown menu.

        dotclear-2.6.2+dfsg/plugins/aboutConfig/locales/en/resources.php000066400000000000000000000007631230033266200247300ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/aboutConfig/locales/fr/000077500000000000000000000000001230033266200222045ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/aboutConfig/locales/fr/help/000077500000000000000000000000001230033266200231345ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/aboutConfig/locales/fr/help/help.html000066400000000000000000000016121230033266200247520ustar00rootroot00000000000000 About:Config

        About:Config

        Cette page présente des informations techniques brutes, relatives à la configuration du blog courant (et communes à tous les blogs). Généralement ces paramètres sont gérés par d'autres pages de l'administration.
        Ne modifiez quelque chose que si vous savez ce que vous faîtes.

        Certains paramètres ne sont modifiables que sur cette page.

        La page présente deux onglets "Réglages pour le blog courant (nom du blog)" et "Réglages généraux" qui permettent de gérer (et présenter) respectivement les réglages du blog courant et ceux communs à tous les blogs.

        Vous pouvez accéder directement aux différentes sections de la page avec le menu de sélection.

        dotclear-2.6.2+dfsg/plugins/aboutConfig/locales/fr/resources.php000066400000000000000000000007631230033266200247350ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/akismet/000077500000000000000000000000001230033266200173505ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/akismet/_define.php000066400000000000000000000012331230033266200214510ustar00rootroot00000000000000registerModule( /* Name */ "Akismet", /* Description*/ "Akismet interface for Dotclear", /* Author */ "Olivier Meunier", /* Version */ '1.1', array( 'permissions' => 'usage,contentadmin', 'priority' => 200, 'type' => 'plugin' ) ); dotclear-2.6.2+dfsg/plugins/akismet/_prepend.php000066400000000000000000000010241230033266200216520ustar00rootroot00000000000000spamfilters[] = 'dcFilterAkismet'; dotclear-2.6.2+dfsg/plugins/akismet/class.dc.filter.akismet.php000066400000000000000000000140371230033266200245000ustar00rootroot00000000000000auth->isSuperAdmin()) { $this->has_gui = false; } } protected function setInfo() { $this->description = __('Akismet spam filter'); } public function getStatusMessage($status,$comment_id) { return sprintf(__('Filtered by %s.'),$this->guiLink()); } private function akInit() { $blog =& $this->core->blog; if (!$blog->settings->akismet->ak_key) { return false; } return new akismet($blog->url,$blog->settings->akismet->ak_key); } public function isSpam($type,$author,$email,$site,$ip,$content,$post_id,&$status) { if (($ak = $this->akInit()) === false) { return; } $blog =& $this->core->blog; try { if ($ak->verify()) { $post = $blog->getPosts(array('post_id' => $post_id)); $c = $ak->comment_check( $post->getURL(), $type, $author, $email, $site, $content ); if ($c) { $status = 'Filtered by Akismet'; return true; } } } catch (Exception $e) {} # If http or akismet is dead, we don't need to know it } public function trainFilter($status,$filter,$type,$author,$email,$site,$ip,$content,$rs) { # We handle only false positive from akismet if ($status == 'spam' && $filter != 'dcFilterAkismet') { return; } $f = $status == 'spam' ? 'submit_spam' : 'submit_ham'; if (($ak = $this->akInit()) === false) { return; } try { if ($ak->verify()) { $ak->{$f}($rs->getPostURL(),$type,$author,$email,$site,$content); } } catch (Exception $e) {} # If http or akismet is dead, we don't need to know it } public function gui($url) { $blog =& $this->core->blog; $ak_key = $blog->settings->akismet->ak_key; $ak_verified = null; if (isset($_POST['ak_key'])) { try { $ak_key = $_POST['ak_key']; $blog->settings->addNamespace('akismet'); $blog->settings->akismet->put('ak_key',$ak_key,'string'); dcPage::addSuccessNotice(__('Filter configuration have been successfully saved.')); http::redirect($url); } catch (Exception $e) { $this->core->error->add($e->getMessage()); } } if ($blog->settings->akismet->ak_key) { try { $ak = new akismet($blog->url,$blog->settings->akismet->ak_key); $ak_verified = $ak->verify(); } catch (Exception $e) { $this->core->error->add($e->getMessage()); } } $res = dcPage::notices(); $res .= '
        '. '

        '. form::field('ak_key',12,128,$ak_key); if ($ak_verified !== null) { if ($ak_verified) { $res .= ' '.__('API key verified'); } else { $res .= ' '.__('API key not verified'); } } $res .= '

        '; $res .= '

        '.__('Get your own API key').'

        '. '

        '. $this->core->formNonce().'

        '. '
        '; return $res; } } class akismet extends netHttp { protected $base_host = 'rest.akismet.com'; protected $ak_host = ''; protected $ak_version = '1.1'; protected $ak_path = '/%s/%s'; protected $ak_key = null; protected $blog_url; protected $timeout = 3; public function __construct($blog_url,$api_key) { $this->blog_url = $blog_url; $this->ak_key = $api_key; $this->ak_path = sprintf($this->ak_path,$this->ak_version,'%s'); $this->ak_host = $this->ak_key.'.'.$this->base_host; parent::__construct($this->ak_host,80); } public function verify() { $this->host = $this->base_host; $path = sprintf($this->ak_path,'verify-key'); $data = array( 'key' => $this->ak_key, 'blog' => $this->blog_url ); if ($this->post($path,$data,'UTF-8')) { return $this->getContent() == 'valid'; } return false; } public function comment_check($permalink,$type,$author,$email,$url,$content) { $info_ignore = array('HTTP_COOKIE'); $info = array(); foreach ($_SERVER as $k => $v) { if (strpos($k,'HTTP_') === 0 && !in_array($k,$info_ignore)) { $info[$k] = $v; } } return $this->callFunc('comment-check',$permalink,$type,$author,$email,$url,$content,$info); } public function submit_spam($permalink,$type,$author,$email,$url,$content) { $this->callFunc('submit-spam',$permalink,$type,$author,$email,$url,$content); return true; } public function submit_ham($permalink,$type,$author,$email,$url,$content) { $this->callFunc('submit-ham',$permalink,$type,$author,$email,$url,$content); return true; } protected function callFunc($function,$permalink,$type,$author,$email,$url,$content,$info=array()) { $ua = isset($info['HTTP_USER_AGENT']) ? $info['HTTP_USER_AGENT'] : ''; $referer = isset($info['HTTP_REFERER']) ? $info['HTTP_REFERER'] : ''; # Prepare comment data $data = array( 'blog' => $this->blog_url, 'user_ip' => http::realIP(), 'user_agent' => $ua, 'referrer' => $referer, 'permalink' => $permalink, 'comment_type' => $type, 'comment_author' => $author, 'comment_author_email' => $email, 'comment_author_url' => $url, 'comment_content' => $content ); $data = array_merge($data,$info); $this->host = $this->ak_host; $path = sprintf($this->ak_path,$function); if (!$this->post($path,$data,'UTF-8')) { throw new Exception('HTTP error: '.$this->getError()); } return $this->getContent() == 'true'; } } dotclear-2.6.2+dfsg/plugins/akismet/locales/000077500000000000000000000000001230033266200207725ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/akismet/locales/en/000077500000000000000000000000001230033266200213745ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/akismet/locales/en/help/000077500000000000000000000000001230033266200223245ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/akismet/locales/en/help/help.html000066400000000000000000000015141230033266200241430ustar00rootroot00000000000000 Akismet filter

        Akismet filter

        Akismet is a particularly efficient spam filter service that requires an API key to work.

        To get the API key, go to the Akismet API key signup page and choose the plan that suits you the most. You'll have to fill a form. Don't forget to write down your email addres in order to receive the API key. If you have a Wordpress account, you can also use your identifiers to get the Akismet API key. If you choose the "Personal" plan, the key will be free and you'll be able to use it on a multiblog.

        Enter the API key and save. If the key is recognised, you should get the following message "API key checked". Go back to the filter list to activate Akismet if it's not done yet.

        dotclear-2.6.2+dfsg/plugins/akismet/locales/en/resources.php000066400000000000000000000007711230033266200241240ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/akismet/locales/fr/000077500000000000000000000000001230033266200214015ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/akismet/locales/fr/help/000077500000000000000000000000001230033266200223315ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/akismet/locales/fr/help/help.html000066400000000000000000000016371230033266200241560ustar00rootroot00000000000000 Akismet filter

        Akismet filter

        Akismet est un service de filtrage du spam particulièrement efficace qui nécessite une clé API pour fonctionner.

        Pour obtenir la clé API, rendez vous sur la page d'obtention de clé d'Askimet (en anglais) puis faites le choix de blogs personnels (Personal Blogs), un formulaire s'offre à vous, renseigner bien votre e-mail car il servira à recevoir votre clé. Vous pouvez également utiliser les identifiants de votre compte Wordpress si vous en disposez pour obtenir la clé d'API Askimet. En choisissant blogs personnels, cette clé sera gratuite et utilisable sur un multiblog.

        Entrez la clé API obtenue et enregistrez. Si la clé est reconnue, vous devriez voir apparaître le message "Clé API vérifiée. Retournez ensuite à la liste des filtres pour activer Akismet le cas échéant."

        dotclear-2.6.2+dfsg/plugins/akismet/locales/fr/resources.php000066400000000000000000000007711230033266200241310ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/antispam/000077500000000000000000000000001230033266200175275ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/antispam/_admin.php000066400000000000000000000067351230033266200215020ustar00rootroot00000000000000addItem(__('Antispam'),'plugin.php?p=antispam','index.php?pf=antispam/icon.png', preg_match('/plugin.php\?p=antispam(&.*)?$/',$_SERVER['REQUEST_URI']), $core->auth->check('admin',$core->blog->id)); $core->addBehavior('coreAfterCommentUpdate',array('dcAntispam','trainFilters')); $core->addBehavior('adminAfterCommentDesc',array('dcAntispam','statusMessage')); $core->addBehavior('adminDashboardIcons',array('dcAntispam','dashboardIcon')); $core->addBehavior('adminDashboardFavorites','antispamDashboardFavorites'); $core->addBehavior('adminDashboardFavsIcon','antispamDashboardFavsIcon'); function antispamDashboardFavorites($core,$favs) { $favs->register('antispam', array( 'title' => __('Antispam'), 'url' => 'plugin.php?p=antispam', 'small-icon' => 'index.php?pf=antispam/icon.png', 'large-icon' => 'index.php?pf=antispam/icon-big.png', 'permissions' => 'admin') ); } function antispamDashboardFavsIcon($core,$name,$icon) { // Check if it is comments favs if ($name == 'comments') { // Hack comments title if there is at least one spam $str = dcAntispam::dashboardIconTitle($core); if ($str != '') { $icon[0] .= $str; } } } if (!DC_ANTISPAM_CONF_SUPER || $core->auth->isSuperAdmin()) { $core->addBehavior('adminBlogPreferencesForm',array('antispamBehaviors','adminBlogPreferencesForm')); $core->addBehavior('adminBeforeBlogSettingsUpdate',array('antispamBehaviors','adminBeforeBlogSettingsUpdate')); $core->addBehavior('adminCommentsSpamForm',array('antispamBehaviors','adminCommentsSpamForm')); $core->addBehavior('adminPageHelpBlock',array('antispamBehaviors','adminPageHelpBlock')); } class antispamBehaviors { public static function adminPageHelpBlock($blocks) { $found = false; foreach($blocks as $block) { if ($block == 'core_comments') { $found = true; break; } } if (!$found) { return null; } $blocks[] = 'antispam_comments'; } public static function adminCommentsSpamForm($core) { $ttl = $core->blog->settings->antispam->antispam_moderation_ttl; if ($ttl != null && $ttl >=0) { echo '

        '.sprintf(__('All spam comments older than %s day(s) will be automatically deleted.'), $ttl).' '. sprintf(__('You can modify this duration in the %s'),' '.__('Blog settings').''). '.

        '; } } public static function adminBlogPreferencesForm($core,$settings) { $ttl = $settings->antispam->antispam_moderation_ttl; echo '

        Antispam

        '. '

        '. '

        '.__('Set spam filters.').'

        '. '
        '; } public static function adminBeforeBlogSettingsUpdate($settings) { $settings->addNamespace('antispam'); $settings->antispam->put('antispam_moderation_ttl',(integer)$_POST['antispam_moderation_ttl']); } } dotclear-2.6.2+dfsg/plugins/antispam/_define.php000066400000000000000000000012371230033266200216340ustar00rootroot00000000000000registerModule( /* Name */ "Antispam", /* Description*/ "Generic antispam plugin for Dotclear", /* Author */ "Alain Vagner", /* Version */ '1.4.1', array( 'permissions' => 'usage,contentadmin', 'priority' => 10 ) ); dotclear-2.6.2+dfsg/plugins/antispam/_install.php000066400000000000000000000032011230033266200220410ustar00rootroot00000000000000plugins->moduleInfo('antispam','version'); if (version_compare($core->getVersion('antispam'),$version,'>=')) { return; } /* Database schema -------------------------------------------------------- */ $s = new dbStruct($core->con,$core->prefix); $s->spamrule ->rule_id ('bigint', 0, false) ->blog_id ('varchar', 32, true) ->rule_type ('varchar', 16, false, "'word'") ->rule_content ('varchar', 128, false) ->primary('pk_spamrule','rule_id') ; $s->spamrule->index('idx_spamrule_blog_id','btree','blog_id'); $s->spamrule->reference('fk_spamrule_blog','blog_id','blog','blog_id','cascade','cascade'); if ($s->driver() == 'pgsql') { $s->spamrule->index('idx_spamrule_blog_id_null','btree','(blog_id IS NULL)'); } # Schema installation $si = new dbStruct($core->con,$core->prefix); $changes = $si->synchronize($s); # Creating default wordslist if ($core->getVersion('antispam') === null) { $_o = new dcFilterWords($core); $_o->defaultWordsList(); unset($_o); } $settings = new dcSettings($core,null); $settings->addNamespace('antispam'); $settings->antispam->put('antispam_moderation_ttl',0,'integer','Antispam Moderation TTL (days)',false); $core->setVersion('antispam',$version); return true; dotclear-2.6.2+dfsg/plugins/antispam/_prepend.php000066400000000000000000000025671230033266200220460ustar00rootroot00000000000000spamfilters = array('dcFilterIP','dcFilterIpLookup','dcFilterWords','dcFilterLinksLookup'); $core->url->register('spamfeed','spamfeed','^spamfeed/(.+)$',array('dcAntispamURL','spamFeed')); $core->url->register('hamfeed','hamfeed','^hamfeed/(.+)$',array('dcAntispamURL','hamFeed')); dotclear-2.6.2+dfsg/plugins/antispam/_public.php000066400000000000000000000012331230033266200216540ustar00rootroot00000000000000addBehavior('publicBeforeCommentCreate',array('dcAntispam','isSpam')); $core->addBehavior('publicBeforeTrackbackCreate',array('dcAntispam','isSpam')); $core->addBehavior('publicBeforeDocument',array('dcAntispam','purgeOldSpam')); dotclear-2.6.2+dfsg/plugins/antispam/antispam.js000066400000000000000000000013031230033266200216760ustar00rootroot00000000000000$(function() { $("#filters-list").sortable({'cursor':'move'}); $("#filters-list tr").hover(function () { $(this).css({'cursor':'move'}); }, function () { $(this).css({'cursor':'auto'}); }); $('#filters-list-form').submit(function() { var order=[]; $("#filters-list tr td input.position").each(function() { order.push(this.name.replace(/^f_order\[([^\]]+)\]$/,'$1')); }); $("input[name=filters_order]")[0].value = order.join(','); return true; }); $("#filters-list tr td input.position").hide(); $("#filters-list tr td.handle").addClass('handler'); $('form input[type=submit][name=delete_all]').click(function(){ return window.confirm(dotclear.msg.confirm_spam_delete); }); }); dotclear-2.6.2+dfsg/plugins/antispam/feed.png000066400000000000000000000006241230033266200211420ustar00rootroot00000000000000PNG  IHDR asBITO`PLTE!RƑٳ3sl+=e}5:,]̙Cz0h)RТB37|tt}tRNS0J pHYs B4tEXtCreation Time03/01/06~? tEXtSoftwareMacromedia Fireworks MX*$oIDAT%0DQJEc[\N 1Hk8E6]v'q7Jl-_}YW ^"y+5kIENDB`dotclear-2.6.2+dfsg/plugins/antispam/filters/000077500000000000000000000000001230033266200211775ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/antispam/filters/class.dc.filter.ip.php000066400000000000000000000172751230033266200253110ustar00rootroot00000000000000con =& $core->con; $this->table = $core->prefix.'spamrule'; } protected function setInfo() { $this->description = __('IP Blacklist / Whitelist Filter'); } public function getStatusMessage($status,$comment_id) { return sprintf(__('Filtered by %1$s with rule %2$s.'),$this->guiLink(),$status); } public function isSpam($type,$author,$email,$site,$ip,$content,$post_id,&$status) { if (!$ip) { return; } # White list check if ($this->checkIP($ip,'white') !== false) { return false; } # Black list check if (($s = $this->checkIP($ip,'black')) !== false) { $status = $s; return true; } } public function gui($url) { global $default_tab; $core =& $this->core; # Set current type and tab $ip_type = 'black'; if (!empty($_REQUEST['ip_type']) && $_REQUEST['ip_type'] == 'white') { $ip_type = 'white'; } $default_tab = 'tab_'.$ip_type; # Add IP to list if (!empty($_POST['addip'])) { try { $global = !empty($_POST['globalip']) && $core->auth->isSuperAdmin(); $this->addIP($ip_type,$_POST['addip'],$global); dcPage::addSuccessNotice(__('IP address has been successfully added.')); http::redirect($url.'&ip_type='.$ip_type); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Remove IP from list if (!empty($_POST['delip']) && is_array($_POST['delip'])) { try { $this->removeRule($_POST['delip']); dcPage::addSuccessNotice(__('IP addresses have been successfully removed.')); http::redirect($url.'&ip_type='.$ip_type); } catch (Exception $e) { $core->error->add($e->getMessage()); } } /* DISPLAY ---------------------------------------------- */ $res = dcPage::notices(); $res .= $this->displayForms($url,'black',__('Blacklist')). $this->displayForms($url,'white',__('Whitelist')); return $res; } private function displayForms($url,$type,$title) { $core =& $this->core; $res = '
        '. '
        '. '

        '. form::hidden(array('ip_type'),$type). ' '. form::field(array('addip', 'addip_'.$type),18,255); if ($core->auth->isSuperAdmin()) { $res .= ' '; } $res .= $core->formNonce(). '

        '. '

        '. '
        '; $rs = $this->getRules($type); if ($rs->isEmpty()) { $res .= '

        '.__('No IP address in list.').'

        '; } else { $res .= '
        '. '

        ' . __('IP list') . '

        '. '
        '; $res_global = ''; $res_local = ''; while ($rs->fetch()) { $bits = explode(':',$rs->rule_content); $pattern = $bits[0]; $ip = $bits[1]; $bitmask = $bits[2]; $disabled_ip = false; $p_style = ''; if (!$rs->blog_id) { $disabled_ip = !$core->auth->isSuperAdmin(); $p_style .= ' global'; } $item = '

        '; if ($rs->blog_id) { // local list if ($res_local == '') { $res_local = '

        '.__('Local IPs (used only for this blog)').'

        '; } $res_local .= $item; } else { // global list if ($res_global == '') { $res_global = '

        '.__('Global IPs (used for all blogs)').'

        '; } $res_global .= $item; } } $res .= $res_local.$res_global; $res .= '
        '. '

        '. $core->formNonce(). form::hidden(array('ip_type'),$type). '

        '. '
        '; } $res .= '
        '; return $res; } private function ipmask($pattern,&$ip,&$mask) { $bits = explode('/',$pattern); # Set IP $bits[0] .= str_repeat(".0", 3 - substr_count($bits[0], ".")); $ip = ip2long($bits[0]); if (!$ip || $ip == -1) { throw new Exception('Invalid IP address'); } # Set mask if (!isset($bits[1])) { $mask = -1; } elseif (strpos($bits[1],'.')) { $mask = ip2long($bits[1]); if (!$mask) { $mask = -1; } } else { $mask = ~((1 << (32 - $bits[1])) - 1); } } private function addIP($type,$pattern,$global) { $this->ipmask($pattern,$ip,$mask); $pattern = long2ip($ip).($mask != -1 ? '/'.long2ip($mask) : ''); $content = $pattern.':'.$ip.':'.$mask; $old = $this->getRuleCIDR($type,$global,$ip,$mask); $cur = $this->con->openCursor($this->table); if ($old->isEmpty()) { $id = $this->con->select('SELECT MAX(rule_id) FROM '.$this->table)->f(0) + 1; $cur->rule_id = $id; $cur->rule_type = (string) $type; $cur->rule_content = (string) $content; if ($global && $this->core->auth->isSuperAdmin()) { $cur->blog_id = null; } else { $cur->blog_id = $this->core->blog->id; } $cur->insert(); } else { $cur->rule_type = (string) $type; $cur->rule_content = (string) $content; $cur->update('WHERE rule_id = '.(integer) $old->rule_id); } } private function getRules($type='all') { $strReq = 'SELECT rule_id, rule_type, blog_id, rule_content '. 'FROM '.$this->table.' '. "WHERE rule_type = '".$this->con->escape($type)."' ". "AND (blog_id = '".$this->core->blog->id."' OR blog_id IS NULL) ". 'ORDER BY blog_id ASC, rule_content ASC '; return $this->con->select($strReq); } private function getRuleCIDR($type,$global,$ip,$mask) { $strReq = 'SELECT * FROM '.$this->table.' '. "WHERE rule_type = '".$this->con->escape($type)."' ". "AND rule_content LIKE '%:".(integer) $ip.":".(integer) $mask."' ". 'AND blog_id '.($global ? 'IS NULL ' : "= '".$this->core->blog->id."' "); return $this->con->select($strReq); } private function checkIP($cip,$type) { $core =& $this->core; $strReq = 'SELECT DISTINCT(rule_content) '. 'FROM '.$this->table.' '. "WHERE rule_type = '".$this->con->escape($type)."' ". "AND (blog_id = '".$this->core->blog->id."' OR blog_id IS NULL) ". 'ORDER BY rule_content ASC '; $rs = $this->con->select($strReq); while ($rs->fetch()) { list($pattern,$ip,$mask) = explode(':',$rs->rule_content); if ((ip2long($cip) & (integer) $mask) == ((integer) $ip & (integer) $mask)) { return $pattern; } } return false; } private function removeRule($ids) { $strReq = 'DELETE FROM '.$this->table.' '; if (is_array($ids)) { foreach ($ids as $i => $v) { $ids[$i] = (integer) $v; } $strReq .= 'WHERE rule_id IN ('.implode(',',$ids).') '; } else { $ids = (integer) $ids; $strReq .= 'WHERE rule_id = '.$ids.' '; } if (!$this->core->auth->isSuperAdmin()) { $strReq .= "AND blog_id = '".$this->core->blog->id."' "; } $this->con->execute($strReq); } } dotclear-2.6.2+dfsg/plugins/antispam/filters/class.dc.filter.iplookup.php000066400000000000000000000057471230033266200265440ustar00rootroot00000000000000auth->isSuperAdmin()) { $this->has_gui = false; } } protected function setInfo() { $this->description = __('Checks sender IP address against DNSBL servers'); } public function getStatusMessage($status,$comment_id) { return sprintf(__('Filtered by %1$s with server %2$s.'),$this->guiLink(),$status); } public function isSpam($type,$author,$email,$site,$ip,$content,$post_id,&$status) { if (!$ip || long2ip(ip2long($ip)) != $ip) { return; } $bls = $this->getServers(); $bls = preg_split('/\s*,\s*/',$bls); foreach ($bls as $bl) { if ($this->dnsblLookup($ip,$bl)) { // Pass by reference $status to contain matching DNSBL $status = $bl; return true; } } } public function gui($url) { $bls = $this->getServers(); if (isset($_POST['bls'])) { try { $this->core->blog->settings->addNamespace('antispam'); $this->core->blog->settings->antispam->put('antispam_dnsbls',$_POST['bls'],'string','Antispam DNSBL servers',true,false); dcPage::addSuccessNotice(__('The list of DNSBL servers has been succesfully updated.')); http::redirect($url); } catch (Exception $e) { $core->error->add($e->getMessage()); } } /* DISPLAY ---------------------------------------------- */ $res = dcPage::notices(); $res .= '
        '. '

        ' . __('IP Lookup servers') . '

        '. '

        '. form::textarea('bls',40,3,html::escapeHTML($bls),'maximal'). '

        '. '

        '. $this->core->formNonce().'

        '. '
        '; return $res; } private function getServers() { $bls = $this->core->blog->settings->antispam->antispam_dnsbls; if ($bls === null) { $this->core->blog->settings->addNamespace('antispam'); $this->core->blog->settings->antispam->put('antispam_dnsbls',$this->default_bls,'string','Antispam DNSBL servers',true,false); return $this->default_bls; } return $bls; } private function dnsblLookup($ip,$bl) { $revIp = implode('.',array_reverse(explode('.',$ip))); $host = $revIp.'.'.$bl.'.'; if (gethostbyname($host) != $host) { return true; } return false; } } dotclear-2.6.2+dfsg/plugins/antispam/filters/class.dc.filter.linkslookup.php000066400000000000000000000032751230033266200272460ustar00rootroot00000000000000description = __('Checks links in comments against surbl.org'); } public function getStatusMessage($status,$comment_id) { return sprintf(__('Filtered by %1$s with server %2$s.'),$this->guiLink(),$status); } public function isSpam($type,$author,$email,$site,$ip,$content,$post_id,&$status) { if (!$ip || long2ip(ip2long($ip)) != $ip) { return; } $urls = $this->getLinks($content); array_unshift($urls,$site); foreach ($urls as $u) { $b = parse_url($u); if (!isset($b['host']) || !$b['host']) { continue; } $domain = preg_replace('/^[\w]{2,6}:\/\/([\w\d\.\-]+).*$/','$1',$b['host']); $domain_elem = explode(".",$domain); $i = count($domain_elem) - 1; $host = $domain_elem[$i]; do { $host = $domain_elem[$i - 1].'.'.$host; $i--; if (substr(gethostbyname($host.'.'.$this->server),0,3) == "127" ) { $status = substr($domain,0,128); return true; } } while ($i > 0); } } private function getLinks($text) { // href attribute on "a" tags is second match preg_match_all('|con =& $core->con; $this->table = $core->prefix.'spamrule'; } protected function setInfo() { $this->description = __('Words Blacklist'); } public function getStatusMessage($status,$comment_id) { return sprintf(__('Filtered by %1$s with word %2$s.'),$this->guiLink(),''.$status.''); } public function isSpam($type,$author,$email,$site,$ip,$content,$post_id,&$status) { $str = $author.' '.$email.' '.$site.' '.$content; $rs = $this->getRules(); while ($rs->fetch()) { $word = $rs->rule_content; if (substr($word,0,1) == '/' && substr($word,-1,1) == '/') { $reg = substr(substr($word,1),0,-1); } else { $reg = preg_quote($word, '/'); $reg = '(^|\s+|>|<)'.$reg.'(>|<|\s+|\.|$)'; } if (preg_match('/'.$reg.'/msiu',$str)) { $status = $word; return true; } } } public function gui($url) { $core =& $this->core; # Create list if (!empty($_POST['createlist'])) { try { $this->defaultWordsList(); dcPage::addSuccessNotice(__('Words have been successfully added.')); http::redirect($url); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Adding a word if (!empty($_POST['swa'])) { $globalsw = !empty($_POST['globalsw']) && $core->auth->isSuperAdmin(); try { $this->addRule($_POST['swa'],$globalsw); dcPage::addSuccessNotice(__('Word has been successfully added.')); http::redirect($url); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Removing spamwords if (!empty($_POST['swd']) && is_array($_POST['swd'])) { try { $this->removeRule($_POST['swd']); dcPage::addSuccessNotice(__('Words have been successfully removed.')); http::redirect($url); } catch (Exception $e) { $core->error->add($e->getMessage()); } } /* DISPLAY ---------------------------------------------- */ $res = dcPage::notices(); $res .= '
        '. '

        '.form::field('swa',20,128); if ($core->auth->isSuperAdmin()) { $res .= ' '. __('Global word (used for all blogs)'); } $res .= $core->formNonce(). '

        '. '

        '. '
        '; $rs = $this->getRules(); if ($rs->isEmpty()) { $res .= '

        '.__('No word in list.').'

        '; } else { $res .= '
        '. '

        ' . __('List of bad words') . '

        '. '
        '; $res_global = ''; $res_local = ''; while ($rs->fetch()) { $disabled_word = false; $p_style = ''; if (!$rs->blog_id) { $disabled_word = !$core->auth->isSuperAdmin(); $p_style .= ' global'; } $item = '

        '; if ($rs->blog_id) { // local list if ($res_local == '') { $res_local = '

        '.__('Local words (used only for this blog)').'

        '; } $res_local .= $item; } else { // global list if ($res_global == '') { $res_global = '

        '.__('Global words (used for all blogs)').'

        '; } $res_global .= $item; } } $res .= $res_local.$res_global; $res .= '
        '. '

        '.form::hidden(array('spamwords'),1). $core->formNonce(). '

        '. '
        '; } if ($core->auth->isSuperAdmin()) { $res .= '
        '. '

        '. form::hidden(array('spamwords'),1). form::hidden(array('createlist'),1). $core->formNonce().'

        '. '
        '; } return $res; } private function getRules() { $strReq = 'SELECT rule_id, blog_id, rule_content '. 'FROM '.$this->table.' '. "WHERE rule_type = 'word' ". "AND ( blog_id = '".$this->con->escape($this->core->blog->id)."' ". "OR blog_id IS NULL ) ". 'ORDER BY blog_id ASC, rule_content ASC '; return $this->con->select($strReq); } private function addRule($content,$general=false) { $strReq = 'SELECT rule_id FROM '.$this->table.' '. "WHERE rule_type = 'word' ". "AND rule_content = '".$this->con->escape($content)."' "; $rs = $this->con->select($strReq); if (!$rs->isEmpty()) { throw new Exception(__('This word exists')); } $rs = $this->con->select('SELECT MAX(rule_id) FROM '.$this->table); $id = (integer) $rs->f(0) + 1; $cur = $this->con->openCursor($this->table); $cur->rule_id = $id; $cur->rule_type = 'word'; $cur->rule_content = (string) $content; if ($general && $this->core->auth->isSuperAdmin()) { $cur->blog_id = null; } else { $cur->blog_id = $this->core->blog->id; } $cur->insert(); } private function removeRule($ids) { $strReq = 'DELETE FROM '.$this->table.' '; if (is_array($ids)) { foreach ($ids as &$v) { $v = (integer) $v; } $strReq .= 'WHERE rule_id IN ('.implode(',',$ids).') '; } else { $ids = (integer) $ids; $strReq .= 'WHERE rule_id = '.$ids.' '; } if (!$this->core->auth->isSuperAdmin()) { $strReq .= "AND blog_id = '".$this->con->escape($this->core->blog->id)."' "; } $this->con->execute($strReq); } public function defaultWordsList() { $words = array( '/-credit(\s+|$)/', '/-digest(\s+|$)/', '/-loan(\s+|$)/', '/-online(\s+|$)/', '4u', 'adipex', 'advicer', 'ambien', 'baccarat', 'baccarrat', 'blackjack', 'bllogspot', 'bolobomb', 'booker', 'byob', 'car-rental-e-site', 'car-rentals-e-site', 'carisoprodol', 'cash', 'casino', 'casinos', 'chatroom', 'cialis', 'craps', 'credit-card', 'credit-report-4u', 'cwas', 'cyclen', 'cyclobenzaprine', 'dating-e-site', 'day-trading', 'debt', 'digest-', 'discount', 'discreetordering', 'duty-free', 'dutyfree', 'estate', 'favourits', 'fioricet', 'flowers-leading-site', 'freenet', 'freenet-shopping', 'gambling', 'gamias', 'health-insurancedeals-4u', 'holdem', 'holdempoker', 'holdemsoftware', 'holdemtexasturbowilson', 'hotel-dealse-site', 'hotele-site', 'hotelse-site', 'incest', 'insurance-quotesdeals-4u', 'insurancedeals-4u', 'jrcreations', 'levitra', 'macinstruct', 'mortgage', 'online-gambling', 'onlinegambling-4u', 'ottawavalleyag', 'ownsthis', 'palm-texas-holdem-game', 'paxil', 'pharmacy', 'phentermine', 'pills', 'poker', 'poker-chip', 'poze', 'prescription', 'rarehomes', 'refund', 'rental-car-e-site', 'roulette', 'shemale', 'slot', 'slot-machine', 'soma', 'taboo', 'tamiflu', 'texas-holdem', 'thorcarlson', 'top-e-site', 'top-site', 'tramadol', 'trim-spa', 'ultram', 'v1h', 'vacuum', 'valeofglamorganconservatives', 'viagra', 'vicodin', 'vioxx', 'xanax', 'zolus' ); foreach ($words as $w) { try { $this->addRule($w,true); } catch (Exception $e) {} } } } dotclear-2.6.2+dfsg/plugins/antispam/icon-big.png000066400000000000000000000016601230033266200217270ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<RIDATx[Kn0+oʢ&'uv(]|{߅T7.PTGL2Bi(Êpgg c)kp O|y{gb-C⏉WlTt`,( x0`=r9_M`0~8)Ioc-]u![ #$duCe+MqZ ]-6J;^K "n0~M; akb6 ˋ@~LBLaj NQAtiFGxo\순(ގJk/{IxCr(1f"jRC[T8R/yG6,FF J!@m_l)~?JydTCr1ڴ1̇e䫽ƞ=wgSAȠǼS,R RlBy")vCb>-\(- bQI WVyHDJׅs=d{NYTH(6L^çc߾&rP3!u"\<2 0?\O;=E׺Ai@&SD–ntl)\iD#k0n7mn" X_[,K%` X,K%`TϹ>{nl4MuYB+d(>ѭQ:Լ)lD,:܉7ܥAД4n?GoifX N-Kv~Ȥ }ù 0oMگHHw%e Yb) 0ޕ)wIENDB`dotclear-2.6.2+dfsg/plugins/antispam/icon.png000066400000000000000000000005051230033266200211650ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb`wa|jhRR@l p񂷭pF! 5R K5~@!А @@}  р@$$@'B%aA klP)%*Wu#@@ 4A4`A?ʁ(tFN9{s"A0(aBG<ꄒIENDB`dotclear-2.6.2+dfsg/plugins/antispam/inc/000077500000000000000000000000001230033266200203005ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/antispam/inc/class.dc.spamfilter.php000066400000000000000000000100061230033266200246450ustar00rootroot00000000000000dcCore Dotclear core object */ public function __construct($core) { $this->core =& $core; $this->setInfo(); if (!$this->name) { $this->name = get_class($this); } $this->gui_url = 'plugin.php?p=antispam&f='.get_class($this); } /** This method is called by the constructor and allows you to change some object properties without overloading object constructor. */ protected function setInfo() { $this->description = __('No description'); } /** This method should return if a comment is a spam or not. If it returns true or false, execution of next filters will be stoped. If should return nothing to let next filters apply. Your filter should also fill $status variable with its own information if comment is a spam. @param type string Comment type (comment or trackback) @param author string Comment author @param email string Comment author email @param site string Comment author website @param ip string Comment author IP address @param content string Comment content @param post_id integer Comment post_id @param[out] status integer Comment status @return boolean */ public function isSpam($type,$author,$email,$site,$ip,$content,$post_id,&$status) { } /** This method is called when a non-spam (ham) comment becomes spam or when a spam becomes a ham. @param type string Comment type (comment or trackback) @param filter string Filter name @param author string Comment author @param email string Comment author email @param site string Comment author website @param ip string Comment author IP address @param content string Comment content @param post_url string Post URL @param rs record Comment record @return boolean */ public function trainFilter($status,$filter,$type,$author,$email,$site,$ip,$content,$rs) { } /** This method returns filter status message. You can overload this method to return a custom message. Message is shown in comment details and in comments list. @param status string Filter status. @param comment_id record Comment record @return string */ public function getStatusMessage($status,$comment_id) { return sprintf(__('Filtered by %1$s (%2$s)'),$this->guiLink(),$status); } /** This method is called when you enter filter configuration. Your class should have $has_gui property set to "true" to enable GUI. In this method you should put everything related to filter configuration. $url variable is the URL of GUI unescaped. @param url string GUI URL. */ public function gui($url) { } public function hasGUI() { if (!$this->core->auth->check('admin',$this->core->blog->id)) { return false; } if (!$this->has_gui) { return false; } return true; } public function guiURL() { if (!$this->hasGui()) { return false; } return $this->gui_url; } /** Returns a link to filter GUI if exists or only filter name if has_gui property is false. @return string */ public function guiLink() { if (($url = $this->guiURL()) !== false) { $url = html::escapeHTML($url); $link = '%1$s'; } else { $link = '%1$s'; } return sprintf($link,$this->name,$url); } public function help() { } } dotclear-2.6.2+dfsg/plugins/antispam/inc/class.dc.spamfilters.php000066400000000000000000000073061230033266200250410ustar00rootroot00000000000000core =& $core; } public function init($filters) { foreach ($filters as $f) { if (!class_exists($f)) { continue; } $r = new ReflectionClass($f); $p = $r->getParentClass(); if (!$p || $p->name != 'dcSpamFilter') { continue; } $this->filters[$f] = new $f($this->core); } $this->setFilterOpts(); if (!empty($this->filters_opt)) { uasort($this->filters,array($this,'orderCallBack')); } } public function getFilters() { return $this->filters; } public function isSpam($cur) { foreach ($this->filters as $fid => $f) { if (!$f->active) { continue; } $type = $cur->comment_trackback ? 'trackback' : 'comment'; $author = $cur->comment_author; $email = $cur->comment_email; $site = $cur->comment_site; $ip = $cur->comment_ip; $content = $cur->comment_content; $post_id = $cur->post_id; $is_spam = $f->isSpam($type,$author,$email,$site,$ip,$content,$post_id,$status); if ($is_spam === true) { if ($f->auto_delete) { $cur->clean(); } else { $cur->comment_status = -2; $cur->comment_spam_status = $status; $cur->comment_spam_filter = $fid; } return true; } elseif ($is_spam === false) { return false; } } return false; } public function trainFilters($rs,$status,$filter_name) { foreach ($this->filters as $fid => $f) { if (!$f->active) { continue; } $type = $rs->comment_trackback ? 'trackback' : 'comment'; $author = $rs->comment_author; $email = $rs->comment_email; $site = $rs->comment_site; $ip = $rs->comment_ip; $content = $rs->comment_content; $f->trainFilter($status,$filter_name,$type,$author,$email,$site,$ip,$content,$rs); } } public function statusMessage($rs,$filter_name) { $f = isset($this->filters[$filter_name]) ? $this->filters[$filter_name] : null; if ($f === null) { return __('Unknown filter.'); } else { $status = $rs->exists('comment_spam_status') ? $rs->comment_spam_status : null; return $f->getStatusMessage($status,$rs->comment_id); } } public function saveFilterOpts($opts,$global=false) { $this->core->blog->settings->addNamespace('antispam'); if ($global) { $this->core->blog->settings->antispam->drop('antispam_filters'); } $this->core->blog->settings->antispam->put('antispam_filters',serialize($opts),'string','Antispam Filters',true,$global); } private function setFilterOpts() { if ($this->core->blog->settings->antispam->antispam_filters !== null) { $this->filters_opt = @unserialize($this->core->blog->settings->antispam->antispam_filters); } # Create default options if needed if (!is_array($this->filters_opt)) { $this->saveFilterOpts(array(),true); $this->filters_opt = array(); } foreach ($this->filters_opt as $k => $o) { if (isset($this->filters[$k]) && is_array($o)) { $this->filters[$k]->active = isset($o[0])?$o[0]:false; $this->filters[$k]->order = isset($o[1])?$o[1]:0; $this->filters[$k]->auto_delete = isset($o[2])?$o[2]:false; } } } private function orderCallBack($a,$b) { if ($a->order == $b->order) { return 0; } return $a->order > $b->order ? 1 : -1; } } dotclear-2.6.2+dfsg/plugins/antispam/inc/lib.dc.antispam.php000066400000000000000000000124271230033266200237650ustar00rootroot00000000000000spamfilters)) { return; } self::$filters = new dcSpamFilters($core); self::$filters->init($core->spamfilters); } public static function isSpam($cur) { self::initFilters(); self::$filters->isSpam($cur); } public static function trainFilters($blog,$cur,$rs) { $status = null; # From ham to spam if ($rs->comment_status != -2 && $cur->comment_status == -2) { $status = 'spam'; } # From spam to ham if ($rs->comment_status == -2 && $cur->comment_status == 1) { $status = 'ham'; } # the status of this comment has changed if ($status) { $filter_name = $rs->exists('comment_spam_filter') ? $rs->comment_spam_filter : null; self::initFilters(); self::$filters->trainFilters($rs,$status,$filter_name); } } public static function statusMessage($rs) { if ($rs->exists('comment_status') && $rs->comment_status == -2) { $filter_name = $rs->exists('comment_spam_filter') ? $rs->comment_spam_filter : null; self::initFilters(); return '

        '.__('This comment is a spam:').' '. self::$filters->statusMessage($rs,$filter_name).'

        '; } } public static function dashboardIcon($core, $icons) { if (($count = self::countSpam($core)) > 0) { $str = ($count > 1) ? __('(including %d spam comments)') : __('(including %d spam comment)'); $icons['comments'][0] .= '
        '.sprintf($str,$count); } } public static function dashboardIconTitle($core) { if (($count = self::countSpam($core)) > 0) { $str = ($count > 1) ? __('(including %d spam comments)') : __('(including %d spam comment)'); return '
        '.sprintf($str,$count); } else { return ''; } } public static function countSpam($core) { return $core->blog->getComments(array('comment_status'=>-2),true)->f(0); } public static function countPublishedComments($core) { return $core->blog->getComments(array('comment_status'=>1),true)->f(0); } public static function delAllSpam($core, $beforeDate = null) { $strReq = 'SELECT comment_id '. 'FROM '.$core->prefix.'comment C '. 'JOIN '.$core->prefix.'post P ON P.post_id = C.post_id '. "WHERE blog_id = '".$core->con->escape($core->blog->id)."' ". 'AND comment_status = -2 '; if ($beforeDate) { $strReq .= 'AND comment_dt < \''.$beforeDate.'\' '; } $rs = $core->con->select($strReq); $r = array(); while ($rs->fetch()) { $r[] = (integer) $rs->comment_id; } if (empty($r)) { return; } $strReq = 'DELETE FROM '.$core->prefix.'comment '. 'WHERE comment_id '.$core->con->in($r).' '; $core->con->execute($strReq); } public static function getUserCode($core) { $code = pack('a32',$core->auth->userID()). pack('H*',crypt::hmac(DC_MASTER_KEY,$core->auth->getInfo('user_pwd'))); return bin2hex($code); } public static function checkUserCode($core,$code) { $code = pack('H*',$code); $user_id = trim(@pack('a32',substr($code,0,32))); $pwd = @unpack('H40hex',substr($code,32,40)); if ($user_id === false || $pwd === false) { return false; } $pwd = $pwd['hex']; $strReq = 'SELECT user_id, user_pwd '. 'FROM '.$core->prefix.'user '. "WHERE user_id = '".$core->con->escape($user_id)."' "; $rs = $core->con->select($strReq); if ($rs->isEmpty()) { return false; } if (crypt::hmac(DC_MASTER_KEY,$rs->user_pwd) != $pwd) { return false; } $permissions = $core->getBlogPermissions($core->blog->id); if ( empty($permissions[$rs->user_id]) ) { return false; } return $rs->user_id; } public static function purgeOldSpam($core) { $defaultDateLastPurge = time(); $defaultModerationTTL = '7'; $init = false; // settings $core->blog->settings->addNamespace('antispam'); $dateLastPurge = $core->blog->settings->antispam->antispam_date_last_purge; if ($dateLastPurge === null) { $init = true; $core->blog->settings->antispam->put('antispam_date_last_purge',$defaultDateLastPurge,'integer','Antispam Date Last Purge (unix timestamp)',true,false); $dateLastPurge = $defaultDateLastPurge; } $moderationTTL = $core->blog->settings->antispam->antispam_moderation_ttl; if ($moderationTTL === null) { $core->blog->settings->antispam->put('antispam_moderation_ttl',$defaultModerationTTL,'integer','Antispam Moderation TTL (days)',true,false); $moderationTTL = $defaultModerationTTL; } if ($moderationTTL < 0) { // disabled return; } // we call the purge every day if ((time()-$dateLastPurge) > (86400)) { // update dateLastPurge if (!$init) { $core->blog->settings->antispam->put('antispam_date_last_purge',time(),null,null,true,false); } $date = date('Y-m-d H:i:s', time() - $moderationTTL*86400); dcAntispam::delAllSpam($core, $date); } } } dotclear-2.6.2+dfsg/plugins/antispam/inc/lib.dc.antispam.url.php000066400000000000000000000052131230033266200245610ustar00rootroot00000000000000auth->checkUser($user_id,null,null); header('Content-Type: application/xml; charset=UTF-8'); $title = $core->blog->name.' - '.__('Spam moderation'). ' - '; $params = array(); $end_url = ''; if ($type == 'spam') { $title .= __('Spam'); $params['comment_status'] = -2; $end_url = '?status=-2'; } else { $title .= __('Ham'); $params['sql'] = ' AND comment_status IN (1,-1) '; } echo ''."\n". ''."\n". ''."\n". ''.html::escapeHTML($title).''."\n". ''.(DC_ADMIN_URL ? DC_ADMIN_URL.'comments.php'.$end_url : 'about:blank').''."\n". ''."\n"; $rs = $core->blog->getComments($params); $maxitems = 20; $nbitems = 0; while ($rs->fetch() && ($nbitems < $maxitems)) { $nbitems++; $uri = DC_ADMIN_URL ? DC_ADMIN_URL.'comment.php?id='.$rs->comment_id : 'about:blank'; $author = $rs->comment_author; $title = $rs->post_title.' - '.$author; if ($type == 'spam') { $title .= '('.$rs->comment_spam_filter.')'; } $id = $rs->getFeedID(); $content = '

        IP: '.$rs->comment_ip; if (trim($rs->comment_site)) { $content .= '
        URL:
        '.$rs->comment_site.''; } $content .= "


        \n"; $content .= $rs->comment_content; echo ''."\n". ' '.html::escapeHTML($title).''."\n". ' '.$uri.''."\n". ' '.$id.''."\n". ' '.$rs->getRFC822Date().''."\n". ' '.html::escapeHTML($author).''."\n". ' '.html::escapeHTML($content).''."\n". ''; } echo "\n"; } } dotclear-2.6.2+dfsg/plugins/antispam/index.php000066400000000000000000000157641230033266200213640ustar00rootroot00000000000000getFilters(); $page_name = __('Antispam'); $filter_gui = false; $default_tab = null; try { # Show filter configuration GUI if (!empty($_GET['f'])) { if (!isset($filters[$_GET['f']])) { throw new Exception(__('Filter does not exist.')); } if (!$filters[$_GET['f']]->hasGUI()) { throw new Exception(__('Filter has no user interface.')); } $filter = $filters[$_GET['f']]; $filter_gui = $filter->gui($filter->guiURL()); } # Remove all spam if (!empty($_POST['delete_all'])) { $ts = dt::str('%Y-%m-%d %H:%M:%S',$_POST['ts'],$core->blog->settings->system->blog_timezone); dcAntispam::delAllSpam($core,$ts); dcPage::addSuccessNotice(__('Spam comments have been successfully deleted.')); http::redirect($p_url); } # Update filters if (isset($_POST['filters_upd'])) { $filters_opt = array(); $i = 0; foreach ($filters as $fid => $f) { $filters_opt[$fid] = array(false,$i); $i++; } # Enable active filters if (isset($_POST['filters_active']) && is_array($_POST['filters_active'])) { foreach ($_POST['filters_active'] as $v) { $filters_opt[$v][0] = true; } } # Order filters if (!empty($_POST['f_order']) && empty($_POST['filters_order'])) { $order = $_POST['f_order']; asort($order); $order = array_keys($order); } elseif (!empty($_POST['filters_order'])) { $order = explode(',',trim($_POST['filters_order'],',')); } if (isset($order)) { foreach ($order as $i => $f) { $filters_opt[$f][1] = $i; } } # Set auto delete flag if (isset($_POST['filters_auto_del']) && is_array($_POST['filters_auto_del'])) { foreach ($_POST['filters_auto_del'] as $v) { $filters_opt[$v][2] = true; } } dcAntispam::$filters->saveFilterOpts($filters_opt); dcPage::addSuccessNotice(__('Filters configuration has been successfully saved.')); http::redirect($p_url); } } catch (Exception $e) { $core->error->add($e->getMessage()); } ?> <?php echo ($filter_gui !== false ? sprintf(__('%s configuration'),$filter->name).' - ' : '').$page_name; ?> auth->user_prefs->addWorkspace('accessibility'); if (!$core->auth->user_prefs->accessibility->nodragdrop) { echo dcPage::jsLoad('js/jquery/jquery-ui.custom.js'). dcPage::jsLoad('index.php?pf=antispam/antispam.js'); } ?> '', $page_name => $p_url, sprintf(__('%s filter configuration'),$filter->name) => '' )). dcPage::notices(); echo '

        '.__('Back to filters list').'

        '; echo $filter_gui; if ($filter->help) { dcPage::helpBlock($filter->help); } } else { echo dcPage::breadcrumb( array( __('Plugins') => '', $page_name => '' )). dcPage::notices(); # Information $spam_count = dcAntispam::countSpam($core); $published_count = dcAntispam::countPublishedComments($core); $moderationTTL = $core->blog->settings->antispam->antispam_moderation_ttl; echo '
        '. '

        '.__('Information').'

        '; echo ''; if ($spam_count > 0) { echo '

        '.$core->formNonce(). form::hidden('ts',time()). '

        '; } if ($moderationTTL != null && $moderationTTL >=0) { echo '

        '.sprintf(__('All spam comments older than %s day(s) will be automatically deleted.'), $moderationTTL).' '. sprintf(__('You can modify this duration in the %s'),' '.__('Blog settings').''). '.

        '; } echo '
        '; # Filters echo '
        '; if (!empty($_GET['upd'])) { dcPage::success(__('Filters configuration has been successfully saved.')); } echo '
        '. ''. ''. ''. ''. ''. ''. ''. ''. ''. ''; $i = 0; foreach ($filters as $fid => $f) { $gui_link = ' '; if ($f->hasGUI()) { $gui_link = ''. ''.__('Filter configuration').''; } echo ''. ''. ''. ''. ''. ''. ''. ''; $i++; } echo '
        '.__('Available spam filters').'
        '.__('Order').''.__('Active').''.__('Auto Del.').''.__('Filter name').''.__('Description').'
        '.form::field(array('f_order['.$fid.']'),2,5,(string) $i, 'position', '', false, 'title="'.__('position').'"').''.form::checkbox(array('filters_active[]'),$fid,$f->active, '', '', false, 'title="'.__('Active').'"').''.form::checkbox(array('filters_auto_del[]'),$fid,$f->auto_delete, '', '', false, 'title="'.__('Auto Del.').'"').''.$f->name.''.$f->description.''.$gui_link.'
        '. '

        '.form::hidden('filters_order',''). $core->formNonce(). '

        '. '
        '; # Syndication if (DC_ADMIN_URL) { $ham_feed = $core->blog->url.$core->url->getURLFor( 'hamfeed', $code = dcAntispam::getUserCode($core) ); $spam_feed = $core->blog->url.$core->url->getURLFor( 'spamfeed', $code = dcAntispam::getUserCode($core) ); echo '

        '.__('Syndication').'

        '. ''; } dcPage::helpBlock('antispam','antispam-filters'); } ?> dotclear-2.6.2+dfsg/plugins/antispam/locales/000077500000000000000000000000001230033266200211515ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/antispam/locales/en/000077500000000000000000000000001230033266200215535ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/antispam/locales/en/help/000077500000000000000000000000001230033266200225035ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/antispam/locales/en/help/comments.html000066400000000000000000000014371230033266200252230ustar00rootroot00000000000000 Moderation of junk messages

        Moderation of junk messages

        Junk messages, commonly called spams, are usually comments posted by robots.

        Show spam messages
        Allows you to control all the comments and trackbacks Dotclear identified as spams before deleting them. Sometimes, a real comment can be identified as a false positive.
        Delete all spams
        By clicking on this button, all the comments and trackbacks marked as spam will be deleted. This action cannot be cancelled.
        Scheduled moderation
        If you indicated a number of days in the Antispam section of your blog settings, all the comments and trackbacks marked as spam will be deleted after the given time.
        dotclear-2.6.2+dfsg/plugins/antispam/locales/en/help/filters.html000066400000000000000000000012521230033266200250410ustar00rootroot00000000000000 Filters

        Filters

        Fair Trackbacks
        This filter checks if entering trackbacks contain a link to your entry. If it is not the case, they will be automatically banned, which means they won't appear in the list of junk comments.
        Links Lookup
        This filter works a bit like IP Lookup except that instead of checking the author's IP address, it will check the links contained in the comment (including the author's website) appear in the URI reputation website SURBL. This filter cannot be configured.
        dotclear-2.6.2+dfsg/plugins/antispam/locales/en/help/help.html000066400000000000000000000035721230033266200243300ustar00rootroot00000000000000 Antispam

        Antispam

        Spam in comments and trackbacks went from an anecdotic issue to a massive problem. Nowadays, it is mandatory to have a set of filters to check if a comment is potentially a junk or not. This is the purpose of the Antispam plugin.

        Information
        The Junk comments link will take you to a list of all the junk comments (you will be able to run batch actions on junk comments in this page).
        The Published comments link will take you to a list of all published comments (you will be able to run batch actions in this page).
        The Delete all spams button will remove all spam messages at once.
        Available spam filters
        By default, Dotclear comes with 6 filters, including 2 deactivated filters. You can add more later on.
        Order: Filters are applied from top to bottom. You can modify the filters order. Note that some default filters (IP Lookup, Links Lookup and Akismet) require access to the Netowrk and therefore can take some time. It is better to leave them towards the end of the list. In addition, the IP Filter filter decides which messages are not spam, so it's better to leave it at the top of the list.
        Active: Check the box to activate a filter, uncheck it to deactivate it.
        Auto Del.: If this box is checked, the messages considered as junk by this filter will be automatically deleted without any chance to make sure it was not a false positive.
        Filter configuration: Some filters can (and, in some cases, must) be configured to be efficient. Click on this icon to access the configuration page of the filter.
        dotclear-2.6.2+dfsg/plugins/antispam/locales/en/help/ip.html000066400000000000000000000025041230033266200240020ustar00rootroot00000000000000 IP Filter

        IP Filter

        This filter allows you to manually blacklist or whitelist IP addresses. A comment coming from an IP address listed in the black list section will immediately be considered as junk. A comment coming from an IP address listed in the white list section will be considered as trusted and the other antispam filters won't process it.

        To add an IP, first select the tab you want (Blacklist or Whitelist) and enter the IP address. The Global IP checkbox is available if you are a super administrator and will allow you to add the IP address to all the blogs of your Dotclear installation.

        You can add IP addresses with a network mask to block or allow a range of IP addresses. For example:

        • 127.0.0.0/255.0.0.0 or the abbreviated form 127/8 will recognize all the IP addresses like 127.xxx.xxx.xxx
        • 127.0.0.0/255.255.0.0 or the abbreviated form 127.0/16 will recognize all the IP addresses like 127.0.xxx.xxx
        • 127.0.0.0/255.255.255.0 or the abbreviated form 127.0.0/24 will recognize all the IP addresses like 127.0.0.xxx
        dotclear-2.6.2+dfsg/plugins/antispam/locales/en/help/iplookup.html000066400000000000000000000013241230033266200252330ustar00rootroot00000000000000 IP Lookup Filter

        IP Lookup Filter

        IP Lookup is a filter that checks the IP address of a comment's author on shared lists called DNS-based Blackhole List (DNSBL) (also known as Real-time Blackhole List (RBL)). By default, the filter uses the following servers: sbl-xbl.spamhaus.org and bsb.spamlookup.net. You can find a list of existing servers on this page.

        You can add as many servers as you want, separated by commas. Don't forget to click on Save to take your modifications into account.

        dotclear-2.6.2+dfsg/plugins/antispam/locales/en/help/words.html000066400000000000000000000016441230033266200245340ustar00rootroot00000000000000 Bad Words

        Bad Words

        This will filter comments based on the words that are used in the user name, e-mail address, website URL or the comment content.

        Add a word
        Similarly to IP addresses filtering, simply add the word you would like to filter. You can also, if you have the right permissions, define global words that will be used for all the blogs in your Dotclear installation.
        Hint: You can add a regular expression to your words list by adding a / at the beginning and the end of the word. For instance, /foo/ will filter all the words containing foo.
        List of bad words
        List of words that list the comment as junk.
        To remove words from this list, select the word(s) and press Delete selected words.
        Create default wordlist
        dotclear-2.6.2+dfsg/plugins/antispam/locales/en/resources.php000066400000000000000000000022251230033266200242770ustar00rootroot00000000000000 Modération des indésirables

        Modération des indésirables

        Les indésirables ou plus communément appelés spam sont des commentaires postés principalement par des robots.

        Afficher les indésirables
        Permet de contrôler l'ensemble des commentaires ou rétroliens que Dotclear a identifiés comme tels avant toute suppression définitive. Il se peut qu'un vrai commentaire soit passé en faux positif.
        Supprimer tous les indésirables
        Grâce à ce bouton, l'ensemble des commentaires ou rétroliens marqués comme tel seront supprimés. Cette action est irrévocable.
        Modération programmée
        Si vous avez indiqué un nombre de jours dans les Paramètres du blog, tous les commentaires ou retroliens marqués indésirables seront supprimés à l'intervalle renseigné.
        dotclear-2.6.2+dfsg/plugins/antispam/locales/fr/help/filters.html000066400000000000000000000013271230033266200250510ustar00rootroot00000000000000 Filtres antispam

        Filtres antispam

        Fair Trackbacks
        Ce filtre vérifie que les rétroliens entrants comprennent un lien vers votre billet. Si ce n'est pas le cas, l'entrée leur est automatiquement refusée, ce qui implique qu'ils ne figureront pas dans la liste des commentaires indésirables.
        Links Lookup
        Ce filtre fonctionne un peu comme IP Lookup à la différence qu'au lieu de vérifier l'adresse IP de l'auteur, il va vérifier si les liens contenus dans le commentaire (y compris le site de l'auteur) sont présents sur la liste "multi" surbl.org. Ce filtre n'est pas configurable.
        dotclear-2.6.2+dfsg/plugins/antispam/locales/fr/help/help.html000066400000000000000000000035421230033266200243320ustar00rootroot00000000000000 Antispam

        Antispam

        Le spam de commentaires et rétroliens est passé d'anecdotique à un phénomène massif. Il est devenu indispensable de disposer d'un ensemble de filtres permettant de reconnaître si un commentaire est un indésirable ou non, c'est ce que propose le plugin Antispam.

        Informations
        Cliquer sur « Commentaires indésirables » renvoie vers la liste des commentaires indésirables.
        Cliquer sur « Commentaires publiés » renvoie vers la liste de tous les commentaires publiés.
        Le bouton « Supprimer tous les indésirables » permet de supprimer tous les commentaires indésirables d'un seul coup.
        Filtres d'indésirables disponibles
        Par défaut, Dotclear est livré avec six filtres dont deux désactivés. Vous pouvez en rajouter d'autres par la suite.
        Ordre : Les filtres sont appliqués à partir du premier en partant du haut. Vous pouvez changer l'ordre des filtres. Certains des filtres par défaut (IP Lookup, Links Lookup et Akismet) ont besoin du réseau ce qui peut-être un peu long. Il est conseillé de les laisser en fin de liste. De même, le filtre IP Filter pouvant décider qu'un message n'est pas un spam, laissez le toujours en début de liste.
        Actif : Cocher ou décocher la case pour activer ou désactiver le filtre.
        Auto suppr. : Si la case est cochée, les commentaires considérés comme indésirables par le filtre seront automatiquement et définitivement supprimés sans possibilité de repêcher les faux positifs.
        Configuration du filtre : Certains filtres peuvent et même doivent, dans certains cas, être configuré pour être efficace. Cliquer sur l'icône pour accéder à la page de configuration du filtre.
        dotclear-2.6.2+dfsg/plugins/antispam/locales/fr/help/ip.html000066400000000000000000000023031230033266200240040ustar00rootroot00000000000000 IP Filter

        IP Filter

        Ce filtre permet d'ajouter manuellement des adresses IP en liste noire ou en liste blanche. Un commentaire venant d'un adresse IP en liste noire sera immédiatement classé comme indésirable, inversement, s'il vient d'une adresse IP en liste blanche, il sera considéré comme sûr et stoppera l'action des autres filtres.

        Pour ajouter une adresse IP, choisissez d'abord un onglet "Liste noire" ou "Liste blanche" et ajoutez l'adresse. La case à cocher "IP globale" est disponible si vous êtes super administrateur et permet d'ajouter une adresse pour tous les blogs de votre installation.

        Vous pouvez ajouter des adresses IP avec masque de réseau pour bloquer ou autoriser toute une série d'adresses. Par exemple :

        • 127.0.0.0/255.0.0.0 ou la forme abrégée 127/8 reconnaitra toutes les adresses IP de type 127.xxx.xxx.xxx
        • 127.0.0.0/255.255.0.0 ou la forme abrégée 127.0/16 reconnaitra toutes les adresses IP de type 127.0.xxx.xxx
        • 127.0.0.0/255.255.255.0 ou la forme abrégée 127.0.0/24 reconnaitra toutes les adresses IP de type 127.0.0.xxx
        dotclear-2.6.2+dfsg/plugins/antispam/locales/fr/help/iplookup.html000066400000000000000000000011341230033266200252370ustar00rootroot00000000000000 IP Lookup Filter

        IP Lookup Filter

        IP Lookup est un filtre qui vérifie l'adresse IP de l'auteur du scommentaire sur des listes partagées appelées DNSBL (ou RBL). Par défaut le filtre utilise les serveurs sbl-xbl.spamhaus.org et bsb.spamlookup.net. Retrouvez une liste de serveurs sur cette page.

        Vous pouvez ajouter autant de serveurs que vous le souhaitez en les séparant par des virgules. N'oubliez pas de cliquer sur Enregistrer pour sauvegarder vos modifications.

        dotclear-2.6.2+dfsg/plugins/antispam/locales/fr/help/words.html000066400000000000000000000022611230033266200245350ustar00rootroot00000000000000 Bad Words

        Bad Words

        Ce filtre permet de filtrer les commentaires sur la présence de mots dans le nom, l'adresse email, l'adresse du site de l'auteur et le contenu du commentaire.

        Ajouter un mot
        Comme pour le filtrage d'adresses IP, ajoutez simplement le mot que vous souhaitez bloquer dans la liste. De la même manière, vous pouvez, si vous avez les permissions suffisantes, définir des mots globaux qui activeront le filtrage pour tous les blogs de votre installation.
        Astuce : Vous pouvez ajouter une expression rationnelle à votre liste de mots en faisant commencer et finir votre mot par "/". Par exemple "/foo/" filtrera tous les mots contenant "foo".
        Liste de mots interdits
        Liste des mots qui font que le commentaire est considéré comme un indésirable.
        Sélectionner le(s) mot(s) pour le supprimer de la liste.
        Créer une liste de mots par défaut
        Ce bouton vous permet de rajouter à la liste actuelle les mots par défaut proposés par ce filtre. Vos mots personnels ne seront pas supprimés par cette opération.
        dotclear-2.6.2+dfsg/plugins/antispam/locales/fr/resources.php000066400000000000000000000022251230033266200243040ustar00rootroot00000000000000addBehavior('adminDashboardIcons','blogroll_dashboard'); $core->addBehavior('adminDashboardFavorites','blogroll_dashboard_favorites'); $core->addBehavior('adminUsersActionsHeaders','blogroll_users_actions_headers'); function blogroll_dashboard($core,$icons) { $icons['blogroll'] = new ArrayObject(array(__('Blogroll'),'plugin.php?p=blogroll','index.php?pf=blogroll/icon.png')); } function blogroll_dashboard_favorites($core,$favs) { $favs->register('blogroll', array( 'title' => __('Blogroll'), 'url' => 'plugin.php?p=blogroll', 'small-icon' => 'index.php?pf=blogroll/icon-small.png', 'large-icon' => 'index.php?pf=blogroll/icon.png', 'permissions' => 'usage,contentadmin' )); } function blogroll_users_actions_headers() { return dcPage::jsLoad('index.php?pf=blogroll/_users_actions.js'); } $_menu['Blog']->addItem(__('Blogroll'),'plugin.php?p=blogroll','index.php?pf=blogroll/icon-small.png', preg_match('/plugin.php\?p=blogroll(&.*)?$/',$_SERVER['REQUEST_URI']), $core->auth->check('usage,contentadmin',$core->blog->id)); $core->auth->setPermissionType('blogroll',__('manage blogroll')); require dirname(__FILE__).'/_widgets.php'; dotclear-2.6.2+dfsg/plugins/blogroll/_define.php000066400000000000000000000011641230033266200216330ustar00rootroot00000000000000registerModule( /* Name */ "Blogroll", /* Description*/ "Manage your blogroll", /* Author */ "Olivier Meunier", /* Version */ '1.3.1', array( 'permissions' => 'blogroll', 'type' => 'plugin' ) ); dotclear-2.6.2+dfsg/plugins/blogroll/_install.php000066400000000000000000000024461230033266200220530ustar00rootroot00000000000000plugins->moduleInfo('blogroll','version'); if (version_compare($core->getVersion('blogroll'),$version,'>=')) { return; } /* Database schema -------------------------------------------------------- */ $s = new dbStruct($core->con,$core->prefix); $s->link ->link_id ('bigint', 0, false) ->blog_id ('varchar', 32, false) ->link_href ('varchar', 255, false) ->link_title ('varchar', 255, false) ->link_desc ('varchar', 255, true) ->link_lang ('varchar', 5, true) ->link_xfn ('varchar', 255, true) ->link_position ('integer', 0, false, 0) ->primary('pk_link','link_id') ; $s->link->index('idx_link_blog_id','btree','blog_id'); $s->link->reference('fk_link_blog','blog_id','blog','blog_id','cascade','cascade'); # Schema installation $si = new dbStruct($core->con,$core->prefix); $changes = $si->synchronize($s); $core->setVersion('blogroll',$version); return true; dotclear-2.6.2+dfsg/plugins/blogroll/_prepend.php000066400000000000000000000007371230033266200220430ustar00rootroot00000000000000tpl->addValue('Blogroll',array('tplBlogroll','blogroll')); $core->tpl->addValue('BlogrollXbelLink',array('tplBlogroll','blogrollXbelLink')); $core->url->register('xbel','xbel','^xbel(?:/?)$',array('urlBlogroll','xbel')); class tplBlogroll { public static function blogroll($attr) { $category='

        %s

        '; $block='
          %s
        '; $item='%1$s'; if (isset($attr['category'])) { $category = addslashes($attr['category']); } if (isset($attr['block'])) { $block = addslashes($attr['block']); } if (isset($attr['item'])) { $item = addslashes($attr['item']); } $only_cat = 'null'; if (!empty($attr['only_category'])) { $only_cat = "'".addslashes($attr['only_category'])."'"; } return ''; } public static function blogrollXbelLink($attr) { $f = $GLOBALS['core']->tpl->getFilters($attr); return 'blog->url.$core->url->getURLFor("xbel")').'; ?>'; } public static function getList($cat_title='

        %s

        ',$block='
          %s
        ',$item='
      • %s
      • ',$category=null) { $blogroll = new dcBlogroll($GLOBALS['core']->blog); try { $links = $blogroll->getLinks(); } catch (Exception $e) { return false; } $res = ''; $hierarchy = $blogroll->getLinksHierarchy($links); if ($category) { if (!isset($hierarchy[$category])) { return ''; } $hierarchy = array($hierarchy[$category]); } foreach ($hierarchy as $k => $v) { if ($k != '') { $res .= sprintf($cat_title,html::escapeHTML($k))."\n"; } $res .= self::getLinksList($v,$block,$item); } return $res; } private static function getLinksList($links,$block='
          %s
        ',$item='%1$s') { $list = ''; # Find current link item if any $current = -1; $current_size = 0; $self_uri = http::getSelfURI(); foreach ($links as $k => $v) { if (!preg_match('$^([a-z][a-z0-9.+-]+://)$',$v['link_href'])) { $url = http::concatURL($self_uri,$v['link_href']); if (strlen($url) > $current_size && preg_match('/^'.preg_quote($url,'/').'/',$self_uri)) { $current = $k; $current_size = strlen($url); } } } foreach ($links as $k => $v) { $title = $v['link_title']; $href = $v['link_href']; $desc = $v['link_desc']; $lang = $v['link_lang']; $xfn = $v['link_xfn']; $link = ''. html::escapeHTML($title). ''; $current_class = $current == $k ? ' class="active"' : ''; $list .= sprintf($item,$link,$current_class)."\n"; } return sprintf($block,$list)."\n"; } # Widget function public static function linksWidget($w) { global $core; if (($w->homeonly == 1 && $core->url->type != 'default') || ($w->homeonly == 2 && $core->url->type == 'default')) { return; } $links = self::getList('

        %s

        ','
          %s
        ','%1$s',$w->category); if (empty($links)) { return; } return ($w->content_only ? '' : '
        '). ($w->title ? '

        '.html::escapeHTML($w->title).'

        ' : ''). $links. ($w->content_only ? '' : '
        '); } } class urlBlogroll extends dcUrlHandlers { public static function xbel($args) { $blogroll = new dcBlogroll($GLOBALS['core']->blog); try { $links = $blogroll->getLinks(); } catch (Exception $e) { self::p404(); return; } if ($args) { self::p404(); return; } http::cache($GLOBALS['mod_files'],$GLOBALS['mod_ts']); header('Content-Type: text/xml; charset=UTF-8'); echo ''."\n". ''."\n". ''."\n". ''.html::escapeHTML($GLOBALS['core']->blog->name)." blogroll\n"; $i = 1; foreach ($blogroll->getLinksHierarchy($links) as $cat_title => $links) { if ($cat_title != '') { echo ''."\n". "".html::escapeHTML($cat_title)."\n"; } foreach ($links as $k => $v) { $lang = $v['link_lang'] ? ' xml:lang="'.$v['link_lang'].'"' : ''; echo ''."\n". ''.html::escapeHTML($v['link_title'])."\n"; if ($v['link_desc']) { echo ''.html::escapeHTML($v['link_desc'])."\n"; } if ($v['link_xfn']) { echo "\n". ''.$v['link_xfn']."\n". "\n"; } echo "\n"; } if ($cat_title != '') { echo "\n"; } $i++; } echo ''; } } dotclear-2.6.2+dfsg/plugins/blogroll/_users_actions.js000066400000000000000000000016631230033266200231130ustar00rootroot00000000000000jQuery.fn.updateBlogrollPermissionsForm = function() { return this.each(function() { var perms = {}; var re = /^perm\[(.+?)\]\[(.+?)\]$/; var e,prop; // Building a nice object of form elements for (var i=0; iaddBehavior('initWidgets',array('blogrollWidgets','initWidgets')); $core->addBehavior('initDefaultWidgets',array('blogrollWidgets','initDefaultWidgets')); class blogrollWidgets { public static function initWidgets($w) { $w->create('links',__('Blogroll'),array('tplBlogroll','linksWidget'),null,'Blogroll list'); $w->links->setting('title',__('Title (optional)').' :',__('Links')); $br = new dcBlogroll($GLOBALS['core']->blog); $h = $br->getLinksHierarchy($br->getLinks()); $h = array_keys($h); $categories = array(__('All categories') => ''); foreach ($h as $v) { if ($v) { $categories[$v] = $v; } } unset($br,$h); $w->links->setting('category',__('Category'),'','combo',$categories); $w->links->setting('homeonly',__('Display on:'),1,'combo', array( __('All pages') => 0, __('Home page only') => 1, __('Except on home page') => 2 ) ); $w->links->setting('content_only',__('Content only'),0,'check'); $w->links->setting('class',__('CSS class:'),''); } public static function initDefaultWidgets($w,$d) { $d['extra']->append($w->links); } } dotclear-2.6.2+dfsg/plugins/blogroll/blogroll.js000066400000000000000000000010541230033266200217010ustar00rootroot00000000000000$(function() { $("#links-list").sortable({'cursor':'move'}); $("#links-list tr").hover(function () { $(this).css({'cursor':'move'}); }, function () { $(this).css({'cursor':'auto'}); }); $('#links-form').submit(function() { var order=[]; $("#links-list tr td input.position").each(function() { order.push(this.name.replace(/^order\[([^\]]+)\]$/,'$1')); }); $("input[name=links_order]")[0].value = order.join(','); return true; }); $("#links-list tr td input.position").hide(); $("#links-list tr td.handle").addClass('handler'); }); dotclear-2.6.2+dfsg/plugins/blogroll/class.dc.blogroll.php000066400000000000000000000107351230033266200235530ustar00rootroot00000000000000blog =& $blog; $this->con =& $blog->con; $this->table = $this->blog->prefix.'link'; } public function getLinks($params=array()) { $strReq = 'SELECT link_id, link_title, link_desc, link_href, '. 'link_lang, link_xfn, link_position '. 'FROM '.$this->table.' '. "WHERE blog_id = '".$this->con->escape($this->blog->id)."' "; if (isset($params['link_id'])) { $strReq .= 'AND link_id = '.(integer) $params['link_id'].' '; } $strReq .= 'ORDER BY link_position '; $rs = $this->con->select($strReq); $rs = $rs->toStatic(); $this->setLinksData($rs); return $rs; } public function getLink($id) { $params['link_id'] = $id; $rs = $this->getLinks($params); return $rs; } public function addLink($title,$href,$desc='',$lang='', $xfn='') { $cur = $this->con->openCursor($this->table); $cur->blog_id = (string) $this->blog->id; $cur->link_title = (string) $title; $cur->link_href = (string) $href; $cur->link_desc = (string) $desc; $cur->link_lang = (string) $lang; $cur->link_xfn = (string) $xfn; if ($cur->link_title == '') { throw new Exception(__('You must provide a link title')); } if ($cur->link_href == '') { throw new Exception(__('You must provide a link URL')); } $strReq = 'SELECT MAX(link_id) FROM '.$this->table; $rs = $this->con->select($strReq); $cur->link_id = (integer) $rs->f(0) + 1; $cur->insert(); $this->blog->triggerBlog(); } public function updateLink($id,$title,$href,$desc='',$lang='', $xfn='') { $cur = $this->con->openCursor($this->table); $cur->link_title = (string) $title; $cur->link_href = (string) $href; $cur->link_desc = (string) $desc; $cur->link_lang = (string) $lang; $cur->link_xfn = (string) $xfn; if ($cur->link_title == '') { throw new Exception(__('You must provide a link title')); } if ($cur->link_href == '') { throw new Exception(__('You must provide a link URL')); } $cur->update('WHERE link_id = '.(integer) $id. " AND blog_id = '".$this->con->escape($this->blog->id)."'"); $this->blog->triggerBlog(); } public function updateCategory($id,$desc) { $cur = $this->con->openCursor($this->table); $cur->link_desc = (string) $desc; if ($cur->link_desc == '') { throw new Exception(__('You must provide a category title')); } $cur->update('WHERE link_id = '.(integer) $id. " AND blog_id = '".$this->con->escape($this->blog->id)."'"); $this->blog->triggerBlog(); } public function addCategory($title) { $cur = $this->con->openCursor($this->table); $cur->blog_id = (string) $this->blog->id; $cur->link_desc = (string) $title; $cur->link_href = ''; $cur->link_title = ''; if ($cur->link_desc == '') { throw new Exception(__('You must provide a category title')); } $strReq = 'SELECT MAX(link_id) FROM '.$this->table; $rs = $this->con->select($strReq); $cur->link_id = (integer) $rs->f(0) + 1; $cur->insert(); $this->blog->triggerBlog(); return $cur->link_id; } public function delItem($id) { $id = (integer) $id; $strReq = 'DELETE FROM '.$this->table.' '. "WHERE blog_id = '".$this->con->escape($this->blog->id)."' ". 'AND link_id = '.$id.' '; $this->con->execute($strReq); $this->blog->triggerBlog(); } public function updateOrder($id,$position) { $cur = $this->con->openCursor($this->table); $cur->link_position = (integer) $position; $cur->update('WHERE link_id = '.(integer) $id. " AND blog_id = '".$this->con->escape($this->blog->id)."'"); $this->blog->triggerBlog(); } private function setLinksData($rs) { $cat_title = null; while ($rs->fetch()) { $rs->set('is_cat',!$rs->link_title && !$rs->link_href); if ($rs->is_cat) { $cat_title = $rs->link_desc; $rs->set('cat_title',null); } else { $rs->set('cat_title',$cat_title); } } $rs->moveStart(); } public function getLinksHierarchy($rs) { $res = array(); foreach ($rs->rows() as $k => $v) { if (!$v['is_cat']) { $res[$v['cat_title']][] = $v; } } return $res; } } dotclear-2.6.2+dfsg/plugins/blogroll/class.dc.importblogroll.php000066400000000000000000000046601230033266200250060ustar00rootroot00000000000000_parseXBEL($data); } elseif (preg_match('!_parseOPML($data); } else { throw new Exception(__('You need to provide a XBEL or OPML file.')); } } protected function _parseOPML($data) { $xml = @simplexml_load_string($data); if (!$xml) throw new Exception(__('File is not in XML format.')); $outlines = $xml->xpath("//outline"); $this->entries = array(); foreach ($outlines as $outline) { if (isset($outline['htmlUrl'])) { $link = $outline['htmlUrl']; } elseif (isset($outline['url'])) { $link = $outline['url']; } else continue; $entry = new StdClass(); $entry->link = $link; $entry->title = (!empty($outline['title']))?$outline['title']:''; if (empty($entry->title)) { $entry->title = (!empty($outline['text']))?$outline['text']:$entry->link; } $entry->desc = (!empty($outline['description']))?$outline['description']:''; $this->entries[] = $entry; } } protected function _parseXBEL($data) { $xml = @simplexml_load_string($data); if (!$xml) throw new Exception(__('File is not in XML format.')); $outlines = $xml->xpath("//bookmark"); $this->entries = array(); foreach ($outlines as $outline) { if (!isset($outline['href'])) continue; $entry = new StdClass(); $entry->link = $outline['href']; $entry->title = (!empty($outline->title))?$outline->title:''; if (empty($entry->title)) { $entry->title = $entry->link; } $entry->desc = (!empty($outline->desc))?$outline->desc:''; $this->entries[] = $entry; } } public function getAll() { if (!$this->entries) return null; return $this->entries; } } class dcImportBlogroll { public static function loadFile($file) { if (file_exists($file) && is_readable($file)) { $importer = new linksImporter(); $importer->parse(file_get_contents($file)); return $importer->getAll(); } return false; } } dotclear-2.6.2+dfsg/plugins/blogroll/edit.php000066400000000000000000000171311230033266200211700ustar00rootroot00000000000000getLink($id); } catch (Exception $e) { $core->error->add($e->getMessage()); } if (!$core->error->flag() && $rs->isEmpty()) { $core->error->add(__('No such link or title')); } else { $link_title = $rs->link_title; $link_href = $rs->link_href; $link_desc = $rs->link_desc; $link_lang = $rs->link_lang; $link_xfn = $rs->link_xfn; } # Update a link if (isset($rs) && !$rs->is_cat && !empty($_POST['edit_link'])) { $link_title = $_POST['link_title']; $link_href = $_POST['link_href']; $link_desc = $_POST['link_desc']; $link_lang = $_POST['link_lang']; $link_xfn = ''; if (!empty($_POST['identity'])) { $link_xfn .= $_POST['identity']; } else { if(!empty($_POST['friendship'])) { $link_xfn .= ' '.$_POST['friendship']; } if(!empty($_POST['physical'])) { $link_xfn .= ' met'; } if(!empty($_POST['professional'])) { $link_xfn .= ' '.implode(' ',$_POST['professional']); } if(!empty($_POST['geographical'])) { $link_xfn .= ' '.$_POST['geographical']; } if(!empty($_POST['family'])) { $link_xfn .= ' '.$_POST['family']; } if(!empty($_POST['romantic'])) { $link_xfn .= ' '.implode(' ',$_POST['romantic']); } } try { $blogroll->updateLink($id,$link_title,$link_href,$link_desc,$link_lang,trim($link_xfn)); dcPage::addSuccessNotice(__('Link has been successfully updated')); http::redirect($p_url.'&edit=1&id='.$id); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Update a category if (isset($rs) && $rs->is_cat && !empty($_POST['edit_cat'])) { $link_desc = $_POST['link_desc']; try { $blogroll->updateCategory($id,$link_desc); dcPage::addSuccessNotice(__('Category has been successfully updated')); http::redirect($p_url.'&edit=1&id='.$id); } catch (Exception $e) { $core->error->add($e->getMessage()); } } ?> Blogroll blog->name) => '', __('Blogroll') => $p_url )). dcPage::notices(); ?> '.__('Return to blogroll').'

        '; ?> is_cat) { echo '
        '. '

        '.__('Edit category').'

        '. '

        '. form::field('link_desc',30,255,html::escapeHTML($link_desc)). form::hidden('edit',1). form::hidden('id',$id). $core->formNonce(). '

        '. '
        '; } if (isset($rs) && !$rs->is_cat) { echo '
        '. '
        '. '

        '.__('Edit link').'

        '. '

        '. form::field('link_title',30,255,html::escapeHTML($link_title)).'

        '. '

        '. form::field('link_href',30,255,html::escapeHTML($link_href)).'

        '. '

        '. form::field('link_desc',30,255,html::escapeHTML($link_desc)).'

        '. '

        '. form::field('link_lang',5,5,html::escapeHTML($link_lang)).'

        '. '
        '. # XFN nightmare '
        '. '

        '.__('XFN information').'

        '. '
        '. ''. ''. ''. ''. ''. ''. ''. ''. ''. ''. ''. ''. ''. ''. ''. ''. ''. ''. ''. ''. ''. ''. ''. ''. ''. ''. ''. ''. ''. '
        '.__('_xfn_Me').'

        '.'

        '.__('_xfn_Friendship').'

        '. ' '. ' '. ' '. ''. '

        '.__('_xfn_Physical').'

        '. ''. '

        '.__('_xfn_Professional').'

        '. ' '. ''. '

        '.__('_xfn_Geographical').'

        '. ' '. ' '. ''. '

        '.__('_xfn_Family').'

        '. ' '. ' '. ' '. ' '. ' '. ''. '

        '.__('_xfn_Romantic').'

        '. ' '. ' '. ' '. ' '. '

        '. '
        '. '

        '.form::hidden('p','blogroll'). form::hidden('edit',1). form::hidden('id',$id). $core->formNonce(). '

        '. '
        '; } ?> dotclear-2.6.2+dfsg/plugins/blogroll/icon-small.png000066400000000000000000000006671230033266200223040ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<YIDATx|RNAmk G9DܙCȺ"HhSHmpE]H$$gM0!I&3;kB.gB#@U^)C4g@·\t1lh {VYėSdP2q#r܊'2x{#;=̞,3$ޯGm'g?&KgK-6H.PqLGoBWgm 5-@.SD߰Ӹ9B䊆g] Dy goiT;AH۪`@XH 0~]IENDB`dotclear-2.6.2+dfsg/plugins/blogroll/icon.png000066400000000000000000000016671230033266200211770ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<YIDATxܚn0%=AInEҭ'haz?0ak$ud>0r+V{>Un*Zh# , ƋCHc FapԱ*-w:4ʀժn9%f` dm++!]%0Wd|`kƇ &;CP}ck|HtkHCwIB#@g|'}C0I$Ɗ$ \Nd' aMa  '|1B7o߷6-O90i`!y5_Dc_U0vhFRO@m-ϼB @R?o% 9z;R@iByg:  uCI]=(VK1Bp FAPM,pEA@9(V!d}\+B, m׸ P2.OހXP,@-k%QK !TW*6b_@ lAF.dO0Bۅ|e&QIBx !$ aߕ` @ <ȸ\,ʑB,Q5hpB0,+q $M< L4hU+R4ƫ7N03=`kךsr/Nrk'", / 1Q N {8m(O^tƷT/.nIENDB`dotclear-2.6.2+dfsg/plugins/blogroll/index.php000066400000000000000000000232651230033266200213570ustar00rootroot00000000000000blog); if (!empty($_REQUEST['edit']) && !empty($_REQUEST['id'])) { include dirname(__FILE__).'/edit.php'; return; } $default_tab = ''; $link_title = $link_href = $link_desc = $link_lang = ''; $cat_title = ''; # Import links if (!empty($_POST['import_links']) && !empty($_FILES['links_file'])) { $default_tab = 'import-links'; try { files::uploadStatus($_FILES['links_file']); $ifile = DC_TPL_CACHE.'/'.md5(uniqid()); if (!move_uploaded_file($_FILES['links_file']['tmp_name'],$ifile)) { throw new Exception(__('Unable to move uploaded file.')); } require_once dirname(__FILE__).'/class.dc.importblogroll.php'; try { $imported = dcImportBlogroll::loadFile($ifile); @unlink($ifile); } catch (Exception $e) { @unlink($ifile); throw $e; } if (empty($imported)) { unset($imported); throw new Exception(__('Nothing to import')); } } catch (Exception $e) { $core->error->add($e->getMessage()); } } if (!empty($_POST['import_links_do'])) { foreach ($_POST['entries'] as $idx) { $link_title = $_POST['title'][$idx]; $link_href = $_POST['url'][$idx]; $link_desc = $_POST['desc'][$idx]; try { $blogroll->addLink($link_title,$link_href,$link_desc,''); } catch (Exception $e) { $core->error->add($e->getMessage()); $default_tab = 'import-links'; } } dcPage::addSuccessNotice(__('links have been successfully imported.')); http::redirect($p_url); } if (!empty($_POST['cancel_import'])) { $core->error->add(__('Import operation cancelled.')); $default_tab = 'import-links'; } # Add link if (!empty($_POST['add_link'])) { $link_title = $_POST['link_title']; $link_href = $_POST['link_href']; $link_desc = $_POST['link_desc']; $link_lang = $_POST['link_lang']; try { $blogroll->addLink($link_title,$link_href,$link_desc,$link_lang); dcPage::addSuccessNotice(__('Link has been successfully created.')); http::redirect($p_url); } catch (Exception $e) { $core->error->add($e->getMessage()); $default_tab = 'add-link'; } } # Add category if (!empty($_POST['add_cat'])) { $cat_title = $_POST['cat_title']; try { $blogroll->addCategory($cat_title); dcPage::addSuccessNotice(__('category has been successfully created.')); http::redirect($p_url); } catch (Exception $e) { $core->error->add($e->getMessage()); $default_tab = 'add-cat'; } } # Delete link if (!empty($_POST['removeaction']) && !empty($_POST['remove'])) { foreach ($_POST['remove'] as $k => $v) { try { $blogroll->delItem($v); } catch (Exception $e) { $core->error->add($e->getMessage()); break; } } if (!$core->error->flag()) { dcPage::addSuccessNotice(__('Items have been successfully removed.')); http::redirect($p_url); } } # Order links $order = array(); if (empty($_POST['links_order']) && !empty($_POST['order'])) { $order = $_POST['order']; asort($order); $order = array_keys($order); } elseif (!empty($_POST['links_order'])) { $order = explode(',',$_POST['links_order']); } if (!empty($_POST['saveorder']) && !empty($order)) { foreach ($order as $pos => $l) { $pos = ((integer) $pos)+1; try { $blogroll->updateOrder($l,$pos); } catch (Exception $e) { $core->error->add($e->getMessage()); } } if (!$core->error->flag()) { dcPage::addSuccessNotice(__('Items order has been successfully updated')); http::redirect($p_url); } } # Get links try { $rs = $blogroll->getLinks(); } catch (Exception $e) { $core->error->add($e->getMessage()); } ?> <?php echo __('Blogroll'); ?> auth->user_prefs->addWorkspace('accessibility'); if (!$core->auth->user_prefs->accessibility->nodragdrop) { echo dcPage::jsLoad('js/jquery/jquery-ui.custom.js'). dcPage::jsLoad('index.php?pf=blogroll/blogroll.js'); } ?> blog->name) => '', __('Blogroll') => '' )). dcPage::notices(); ?>
        isEmpty()) { ?>

        '.__('The link list is empty.').'

        '; } ?> '. ''. ''; echo '
        '. '
        '. '

        '.__('Add a new category').'

        '. '

        '. form::field('cat_title',30,255,$cat_title).' '. form::hidden(array('p'),'blogroll'). $core->formNonce(). '

        '. '
        '. '
        '; echo ''; dcPage::helpBlock('blogroll'); ?> dotclear-2.6.2+dfsg/plugins/blogroll/locales/000077500000000000000000000000001230033266200211515ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/blogroll/locales/en/000077500000000000000000000000001230033266200215535ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/blogroll/locales/en/help/000077500000000000000000000000001230033266200225035ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/blogroll/locales/en/help/blogroll.html000066400000000000000000000032721230033266200252110ustar00rootroot00000000000000 Blogroll

        Blogroll

        Blogroll allows you to display on your blog a list of links to other blogs or websites that you wish to suggest to your visitors.

        Blogroll
        Your links and categories are displayed here. Categories are displayed in bold. You can reorder this list by dragging its items upwards or downwards. Once done, click on Save order. The order chosen here will be applied to links displayed on your blog with the Blogroll widget.
        Click on a link or category name to edit it.
        Delete selected links
        Allows you to delete links or categories by checking the boxes next to each of them.

        Add a link

        • Title: Link title. E.g.: Jules and Julie. This field is mandatory.
        • URL: Link URL. It must begin with http:// or https://. This field is mandatory.
        • Description: Short description for the link (will be displayed in a tooltip). E.g.: Jules and Julie's World trip.
        • Language: Type here a two characters code for the website language (e.g. en for English).

        Add a category

        Links categories allow you to classify links displayed by the Blogroll widget.
        They are displayed in bold characters. Enter the name of the category you would like to create and press Save.

        Import links

        This option allows you to import links from an OPML (RSS feed format) or XBEL (format to share bookmarks) file.

        dotclear-2.6.2+dfsg/plugins/blogroll/locales/en/resources.php000066400000000000000000000007611230033266200243020ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/blogroll/locales/fr/000077500000000000000000000000001230033266200215605ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/blogroll/locales/fr/help/000077500000000000000000000000001230033266200225105ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/blogroll/locales/fr/help/blogroll.html000066400000000000000000000046131230033266200252160ustar00rootroot00000000000000 Liens

        Liste des liens

        La gestion des liens vous permet d'afficher sur votre blog un "blogroll" ou liste de liens vers d'autres blogs ou sites que vous souhaitez porter à l'attention de vos visiteurs.

        Liens
        Sur cet onglet s'affichent les liens que vous avez ajoutés, ainsi que les catégories de lien que vous avez créées. Les catégories apparaissent en gras. Vous pouvez réordonner votre liste en cliquant sur les flèches bleues à gauche et en faisant glisser le lien vers le haut ou vers le bas afin de le placer à l'endroit désiré. Une fois vos liens ordonnés, cliquez sur "enregistrer l'ordre" afin d'appliquer les changements. L'ordre que vous choisissez sur cet écran sera l'ordre dans lequel s'afficheront les liens sur vos volets de navigation par le biais du widget 'liens'.
        Cliquer sur un lien vous mènera à sa fenêtre d'édition.
        Supprimer les liens sélectionnés
        Vous permet de supprimer les liens que vous avez sélectionnés au moyen de la case à cocher à gauche de chaque lien.

        Ajouter un lien

        • Titre : entrez ici le texte que vous voulez afficher sur votre blog. Par exemple "Jules et Julie". Ce champ est obligatoire.
        • URL : saisissez ici l'adresse du lien. L'url doit commencer avec http://. Ce champ est obligatoire.
        • Description : saisissez ici une courte description du lien (permet l'affichage d'info-bulles par survol de la souris). Par exemple "Le blog du voyage de Jules et Julie à travers le monde".
        • Langue : saisissez ici le code à deux lettres de la langue du lien (par exemple fr pour le français).

        Ajouter une catégorie de liens

        Il s'agit là de catégories de liens, qui vous permettent d'agencer l'affichage de vos liens par le biais du widget "Liens".
        Les catégories s'affichent en gras dans la liste.Saisissez le titre de la catégorie. Par exemple "Blogs des copains".

        Importer des liens

        Permet d'importer des liens à partir d'un fichier externe au format OPML (format des listes de flux RSS) ou XBEL (format de partage de marque-pages ou favoris).

        dotclear-2.6.2+dfsg/plugins/blogroll/locales/fr/resources.php000066400000000000000000000007611230033266200243070ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/blowupConfig/000077500000000000000000000000001230033266200203515ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/blowupConfig/_admin.php000066400000000000000000000015111230033266200223070ustar00rootroot00000000000000addBehavior('adminCurrentThemeDetails','blowup_config_details'); if (!isset($__resources['help']['blowupConfig'])) { $__resources['help']['blowupConfig'] = dirname(__FILE__).'/help.html'; } function blowup_config_details($core,$id) { if ($id == 'default' && $core->auth->check('admin',$core->blog->id)) { return '

        '.__('Configure theme').'

        '; } } dotclear-2.6.2+dfsg/plugins/blowupConfig/_define.php000066400000000000000000000011731230033266200224550ustar00rootroot00000000000000registerModule( /* Name */ "Blowup Config", /* Description*/ "Configure your Blowup Theme", /* Author */ "Olivier Meunier", /* Version */ '1.2', array( 'permissions' => 'admin', 'type' => 'plugin' ) ); dotclear-2.6.2+dfsg/plugins/blowupConfig/_install.php000066400000000000000000000014441230033266200226720ustar00rootroot00000000000000plugins->moduleInfo('blowupConfig','version'); if (version_compare($core->getVersion('blowupConfig'),$version,'>=')) { return; } $settings = new dcSettings($core,null); $settings->addNamespace('themes'); $settings->themes->put('blowup_style','','string','Blow Up custom style',false); $core->setVersion('blowupConfig',$version); return true; dotclear-2.6.2+dfsg/plugins/blowupConfig/_public.php000066400000000000000000000015001230033266200224730ustar00rootroot00000000000000blog->settings->system->theme != 'default') { return; } require dirname(__FILE__).'/lib/class.blowup.config.php'; $core->addBehavior('publicHeadContent',array('tplBlowupTheme','publicHeadContent')); class tplBlowUpTheme { public static function publicHeadContent($core) { $url = blowupConfig::publicCssUrlHelper(); if ($url) { echo ''; } } } dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/000077500000000000000000000000001230033266200222105ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/comment-b.png000066400000000000000000000024601230033266200246010ustar00rootroot00000000000000PNG  IHDRsBIT|d pHYs  ~tEXtSoftwareAdobe Fireworks CS3FtEXtCreation Time05/02/087~tEXtXML:com.adobe.xmp Adobe Fireworks CS3 2008-02-05T17:17:49Z 2008-02-05T21:24:01Z image/png G8kIDAThMA@/a$4N:($䵃k$ɱp $IcanI$=>I$n|yL$9>X$I-,<}3~qaM$sXq{rt XIENDB`dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/comment-t.png000066400000000000000000000030151230033266200246200ustar00rootroot00000000000000PNG  IHDR{bsBIT|d pHYs  ~tEXtSoftwareAdobe Fireworks CS3FtEXtCreation Time05/02/087~tEXtXML:com.adobe.xmp Adobe Fireworks CS3 2008-02-05T17:17:49Z 2008-02-05T21:24:01Z image/png G8HIDATxmA00t -I!dLoZiݦjmžx8JwƊ;,gIscXa~$ى-q7$ّ +n'Q$;3ۊ$|$7 p$NrEX,I 8IduX7 I $I Y$;7.g$Ib\Ӽ%IqW$IbOJp$I4$Ib2I8O+I$W V$I4Idspe$`yp$IY8 $I6 I$9嫇IENDB`dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/gradient-d.png000066400000000000000000000026301230033266200247350ustar00rootroot00000000000000PNG  IHDR2tsBIT|d pHYs  ~tEXtCreation Time05/02/087~tEXtSoftwareAdobe Fireworks CS3FtEXtXML:com.adobe.xmp Adobe Fireworks CS3 2008-02-05T17:17:49Z 2008-02-13T14:37:37Z image/png SJ4IDATxر 0 / Adobe Fireworks CS3 2008-02-05T17:17:49Z 2008-02-13T14:37:37Z image/png SJ4IDATxر @ 2q"Uʔhphr@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~C 4HzXjH$TK@@@@@@@@@@@@|>x؈DlS R-؈j|HHF$2c#GCZ/d}4]A@@@@@@@@@@@@@"cqDIENDB`dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/gradient-m.png000066400000000000000000000026461230033266200247550ustar00rootroot00000000000000PNG  IHDR2tsBIT|d pHYs  ~tEXtCreation Time05/02/087~tEXtSoftwareAdobe Fireworks CS3FtEXtXML:com.adobe.xmp Adobe Fireworks CS3 2008-02-05T17:17:49Z 2008-02-13T14:37:37Z image/png SJ4IDATx @j:qt&4xlpDO4MQ AJDFZuD@@@@@@@@@@@@@ܵD DGlDG@@@@@@@@@@@@@|u:Ѳ:"Z lWGl䠎HHfn c7QU k^2Sov>IENDB`dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/page-b.png000066400000000000000000000024741230033266200240600ustar00rootroot00000000000000PNG  IHDR gsBIT|d pHYs  ~tEXtSoftwareAdobe Fireworks CS3FtEXtCreation Time05/02/087~tEXtXML:com.adobe.xmp Adobe Fireworks CS3 2008-02-05T17:17:49Z 2008-02-05T17:31:47Z image/png wIDATxmP@@B)@ /!RlpwN}-m:x1U]W >WjUG;5T[Wg; I7 NIENDB`dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/page-bg.png000066400000000000000000000023571230033266200242270ustar00rootroot00000000000000PNG  IHDR vasBITOPLTECv9 pHYs  ~tEXtXML:com.adobe.xmp Adobe Fireworks CS3 2007-07-30T11:04:51Z 2007-07-31T09:16:41Z image/png 8ĄtEXtSoftwareAdobe Fireworks CS3FtEXtCreation Time30/07/07MIDAT(c``!Z2j -)ZJ-IENDB`dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/page-t/000077500000000000000000000000001230033266200233655ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/page-t/animals.png000066400000000000000000000666141230033266200255340ustar00rootroot00000000000000PNG  IHDR LsBIT|d pHYs  ~tEXtCreation Time13/02/08GMtEXtSoftwareAdobe Fireworks CS3FtEXtXML:com.adobe.xmp Adobe Fireworks CS3 2008-02-13T15:04:00Z 2008-02-14T17:05:04Z image/png S֎(hIDATx}Tղ$#s xA*( TrF`̊ UwN=azfzfI=ݧOwU0 sfffff˰ׂ3afV@̊10Y ߖKi;v 1333+AIp ]|:A+-B 1333+Aɖm۶ب + Avur'bffY HXX!AQ^C^M`BA^?+-=js fffffxJFT -)R D gE6=oenU\ 13333+ڠEm[ ^'z|z慟?^^@33 @JhqHe+T" cz%zԅׇ寧Ha+ܰaCV?/Ot UY@333tL2Ȯ@D W/q+} TKi=:/rF_u&~O_c4333bnn̬k%Ya 2 zUA]A!Պ.TWZ*_@=|WSW;tp~>~|o)a177bfffV"Z6ЃXՇ}{2R$uԾcW}٣3~! +܊? u 177bfffxP@ AVv&(`/>j  J,嗗=̟WX ? >llύICj} ff@ eppAA@DM}wy8ݺu;Fp@*!hՋxzuO>مGP߯cO6RET 1333b?BE%,V:@{7w߽?R = f>}F$߅7|~*D VAj 13333+jjGh~+Wāy ԷӧOk(?L Vf, V3>߿k֬^ԯ?ڵk 9~6 x Fj*5US533bnn,CJWխ" F4՜OF=G}t+A?A ](u*qS ` iӦM6m>uw_oo *+0{133bnn,3FhuRu JUGglWT)c&(*q |su*Wt/+ A?$FRn"g bffY- qA Dăa\p@?-UBs$S*&ݪ*Zm۶m~H928iX@H:Ql= ff@ ehP1 ]S}JéZE=0wcu<A?ȼ q@_lzVEvts*]^*Z\QGB${)~ ؚ Fb壧H Var8b2]u$FU3z:>E#QsM.9j@ĂZs fffff;eOa@$q@ȁ_d?}bՇk}W  q8Uw3Ev!5YXy_,Xp%>Tb#:+/ԯR;"8c)Lz J8 ˀs fffff3V?6oaЙ3g"l.gU`]gxo1jz$DdȐ!@=>uY!q{vHg~Rw3@J]sВ,,#8E/Ό~? Vr$@ f>4%K1 8 YN.܏ *M VR]y-]Ռ}6n؞ {<\TgXI$i|/cmA* *$K!p͛ h3333z~s>(8M#s= t bt(*Qr9 U"rT^L`ǟĚ; oGX-(EՏLTH<a3333Տ`rƌ+?S O<}֬YଔzS`2p2aUZ )`]$SI a3333 /x:Q 4 ;;H5*86>dA>LG|ŃJ+l=Ec{G <,HCcD-ކ;4X`517bffffVL[lWZ5o߾SkB/DC|=7Q Ps9'~KXW71խ ՁALƷѯfUf /,@M(Vt\\,ps_ gƀs fffff @*jQM6֮];$k׮T`׿dO!wC' ྲྀ_OwA;6ll W#l]F*#*4kr`1 @ *8'5 4EUD?sTm۶sR[jdU2-Td*5@yoV6H8iXl')[__bԯ |d27|>Hy"@ ʫjQK l;^[oh=Nj=xB> VV%.)I>lZƍA)A1>}' 0|lP?a߼Kջ41bn,eǁ!h!gӳ_'NHXL5/`@@yYFdN5rAp6%wI[k?>(a-/93 zq] _"@ zAh/ &EU<44RXcIq d9^RPxM9C}yz^ U:|u5 ,u&g(VFKx s`} 2JC6j؂ss fffff 8ޛi/R_-8p~kh~F<B8| [/_TT8o䐡CF[n}L Da](<xk @+.F &U"%wI*oQ|3bnn, jWe{ DǜA8k bҸtd[.^k ]!7d4UANSG ȸ,4OEy;}!.g@H 4 b/]5(@ eDV\&Q@G W=zP(hnJw}d}O%yվ}{6hV 4 bjW %}&,}4ׇy OZOB G,()M1*ANV#@ G$aܘ s'™5n&SrY>Z}B8ׯ_8bĈpO?<| :^ +RMvh17bffffV$<3ui5s8xfALVy}B+k!CSN 1+%[H3H~z Al "@ ٽ 5uq SЧk AltL vꫯy>/ @ʦAҦHUD 13333+./\f2>>#5Sk/dӀ3g˗/op„ ҥK#i^6o۶-jD7+7n$@w 64bn̬X~/L?nbnC^^ʆcǎ .\_>jD [$^ sv֞%wsaFTC 13333+ dr:.gr;b )wΜ9/g}61OS2s!duXHFTC 13333+AΝ;?:Ac FE)!=-}{O>nڴ)ܺu)a`?>İ9%fRUpBp ;ffV֭ O=> ~-xCx FA za <82eJ#ZV#:V1Kj6~CЋp8 &I%@ ezҝTo1,ykffVd$x @Yc @s`*6tpu?8&1b@ {y쬆ɍTXL LȏB<0CSYK%33?@ooc*ŹVv5kV8|p̙@wy'erf;y/M@P3t$17bVj zY/-[mN{ 16V13+aBtM?  ~:ݽ2/`qժU9hXzY4,31׿+zVALI{o5517b) Al1J +ŰvJ/#zg4`;6!wo5ri~;kȒ%KB4h4Wa l(X5(s f@lLaQlA!5T13+Dz^EC fϞ57 !oc%+J=ca~b2%}:DgۉbIгgLfk)" Q2F)L'!8[OGo6ؑzb8^[d9.k^iA;+>Zg{H@H:H5g6N8'Aw ?$BXԟ WX^YrO=TG} @e۶mI&g1e7L~uQ=p.~MTi,Zj ȷ! phYF\cNc)JU7o>Dt'kĬ0E#TelĔ1bnĬW6dwk/b oۖZ4@-wK_ t4{F}@H]Ji`HϮA4@y>hĬmӦM2~~m% 1.~+W|Oq f_([#(.y;2=fhf8O BJVH{(I"}uCQ[«* &M xW^B5PeA bR4bnĬU@=vv۩b[ V<֙YF/H)h#%˔Ru. boU "L$tOiS]Y#91×_~9 4tB3Mԩ)Ewh5lؐt.ymIzۖF3l 1ߢY@R3\S`z 6t N`Qԣ-W^5 }ҥe%+hff B9DAvCzl @̊3 ޒ#՚ғPꫯF@Y&&wߙjCrHݼHX Q"W^77.\xq /}YTA3bVضuC !znT, @̊+(ͺb-MIw JPg(f[dɰyE hYh4yG}:V?4ge?裉#F%ɗee={ ;6\pa~YQ2InQR 1+P&cC6ĔoUƤ^JV&1j$^lYaÆO>Աe[6m^8Sߺ˾6l?Ν>s!GԨMijW\qEx 7cƌ ϟ[.1bVF*֡WT S17b/9*0p.nSS+>RX9'Ҭs yp( BhK/H H-@ĕfү_pԨQQmڵZi~feSLYNk~ @nO?pn8)d?bïC8$0ּ O?yǎ\s5m/<^zZ!e |=CQ31hTò manrhKO?G fEi=ڄ-UJS [s epXt²[oeJl./σ۷Y|[`Bؗ_~߮ )Hj4Q BNB8qbޡ/"_&lVT~/vhc V _P5U?§/'r{?E2맻 =V k=8upm8O>Q{~o~Tbǵ^>1DՏ_|1D\1p|?hР3O"V8Cfv~}|鋕<@s |0.jGX($+x 6u`97紁u,tԬ9qhUZ85rEp-lV; *T3|׳ҧ^]uUpc9E3*ؐ!CiӦhgǪefEi'[a"f1(s] )U}!ì?1_e1PF 6냾V{yr[ Uz]/4 ̏Ri IpeBR6ՠQ8U/裏jD?b9'-믿>{g`- ]̊ҺtJ[pĊ@ e"ۍk#bѯێU R\_|/ѣQ:*=WQ|HhW( "5,h쇟}Yo,^JDŰKF#y))Zu&y8bĈW*33_t I P%+17Rreu˄zUn<)]u˨TJ{>sHާ*;Z|{՘ri.ضW:5ElDn]x(O=T)i|Kt4TjTpҭՏs >2ڐw֭T9N_??NUcB:iQ{LeL$E*4~Ul^2YԚOF>}zF]6/^lfk&J2~17R2GxACQHQ5]*իEmRގMEcY!ew6H3TGYtTv+ i֫@ϩmćrt H,F]w hCY0^%6 OD w} akmqLVw:o Yez e%vQک4Vd(վ}öhd5}]t%ث/Ϛ5k3H !sy7&vcSQ_e ><9sfJ}]R?,/s`xsEa3QFKNb^{8jYt~bHfZDΑ;OWդ|UnxQ;C~SaXem><Ν;? ["p2X$&AeZYYs.  zYFg|}14mH)5IjY⁎JݣsN}? p|Xa'@^o> @2|4(KI:q%fN.*z,(FGq(WloOJxgێX|eIZ~{w٦M}*rr .)8Qi5U f!ic`Y^Q B7|sH/h X0OcC4rV*&Ob5> @2֞䮣^\|ON^s5<bpJ-{"~.)?x!\~ב#GF>(ʆkV?nѯrpXIk4v|oVχ!cDez*CT"x߿C`Wʲ`J-Rc* /_~sMDmޅb] zxi@" @2| q3~4T833r>vqMZYSoK|$?rێ֐_~iWwWi2|S\[r{>R@xL83cBD6?ؼys&ՏLq_qVwXa_kG?sUH1uQ֨W|f-} LsT8#?J;Itުp&qz&z~w_|lK@^ZR]CD#^}I=6bn$H2hw=sY͟FMp?4.C].As=6ӌ8֍\4אR4~^ؗn ?J 懆Vz\ͨ!`Ll#PL|=PD"rIy'#ի^fKO`*HYasE.:)wbR/<8_j>kf ~pÆ Q߇_*k+'WrAh$> Y6mڬ=Z|'Q_4[S^K4Pi(8kad_O=Fg@ XyqT?,t:uaÆ3f(16ˈu &~2USBr'MX=?3ABS*Re5O}^|ܛ9 Y|V>f1H`Ar6m4T4ڲeKXAjMnY|4;Eko߈OEC*z!mg ?orFtd?(y%{X !%3HGk A[F1yy"@sk&+C~tٺgos@~TQ(Ns?餓uE*ܿ!&R8ِՈnH>A)ԵDwM`Pm66 V?^0ߡfAi2\)Xd(aXD3LbtAD/g=%nF z+XCeMU]xd9(,L$JzA'XlϢkSePɬ6dUhtࡒjeu= d5`?A7tle흐-Fj 7vТE7Ay žBuuL1Ci㕑^̀.njNF M`I/'T'˰W>[7f/mͽW_}]`/{;h^3&#fh2B$+T2~`uFWmJ3[Rsn^,u$%9ΫHXjW"W20F%} >0<&p(TkiժUezcY2}h |=o݋c|0'\Nuv@&80yI]CUn(õ-.aMZd$C ;k;Au;lCeƊ:tlwBRe@)=!fZcB!duֽVmPt .R3 RM2WiBOFs2 fFAMn`Lx59dUzd"+Oa_xh9yP6Y~VD.\}0i4.vM8G;m %yQm!:$GJUAkweY 0=|vsJ(U G>\@U"ƸeN%29L c,$Uŭ5/\<Adò{QkmI2cNQzLgZc,s nD,6dL IśJ|T$d]l#hMO (hL"4cHyB bt_ժUBzô^ ӧ3F&B>Jٴ(@~̺QTX W,VF433MJ0̊˗GҲvIH)H`Kyd:[:j^F wxRe{k#kGZV3?3ф4* !X%!]k- E>nNmL@oɌ4!VQ\jEZ`A8_vi_&a0Lz>7rIuU"TE ׈ZWz >09Q=_OgC~-A0T,`Jh]~j/E pS ҩJW%&Pcyʄ5I7k:O?o3KH;F0]<Wej8UD#>.gjiԚ[B1^XF2UD^&=0yF_ށ@w3C=ϯnlUW,UF*"a)Tr Uf^ǧEZWhAq̀U^>X̀No!=|pm@?U@hIF pצi\Q՜nצ6v (@׊zܩ{^c&U\Y}7i=5.~ y=BQfLM ?}t$gz=/#OyW-M$'utU>dk(K`y"O_r Qp;/;aň=0E"J`Fg:uHs~bM^!WQlɒ%e ܆RAAwn6l0x?`?]>iՑ|C ƍcBuVHDUE d%$wx*[_al@Frf:uNF)OUda")2.'{| ʼnfv(q+!5hj ^I} D/>ZHô^fG@Kez*AW.c6O#ks\ ~d/y 6X cCh*kco|xTGh`cx:6nxy,<gv, O|!jΔ G0ΔL^YlIZwlp茬2zh@ރz4x@a8`_v5ޯ7T\_A}ePQ*T5Y9rU>U:G g^*ZY{v\o$k @%$TEc;Als"'`ٍh*WT@=f|E0V8Ƀqݨj hDuIwI9i]ySFKfl'UlԧJ L)5%(Y0H ~yF믿~ )|#N+J$j@?:M 蹁JZj& :tν=qoFI 1b^HiR5hcEmO<T<dHjdP?3~'a8q.$<вPD wE/{TJDC=-T7(a[IWyqfoڸ*8X|߻ԗrmcѮPI*zNXY}δ`C>{c|Ŭ~aM|%A&h (^c}'ݯR٩ R0}'Q샓PNA꼎 )TMjgs{7^.ﮪU^U$_w^ǛO걂n¶sJ`5{=Y(]O:}Yץf # K* F)@S@? v"/1NQ\8Oha5vvUPT kS9 (I;A.|vc =Uj> I}@܎*J4'+VD XH5,P(`OɌ:g sUL=ռ ^jJ/9%aow%p[$\kP" ;8jļV@<TLTf] ٥8͓ư7?hX|iY ~x'pOOa-Pgl܉'xP$ Mu%4o9E6Hl~NMK#GiAf}@V Z(#{6 MuA1YYL5*sV~^SԚ흟 gN)8UpB ۾0>sva׋h\[$ܬlHSFKtnW?֫>4zt .qV*>JiOz>U?o]wmdOO>{U79 '/ZZk+kL pG2c 7Yŵ=޹urΫ:^q4Fk4-T:S7}=_?S3Q5Q8gK"a/D$xCv^fļeM+yU8&V>ߋO\ xs9DP' _RAQ>הнYu|"$È^IK=y1 TjW﯅/T/qô2{]nqV NPsea'52.S,JCQLZT_{*؏(B !HNT)pz!V>/%k}pQ+H:^x0Qٛ75W(ƸbS=kq7衋3A7jBOZ%I5fYMv7?'Q샓C8?m۶^Ed6mڴY?Oݬ3Wq3D#`U* $rojyPk{OxXh9"9^E%}[&Q~ gI%-v .թH¾ `dbG@e]T<,,(|M.Nvm3HQ&^EiK|]nX&e8]5𺭂tc>OڬQ2|yZ,p3.H^Ar]Vȑ>k#xСuY#+3IM)ѐܴǟ#Q;kA8XIsUNAZ:y`T_ ix=NJ'bu]ҧ?AYuX>_ "ZxMU>Z݁kFuԿJWs̹I7QBQ&]$7ǫ9xEKJF%{5Mv|Wq|2c >hРhZM9qhc#]~21eOG"A(~̏ YQހu$=պLH֞ :zEY̍SQR@H\ya<Hd:1ˁ̟`:* KɵחS,L UH~)f\%ѱ1ݟwy*J)<\lʕ+;+ST@YP0\Ν;?Mr+5OWf4퇉зUɽIX=71MʫL 1sUj`4 re}'3PebxgX*^ wh2xe]fUX~7R=TEPd[^ub=r~We?ۼyq0UR”J}^玪N MG]|)| &="v8QyW}6V)ľPrTŔ )l/XGWP-!<>Ke2Θz> /W\dppI PZb<G;:>cޔ h+Vj'! jYEpE Bl/ItMSO=U 0QEw?d#si|NY[oFqmUǃAP\2P4f,< y[ h9) rȃ`"XG00D&z;^t:(i ۹cv=1+;~Y^C0$n?fFM+HLuru <)^RJM0{w [t%^ |\ AΡW26|PbɌ'sm3f̈5йyo%(G/3ٲ9u$ҵkוANSenaDz+XG3 L\`',D YDAB6E%&:ԻFVjm%m:  -n4ߒ>2R8_guyAi@ǟp 3 grNLEUlDK;EH!a39WXHѡC?_d!{^-ԏ@Ɏ5gcI\ԗLe`VԂacW\S9OJx4d3; `LIK9 p}.*o 2V +yר 8a)=<|LwB[Dey J"Q=A>6R 9c @ x#zmV wt%!87r=ڗ3J P_D|먭 gBBA4R]J"jW )n8]ds&7fŗ<*@w\>{ .1hq@Y@Ҍ#Dw*Ƿ . I͏,Aw*M(D X2Mq_$z-EM(hXTo% 2)_zeJ8W}T {C9MAhdl~U8,ֽ{|ڴi2cǕ^p%I =0D5pY)Ц @*s ~@{=|$PyOcO͒HuqrvAd JP_%,M &h Ma3^Bm3EKr<FäJ>7E՜\UМ{$鵙5v{ 33mM,@TU8WҥK#)QWa_e^Rm%?ӔQhXשF儔_*+ tӥy" p!c@Ul%ȁc.ҎTK!<5ɤFR\#*[^E(-_C : SZK@0h]8Q7|9&zIB=ueO& *{BuWUZo9L_%,VGu$T;@ [ sb 7-Vz%MW_}t_@zXܜ~RDU^n~(WJV52{ Tu,NEv+YMRx;YsLdlǛmEi*,}k2~ HGvRQV0#`HՆp +*tenCQ Yv( v]#9wH& s;n븝j&WE"EGXޚJteܘu^zHh::H{wy'ю>OkTAxձ.ODCӄ.u>Hz1UK\$O*RA:y`R+7[nΑ߄HX!6^#G$g&&  cx`Μ9okDƙ)8 g}2g0cojt t+ƼYn'/Iaf5#IOVs'JU/,ܨB=!%j!q6[E79ۣɜ9)DÛ0cjs1^Sx"0VY1 BT(Xl`% 2SW(mSl>uS~eAHh3_mjA3c@y:{@i:ѽWBҼXUTM6l"~ 2T6R7U^y^f/BW/r yw_IR.X\D#3+:gf&sX<7s &}}2 l rfk@}CN|C:Wս3<0A>S( fIW7bn^FX5 ٰszu$6%zEB0*'a; l1p5'jV3UjKg0` _kp&; h_ٍԻ%R5z֌ {Í7AUjZЇ=Y ]R 0⑨cڵQ?P%@H|#lrf+2~`i Bc4*ƽeǃ,-Xgٓϋ% dMY9qvP:׹u@#WAz_|>,i^\KK[y~) 1-QN:if{K]O [m^PB>?TN@dJx xRğ7QUǩ]a{kߐ/SkNIMpwm\@*!s" 3n(wLV?J ŀY> jFN6rsgywͭ˞&+ORP[t (&*2D(*HIexu~ WceCjv,'ܭ JJ= jĸŝj^_w6a}l:Nd6l(:'36:y䑯 L [j~6f܉yqB QىtUP՚׹ʦbӡzWܸ 'L=3UHҗUYdCtAgw_ P- {hVJ U>F\ǃbD"2x<$2 h3(hm=@Jg ̅Z\G* Pɒ.SuD @ ndϮFxlPf>Oyʁ `<|6Kt n/P\[SiÆ5#KAL}j?QV:VHb5)6wjctԠ( 8r1`@z-6 eN"638b9a#qªkIy!ϗ[5l޽ ^{QvI&lOf@iGfP\0EnLjwIhQ~Rs9P/o@c'*+@/AS%Tw/IPy(O͠f^K_ydBG`-ڜS '||p7+ɏ?xuCL¿ = &*6{)v;n޼sI?DLTmr<, E@PL<wKJQ`>(GtldPٳ9!l7$3װIֽ[S]LV/#?L$< !QN>Iz]hlz>ADq:Hb% W$Hd7VKdi#~;+>~'3)*={s?@À17fT~XFuN.+&QgyP"!8v*uuGKЙ 3 %G ^TH&zraא^Tx<`I߿nO}ʧP{"ȖH/y}Ą*H5ԣ lٲɪ53U"*"概{uE-ze T,}ַMXfzl=D@Em$xd& KDxULY+@͋$*AK;˗/P dYnt,r2}.^欽) =(k#^6l+Up060/o D 8jdUJ;E&&B90P42!+ B.شNG0% 4;DFCR'8$.F [FӷdˏVgVm NF@6^/>^A^!Z4{'x f& @z^7QT.@ֶ 맒qrUbxFv@1ZF|0N皆 v; `CU5)qc VkZ]qZeO;ЂpNjU܆5z%Av_x_Ys¸nWߣVG,WK0m۶iiL8STddژR @i1#xQފK"G~7i„ ߰`/nFBW " "AQp&6a4NG7! XѬ>e85kW)~c=Dq3򮪀1`n{S X?AH4| Tg)5)RTU^U(pP "kWry9}&\{AzkA [&Kcx  qĿd7V?ƍI׊DRCy &FU\ПVV*c}Ikx-#,lJ00vꩧ@RL!HBؠAa4 @-/#6 S B`E{q8VpӝJƼ.hfX*Jv+T+8GgPAϿLO⪻ҽ?erFal T*>9#.WmVQ5ˑMGvz=/?y{ӯW6+Tڨd N9'Q V:HbA)&$XnX49YdE8.%hZyaf*933333333333K[4J&afffffffffffV@۶1affffffffffVd $4ڕYZ̬%|;fffffffffffE` @y03333333333+903333333333+*\jxrIENDB`dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/page-t/blank.png000066400000000000000000000035441230033266200251700ustar00rootroot00000000000000PNG  IHDR LsBIT|d pHYs  ~tEXtSoftwareAdobe Fireworks CS3FtEXtXML:com.adobe.xmp Adobe Fireworks CS3 2008-02-13T15:04:00Z 2008-04-24T15:34:07Z image/png pL[tEXtCreation Time13/02/08GMIDATx @E);JƅFMVv73cQխhy|SMj3k5}Fe+\sͣZ\`j6l\E      @ @ @ @ @@@@@@      @ @ @ @ @@@@@@@      @ @ @ @ @@y-|IENDB`dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/page-t/butterflies.png000066400000000000000000000143161230033266200264300ustar00rootroot00000000000000PNG  IHDR LgAMA7tEXtSoftwareAdobe ImageReadyqe<`IDATxD񈈈cĈ1"b1b1F#F|#b#FDDĈ#bDDDD}:>s|ssWy` $ @  $ H@  @B=8y48NӒ%J&@#Ig1%: @{y*iVgI_=s&%Z5l̏$ oXo{KtlĽuDxlJR?.顤'1"|rO͓>Fq{NI?%b|Q*ҭ%$ -l&~iĩo-Xq%hm%])8Re}mq|4կ<O$ ߄tT6f]7k5ۣbVbHArA^=PA= v(S  uq!?wB? eLҊ:&'V6s`F=qeyKpXi$",Zһsg2>4y %~Hڱ'/ꨕc-IqOBsj C[{o?(k9S  LJxFB?WKѳ'zk}L.kʡ^\Ŗe(_ǃ 4`7$2>II_" [q**>Zy+ 孵V>#&[ Ί+ZJ{brɼⱬ(D>r|5oMxoP^yîcl7QUOIE-R^hm'nr,%$:?Qp_6 Ջ4b۰^X8w5ky7.@^&ZlÍ#[YcƄΉ㹽^pXe{y`wOP@fV)[z?REsʩuL˶7le-@D@k'h=}&/|)8dVi,8ColemVmP\SKſMo2=P:L77[Ռ:[! ߜ_m5CYS[blPM*=C,QUA;w~I/>#z84Fc t۴}I޳5==W%='8{6nxO ӏ~VY'vlB;L8ߴXu}.$=[C~+ : Ԅ[/s< %mPN%=cLb{j}葂fSVR5A@<?0w^8I$cҐVؠMY++rUs 㱂]s$d1iXmY-?啕=lqRACyonJhk>Vkiyrxk[ aNyֆ^m^Xę4d/~đH@(_cQU6;4ȘbXV He<8aTA8i#Wu$"e*cQsuST ZrcJv*ּDW%*{]JN/n2@ ciu#,o0"{& .s >{ھ zr QegfLYȵ=igk|V.Lد47Ui~Sj hg]/WGc޳sg_7m/mƢᱻI9ob;Fu*8*>>QH@2JT -#Kέ٘q7~kUʐ=I{h4(I#7#mܿ<'*T58EQ1K@OD/&_$.ʃ|'?lky1>4ڦѭʹ3Q=!3$ dҽRs_Ɖ #wo$Jl'}ߊuG:_$-,K{B@6_o&1nbJp=jIƝt{3ҹ ն=U0v VAd4vV̅X/[S!wR OvXfJ4Xb<'o _lEZı5q?Er&6Vx9sO$;BPސNyK_̒i9#Q8QW3g+#' dx I?lKL%]}cSx?Em?3 4΄::5O)uF`ie[ѠZ b%#m8^D?4}& ٘r~3VX~[y [)kL'z"|dHOv;T3{Y*ߣ$ d [rʰNZ%k%Q/J>1kܨҏe KYY;V{4zWj߳]$ ߖyk濸g`I>w%:DkNEM9{3* $ dxØ1a9G-xK+%+釘lyl,VA\~Y&ߗ v^zҢc>d\6W*1ODT FwrzJve {^ed rʷTSƍRO9Kܯnug6Ne^竄b; Kl7gqAҢ}oRs.MuBOTDywKܝucZ9׶"o;ϯ&{F@ :kУVBƚxּg+sy6oƼ,1)NT v cW/m=ᡕ ϴX"~  o^u'C5_M?Qp8`ndq ZzJoe&]M2/kK#׊?j\U]P{E_)eAݓ)7[a_G;+KEn Ժ,pWhʜQ$&xp}^?8yeD$LF|E3QcIȞW4cQ8wo%H\xCċ& [W)=ޤ]_VMl& K)%JHVD$9=ސ$ݍvt;WiC!5CVw-'$/^GonZ H4øUekߢ+:촗5lG hĤ3Hr.Ű:kwY`P#[mHsلGy`Dp $ipR5ȸ&ҥ`0T̎T᪌;?0W(׷\J_SodF3kxI@@#ͿSzz^x|VZ JN%:E„MV3*MݝF#iF'5D-"w5bԖ3blӳ|Fn|$dYYHd7yyYl1>$ Wd/pOkfera?BgA1;25q?x!ЈS#6Ms&E<=οɨ̍Ń x-d11^&n7-}ti Yՠg7Q$JrC& i܏cބ;mm;mn&~@Fߏ8|Ѐ*bQ}t&#sc!~$~cfiTy%a֯ jp^-먂]f2 ] H7UZ1-ƯP\E7Yof{>ɭ?fɻ錮;bb_O[_Mga$mzO|V='cXe3, E$!rx߉{mIHwj His >?_z5[)8Ŀʦѻ$$a2Ј$d{c8yM*Y xΟҺN+%ݥh$(8{&ռs3l\&g"ZAOTY9^Lt|ZDP}WcTNkDa g׮͘}$}W㱥TY9^?H@a%qF Jr࿈Q$*`j|Ni%WnG㉳i$}ѥ`-IS|cU-g%>gA!=zuB fPZ&k]k;Iݦ Ა5TD^缲L\)z0cK *X78W1uߙ^vT ,@{XwJz!o ng{`Y> {}9zm=嵢04'b޼J~;~70`C*[Ռޛ0P3;deO 0@X 9k2 4@{sV4^nCAAADؕ&3 AAAľ7'L>IAAE|uMƃ   VH   IAAA9u-Ɓ   <9Үо`IENDB`dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/page-t/default.png000066400000000000000000000036061230033266200255240ustar00rootroot00000000000000PNG  IHDR LsBIT|d pHYs  ~tEXtCreation Time13/02/08GMtEXtSoftwareAdobe Fireworks CS3FtEXtXML:com.adobe.xmp Adobe Fireworks CS3 2008-02-13T15:04:00Z 2008-02-14T17:05:04Z image/png S֎(IDATxܱ @+%SӉKq $H y4@@@@@     #      @ @ @ @ @@@@@@     #      @ @ @ @ @G @ @ @ WR}jv733333lwqu#33333O">lZٕs33333js33333mWfffff6gp33333<$2IENDB`dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/page-t/flamingo.png000066400000000000000000000311001230033266200256620ustar00rootroot00000000000000PNG  IHDR LsBIT|d pHYs  ~tEXtCreation Time13/02/08GMtEXtSoftwareAdobe Fireworks CS3FtEXtXML:com.adobe.xmp Adobe Fireworks CS3 2008-02-13T15:04:00Z 2008-02-14T17:05:04Z image/png S֎(-{IDATx MuǏL9$EI( ^C4הRH(BfC*i@TD$EI$Il9Ngz=[78N E @ @ @ @ @  LX(&҄BPV(/TQA('JD, DCM65o:w/Ӝokk 5LXIG @ qdž ??;وk\ԀN71R*#"BmW!U9r#Z~ֶA @ G1FWy Qs{^S8]_|v˗/\P8Xlͫ @pǓO>Y믿"m۶_}ոwyDk}:ĝui۷o$ FWD8DH!TA @!Uןo=9||yABUjHlӧO֫?v6hРܷPڱJ3AU=~Ie[g͚5;f0jZVXI{V?#̃vZ|iB @RIyT=K?~!9U8DHXI{+?nar3j֊U*­~F"S>`"HKF_DwZ!)Czʽ;Mm(R$ؐ*jmr-gI{rN>E>}F[ & @ )֫y]}Ǐ,m+t)ןGwZ ;w#w}wVhma zLt?LIhfUJ?ӯW/UZq-b.'eB+H ڰ @|Ua%1~9ժU/VZt}-n *2Dug"@R~rks#kpkZW<D[Zney& IJܬ}ȩO \4m'c89(9;vR>ag=As(@]"xZrO=/Yrp6*>\c?A+zFͤd%@t~w:1D$'}ݭH uyr(@܅'@b]zWOw/y;rRC5z>_~r]HHvw^2?'tRkKlXW"$q3LeHޓR2>*()⋧u&$.D3DKovt{H涫~ul *465w* Ge!@H(-%,?J|#h*HL @e,AIYuUt~xXHR\W#hE+nsJm|?Y ~1!ok*nO^~Λ7Ciac_}}g!FrzUHR,%+˞+Ag묅@3dqU,cEb-!+{ƻOgPl+T 0+VPS"{nRPڞOg߷~7DNIDb}vg̙… Κ5~#9f2T~UAg"@ L^—R(gq#WˎYre,ȔH !6ˠs'L0D=Omcշ{ KxXn&NkӍW -q/U+|S~YWinTUS &dm1#s.:D_wΝkl޼%H*V!ʈ{v <,@~i&$JkC֖NeC9~=oٲe{\}՚}#/""/欉_zk#C73 P.lI6ꀳSBE|xWUݒTuS/TLUؕ֠~2IK,\;Yg ҺFcv:={jb?Gy7cE,dzULx,':kjd}^^ݪd&kJfj_iӦi{ӧOQ #GjEǑx""Nī 8me:*HSPy&nuVrSC0-v& +tq㞱(M +$xMZ DߵWwݤI&ͳDΡT|=g>_' xpL VۯJ+ Y8}u Y~7m+'DfZzkQUkҨQṡS)TL%m IxG? AIJOeb6lU+ (R=JYEEQ 6l/+_znݺ M\-),i|'3"WgZjFVzHr۰TH;ZN) ]MecLVZ.0ڞ%NjU ,ᨎyQLL%qU7pd8~g0/겥jgUHy?K~EY3 DIkI D'ECZ~Ȣw[sz%٠o-5m֧[S!(n5Bň ѻA1m4w]6.EۯdܭhWŋ*8?W V}C]dly&*@K%ePWU;nSG J>.NggCr40(T<);pjo$I}Μ9{ Tн|I6L6D@nȮ1;'E1dym:ӶaU7Q]FؒwҡrP!"[܊F@mÒ:*aK"$^_)(≏D-(LLTZZf1df`|fmސ뒝Zʆ'BDɃ⥗^rd۬4W9]w^gZtsVA0_Tg"@ dלGQlanj6]-C3\qAaʔ)XtYU|;9r#{΢EyC%:WB'ŇFag"@ ;dWt÷:h,ӭJ{͒]͛7!""(tVBd;shV93 VNKpcT**BHŽB0Y w\[IoKHFϞ=u?RZZPnA!0Ό0nԊ~Z5j9vMXWgG ZjV] &6Zi ϻ-U2~M"FC|ʇZ5\>F?IXfJ)dCbG*]ZAaVbE%:U53UIyv+:p}ueVET|h{ Ox G3]*]y;nk :O8ݜ%Cf+-u55T!"vʇ^dϟ|Z0,gNjW=nMxp;dqf+ruft5ëBxo^v|Zs\ 2,D й$Wj^|&a0+V2zv+0WxJWઐjRNćTcˬ*^Eyf (o&C璴ڽ{jZ 6D|zb=\.tvpBwD[r$tRvćWںuN:͖5K^[0תYH T%rW^7Onj'!h|a0T>[r~7?IիW's+$ 'p@t{_xa#+xL^)+`1Xkf(vƃ&=DCsDs>>ܮupݣ]e[x= UԫW*1[]Ň&T='L<裮zȂWe网v?V:YW2H/sDUU ,_DD=~̈́LʘYYJSVuVoeULYc0a„Gж+Mȿ-XǏworƛǹ{ZxZ^ ]8 U9 i&"*bT6XQFy>g>V^Ғ 8Ҍtzyh?WćV@ KuleRX+X`Dg @ RVɈGK8<ģ}(Eq`⦮m6gΜɲh[aMp*Dcɻիu]oOHdE])C@ OU)bQW(["lD!۷o߳-onvzș7o^/.Kÿ@ޫ.{ׯ_E1{JQ-X̀@H$F"D'DJ\I57io>So(|A6d+fC1TЕ74^ܹĄy]i[B@^HaR֒!'*~Dh5dΦM{/ZR㼷~ \Ƙ1ch/?dMVB?Z/=z7=1L\&ˆ#l^$UD|#i>NjXɖV?}…lrņ?Էot}۹ܓ|]#>|MgI"jG~8T/6[d%yFPqpez?M֭[ߠ<3!pyj )pB A"DGod?x[-[L>ݙ4i;]wgذaѣm=WToڴis=s ;_{ms>z%HO4T>]W;e#q1wT65fp\`'HYR\ ekw0L|}Zl ċ}ڱԛ~_x&Qr*ץvMv'EDȘɛJ碭y\i+ڵkW^yř5kٺuk'_ݹ&b<ܹs]m}$s(LMy#tSΩ|.k"4GW񊟇駟jM;qjD|̌9}.g 'pC;`NE`m*hr%l@5GǎGHx+։^;{ty`"Z:U 'xLDƶE}.RQEVBKD˟Fڦ 6"IշoC&(}in㝰TP>uTgɒ%g} 䵸^&2V2!qRl38BtNeln  v K[Nes.s_ X+OKY֦s%z[͛7lnRz@0'02q];Zn*56SP ,I">'f̘j2W+J lX^Lp!yf>Ɛ!C&<[ LĿ%e-avRݻ?e'ؐNsZ ω8b*&7[&]gB=lp6OpݷױSJ#*V8X\ټy#bdgQ˪މ;5z>督? F] )K:]2C?qٳ$K0A*,iBԱH%M"P>׆Ϸ?3c3mN gWDG9K9]<]יMgn;c[ڙpg_<B=XbUss]3@@(H,!k:PNx*mQ,7oj8GWe]m 8㫴xՖt'~'N磃'#Րy{*ȘgGmI{. l Dٜ7ѶN6ܓL՝T8]Wz嫴JM ,X0ˆqR$3c9o~oh @ ?0R2 ]~e}Ҏ;\yqDi[sQ nЍd}V=-wb5Gi9!@ UnQP8L1u}.]_Tzeu hR`晽z8zYb8)Sʺu6yx!ט7KGOb&鋂T [ڗQjժOq֬YyxV2ϼĪIL5:tg?jɮ~ƩؿHl/ @d ۢIb[ғ A*0e˖VjmB+ڈ6lag[l"/2ދV&hin2rz N tEK5z+{u֏緱D I~y桶h('D2,k?bmmwM䖋'/BW{#Ͱ`s$ a=]֪J7n% =˞VI'%D篾jlʊ@$3 &%:pprduZ d;]w6}э1jS. 33D@Ⱦ^";̋dn:G8I88mB!>]w ,#ڿM4h(;b5'&A&@JIM\ azS<a % /uGgjhv 2e }M$s uC$@R<a { \8po{RXO=71H(V2D@H_/4h햸4!L%d=]wȄ NHr_܀upL$\Гt]G@`y&$@b󅳅S"傞x9ф0 T2,g7Z    -nAAPmql׈   O{AAA&Bڮ  X8'  h1^   Sׁ    ^   *~>ymIENDB`dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/page-t/flourish-1.png000066400000000000000000000116651230033266200260750ustar00rootroot00000000000000PNG  IHDR LsBIT|d pHYs  ~tEXtCreation Time13/02/08GMtEXtSoftwareAdobe Fireworks CS3FtEXtXML:com.adobe.xmp Adobe Fireworks CS3 2008-02-13T15:04:00Z 2008-02-14T17:05:04Z image/png S֎(IDATxqHP@@&!!q&!d@vA_tݮe%з8O3Fvw%_ ( hFu_6gD@{P>9dlx`~(!.8sLEqJy+. pl2.o!;+Ii[Y( SuAMG)!gd0|TIۃ{wb8z0R7<ͻޣ@HP@z90puPBwWhΛվ3 eDusB]Uhy Xެ.{[F / @Ņd 8yo HU{ ߇֑#|ߓ(R@b8I髜sW8˸@ Hh My?2E$]a9 $Hؔx4/pσ[@6L[,`\g7fwCP@Ica>?W,:QCd0rv0m8*Ӗge9̌b:ٯ1$cqP@YG deo>]YUB? v`PܚX_h]_gے:;* L⠷Jn5hxLru3".( tXB%H$k. {Vyl@ H̎ۘ)X@)YxcKz[@fCG1)9^4/k+ -wYɽ$.TB˒ט4-qэ{) :ZJvkcxP@.5;tZunNWoV 9)i + q{eɽ/8T=)8ôS@xKY׀2+|ݱ*? %Qs2E C- ˔(7?d0"y㏢KZ@f)P_* ^d* <[Y jC+Kv V@F!WG qCwR,]}Ti ȍ ?y%c7⽛W,26 IH*N H ؗUfk,Eihe, H?{D7]\!+F yZR@xAB\5jqdtbVyK o OY@H,̺>{-xd&ٯɍ1^$:gCF`P$Vb3_>GH|ĂZL$aZK̆Lk,!eX . 1'_f{k#g%P37>,k@o H,eET>eK,sJ24JH>AA(GA^ٍVKHT@m 'o,e |,r̢ԝYϟe6G'}5{Y( }9e#޿B9$@ Hq cY$|~ )5̶*|) /x]o'}nɤBQza W~4} GYˊoeTG IpWg cG%$K>~ws  HCdSfE]V9^a~5cc/ˬklr=?V^lj\5*~?h>_!_F5M{+ ( JNV;+ze  HONYy+Ӯy|P@P@|YkW, >+5  Hg=v\"/xy( ( =j[u'%f=rE"@el:Yz5V@P@-Gf*G2y6kWEFU>6*I@iQ ]z2M72cD HpoݧgJ´YJ$|oϳ}rǭ[[@2<7- žYY:uU ZC`$߼}*RB2qY:ς˴ A ˗׌KZ}WFNqge> Hكu1y1YU\ ) qj];uϊK`Po[)76?J%ZPE:fv9X><~bsg- uH[3xXu WqR,dj,dzj|n"Q 9d}O C+ &SL H>cHi={=%D`0$|o70vT?t1r38 T%AFZB|}$xgz[@Cˉ,oUfV&_ }. ˎT>. Jț@ HeF,z;3)̂( ;H5T>79)yՃ@ ȩAIJ+! >= z@eXǒ8{Bv }2h411='ɓ6ΠG~]`X xqOuQ,~l@thKOsgJWdaeO`}JHrOq䭁 HZ+ T< }UѴ꧌M{^@iIwd_.*U{\>fVߓ[@@=oHۻ7x]w̓@ oW)E|c=Ǥ H_$L>-_{U!""""""!vuYxL""""""UtɭqH9("""""Z ]H^n8i:2Y*) i!/i+Pf"rIENDB`dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/page-t/flourish-2.png000066400000000000000000000310461230033266200260710ustar00rootroot00000000000000PNG  IHDR LsBIT|d pHYs  ~tEXtCreation Time13/02/08GMtEXtSoftwareAdobe Fireworks CS3FtEXtXML:com.adobe.xmp Adobe Fireworks CS3 2008-02-13T15:04:00Z 2008-02-14T17:05:04Z image/png S֎(-aIDATx{܎պVj!*T B%:FTJBQNIfDD&2;AJqnlZkc~}~>\{JR%B!B!BB!B!B)Hgxɣ  :GS@!B(bqYzt\ytW=<.hB!)gxt#t\H !B( UskՉ- <B!QCp\t\@oӪN!BGCs5Z=jP@!B8X |$OL \!ɭYB!P@88]h后+L:4{ S@!B8xJIGq`w[B!lK蕰t\t{ Q@!B(nA:ȓPpVsB!Qǐ~E a}) Bppt\t (FB!P@88O@HP:P:4##=NB!Q|5!.a搎sHH\$˟D!B# УG{hQߣZot=/ʶ+ !B( esTn";Aߣ#t IX:nH{M!BʮtC:zt 㦘aģfN!BJG=l!JqL{ȧ1`Q:FAIq#nZP:4cJL !B( EDbIg&缝rUґO7*Z1!9c,h_B! H:$gwUqJ8HK: ]Q@!B)ҠƙqG" K80A!BFD( #tٍOBB}V|ztdэ|C:ǐI`rحW͞Y2M7( B^:cu. , +P)!Ր-YB&!f @:4Sr yq p0x%0p !B( 'RSMB@(% WCFlɲBBlC:OEPBl ۣ#tܖtL(}a>"tf{<`B!P@ f["q% ""sBdB!>zGw[0HǘҡSAO`$,s-aNB!LAt0 L$dCqlkTY ז,YWofNȥҍX B! HAkk@HȽJ="%@τ" Q`,D7qC:EztS:0B!XixAՃ"p3:'>FkKu5t ȁ+阜tȭU|\R:TâB!R1@:\e. f"[#01Ftȕ>J# |P@!B |b@u޿$$DK^J+RPlc+C:f(|Ca) B A"|I %sZя F 1ئuIz;r +Q{t䒎 IC)JfǣBB!j w P{D^ WѧWBtP,GWGsPr q?nHGrqcALJnsM!BH$d/&z^Y@\cc%H*Jz5@ @.5B7} Hcj`Bұ0t8B! H *a)#!|ݙOpUb" [b%0/Cl0U끑= 0Ls$Q:C:CnQ<B!% {D-գtw:ȿB6<,͖rPP.P,af01<s;)niJ܄cIHXW.) BRJ{?LCLHcg U7{T>*ʧZ@rHTS:X 7ay*oc81+tX: #c3B!UC@D$f?nH) ۤGNCDÒE?PHd6^ș!u<؍noWI Jp鐌Ts+xHǜcqa~+Kb1B![@ ll cos؊?8 vG`5X*Ӗ(`:c)>v##_% +C) B; D"G9KHȀyȕ/du*F.w,|ᐎ1cC:F[ܦw#A; Tu##% RT[Q@!B>$l` =LDq:\jK0HNFn!c؍\:aÃyXx!+BJ-UB!tM-@*^@ZmOsϞ AʿR.OH:qH=4 !B( CVB"|MO7`K  ʕi\Cr̛7r`}_i{#H_\lj ׍| Dlx[WSsIǪa-z( B6w#pބz%!-EY_符}U{ ;Sk=]m{tr'l,N@:m 񌇪>&#Un ,ǥ\klұȤ0;B!lC"(r(y 喬/5gʺyƀObǧF4^$x* 9Gx渾-R*z]:֋nB!P@Jc8z%!: P#dv =C} ѱ `HB:dNG<0MV)sC7c:B!V@TiA @;'p>g _%Wc{-կ>-PHe+`ݣ#tȜy>s O2*t%8B!d+ oFpuJL/@o$SGgsI+M9$1ĄFE/< x5 H\u~9W!)=nq鄤ï)NЅB!Y@.$d7:^A-%> D_w<~-`#JtDN r7?^7#k"^I\Q@!R-X2)b 3󫖄\[R!P y=]J0[GD̏ZDހ`7tL YiIW=:d]J, ;(ŕu KօB!JwBvKB))9D<$_N7Dk hW=-W$Cbca꼔Uƀm3[Ҋlf#x;i[F^7 ؐthgP@!R5D.$]&ҼʣU8g71\y|+mIؒbkaJHqۨzE, UrqcsH0 KY) B) C5- uxSKHETޡwOo|Uƀ2+a7xK0%0Mu*S2֔绍 F>dʿGGa*-NY) B)@KB4u!![euME 1UWEF~rbLE+=YK춸'Jx^8Sere0mUp7nE* }2Fu !B*[,]Cl2rSq^JH"~}*=9GEF؞f wSFdS.漝r74}:勞%}Q˯1`a7|9)gB! r]26 m7ȓӵt<=BH)Uj'˙3[0 Z 0 ga  ׍|p ׍| )$xm睕1`a7|2mB! I{$ddqKTYt#!] hq-MDP=-;g\ >?TFؚK<|G2$[IA26g=:.H<{A7 #QTohV:5H:^S:L9inB!O, "qLcUVHW#3{MEPg2oB@ڑxc]=µ'ZѣZヤc"$%UVFW]#ȧclHK:Ƽ%3b@q֍%qTQ%HHN MW"3"ْŞDUzpW XWcUHR_{ F+2/g!&c%ARycEBѱVիwʆC@!T&!؁ԱؖH!BH6}{VHȧBB%:XwS`5+!OBH BB6Z:ڎR5+,Zp߃Ue8[6H]!K2>#̛-p5%j0)+ұ:tӍ\WsigpȭU1>@:~#!'hP@!`HoےewX[@s3Y$d@l%!n g쟈kU>$|%3<.⳺<~URUpWĪd.!wZ{֣|r:%,O컑sʍ!:]!%;!#zIB!V#od/d/>hUJ̇puO7A+[X!O9jNA1_[2o<~v'y FV '`|<3N@ұ*t, X8=ŀ .*w*ȯ9B!$x.o|X dyN/ջG!!Bt>:r=$dglF8ϧf'|'rEr`@+|s炕x?_lr50 IgqyU)HsrW%\bFJ$ׂB![@"7m|!`TKN7dRqd H x=LwI_l9&Gv$r9#ބgrXH\Gp.'"7!0 pY6,. 1Kףo{#+;rT/@0][:vDr]D( BIM@TiWJ[49kUYtY%]vOBͣJB?!NAl;|V/ Cpϗyۇ\Hމ|g Dsspi2AЫ'õdUrI$\Etb7B!2FڒU,Y c9VDY To-Y'SQ"es73F>&̑\MiO?OVEypfUn2|x|SjbĖtؕ4wmB!* ^%![vKY ٍzdK!&6 Q![} qߪ$43ϹbUd@@앎V!0B!.I!–0zuOwHy䅼dQ|^[B?{hh6u!GvWsy'<E2UYQbtUǘݣ]+-\!=B!s~G 2 /KBؒ5ȑ'*+ F9ƑmO:UI\"-W>swU2 CV'ԚB!gKB~(z{`fX7-YXu?C.6 7 ꨭ - x8v*+[r$I)Dܕ$k>oWn 9B +8^5) B*EH[V@D.k煄-;Xr^ In06S! OB.K8.j/CC$)k$0=y9g#4O=N@:LoQ)ί_եEI$t|FB!s=_$$ʖ{({z-YTY) X I*_UA:E|e3lB)):0suIq~6Nq@>ՑD&6ov-:R@!Ri@%!qdu2Tp$^ ٌsʠbtʁޖUgr3⸇#d!{t4Jqt^+*Wb&ӈǗ+\7B!I@u[Bj7)wu>L-\ibawHq*`3OT<L E`w萎MGsVN^Ya0^SH>Qj|X#_o) B"$Nldĕ2$ yLU,'!Az|JDY<<"fҾ|mLJ]I@y:f:/0,Crs zPH)B!B@eO;jW^H,Uy!6|TA g{W>㳟ݘ!*fPH" |\#gtB:s( BT28B q{_^Y)ε7$KS { f99 6/r-!P1`,y02trǧx͇t߃B!T5K>Z^]ӃBtBS\a-K1@(*Hb/y=:.}cs>ҡ7l<˂2~HFԒÞ =GHz< !BLJ<~rK*!QH-A|.y?Ϲ|>*4F.V 1%)s?!& ܥp;U~]?b`B!UE@R]#ؒhp+!6Wѻ@-W5!8LmVx![#Jl 8"~PQ1I:UF]H1$JGOiUB!D\ulZ!Y%HVJkyqS`}14,ECJUpYJ!\+c)\%OGی>!'< Q@!R.1`.V:&|n*|ZlO{VYoۀro%"Jǫ: u'K:LS-fZa ~]c) !B*H Z@. Q03I4߄{<=7?C:qg!{tMYތr! >ZRʚzEFP@!RYd+ް X@JQ~,}[uV qljaCtLǹpHѱ>xK:>Pe;g*v#zh ǿR@!RYoBB-@ 61;@|sO>i9{J!W:\9CМ;͒}(Zf^>Tn7 %o(tp&B!M@tAOa]sqz̤?^ZJo1o:>wN}ȑD+ìtt糥ѱ8) ~[aX[RC޿[#( BLr7@4@A:U%:o;r>,:pz~{{sܳ H鐎]>۫ZX\eV1UŞ'!lggߒٍOH-|F:uB!T&`HaTѹx5h@н `Vh~ܟ^1ipؠQ:^wmyt/N0ҡ}O75!c*ecB:*F !BM@oZH;tXJ@QK̽9Krg t)W9λ!vܛ򘧦) zfϖ){Jl`5RJ ZP@!r [ҽA.zYF1 a#CnrwtʗmajR:Lli'S%UK:@W:B! @B M*FJ;λq|ϞG:֪=>;}c\6L*ty۔C|HbIXN!BHe9x*%A%DK }G<]_F}Փ\S<}>1tUOtUZ%%)v.!C4/)d|A0TiKXB! HY;7rEHbUCtXπr (B:dNހk WrE'r&t| LR#笋xs,B!`sb5Bn +$1's|ntȭUרɱ%߅:.SaWr lg ;yȱaoK GܡݢE|9HpRAB(I+tpdqppppppppppp=|s ,qGIENDB`dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/page-t/image-mask.png000066400000000000000000000036761230033266200261220ustar00rootroot00000000000000PNG  IHDR LsBIT|d pHYs  ~tEXtSoftwareAdobe Fireworks CS3FtEXtCreation Time13/02/08GMtEXtXML:com.adobe.xmp Adobe Fireworks CS3 2008-02-13T15:04:00Z 2008-02-13T17:15:43Z image/png \RIDATxK @q, HN$T& Αpw_R*IIܷ[b,W I ,Ixh蹋-Br~v5'`Mտa>y*:/bd=hTʚ3Et2KJJ~ݵU-@&S d ~- 3 #D     @@@    @ @ @ @ @@@@    @ @ @ @ @@@@    @ @"@@@@D @ @ @@@D  yF$fIENDB`dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/page-t/light-trails-1.png000066400000000000000000000677041230033266200266520ustar00rootroot00000000000000PNG  IHDR loHsBIT|d pHYs  ~tEXtSoftwareAdobe Fireworks CS3FtEXtXML:com.adobe.xmp Adobe Fireworks CS3 2008-04-29T12:18:24Z 2008-04-29T16:03:26Z image/png AA8CtEXtCreation Time29/04/2008trjIDATx,u?Uun^\qII4ff4+̓F6_uL3&dCItVUfFouoʌ×Z{> A $H A17|%o?x|nA $H A(v $H A $#3A $H A B2:U A $H A7I=G A $H A<3P $H A ħ[b $H A $yC; $H A d $H A $Hɏx-$;eץ ~GH gc p]ߧڿ΋60i1JOMKo4x34Ki~|A $LyC*)AX%@ mjjbllа"B\ MR%>;h,۶Q0/ $H #8 A)OJQ @c%`TkJFyIf=x|Ԟ]ǐƾ7r|̂ī&O.Ly A  XK$mJ/5h,׮X DC״!H;&.Z]|&>|)Kϋwȓ sR,B7K;b$H ABXamB>EAhBHiKxBej[l qT4,J6}iS"ڐo@wA d1du1XiwPm !Cڃ[ZBy&|T][|l s{ $H A29]=@p4XAOAQ B%w`贄t',!.ʓok~/$H As'#n R ,~唲tQBBR|\) V\,:~h;.H`' @*H A,CVϻ7fQ\ !EBݱ.ZyJ}bM:ҳ$H A.9߼@~6r^4\/"ˢ%Om=BOѳm7G/9 $HCȫd;@ba 8yv 6j `0a BBm\K2~YF=_þ$H AZ"-6`E B|,1N xߪRa9$ $$ $uȓ?@0 HpQYB DEظ::;FP5`?BX<V A_n|5Á2F=By(BF@ T=3W]tnȣq=Ǻ6  $H%ȧ@\@HwlHB!ĺZ*N$R#pj͔e!KQ\t>؉hMÓ? $H 9u ++V_ 𒞷,IMsZT< ňqoPreDžY6-C)){D-aqpv8&z.l+I A @>@zFmNѿ@_w,!+AQ+]!\O L͖uOkVfg:`5A $q3gZBF-R"sLH Ry FY+?)8d5Ohs&1F1"R= ? $H &rWx  H7cňstΩvJtviAjw_0~3슴dg @A $37@^b}s!ƃAHBv~ ˊ0sATkz8_S!$H Ag6 !gE؝aKHުz!5 U=o+s,+?v}M/$H A @'PuTHHiK`#W%-&2-͵VvnmOM[rGl,NlˇgA $AW|B2Kpf z&R5)v !q|vyqo z^@ meyQ9>ن1$H A<݅<ڈaj? 4wɟbì\$V=oq*6OeRRB*i<# #Yܯ%m  $H ܱ_r1BEu@ADb-)ou\e[Am۞gz.BhO[n!"/oz 03Md$H Af_u Y#Nu깎BQ Z!>+KHE J01$H Ao|1\|g9B0L UHuԐ$krL:2D҅:Qu Yx,])F!9yL}7 A 2;?_NQ`J[G|j*.$y\!Rֈ@CnneT +M+u.mlձ; 7ևA $bBPTu\j).pe3C̜pƂؒ,㍼fTĐ]~5D A94|i؃ҩ;BHAB $_Brj. HpW]۬@6o `~'x /&}l&H ALG49p CگS:CLq!TZbYI@2<6m; Z8\;N<&H A @ο@ NSx#7bDNg.Yl"Yܥ`o @ ,u߸-&}6? g O/C6_4~C $Hr7}4~ A .YTҖ`nBHWNi!yL ʡ,.3P-'ܰs8 V Axp7dBmI–lZK H`NkHe Ӡxৎ`NkM]smկF^-;S5:w*H ÎMŒ~=X@䚼~-uB_ N7"qCŅ@x `/!.O[G/=-=&uo&;+tTsqq2#,5ly>ZR{ikfן)Ur ALNwB !T>rɊ Bޭ!HHC ﴚEe*fXZ][t ?@m{fv1FUZcCn8m $E%n[xiz~7T1{d#h,,! )oK){kHM麒50T| `^D^aw yT]ac=]%H 0#^@c\z9eY ,YO [VD&tIƬ-fh No׀t?Y+68Y8ۇ̭w$H >s ȓ?~ hGp:Տ%# \ t.9 sRʖUB6 έl{G̝Οo`s]/cR2{M=2n`$|3~yn<f:. )\*곹de"[ʖN5D\js8M Z4AQϽQ+P z ##?z c\!dLDҔ"WܭN1c 2ЙxMSlˆŋhgqcA$K0zA[AϿ bQl?Np8W)9(B;T0!o 8tm2BtxA-k&׸ܓK*8=* e YA&],P}ˎN *Í6 Ҧ3ƹfn#&&˾q d0-ǖee A\g ߦ=q ;:d*-@&r!U%ZۡUG g z@=rz|H D%Dl-"15 ƴ%yx75Jx},^S( (lhKaoa>, 6`tbTNϟņ!I]9BRy[0Sq쏩{\KΙg|L0v+3mse-s<- 1y^Y-?3S) "QC?|*F.z!Q֐" kH  0K0H wFƬOZ& bX+"N[𙝼=Nll ͧ9u r@f7KY&Km p3oZFC6 N=m nԫ%ņF%ބKC {&;ZDDFst[{1r8Lvc?DPZނaZmug.ࣥ0Ozd|?@i׽рr@ۧ3@Qs+)Sؐ5"q .`8sQf*PaL@ ]DLƢ4\X]\<,5AئhkH;d1 4h}yOtu~S#^A-?H%1Grh>ti !cJlg֐6 Dihy[O[D$o![+tyA]QCw 2[ҬَnQԇ,62} ^i.IY9Yi&]: Y@K74(KM A :H]Ll'۠^֮Y)Mak 6ܳ\ Xgs% `'t!'><ɓPֱAl_8{8T\ФSt JnaAOM2]m_C\27?ou꺆v+D]R}q]n1Z-(VKߘ0{"RwaPyD3 \Oఅ SlYnj~*a2Ƕv`q;/09Ύ{m ԩwon~5|#,= ) T~db 3kHD7+`k SXDRy3fZj[D`7 ;n\ሗ epswq AS@O;6|ip`w)d3hr-nNx3wxp.Cg;|Y^uAȀ5 Φ Bܲhљ[D8iI݃MP?t & hԵ𙱪=a$x@c/M '1Y)djMW1v%x x(fSX R`?4k? ifRkx`%ߊXJo08Bxp0 13{ue uX[ev{ajecee9>ZʮZ>Z|/|PkR fk%46 DClY'YpD.5H#ߧbE'Ymyv od{S -L?%kA)xלS5H&/1R5zpb"N!*B1Dtݰr ;1"㸟@dw1U` ﱏ,G<țLӾȮ.Sdcilȭj,pZG{\Ff\kgp喕LgKX;դVw;TIwE R^Ae:OKY~9sPآ_O!r_B@hxF_m%#=׻IuЃ>FCT!Y wT^UU06ؿܿq7XuE`:ۺ^imG^68:,⎦ieši<8AjxV6u>;hPe2TTISBw vnjk#2іnϥ=&!%Ut=4f%0;IrӮJܺͭ@YSdp7עѷi%@VXC @ǂP"FG9Xwҽr/̰{IL^i2b4yYY멇t [ :V9 .Q1 gkj%H6PxKd6Y c2 [{q0CB,!9Ֆlӕ1Z} [54.W<>Z@p^`gac=-Gy|(&vH5vz3hI 6ԶYLWLS%iCea< @ǰ8\Ƹ v&kyK *kJ_5dxZ v uQ\9uْQ Y'H@ ~-Z, a#Z3d@s $a 1j(7WJXDq|[]~ϔvκ[VkS7mS"1EiADncD-dIݳ*[= MSr^EAcc>,٣@uUhX6ؔڜ4I+J(;"S_ FSHNj@"{]:uj(FAL 6]s5pv3y,!){3 e˪+N fDg)@$m#l "fK9:"ݍCW"cPȂR,*{1A6n[d~gKZ8`rJ5`̺K߀aT,[XDBw0HF3_7cs7Ȳ] /D SjĮ2l;Ȏ![H@/~ݕdݮ.||r<*C[ol6_a2߷iyG(W2cS"*Ulݬ@wN0|Q8…V3JN[Fz]B[7Jv,nu|D#ܽO#̸ [eVA;O,A#*veˆXYc=cD&ѹqz QYBYIIbxגA7Wr 6@ !HeOZ*k2|mkO㰜KL# ɀ.ձ̩&|tA߫і"g=]Dkޅ,{2ܨk[ԆT@"=_\Gݳr[39M}FzgnFU?'g8"ge\“;D(Q,dI|u~0*d` B>H>%| HK@nރ8d!$e?SWIլ'`:o7 &X܄5dB39T eF-q bap&8q&E6]uUYҔ_ڣ}cE>|>&KQd"t ?R׌=ӔO4Cמ(b'Z;&V 7 LCJ˱75.Ka,$';$"RRe[NB-P(I`NpyG r ,ZQkLbIz ^7c*A!ܞdwq?";H7d* 4*֬vP|-PTEpcSJR=Y<`}F2.QleřZl4kա\_r,:2/xtrCj ~Q> PY34ve*E:Ā[@| EysHׯ@ρPpU/}ɥqQkn*\RH I ei%(M4 ymv<۹U7@js}aU$hֹ_T*]'YdVQA,ϻ4N`}}<۟"FrE\6Jn8X >b3Rz&Uw䶭٘7Y&+k#9;-jOIh޻ڈr]9A"/Gn5e4W(yͣ?B$؟.H1ϟi#q9Cq2fA\*fxW ZbDb\gaD-!y.+]ks@㇠8:|w5'!ras 'ZInݕ2\{FHD)hjdA{4ƅ6ofϲgmd!߼%l #M#a7Ksu0G"4vjqnV~c;ƺXq)CD#ڽx3P* 82Xk Z]G7u[-0@FTE@2OּqV.DJm,$/?PO4]Z';`{֪[E c<㖪KbbQJl8Gcf*{:\mFb!@H YT:M3Wh6)L琜}w5RqVڷv$.X.Z@qؐj醫q"kԗnM>*GmIUD"u[E<2V(vnYmk1.ۥ yyq?H_MD_hxjo8s*@CoBzR(s״uiW>wp2he)e>zU,ڿ G|J>Aw$}E^)ɤwܞ^\t)+C6I r<ɔod+Yx$hkיFV@ZZW5"걈p4CAȅ:;l} ߂$b zۛQ\1IoFؘ(JK`=H:"@=keXmNy'Ue}W[g Nm/ 1~Vϊko0ƒ^^ʽ*۟ Oȕ3UQ 6ѹvy݆A~2~=-(%W)W22ϑx r!E˰OrcNA-{-nw慠Ǡ(}\ėLn*E]ռ&zQypȱ:Nmb{ 88d~MV.j1rxKUMODW?7_{r\oԦFjɭE"!o>폧u{/&ݸOpnq5x)ekn<)SN_@oJޟz4bmɈհ eՈn֌Jo2o6,FT*i舴+/ߠ*F걤y|h&=Dw@C@% l'XIn[wHW /"]~9#ArAO2pVQ }֓:?> "V˜BMg5F2y';D "Pی"|[_WuC%ns(?f<ӹ%:Ĉe]yɠ[@h}~ڒjwCU֫Vʗĺ΢eAF- l &awi{l8q7c[<;5v,].'GɻEG^P4n8*. ~iys^Q0Ԯ̃][7(jU`(Q!tu! 8ty3L\Hm߀ؽ|h P!(Vq_TnWq$n!]H/A^R}I[Ia%1-%é姁X8cͷX/ςu ux=mcD=dDZ( +[ESߠtt;3ܹqS" csvk>3E~jkEl8q9LqѲ=g{!@?@V?ؽvc lQَ֯hU܍F"&SpU 4V*#nj?h̊!Y֠uU{@jײRTokKIH )-U]YdꞶt]F-Vn`r^!}s@][8"F$NKVm3- 'uW?H z{.AHyw y(8b7=ǐt ,Y>~#o]B>u;u'q7RÈrb}.Z&02vRbts')҈W;l-lr\VWY~ A|e~L?C~Y[]|uځIXN}:T[8²-IJ: *-(ۊ n[oRF{Cl}S5o'msۺt K?tr˃ؼyՕլk0KG.b!E9XR&RJHze R+%Aݻ,ݥxPbK}C+RuZfEB}Ai!)cm1dAoܶWH/E g| L-;dwEk#1⇇qM+s*f2fczLJK-y9ȰỦo>䰖9b["ycu۠ dY%cogH7ݪo~f"I."С:]J1n?{2ٌӸfB8 $_@V҇p$@琮˕#=[Φ)Ok'kh1DO>Bs#5L+>(s8:{D^r9.X+`.Dy\(|.ڇq]%Q8qK|EWn^CrE$g_EA$NE'j+G `> noirh-Cq]Y :JaCd{QdOFc-nd8Z&d;>GO g3lU} e!ٿv:+:h-qnt-yzRͅ+n\f. ;Y(b|2+8ؿhD!8xhmp<ב*/A*< љܽ'Yb'\ڿ#1+séM5([!Q*@SUFڐWcF|g2Qa*0$b`XgideOwn`ŕXk|7 F\Z kct<ղ;n7K>ؿ |އؿJ^hHHNHW/)]߹= B,t6b//na4YD[@ȟ`‡h>`Ǻ% w :N:]rz9 hC`psAP8:B[ ; Kf%f;)quf)+ #}®>))Tu5Zq\IQ|"n$/|Xj8wm(-*Z9?C?F=hy!leԪֵoJ[*ɷmkw\ֲYtϫT'#9}|?YƔŰ$`FAR]Ue-Vj"`ScF*^ g#o@zbHbSw!A?JRH\ \2 @sHqÍcz62JAw@1} ҇!(}K@>Boe۫Ayճj:JqK`!Khenb8h_U~0FTH}y!‡LQ}`:OVƁHsGl^;fQ9K*wu"37,f)+;CX2R\ۿ|o8DZ}o7F_~'߃TZ5;-w _Gr9'_PaTǀ p ш7fT4疎UZ 69dr8\oݵY.uZ&knV_"-$ɇB߆H>Dvz݅JRg:V@6hb S/%Ivo>hX#x RXT^gq}_F~U4@1-SfLc-nhekS$כ]>] 8-vU :`8 N]%9 (sՊC֑BR\J rO.LdNqž甅mXmcB&AI|tMruriϾu*q=#Me-Yz37l.R\Dgrl~(҃gqz`viש i }+P-~C .rV {BėiWMq-Uqu2~^WsEmFB# u/q V=9>}ɻp~}׺Q,暌{{n3xw$&ST͆`@ۗD:]%v*|n$ .Sivx {O6&q臏Tuxxs*:CpZ@l`qSY;N>W|2U1t Ժc_d2lpGSyzkU=C[DyFۡ pWrh h6d=_q$$˺ܕ+~ >Ti bܞ>V@"KٝˡNJ!ue&8zFA* c G_h\Ҹ4p_"ham^^eGo.X@h49GZ!NTb L(ZQ|=E(+2id)mD#>,3Q1Tͼ>Rs(f*b(_xT.xuٗU<$Z{TL2ܮhTUO[sr>v<}MsЦٌ=vXႌo 850ec#PP=D(Sy*"ѐ3TYIa(Uza)n`*݀\T 3QÝ'[:ʛ6ܹ!\ŵ#[.yꀴ+ռZ@.@Xxp`x`kn1pXCQvŮi!Ev-r1J]z" 5#W`c}JfܩM4hc:o~-ďB. 7!eϾ n54AdT1!SӔ_ͳݔ2(ub=)/t4p*{I/iS,ÎiiK6fkVr &jt}JT:`@$T@8"PA`3Xә9쥭,NA*;8Q RLW^f jcq[e3VJ2QbfF;$E/tZ@:=@H)sڔiQxm3,'+U\ }a-Ӊ#@QT.m@o\s*)9rSM[Q|^ˤb_Sգ3R.e>?@$[>S ˤe0#h{`#_X!9٧*T:V:~zb,N7%s1EZo9;~]bFWhn-@SBDGV_q ~ {<:00&b8a2o+u+If \?20P2u2WPYJdN*mExR;Zv Q[ď߂ ~2 ?~UJr AA$]/XrPxSc3jl@9=zLv^$|.(9CIg׮>s[tT~ jl;U~wF,Xٔ r3wd'sxy:h{H- l\o͊.4|rF-Qn,%% CFIy W2TX.1 e80+Zbsa1QN;-;kt< 3s`ݙC:3]sL}I)U|p[@|p 2ߍ:q<4TxmKM-%rrDQܺC(zR&Vs`nr4_?]|{GkK:w /诓aT;YH[l Qy:l%&(ɍzӕEN8: $t 'gvq@-C@uAZ:j8- Y~% V#gwf`~!݉#wtc}B>-4~5N$F'q() ;ŕZ21UoȒ>quq- 4R>Vocq~ɍTzQxbmr+`!4sasRu Sh pXpu8(q) q7nP+Wv-n*:sJOtdwK/GPt62uXL8/ޡA%t#Ŋ=?Ӹ9x#mHY2+We_?ܸ Fd5KW2_I6`JW,zG Eg_\ZŬ<]d5/.*A# *=\g\v*d:GwP2}v\z<t1cm7~ bqұӋmps<{ /u3ؙnxDS:Ԙ 0FLH+zv| @|)+q]B(CvwZy ]ȓ2O+:ʖ;9 mJFVoRf`#1:VBӯCķJ/S#2Zl>qgbD"Im3rh6~r O7bdX kYӈM[~MB5KDTrAǸkֶd8 ]|!~ zK+  7xz2 U&Vc gC?kuՂ\]i>ʙ!\Seo&  t:,_ 9U;,f}!07la|B#;gDh;wJ{j"+iBqMN+vB<{ՏE@/bc<12*b1*aYϴe#.uF68 18c_}{: D%$WU`Khu3gO)8pj=-mzv;ظD[ 0ذP`DY#*U{*mKsS08ބ h. ^y o& 6ULD8"umŚQ@p#sT`s89hiVL6HS m=7W@ru>ܧGP"`gbtc ~`FΌLmtaE9)Rۑ@CA\ xM )Y?5-&x5 Jf?kE]+1};<Q ݚ;:ÿi%dFV 'A,%Ұ(T{y׋Bй -xan\>9ʖe%$eB!|OTwmlUtnwiTJME#=.~Dw'{7~'Ń*V@XoV}Gnq԰#B(r}<6kFB EEHRk&6Y3!\|]^hɝId5#>dwGΎ6,Hl  ܞYƻgu b&iaq0/ }1 ڒM jE{/ !w1VH/3H ?lW04rrP0KA,pތddr@,6bfֱYwÍo~5r7Q  mqz>8z M5v\[IwmûdTy6@BB G0"7#e` b܃A,J)u),܂<{$rkf@,_ -cwj^{x\KM'.&K{D o<߆\gֲcll r³==Akb7lx&o~-\nca0yy3=#OH R!!~bsHSbBnhI_c1-$H Hl h{rS|ux^6}cI=LjAvDP?3-|[aBT>H/Rǧ~sHϾ~ @/aIVx|eT٥ib@;h&@^(XAss͆^Њoh¸4H<ζWZqp: '$m!8Jlxy.fc{U}H˼Io=t8e. wo WQ-~;-^w<ϓvXɰ6OڥqƣN>S`FLdznOW?| ȓ`\ϲLYViIuƼ|5D\]f, SJ'}GJ)n~}?qaoQIT&ݱJXyxzXދO/̞O]"JǥW#ŎNf󵭀mL"beT;rݬ_Oj5MZ/</r( $ qX~R:lmRN>򕭀w# gL!5NfR M ԂJ.rF/XTiX@h 9AM:Qn6_Z ȏ+*+^W[M9v\틜{VĴPjU^  & J8FՋ%~SioK1Ӥ8=@'ύdòJ]$ YkeT n*b)>tɏV:X{X@v fͬH˂( 4E#O*^dL|،JyE2=X睝6_q&>Q$)fc3ky{I=6$DYp\ϽH*R6#vGh1X@",w8mNh;\Rd2xjZ@~&Lݽ$ށE}]d ~-[vZ}j- 2Q:ߴ*Elyn} 7V ~0'kit\Hs-"u򵵀BD(VȩyxѧR@>wLͫ(a |g7))t@[[]( ~_E3*jtv pNda. PPPS#Q: rc- U _mX>4L:ŵ,PrED^&N@ %ej@` w,fHXDHE<f% #S 8 @njPX[H\. KcID ulW_vD C@Frct@IENDB`dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/page-t/light-trails-2.png000066400000000000000000001200471230033266200266410ustar00rootroot00000000000000PNG  IHDR loHsBIT|d pHYs  ~tEXtSoftwareAdobe Fireworks CS3FtEXtXML:com.adobe.xmp Adobe Fireworks CS3 2008-04-29T12:18:24Z 2008-04-29T16:03:26Z image/png AA8CtEXtCreation Time29/04/2008tr`IDATxw=Kz߇}9~7޻l"XE $-(VI-2]lVQeVRpJ$KVI*'$( ł",霙~̜33spAa;gf΄DF3" $H A M^c"\K>[ A $H Az D[$H A $HO  A $H AY[aWA $H AN>GD@yo$H A $H*^ $H A $Ȑ3n A $H A׉9܇ A $H A,C $H A rH"$O[Iʶ=ۅ3`;խP1=uٞ6 {>/pc $H F1_s[L,}ZF%JB%"10%$!K:k ܠgXTQZis%]SW PPPJnC -at@6 $EX`U$8IuVNBݨAo)@LvC V9ۧ<z}<.w~ZXd۰)n/H Arka"$M߆Ԇ]5+^QoO4B$FnY@R`a bgC%^c<s{:w0 > =$H AD<34=I"d)%HL (  3 n 0vg χbY϶]:|(>bb욕q1* $H"W~d^ʖ6?zK DsB'YEJD/%{\~<_ x"}Pa=Q>//H> A ˫k["ǭ\ňDI\ag`NMXh!nuOnϼ`Ҭt7x }[/H*y=$H A et[5 X ( !BؠoPȍX9>"S$s#L Qʧ7]!;2 у $U{7{Ğ5"*eM !zOHss@pYd=4 /j^ CHI$JYJwړwEV A dh/?~H RL8|NFb%tf!1'd0,%۬A ,_sr?w dyUn5/;ƥ$H Amwz+|Ԩ9YBQ[zDC|39WƢ(pDXzTU}9!M׶̰!n bzRp{+;sm $Heˏmz{Go{8-^ f|NH ^\`)+zHzCH[M޿NSY?lp |lyn A q^NL?Mxu/!1b!ØC,AHC+R?oխ^ϽGK8bUc1AP:.PI AY e5BeQd lIqdձ4*WŁ:{pr}y"_Fr!q }[j 8@H A',BC/M'u"X(i%fB b[M,pKvg#Bߧ۹q=ަt)fLHO:7 a= $H K^ oxŒwdY#Po9PRCó~!ɺ~; |}iuYR%W5@(d]Quul $HeO{&q• 74[L =B=eiTrB4zהdn,y CXPiw;u# >:+e"t!UsG AH3d4B< TJyD9 q!3RT$C$;x ^J?_diI5LKps1uAy_@ $Ez!4t=B O n(Eu3{B p@7 nch E:ߡ*3.Ş;3qU A O5 aé" )nd4E2bt0Qߨ"lQ|)y9{NoA(="ٜ]>zvD A r|{@` *"XĂB`7HfBP:dpc!mm$A13>Hmo-)x'.u! Cxr $H=d[}>Uk1dP$H A %_4BH= K}G'/V2LJ̤{, DЗ!쬸qI[)4j(KtMy /rQuL\چy$a[] 8H AJ-%H?Q­ BʁP-to aMh^eH $H ˑ?@9%9U|[3U䄬DRO "Tfez%!V&*?ܬ|?5E mCscwQyAӏ]w(FWKSOJ{Y A U~%Lu&O~ZxDcBԆ%8MrABYRQV BTt~} Moߡvѳ┟aa/4$H A[A; h I!#!gX#w`@HI Q+dUAvU3R61tat>˗߷KhW_ ^ A r OzP(Bư!dڎp,hXJ. D"eλWdAj鵵&dG֊?0!A)x}!Ƅ\]K~d?cu]$H AΆ_򣝥_?Bz?H-1aёyB Q!]e9$r+"W ";*CtпW3C?ʶOyx7H$y!zCUW ևuqg> ${G<˅± }y_9#4I! Œ$L2$x 0[*f5)6!Y>Y}cfEumuUx I_}]{z|A $HǟR{ r8M%R M,bF 髨/(w,-!/J*ImAȏqii aLܺA!=H A -ӛ~ b@1A*d"DX#D l]=Nez٦p #j Ҭtp]sMaKzN=Fp.|Aës1?Pz $HO^a!*+6|@HD'yaI$KNWC [@neY(XCt-t<mm}BѳW-Y $H A\@~_Y>ԅbivd cd$3dRU*#~h[Ia`§W{_>ǐ-ɫB&KowT A Fg]YB""!IqJY뜮Sl L_M.(͠)imcω:bm^0سp@W;f}VRs}ig[iZ_y~Ɏo>o? $2/߹s.+ gE8Ia=Q9E "tҿZ] vVd׵P'5sc  $HU'm߼!XBHeSu,(R Yٓ}@H/q $l mFoW󾾔V5Y@m? W-8$H A!ooݹ *TT@FvW(<@T$0ސKzYHqxCV*{;غ 7*Az3J>x8fmp6 }iG: p@$H AtWy2Iw]$K|㈶+<&CM0 $HB/x  mc2x<`v,Ja*DD*典)b]30$8LR$KO9~4emlF#,+ߢR5wB_n}Ƕ}0,$H A:?go=!dܗI*n l"Ĕe7d{C y9]W)C4 -c_z=O Fe|MCqnmb9 ߧ $_x/K b"uQl¨P+02o8` p")GiDb&fQlu*vvPlXvP Ma w8!;ίaO}|>cpgy I A4*W^13RS884ORG@\:W;7'v0Иl-f},}S:ޫN]%獴 e> $H yT +9g ;@Y!"!YD(7/7o<\RA1]- &za30GepAV*aa5, &kKV#ۏ$70sV]ﶰzލ=/>J%n,/*~$H%UeNK^-> yjs!u/BPwL(JD<5# qH)Z,W,.aZȖ"%ٍ7؜GGww=m Xؗd"yqG,vAFkuq˅˾?}х6_HOo.XwX7${]40<{39"UHЄgBʰҾes3B>S0W9,K I1+fUvDa;[[5<.WO:5\?n߂/̱%lUqa $Dc'O[Wmת֡Œ}焦L/T/pdʞ*1I=CG6"s@ʜW@$쳒V7•m mb'ڶ-4Y ]~79ʾ~jxI$ȅ AsmW-Q{Qw(`;E3|='_$tEAWs9@m@a=V! $y~,I*0 066T';X,[1+}>-6m]ryͬ~T Apt>F<%tyj=l.#CD>w_p!an}txI IDl!yC-rAS$i** HXg hð DjK%!~u+Le7F|: ߱.$U r:&y=pAYzvju]FP_y$.D}2A _D@E!&`5p}yC!ɌYYO) X&H94]OMԆe zY 6ԓK7.>$H 8.Ap鳜<ۼ%@!>Hۇ@#K`<0*CHRJ~ !RluPWId7L+M$^ۏ }.u;y9:>ϖ g ㎽*d]͓c& "ds)UV?w2ǂPSoLolYP^Kn"pcc5R!4Ca"qJ<-Ӝ,.}e~`at鬈~[f|7ٶoa5 A .7E.Wݝt'Goݻt az tuCmU 0aOj[K_}s?oSnIKHS^Lt]4=0Y~aO9EXVpwQ} MBkTADjBiC" Wk߮J H; !mdOr?p !3ضPgAm50! p$>I uQ.r/v ŵDq 37mᲝZQ}5z3ȿ{>U)/*;^nʟ*El90վt1$~"1T Wx)lLh'6+fscCQZmemq5R C>t&hkT!6C4h[M!k. Wcp?>?w#dpQk{"gaK9=tMP?xNB?~|= &|Bly#DU DXn"(aYėDfS73jX60ae(Cר^W>F*ݟyR{/ٶeCggK2lFJ& j%{@^v?iCH:O11kM7]C3rE psUAc.,xLǬqI5D?#mXֿg׿wu`HF CH1!^b DDaYFF"A ,~"aλ1 ]o DD`lP-;ds>B3V#0 u6AEh$c_o&U%͒̿Gb˳d/.Tm9.E},`sxXxR=y#󆸅\1m <_ ꫨu,,j;u0:oJD1G)eQ$8K%v"ŋͰ-*he1| FXmi~K\E,pumzpk c= 70aeMGWDLحDq}z/Iy yVvtOn7]q=fOs=D˴*g usqPNw"l|y%!,J OY Xndz%{=\F5?AZiB󒐵a"[ wgZշ1(-F݁!gA.͒W.ÇFͰY&i%yz(wֿ@ǧ7W_ezI<@t >p-Y~ Dx{aXGA @$iz-65xQ_V۲gkGݓ5.Y|:o25nX`{APMW۟+\t  fH %ڿ±ltK#oXH!uCi JZ{j^JY)-)54j-Qk3"`LT(3 1N%`420ͷ)r[h \eMuKzχ~!U<G RRU*=sun+ګ^YV YHJ泃BEN1V8z,!4C)23)3OҹG$U[F+O iW5W[Ǯ&=`nο{0 \^ypJ4Gl<*ss ~Tbflw5[5Mgɲ 7QPaL$~d#"rP~S)$ט҅kKe@ (ߝvre&3N%#eEYqs8ACTs=랐yNGW^!d%A&jMjfa6pc'$qu*%RRLYCV``CՈi KC@F^=m-ǚ7Q.96BFoX+tƱZXцcS0-aN0ѱtozsHC e() }YkLqlKb&ʢ"XXV.VQxC"" Ma,<$)3@(s *UB 2pZyAGH5/Hyh2s/KSRnbo\k\X0D)K=r11Wê-.,rj3FdI)g$}$_jJTүMsjP*Z(w#E9֓!Rrp!YEYedd<[8(9JE%.RJ aM)kHƣiDLf8xAGF.J T`7Ї5/^y.r@Uw-Iey2dkFJ˼EB׌{I'#2Zܶf\67 A^V֗`KK*7[q1;(zWsZÜ3/[3Bގ If4U>`D"#a""Fέ)V#]RpM~Ab#Pet$6ZR=Ni'XŶ)bm\=At? %\$+>!Ķ@bgqpXC6Yjֵ[cBƼo`l3|*|4u!_?#?@sbsՑGbi]G[އ iG*Y b%Yh"Y>l"~A@┛tY%0$4A$bLlbW<#lncOQq$EX+UEQ&k%%5B*I'ıS9N^|d2ڠVZV yW"КT0-DFkZE ӵDG {3CϓJϓj^+AUJq OqHYkAcc ܈ƻى>65όF*/@vDbon"  JGRҬv^=K<w^ `qb#0,a{$FA~U9 @KknZ١ΉR,I )xko!Ƽ1SD,|JP^N$o3&8 t)#$KchIt:ptsw#}/ ȫKaiEU J JYᡡoVusE Dh簲>%*ygpB#v!Lp6ծ匬Bi s4-52\tTus@GX3 HH4o  N@> `nn IEE+7*v)Y#AX"lcQ$j,I29I~""ōy!&`Pb<˅[{Eq>%l~e|afyW~C}C(0bR_#bbBa۸oa`ܻ\C*1cHT1$VTN1*Rn"-vSl5<` 3>E$ x g91"HC:h2iNp?K8_@88P* 2,BcRDǘPJ73O @hiEsXV;i~a\PiinvD2vy/@7xIfRb7;*Z.*m`<٨7VTAD3lNoń! ">Dg1[u/VufM80z{]RTTfI KZaFU1ʢX\1*5&pw:e}a^_D°/2zј2ȍqX`z S)I<ԕh^mDk4ËWpG1VGџǛ*dY̋k׏z< \B~otaYUU YV)a=E^W{g"<$eeGYoumBLETr:-X h̝]ٚ>j~%Æ̷"}$[Q͘hW(W*i2kY< f0bX-|"M?w!8ItoFoFupSr9; %b@JDH0EK8kŏ,Ѐȿ(_%f]E؈FbႤsx Ma"1e.{E*TJЩF$ˆɂ$H`BaRf[zdϳi2hrHCl3x+\E %Xx;ܐoa>h$#I^imcnbn62"Ɂ"w !Zs]1C9 ndp"A`Ĕ"d~`L)n;lC#LV{DG@bZEr*fb3xLbO7x?4'RQPyBx4ȵ="d,gZj-Ҽ4ByNdݵQWZ$f%ጁ,A*1\YL[_%7{Lw(.5![L%|],eQ懟ņl}gp,S9-p~QX+ tܕUc>U*t 6q&GP\cqt f@wN9[ Q*Mt d63$aC^G͑Ț}꓈8X!0{xV{ؒ`KD>A,w1I0 'b3]SxCi5Ui7}]m2$6;烸ծ mFLj'*W;bYsqOOV"z *!P]Ϳr^w|Ub3LY|;9|!%<8yo%c jh:o:2V,s dmDte'ܴJxF$pmhr@q`]=C\'yTb&RL\|rEnLyYugw`7?EE-<~%j%K$_b7<)Ū|Щ's Lk5</!%` %Y9 t [8*?JcHf^wqۣk&Es7:}8xaD:NGqywD )Wjֻ%Fwg>n7pUc5SĘvJa[똉-</!#z;Nhgy,lF,;<͞6L}\Clj/7 $0,@j%0SX$ZL=+*grwg!VGO3E<8Y sލ:%jQMBO~_һs'wۼœ[/4jV#kڥmݐ lV"E+ŠWH\2Kqd R䋰&LXX6'V L-P` PUhKE["]gi0:`=ppm-1[ڔ;m)"fDX QQʝ(2RfYq*q$#pV3l,=zEC`SQl9^r9DV983:b^]__V0p&% :0;gV01.ID#J \Hq[-7J@2^9CE^k8wCYCz1"3ȝ` z8&S Odmޔk\ uP\䪀R- R" L"<e* 2(I 35ќ Cep)|83|}3wrB|^y"}Cj=CD1m_:)^"lĄkqQT|;7,q}/wOs-^n]¡F2YsCٔʱ]ulEENJՠŻdTܤM>ǹ AV=>JJ<(oj7}x7> bS'PB gm< x@wq^c<+j&@% _Uڭ/*Y7Usu$X`'b1}ޏ AO%qfލ"0V-/eqRme@bwp3}ɇ'!F|ګTs5lL\njPGx;4p-L3y.**0E]'x˵0}&ZCXj`)' &qkDxf5Ƙ"%nw4x8g)fy2y"dT /Ԍ,[" v#K܌}("HeU^.W=hn1hg/sИ垑Db?o4{*V¯OdgTg߆DR1< uݫM R)Kd ZاER&i(&Xgx+:^_5c>AIN:u<6Ыx,I¼H&JʝiT+Tn-1v&ř !Pkو2)}4.&ya&'y!EXBk &f Q&6Bs?F% pC;:n۸72 I`Y1 yaJY't;t.vKL%\54r}hvJv ە4ҁ5YElTʇZE.᢫`[hIh:l$4J&\.;~Ic3jZ[<"sڜD#9%ux!FƔ%o6 }+It.OH8$vg)vg*ZŦM֦DT:mHV_Gt= œҕKa! DL/i]l#d*7ש)Aq,qUlbɋMЀ4Y,3F~LχTBL)6VWIqm yNۤc%hj+[Y:VoX˵AW}}Έގ)n>~WW-ƚ|N|SDa&MMz+8Q^-&BT ]{/P;W$[<l,]+VS `=،GY܈(͑i2ƌg) a23(Ud`ҏZ.;p ojŽQR>B!A;{xM0;>|HJ^a*08w;xgC~Lc&)ގ(ktY5p5Z5{Dt6^v7ci,ClYΏ# ńRl`Okx_]mlXI`k8^'$N7~Q4BTr=[)yNVr9|d{@pD66L@d)2сH5nKDC&Uz^EkEF^Tk)'3~"qi%JHg6^ǖ&zc:Vj~=+\[NlΝW__FdåA z^2FX)6hx?/ʯcC YYh*NF x^[8K؜i`}E!lFs},sY Q;.;Tr/FD"lY8f$7Z0T2Ra"0NVT =K OS!4"P-Dc$XX>)~w 71Y֨g}ZdP~B`7Q)/yLR'O L*r$-bڽ&¢ xngU"P-w4g;XIcw(C`g`qsX32PT2=K< k y+CEqV<$?򥐄~!R˝L{iz,Ji?AE/J+WWt Zu]ߎVse.C g{IuVTs>黸V(v@* ujo3=V.S|-!ޗyT_X 0WBX`$3&51uë*>~<G8}oW} y."yܮ(h%h@])zMlKW]2/GVg=،-VQfY{ </Ϡ6;R=7՟9T\|qβFyYƷ!Sf֭wIfCBfV1(\JH28B,sq\-^[a5E؝Xؖp_;XOji8a)"hSx"^kc4#]=ӊH*;eiopZ0(J /_ />W<%OxKo^X:REs! ![ԺV 5OI>Tp-η)`d$%),zYi;esҫ0rH "nyܦe}(/pYz61} fH-+ \ y4TMlyꍳUH鹡.dX ߋqa{xk[XJV:x>78 :yq6QK Z=Y'ZITb9'5\=i^lʋyyXdۣ 8VExU8fȒǏҬ_;翱5\ 6ckG2N0WSGðPUϣV??S:-<7%c̻q-d%cFkMLit x;C]- o٩n{ vmy,1o6x;6]LLp#Ƭ6hcލ>ď5  NeGh޿( 9/{`$LB-ǃQNH < Ձ'qiGW!ASc@, 9a}j[57( uҨzF6"EHFN $-jȋPc{e& XEt$Zaq`a6IbhcƚΑ#Ck.£D-P٪b`(U 1q-xū* yf%0qޠ:s(,ǵϫSQ.iuyFtYYGx'yXյQ2pPd2/qH%l[xA=Q4'CO8c@gQWcDT*!JT[3?Kq*9  - =m!M$y5CĘ a'mܧG(y;HYo,*2uF5?n1UÂlTV#m軁,_c#*BFy%"J}od^P#q̲kQ:7Kz5K|9 G؋DCRz%_k߫C)xI~x;x7wC}Lx#>Y1>#As0YAB+h 1nװ8vqYY$A<3!NgT$!a`X}\'X)nb>Ḋ#5zq"n@<7G}Ы8qJEeKB|u#QVAO( )Nl24tAO՟ ݔvq'!/_nQiWR^Qh's1k-SՊ)jl((}[hu>zQ9f[EQ)'! ¤4(.rk`0i?afGV᪚VЗ-v-x#bK>r{`)a&8@$O!b>ňO #:@bWB)} t' }oHpQдP*.bL$FDc0y8ý')>`K "zs岮}tym\{!ќQ *cѲueJgi2U:A"鲈ތ2YhEyވdumMQtagʬA8H%Nk!+.|=5CI5/VβDK6VcniT(g\jGGTD [p y $Hpv#|;X0I&!0 g}?0yS-z$r8f ϚwCdf`օ.8"K=[1a=^T<ZGQ6e`o&d9yž.} 7]vy+XVzT%Z[lZ^C7i &:a[d';o&=~ cHc#L!VR$beR,RB*Qm}l'ʽ`1pXSDBf, "B b!tY>S6p*nx"ޤWq^ pf2K:-J8a3"|tkXJ.< p, j(Rx=8zHd? asKs$@,;:yڽ"OUzwVyq#VX5U`-BxY,zJE#;7yT.Pa/YpNR%aR[{k (:C^~"Ԋqqv>"X+具8O~ Ou|±aʢd*LjC4^?]*q:Pj8c6j5㩰Gy8i,rIֈ-yB3g$ %3ܘ1+`aT?w4x#͡$ʳ6.:EhNgaV`!g&+8-LuSG/=zt2νYb1!+`+}V|ϴFWGxj%B<_Ze7k sѢ/>73_:!X 3taϗ8 '}տ4*znsW'lsIa"Y:ENIDG|U ɼp*Ui#i%„J&9|}{g)RN`{@| c e*>托f%#,q#@3ȒYGy(j;{HbzL Q\Rr&I}p^ZY^n6rc=߂"6TF'iKbۺ9J(J(WY| F8&S'^ӧC|{ +Z`6 VenUX`xMJ1-GyTV0#kc m?T.Z~*?M8rol#'IXQ\)fz^[ّs6Cd4//Q;clb>Vp1#p lʵp.[D1f U$XLlbFx籇mMoѧp/Γ2v3Pa R= okǹ2Byyp*d^ 枍j/1Yq"f颔wʬ ׷&wݎM>)%jUVRV 9!dSC+uыߪ${^dh%66 VqfV c|(ϷȒ2å]$$4A1fb)ᔶp-г8&]8JE#Fe4wLО7=Wv, b*;))7L.Jb*ppV5L?W@|C>a0>\Yvˆhf!0O&VHp1}^cg]( <\k3؈֢ {T~G$954^ }{^mR]}yS\ EryO<({/ K ӹ-*Ī$~SxdaV8OxߥO[i63l\V׼x :Pמ?f%&Rqދc%O lĹ"FXG<}r݇(Y6\B! Oh<[꽭vK?ߟޑzzOij“ը \*iDWTvMMޢ!{d%l㼔mL6>6 ńu>:e O W,LpP*`*0,^ohl6"r:aMsH240[DqI)VG6,bx͛G7Ǹ3r=O$㻇3|(#rpQ0FR3WGgs"<]/I J"& nDX]u倌 )lH  DSyz TIE b|z(-%mJI]ۻ!sw~K9^9fGJ>.&ᔮ@og~bRstI wlvHZ7hPk)CK2:uF e%Fcw/Ρ$}s;/1S%gq&XxIn_k2{;y<#.Љ8P=#8tC`LHb3e|o%5lߦOk<8cq <ZxP!pF9T*+ٜQm#"U" n%دxTH$0ed^qʒ0 &w?f"Y='8'klv]|]TssI];`AZ0z~G[e-R7p;L¹~*\QG%:&=P1Yds cw&;gؙe!EشΚ9ݟ{/2[Pp{\i2P`4h$I>R-&t3Κ"ڼ$ռ%XxA$4/ 2r-,,ptNADUs= }82eUᘇXA!V 16 )*^_Æ|A@b Nv6} 10Yr 6C+ 0a7C@6،!/zmJ) ('i^&;M39Ht=86꼁-z_bcH€j`t~BW9<p7KYnOB1Ipy9jv`R9j3wW|=Mo"|9| 1oϡR[%-$@vˌ}Y` Հ$RB:FXɪkQCUb]rI\N-IU@,LmV&l9.ۂE=4+j k U%@=ܥGzGQ6=7a]lx</~Ox'ru$W="M6;Z]KAIDXV"`#qOPN*{39E媦]ǸMoۭ mdvzZώ& IIS+]#&Fkmnluc*m*>*ZXT+"U,<<=7"8I%u8w<763ws@P9[V@6WN"ItLv0$$<f6-ls/d@)]ۆo :^7586c4NDRA=in tySRED2(P•2|e)>ɿM:V b̐`c'EƵ8YD# y\>^$U^z8jùR7P@}fFt1Q=P}r&s]b"] * j)[o~Յmؔ&=*pr&^Sy% NfJ8WfN7U&ZWpobWe>VIۓ ղB Uɨv0dbVt)|Oa]gH㔶/'DƘ1B֖{:QFRƲPދ3V}9dlD4O J,yHq֝q1rbb]16s9V¯NU-U㋗@]鼅.=.%wߚ` #5 FW 2Xchg宻fS&^I'!dvELTpCW!e cOS^b\&C)#V@VfDRცt"xOw%S\A4E?gaX˦fV ϩ3=~d}XfY?=AjGT5h&p D/ F\/nZ6 a85v7 e+3xK0F" u)(-3d욬*Z}#0Ɣ`{Y GHx2Q3y$I0e]E?*y sJA^! ďM Z-$i\]ޣ>0wY-uym'Ż+οh24@gX*_d R 9|)/›`4խcJ)' nM=)>wW~'ƔWTQfe[T&S{%38FQ* CϬ8晦n]ں1BKz)+^/Y m>%l:wh2hw-s>Vc+*mr](KTqRBYǂZOl=;)=d F?QgGy/Oy@*W*.@bq[*Iz\B"\*TOȼ+ L(2ZZU}! -_<.}XV>1IϜ}wO~A|$[ ?)V0CT59pD},j)gy1Sh29UB$\(@e˘c+ )klˀ ;Ե2G%I1Z@SF:*g67?tNt} |tk_=^_CݹR/ ?o(Wr\;6\ Ht^jCR?&9Y/n&2 DdBXy zAJck'I 2/p +Ra ap~09 F xo'Hu^ۓ8Sp|I+,Ebf *Ӽ:،=5d{!%Q>c%\٪W$YVBty& b}a"׻ݭ8[P%i}}q;}N*\VW}-ZFRay!0ƹ6?8ONe>sk6G7,Grg&>j$v4 wm :!hD+˱ҳj9<]F<L]$6~(* GB]zd|PuRj.cDtM/*CHq?~~O @0%FJ+S8C-__dhb(t";VB yL M:.BaꬬO*)cX4yrݙ,LխX (WGV2~=~;zaIʞݮL`Dj=)Zש:JAv끶ڔ9$DUb Pe(/v]6*Eϔ4!*HXxF~3ui|?4 4**k %T֕( !Jqy?M}%/h42)<GP3ҵ.`Lq.-+pPՆ+>=u0qa(j @>@mrK~;`LqI LvrrFq7T8+.l[jޓĤwd+ BƄ$)>M_ǘpD75$?:eggUԐ7-VJn!WCr,f%us㙡9Oly`.@I[6wg{TOEmgTUuRb^!>Ƿxy-Q*'Y݄5WF5TJ/@>|= tf1ɗwkT=Fة ~"s=6PZբ qpS<>##t- 5'0(m|F^ !i|?5) c{6XLdY_GmC2hY-Azc+U0˥tR$W+b{7p}oN v{S>Wï;so\IUÌmU ' 9MW` z(q<9 wXD^%~LJ'$>&4k#"4gpƘN\1T j"vV9Xl=G4xQU{!UAZ<Bx3b]6q< Op,Lv^jy?~.x}Y{h"ݼ,v2OK]iv9#t|Ҵh9tX#sUT!116"b?}/ ?{,gL`3ZrDc~bT_akÓF+N#E@eٹaas ~3TKd#ϭFx$ŗY6Pv.U#o[^2*9U8vg%NAk͠V ,ŹZR^Vc=J~=@CX=LX}ωwCPƘJ*Y).dN!UU<7}]}2 {0BKWp $e:}WYD=d"[J|eoD>7G@@^=K96.15\8'43YJ@ [!v uW@.:0=bPj|aTWL6PU'%tM*t׏SKX(VTk~ }?HBף'l\,s.4Fx9O$ruS@"?u}ݙW8L2Wb ey/o\Q ŀlS 9(Q5AIw4 {ݾIy<1)uB~q7Sr~5GW>oYX 1FRۇ[{3@A< m#F @=>Dh^Y_=Ã3YЕU~s7.+ k͖Kaɸ*zA$,Z9wo>4&2r8.eh!ͩ+8b}q]URInjeJU玐q 6ލ Az@۱mqH|pԐ@; !H@`|'.;{&_vhxs_ĵ|spx?f9mhx>ׂE5y@<(熔P s꣬Sn[6f A&];FX'>9WfؙI|ZPu~/Ck|}? /aey XRB#<|11>T'նpg4ST7.|S5) u1>7 ̵A $u&qY~=&|`}%8NLnpkoy} 0i'xaHqץ&PmD<oR"'@nSSC1J36M H6 u}nz>57g8H$mf}nۿ@^2ĀKpn'yƨT*%n僻C|%)_RZ Uƨ> 畭ʠQS Wӂ6p A~' e?[8I˵M W/y.¯/)̸痟+|ŹuC8Yl-z5,F_{ ͫې.xeK5ܳ֓4F  &/ jDxq-)N%#LB\>|T}f" "^C,wR0@΃: t/|و\0T"QU]5icҵaF|4l  eZ$l}ܙJ̪-=lMtSyw{@~P*PV\'04CtT9Da !Fny!ZKh3_tWh d6%X`w&HXYr8uD\@ +{캃 ;<2>-cuLpUx'`cv A  m!d[Ry蕭Π> "Z,LtX\sp}ߩ5~%Z9HBtZX]I笇848VA(kc0,P)\kJWN@޼d/Ѐ gmDpvԻ#x/@!/\@^[ k's/}fKY]i[\zy,cm@#H 2x-4Zy %]c9߼yëK2 sc-^ ?Ⱥmk -t^~ #H Eoy\\1Hx, >F AҦOy>5amkh2oyR{@JYVCUe!,37SU A\5Zx4e|?l6Hx1|^y|N~ A!s *ega $PBl B xs{:x@A.6~UI9"H A4Z_I )  @ "^c  A " *r"m|  7~%HP x9$f A\+`=+| `$HA  BڂH۵>\כs;x@,r A 2}v9_0 ``"H A BkT:GRzPnA A ?@[pBA+4 P$H AX $HXC A $UA $Hr=@6 $H A  n}@ ߮IENDB`dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/page-t/light-trails-3.png000066400000000000000000001126441230033266200266460ustar00rootroot00000000000000PNG  IHDR loHsBIT|d pHYs  ~tEXtSoftwareAdobe Fireworks CS3FtEXtXML:com.adobe.xmp Adobe Fireworks CS3 2008-04-29T12:18:24Z 2008-04-29T16:03:26Z image/png AA8CtEXtCreation Time29/04/2008trIDATxy5v߅}s[%%p%L NA )SP!s$UIH*BASPTB!ˊ,ے,!Yw9ݽWݻ޽O9y߽} }z{}Zc?  ,X` gOD7_y ,X` ,ؖDQ< )X` ,X`?RB,X` ,خ ?v,X` ,X'GHp> ,X` 61B*X` ,X`?Av ,X` 6 13,X` ,X]X` ,X`=9_ƴy˿5$@t [)x|wjF}(qG}v{>ߣ.L4C3mf| ,XmD1- h|\ҎKК \&ݩ!DA ,0Be"7ɟrBt%Bc0u=Hi9`VP4 )C@gt&!8q]ԃL\X|w< $X`;Di$?wOx9Bdxt!9 R3!{ BZQ*܂b:>gμ9~oiyzTs&m <~f ,X,XDN Oȶt'| AW B O!%7W]Nb(XcC8wq_Lʮ!%@H`;\#/N ?fWـD ZAz'2r &\1*S>h .rJ++bW.`cxN):[Gc )]B\p2~yg}ɜ B8 ,X`a'65;NP;Jw>tAZ!9CMOe#!38wM Vb4%\jRu3X,*YC]DCx̽03'=sk@h᡿?gΔ=@H`ۭ.oZK[: P*X 1K=(`f* h $#EY®hEGNg.B:O1WMrdiXsP(Y l ,X'mbZRl*Xmx)N Ĺ 9א| p -JfNy? U:gs6g|gv]S5  lv  Mѱf@F@o4zrO>c~8S smP;u ,X0;ivй mH#K(FDOAOCǙm+@I`дrWfp\ FE, Z Zf҆2 v:VS?BNIەShVpJwB]rY у ,c7-\?'pV&rj" 6ߏ B<!f@\*$z97B(\0B-!nm2Wcy"IqO;_?麂Wu@EBH`ۅ=]uSȿ"Cd73<=5o?(E Q` 6=Y/M[C ].Do׀扄BW`<9f,Rv>[~Hʮv)l3 .8b:CDOĘ&\T&(=-T=Glwl4.κ=FvHio5=H`۟=;a!1|LtAdw"#!6i7"ԣ!6BL74:Rsԅs:S9SIN}@ P,X`?81`kA&I x6?_Cf^3 -4!vTh>:]]4;c0a1ڹO` ;{~7 963t@M ]Ukp_C-!׸B^3?}CQ9\\Q}u6o ,X`{'?65gթAD B$(ӱ35!r51H8L!3Va\۸phJGpL.WHujo{NzsųGM|i'?! lW7M w쌻Ӡ .שX $iÄ́ kuѰ`GSnF`aJo}B禯]x wuT*߅<&H`ۍSa]^f<jQ Y\&)˶FHv!)*"e'jX=!z?f ,X}@^33CyoO29> 1":G$=ƁnPɗEt* 1F Җ=9q;O?0ƻ cGQnktfciEC>54+D< ,ء6-;uaXB,oa! D sL @BCw`BX՘!.la/í46S:*̵ O_څғ/Ż jA ,ӿ}jp 胐TJ7b!KHpC2$ߪL/CMg>L Yӌr~oHz̔aTΩk,Oz.0 ,X`Gũ!w!Dm!$! !3L R^ Y:TX smI˪!Ԭ9]8JAEu=^C/7gZy,X` ijNe*VϾ d"D3: R^#/d,T}?'- `/RghȸV2y1>.ۻ5Y' ,X@^/r < BL+%do! C!6C-r97*%K@H&tAECpx{bS9-d#"5!| BYȆ9 `s.J Jx>ù[8!! ,X`}r_@{>m GK[ ҄ A,އQ¼A&_BuݴP8rNS Z jv^/gubs<9ُ\Qާ4,X`m ??0 BL RǤGOb x VmX k5)h`0a̩Y:Aȸ`([h}]+G?jҬ4!X`@ !ԙ5hztk@H F$ @`^!۟A 2URwB Ӳl=CٽOrB XJn?鏗v䔻mw6@ ,{b'B&*J'\($#-Q(d!E]29$ѐh0;!61Dp.u>QvCs jX lL AT,1Bj,![2䱯c!D9Ur f]WG4g+\6 Re=D{g>0 }xpp,X`vcqN K 1cu*1fE :B}GqTN#WVJO[0LRԭҲJv)4oS♷,X`75crh{hH!"R)d[~!w Hs^oE 1GF:XAܥ]AP%N~cj2BW` SoN V;4m1"z!DWb`#@ ';)NRe)R̽?%~nS¾6Ӳ&pxu˳yI ߫B ,x-lZ?ݞb HztJo@@ b1Doq}!+RZ7Z#F0R\ bqP2e}վkKh3/˞@,X`sw^S?|9B!{VC!!TA<09$J4*4hN9@zCƤbtvD^ x;)fٟ` @GzSEB|ՄߍU]ȇd1s\) Աs/]vw$Cd!Rq68ze~J{#oE#}؟` /\7|~QФN:ES}/DcZ U=CrnDCԫ6T4v Ry-v !VL=Qcnm߃ ,X0_o^&Am#|Ϟծ  tD|X XՌchkd`5h:[jB YH;"b{gH_mKH>N @0s\`=Vp O'#lEC B!ĥ%@pX|H<Q2+T=g|oT2A3*H˪mf~y>wxEVxL!aMԖƒ'"X O/cj@ ?tpLꐺ@p7+,Rd!A1ECrH< /7`ƴ,c1:I8zBxwQB1>rXjVH 2#X؋1N=D |ד|DΰG4ϋL-{E#$Gh\bA!H! Rm0+= QBCÖ̯1F<2ڲǧ掘[Qs_zL >5]X!"%+aHNsv]V&F`Ƞ{Ln(}P#`d!7'\߁] os! DvV *V{jC;ZVA]URÄÒ~ wZMpa "{g:S: ˔+ tQ,c - M\ó}+}w #>~@~} D [vYRDO"Dj^H;KQɗKHU+ͪ*lSb L|K1ACoi}hh }l=Ijq =,Ƕ|7aolPbqN"&W?/=&7GLcVnfAsGdb HU4!۞_ ELP!%{z@@Dfz]6ܽϏ@:L}A 9hx vsxidJOݠ?Ʊ',{):⎌olEbvmi~TS;v(bPo#WEdUz:huN""/?勧P>&S<F PITt\gP{2ޞ=g3G7muMhnܝ+<,}֜iZc@6t׮O-> BN:,a@GDoc[6DJ y)eю!!˪P+G_h^6-Շblx8 k}E%+wۼy7`cj:m׫V'?˺Ƹk},<a Sy}#|z_y_edc ,Bt/V{4.!B.' DQq`5RA:ofuR-K 1H}X~̊>!aض(uoU'y^qJ~ޜ"Sy 9Eq$xB /NwmƤp]>O;Vv8p}o,{d]0g4XO䏾s+?V2\ЮR BE@@L!HuV^|RV^úH5}۶76#㻍#!Fy_;jBka[-7y6s4P4G0®EpZךZR䯽@luj{:Qf`!}E4$s$LjdD9c,IZAz lgHJD+ "pD9S+ @9N*]]l@YI 7Tzj`tpAD2 D>D]1 Db Abc[X)e7`䝜]4( OpGp -2Dp}l!fmԎ{E^K{r ]Ć|ۧ |7='#r-7 43(|j) Yl)YdQ2) pQ}- Y I ;-kS(fIC&_ "SxBV``6ز+Zw9aeskP}Qo T!@czF-YsSw\9&ύ3HKoFIr_mO]_602L gm>MIFJ!5=":|0L-#:1;޺iG8R9f]j ?*b/Re]`}z$M8w "y S ="MP.;c ZeJZDiZeή`?1xns98hG|, \-/Р}OZvM茳ŵ2=aw3א%a;(om/|]'=2*zAUl"? Z\|/?'_z_ydyB)Yd it-kPiYK9M-Kl:{ kI巑˺zUX)^Ciȉ4&6pֽFbsֈ~ȍۮdz@/@ݩ3dF?pt.l,D=޷72Za h Sb8c$zFSo4ZYJg[j *RZ -}'y=|lkڵK=QG\/71ؚgןw@z!oUځ/4!²e^}WcːPjYGHEޮ-nfAM}u"%ۆ6nsU}n9u爦L<1s|!:2:QT࠾臩'zA}5cq)in`qtL!3Lo XϖwնWd\{~Z5~KDZWew(r_f@}Zk\el(O*s`Մuf[xKl^ ҍ5>JW}m}:|"Il߮C)@Yiա{+[BUl˶}sQH!J%X(E $-AcFDGiJn^c[D( Yu)͹0jE7ͽ=aD57_T?#ԾoX'rŦkP_?GG@^v޿rɵFC\ NEwDj $ǮAb{J5Kjz@aIb2(ې^#}[4A==OP8 C?B !aSFٹMW4pSﵣ̦({!,֍vNk܁ "Vb6ʞ(G#:Ru¨!pV-w룢\G?R( y@snno}i{Mڀ9Bg\iׇP'2Rէ? O}2ڙVj\n)JO|%,Ht@DrtF"h=ؾvFXȑ "m(̵mKcWG[v^w:ly eoh4lc?u]x StMh~ TDKȸ[z 4N[Tl4l935P 2JZ@PM)Qu6BP1=0RI7|_@Ecf=a.cQkRGtER_@~vȾ'1񋆘$y D 2( -Fs0 4/R$6!ZqE j` "Hꉯ 9(|۴*5:ڡߖMfF~pn't>=0JA&quqpՇ Çfhޥl& [M YLR1K !Bz"Xя:@S H:WH] {`9=vn2gRFSk6,T|O(e7O>=&9xA 3!06 DExIQ1kwC""|/6g4I@0៞4&&RQ -hN5H 8$kd߀9SMet -WRhq3PT`uGQ4}_|a0UXzX4ļNz AI(AdBaJ(5< /ʗjSaLrEĦ +W+:&WHsYV'z{Gjube MYj;9##U>C\/|Ms2У]7aBv(65*n0QIl3&С{$. *#d8BD+U` < NO+i8<)И5HCX`gL*jHRD.H#s:(p偖74˄aLic@D2EoyXsG:gouEg;OϕbŤ[z:>ZbN,ER|J}"C[GWӸl6<#닌mh˳{hw OH{ۋ}.90eab K1;y*gd W މVv80.ܰ7}w᷉[t[HL-lߺ)\Ż?glp_}Et@+y Qo &Y PDv( !d8_W_$3D"S51rw@jb\,D\T 0*%Eݽ'K]ƃ JnEE^c!AQѪJ& ?~e(-Trt/҆9NZvqԬ,/>ѪlD+UELF&23@2y]7,9d`5 G)Vd1u$[}P":Ae1Hf 2 Ru"`/I^" b5%F\[< }̳ 9xk˧v5gKɨCF|nf9RBʑ%Bn2C$S dX 5YA\:R}=*x=vằRbb3EşK0-G HR$R!ǧZnCϭT nنJ*ZBH18@Q,^-5Ys^W7UYJ &mgQbJa"jD<ضmK2 avma3 v<81oݽ  ~ ,lϺ>oBFTn8H;"rp߁8qp\X]+FT S  X bdYt #@R9ѣ'=ֶ$J'LCXT(VwgqM'yR> $$nWȿ>a`DOA7FjF:BD'*',sA3%dRβHct֍3%WpzY /οO /ooU;1Wu9esd)Ub'w 3W9e/7 NC*YlPbᡭ72_ΣWpEM>NL}Zf~pRKw$,cgaW@BwD)!S "A)$@mrSщn$`X!M.YB"]$FU7TZeQ!ŵB֣ >u"8H<}Ց :e eC|d< 2 t0TBJIEzB {& m9Rroξ/!9J(U*H4*[tkjc=b3xy%<2??<4>I^܌Ptu=OMY!,>*">Ū3| wQ+>¹:Io)t];߁~btܵ$S {=x`vn`/7wu yJ!Q !7XH;$B yj[cDLJ9x4>A8ٷbu0hDݰ(dh @Xl^*ظG#o :杈h;?@H2:N&gȢ6$T hVTcN1j T qwJz5>W.Vr/E6_ewO*-sX03O'h/$VY"3 "q B `d{HwX7x)_> q-Hb$2o7wOF0yOO 0*栛ƷnVE DȼhI岁HD=G,GD' DbՉ|TPu""PMkU*7VJ{ gǪT>oqw[E.@}y<\]G:6"NؾZU"D2"}EzXnH@ gOJ9)Ce]2>GgCŇ3"K$#\E8Ji5rEZpٔH'>@^<}a4 )ܑw-N 3,M&144(#$tX\ u-Ȑ/*e#9M2K=ϋB *2>w2 O ??m.59Oewfg'DP_Q4Ë xxA *6*o:*ЍK2AKTNn*V_ .8 8Iv B;JY-D` uը\Đ"T :һCp(4Pk"NVf Umy@1X]@& @&ϐ/>\|X@KSKHd`~@kHC.אutْRH4Qq4|!6kqܛVĒi] J,A$VH3$IڀJH."!"TcH,]?RQo7oȓ'xs]^} uѼyL /ѣ2 bNpS/.[H)bZg͌<'"_!+'C;*!!,&m%.^=RHHVo;3ߏ~zϼ;,3ާcxd'RG8bXq"C^C7tAj^RP V`ZBIF$ؒ69]찃gCqo>w X<9J~,XW8JoHe׈YRJ)AEǪa,J )B&"BbLAEՈX[1ohwR8^Jֹfn@ 'Z8qB! @ne~N1Xdt,9&>E/'Uqluo>kvxvϓO]lpOJ }Ʀ]ZHl+ղ%=tVdPhW5;B! lJHzb,;}B)hs}_Ć}>fy^5k2M @%˪ns[劀RxDC#O._JaHvf4\4k~5'Y=iĶGC9mۗZk[m8L/jM/PY~#> 3zU]_FʯUa:' Fӻ_ݯ#ټ`%Oqu<y(:rV/N|vjبaC&sJi ".5> ~"*BO*A?.ZO!|UH R'mU0]j'0 㵯fMq}yT"PUSj xh jnOQ3҉Ej+Wky?L`.)*@yt,Z!ȣEpz1 SHpE9}utr[\5SիbNS8*ԉ8PboC/ %D]uKE>ᑏ Xd|4&Y!NY\Q֎^V.{dga=lh3=sv ۊpZ]0}?%$ "qj6*t˅DZtN.xiq鑎 :63JU R+da WEɁlUti}PZEtDKP7 aP r HkDɋ&B$eJcp|4>&>Ac#NUrdIbTޭdk$J_chϜ5FhTgR Bu L[_DO3qc^$j<;lXgr緿g7 U nWl)+]:ey?`r7ū)i,GHLgm~sagQ*l@,gEHUS*r)ԦwJ7G;ݪrdnVkb9 k*$>x4`v$C櫍qeyVq2Fl eU*'H#dbMr4>1Je%bSjz@kd=w.( f:#!# 8ADJe(:9$֐9!;0Qlٓ{(nH;$ك[7 d[ %. Y|,>&>F#MΫj[J`^mq s NsIޢ/*byGXF`!hHdxnT̅ߒ2) Bbx˓Oq{M(j)Pk}lTBaP,O6"kMϥ6(gH0Oume 2yTA&_Hڂ5c`-G^-H3!p)tD=ɔO`xGSD}};]׾+ HekA\<,Rha5C{OiVW?8{_!uЀ-ۨa԰$iZKGgl[6!ȹJ@)m#*bBz$zG{W~T@*R%]}j>nW%~5{ģESOw^ x< pQu$Vk_#I/e70b:ϰINWX'sUEƺ9p(Ƚ hmdž܏>XCөKTX#'bRdwKp kd|]AGHz$چ E+"$q^H0/;$Ea{$V5C ŢEVQJ*:rݍG-}J{I 1Ew z\I5p˚V}ET : XqY"+;^q.t;Q^-u5܀dTsPG*ODtQ`TvСαw-[E$N"BP" h6WNP "WM8JVmM5[ Ҍ|qM m'CF,FI),P XmEHSx4>QQيŤ{QH(be<Z> uaLj/%md>wEHrQvg#A! "Slo6%|$UOORfD~k_ߒۺ29lEx QQ*ǵVT bp~+hG+(NgxXaa#Wul0rh9}ԹlNg#4@}hoU>T& QY@BkJA*/:TԜ"ۂT+ng-2Sw"*Of>`]Adw}eBC8&^bQ%ivowe,gDKǽKC{-$Yd&[/qy"#ܜ/we7N0k7sY-t5HdB$Q͘G DΌ;Պu[ ZE3":"h9;9*Xu]oUjB qK7V5k\A (S{VNtvekanҨ7۳Z'1bH5Nח8~x$- ʉSY,Shri'wuV4YRN:0̲݅,aDΐ LXG*=NAkR {䕳Ԭeh+?hYF%C~*gAE56WXdXd7JHٚHQ8>F -$^axLk( 'pdy#4jF}dQ;",=\EbD2 G׵K3$%ȒgzgDKbꞞp2,9C t~ߘ@~o+- !A$MZX0i Ռ*P9xcs$n [ԅH~(RjԌp o "1+0V쟷k1}{<> i?Ubfnc@+KCPAEc5VE#w3,[|ursd 9r)\GMWԆ STKgQ+q bK8G$Jr4er}Εp )ryL KZG9X+&碀  AӾ(iFղ4"k DJZfXlnUA{V纓H5JW2ח8}x!dpK8.R <,xLĐT7Igu5\̈́nyQ,Iun#F,N31kӏ^Zx<+dD(GScCi647ym"KSDCqr#bذWN 8B?``a1RH[CI)|,+(I"DO2Qn!0iL&.06ӿ\=w6emZCw|oN ϣuVw{,pC*DvxR!TiR:E""OR_F֌LT׌hjZ|)!J^Qޕ%vE<ش>5~mŞuu]u^IQynR5" .PVL7-bXJ.gq qz(*Y1RĪt/. #7OŁ#lK՚.s#^pC~~XN>Zy0P=ʴVu8*Gs@W9"|U+|ig\4nb=B_DhƆ[O/v‰-Jakev8w 6Uʖ~"0 %GYB%XG Yt49eفl~W~p]jsJ] \ձսbZez$Jk<$)Vs<S rĈhKHD'HYD*qi97AC{Wm ~#M|,/30P}tNЁk򌺴oEF"q! RWsD?LjjZ)ryҴ.uݷ(ʔOr l{E0C`(5,K>o#=ʶ @rI;b*\cdh0V51m[VM+{]++Z.+DZDZ E1! sD5B+82-CE:N9ixP\鎿YRVc!;n]sZvu1w t4@! )$ja># g4Yt\DXG "Ba<$ԝ+8읷] WYHl-[|B$SMјRfHIv߃m5f0 H@!M.pxۣDǪ&'r !$2":BCBry?j2w>J-RON +G},䀙 bX!f9*b(kRŸ7E@b#+D5}iOjZuaX"!?T:T0*0OSnU6^g7a_!ZϡHBz2A17W8}x*ȔQTR&sl]>򩂎%U>w;muS1qJ"H:E, . yT|S5y\V=xȳiY–AQA[Vȩgv91dzVa`&!B9Bw!S,S$$S%ws<$)WR[~@ B N㯨z׸)-I&oq6@ C_H0~7DiRp~!CS^wPn#-$Xj}FhҾ̊Z}Ԁ#S+oTftD˩^ ]~`n+,DMxITEj=AUªCH$88nD1Rf|g} 9F!:zQ:C{_ww8@5LH}h4fzsIcMGZEpu#G;I2^B^#-W#^z_?؆Gīy!CT0`ߧ5(D#fDRv!* J5JE٬ O s-9cۈ L!dSz?Ue(.s#] )o+ Er%S="1B n_f` Q+4ӠE !{9iPz:UW6 IG{GD2^1QX=) 2TGrVfrB3u֫BNa XiF:S ryZQ7V[7 asZ|rtFH ';L |gyBu?il"s{@=JvG /m窐M0NjG<X"ϱ^fsBTH`{8'[ʖyRRUԡB f F6UzJU.W8du }Ia5wpt az:u`'G?#dΑ#A0a^"7eEB0# Pdueӻu1T'y:^!(&>&Pj{YUV Wf^*i |}n}BI<3Ro?@"E'Z~##!iϺ{FEA#^ζ;S HnY6AV{H-" F2'kٙ3pO`4ǶZiÃ"-}Һ {y7zt+8QK."hv 7GX'UQfqҒq6+DJ,WΛ 9mڭMτ(EYTEłcHuH.jبv#WłC#<&SYpcD2u ;it,luRV{!c2YҜ= AԷ'7ƒV 55A$%y 4e% ^d ByUgt\lZZD5 ȐbTdB 6H'J;2JH=+^e}M8|s\,1@Mm\n~ lD62e:7miޏn~<36":*3 F$(Zh6²:#Ns $W%U<ǥI\p'gLO"u6_drB*UTG,ConDY$sHpqgwGݷ9nf&[O]|!FW˕pnn8JlUxu\qj"lDExj)o Ǩj cӇ0u,3֭^S]`Cώ&$SFHGӇK\ܿrQvA U[Ϫ-~hߍaoqRBCH t Du:U7""U8dgAOz}lc,{!!2j[b{1p':r5! kRd.1c^ѲDR:,J $&`*k Fֽlӊy#l9Х 7"qװL I/وVcCKƸ #GߩoP0G4Bw-QaHgUT? ͫ5 ) F L!NUҽlOU[$w%,ss>wXxӝ=nqO'Z{ԣ۩z@z4a((Wc$ <^bi2y*ҬOqzLGX{dP'Q*U*UD8EDLjhg\[6s-Ju+\݇Qـm{aGp/lz_oX $^ s271571/Itf˾4fڲu\!f^̪!]FkJd8Y=XFChĩu&$6]>ƇmIsL ɷ6'<F=1;}0Be[qGGhd.lDZ!4Y_$cZ*GEXGhG*5 y\^+Kg\mЃ0& 'cVc8ٖzp+킄3bQBonqq_ <$ Y|s\c/i]ʻI^aэj8PX8HK1)pA":ADH9":˅fÿZ+uJ$8ҩy\,V8yL@BEwC\[:`8/"GgDJ|"$c} 1mME]P.5R6Cw#vE u]Mz+^U[R|]4v&GQ*m7p(S+B aHZ8EUB1]T9oՑD^BJ9xΟ5*x/AuTܰR3޹b_jT9ay:RFayy sԣn@ e)}Vz-dոq\8u WA᪌yDX`)O_ۈky{>z {mG5#`^ހ fcU1ud#%"DX!jHъ B.ywo}3_ѐ:ҩQa]V!Qܯʷnnn-a=4s{ᩑLL9. jMrq"r." YdclÍ*ݷ5M~o_qOH<3IяX"Y+hNFgWh27ͺvTZXEE{5( &eIcfsu\=FBsmuXhnaV*  & Q~[L$G$x,!iտ9-0G:V 푎n5 AhOX Lj|_icƟhUTPFXKsn8>34}h_@\,@{VQ[sEr=Z;55.iHu gU[{|.LڡU'tm,wc! `T  @Psȟx}v \[Èy%rמ+iރ3ΑrFH$NTN "Z) E˱dmWE9T"=KJZ#HUNX\[i :A4v7s4/YU`^+[GȒs\=l5M`vW51!Ռ (#ZAPV J59 %Y}Dlb i#1Wvxat.ϹW珐).-9/<41 ŵcღڞ^ikt;37U f >.'bqQMb 뿠үdkܔhnFTTO~]?;)ٶȶ0B^]a|}_OɑćA eU:U1PVWuMIɅpNAjyK~&EDZ,{vFp} } b9 '\OrfPZ`F7GquLxj NpQ48f]̳"U~"A+E4CE:*Xh!:z]R_=P{+1oE4!)W:Քk1g4,$y5KR\iLV3H"uzoɛw'*5aL" J׸=|!%)G X/C!:iY`D]EF0PZduƙ`in!Q7l9/n63$9o3p OQP 6Qn`]фjVg^T_ok*,~G wJ2_ӯZm1G?4Q)3Ww  ᅨQJ40CpwYrqi d|uP]Ev(|?E  DTl $UOtJ4EPE=i0`j&4CB?`uW9H>2y x8H@*GP[q}GWo:]9$i|]AG TjkU]m[΀c;x,@Z0_C.}"yh}ў^  w)ղD0ĄX\Ry?|ah,M@>WpvȈ B": $=`@D|[BKJAK,U"r7{EoMPr0HL3 1cqװֿ ʮD{HOEcX #BBO m˸Nm6ӯ`>;G@ލ#6۞s&;Etv$! ]5>Mǣ 4"XA D DR+(EP[)ܣm^I3քbX꧱?Cg_ku:M3H^CATR0V=dș~m,Z(f '<Ɉc\Gl:bXJ? > J쩎v6:[0uQSh\]p_!J6amQ4o7#g_y 7T]h[=?= `. I6|>UDٛ H t<,AКJ]B$sF?9M 8+8iDo2 </A(zjϽuL&*`%b$rYLU}[$hu2!¶dqQ)` u1ǻIϸ;X3KB =Z$K e˓FBm acÆn#D8M u}ۆ\1MDLK3ݽ߉9[ g /8F«)iDc+fn '?݀XˡEr{%UnT;w?,$%8~G[rIn{.L!xFwZIζ2DXx~-,ׯA#KNqz룧H@T ӊj.شf )oAvBߎ)`ydƧi%?v<dzHڎ]Ko#k\d܀ 6.81'*t:I%\,@&9\?T60wG?仃+cv+IOWvA4GJ|&!i\}!4KZZX@:AOg\GH`'o%L+\]ȑPvY: k/J_EciZ7̭}haj Su77oot:d@ɘqg@Co~߳Է]}o W`D"q8o:clcao,O <\a ù`rv5 |q+ s~G\_ݧDIki5VRFECGX]bށA\] dҦǩON|j0eխ7'Gw<*."C3U:U`!M١Siwzj5ƲDHxSeO#qHH72vүG?@79T>}g"ox =H$0 Mx-ig`()h6oDK$X5.n %xstu# $Ҟm*H'+nOTa|7%gY;ND]`RlE ;r[<#Gn)y ݓq:ƫ:L vp| <o5yP 3tݦq9H#I Dhx<}(F|,Az|t'2nDHL4L~:дGvÆq7 1!b a7| S^u #ZmgJM# i 8Lu4=BL@IJ~M`8I7xoX ru æhl9b67[5ӲLE&Xٷ᷂9nf*SI5@ZD Ϗ~xTc+mOa&Uu#l9_Jn%c`u  J>' D5bDXi 2Ղ/k^{W_-2:d; UcnxmHchn/G*# @P+jY_%߇[42nG|TX`O~ijw{w gn}G@n4J]0טطIHN-R#uK0$6qyF~؀fNEiMBÃ=S]s$3\,^yeYaY5K w9<ߊ:Q"Q߶6t5`׷ĀM;%H#կkoG`fCBbŶ.4^UeLďKz #X]do  O| ^.tSa(Y=Lzw{( 3 d4dG:kZIՠv̢^c_x~*ckidK'-t}"SBF${a!F`@)YS3=+#_i%!16Z?45ps0@ϿLJu >RjL>OAMn .s<[Թ[\ꪤ2 Ej Ȏ^D0[sZAy!D7{ʗj6 :.ߏL^&Cs|`6.0@~eb֧.| i_/&GwxקڦXkhw4A1>^e*la,};L*&౽ΞpIfTc /D7  XF,.7?TV=ZcQ^ft5O~qW WJߢ1Kۅ|. mxYw(  dNg)w4Q!{>yZa0, q!BL'8 mK;F 7'Cڴz,he-&5 &4tW)l-*GP{U!ܙLVj}?OvSl l@n!Γ*+\ɬOßz4n-84(]ca/ʙ!ܑbfk2N՘o sF`zcCMx0]64ߛ@>y΃wb[;<}4AĄhR+E 0)ZBR6(4ͰbswG2@#X >b@D+G_]k1.j B!?@.ކl 靶= p{Z0OCMx0F9,jWpBq: [\>3~8F`B b̩c ?hH}R| *۠!]w1F`n! |YCU<&mv~lrG9ù 7@43r/ 7> O(!s)2l l!-xkW.Ass7|mXE>kw[f#hW M11UlСcӌ*G;qx BD)YfC>ap‚ öqƚb\pl!b/c2/bY&6Oh~<ym(X`=(HB|GGB8 Posp]wYdl5X W򾺝W=ig SD(}7GR|"Jj}0w @ߗՖ(vPwVx6h2X`@C1]P=sYphck0< 0,X`>c7l "~oȟ|` vHF,X`!DCMT9D2=?'/' )XG,X`w>ǿ#HCu) ,X`~k1?i` ,X`Ÿm<ೳȿd,X` AH{Ab(U`̂ ,X`ޙ[~߫@{%@=ZH ,X`͟@o\I+ ,X`  5X`{o ,X` ,O. ,X` *[(IENDB`dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/page-t/light-trails-4.png000066400000000000000000000766531230033266200266600ustar00rootroot00000000000000PNG  IHDR loHsBIT|d pHYs  ~tEXtSoftwareAdobe Fireworks CS3FtEXtXML:com.adobe.xmp Adobe Fireworks CS3 2008-04-29T12:18:24Z 2008-04-29T16:03:26Z image/png AA8CtEXtCreation Time29/04/2008trxIDATx{4ߚ}{;s &3EefD `P^;(AA J4D%( F 83ow_G^]{UVUwz]U]uy> 7/^xŋ/^xW)"/ ^߼xŋ/^xR2.}ŋ/^xŋ#}/^xŋ/^!|?ە/^xŋ/^LDG"ŋ/^xK})W^xŋ/^xҥ)b/ŋ/^xK/^xŋ/^ ^xŋ/^x9~ d4:t8 8?+Ks?&6Rt6N;.Dq>Qu.!/^x⥍E  d?`]s B3F $bhQW(r-98upmApB+%mImr^^xŋ s @S m8*`LT+/8׊+pm~:.讀OK0!m (öŋ/^8I7@-&} #!am #T@j,A{Pe "%r{] (]W[ѥ5Nj/^xB o.$kVFJS< .&]V@H>ETc@..VZ:Ra?oaË/^@akZ>ʯ!dr. d) $ĄԵ>23n]+{!} *jMY8/^xr<3 j2 ,'x+ҁғbBPHlߗcB\).V5۱ PePw@׮X]G]$p+ċ/^_:$-!ŃQ'u!S ]@Hz:}d zhs}ł!^xT%op _rdR>SfA\r%dt)ԁ )pq\uY+5Hue \UM+#{/^xr |k-&:WW<Τ2c!yT \̈́U2R RR=RGg欮5v8>Aŋ/^oq CB"A'bF^%N@HQ- H ^ ! ])wmCC:~6mjʡ!/^xy_[]_p8I6E G^=S>Hl,ucFnEkB?dzYp(P0v]/^xb @ޱBCd Q!+ڋt{Myu5=>,?Kⷺ:>c \At۴BxK2CHi 2af #&Vit{T.L^tpźknM'Ur=/^x@~krb[  aNhNe? $60蚥sj !.SE`q^xŋ /;PMb\Py5]LHstW+prdK:ԋhz]/^xHF5(%T@5BdY5vٱ*W6m+0$ԯ~(cI0 8G5 v |_q@ ˋ/^bg:VKѹ`(B Y6/Z,VXBL]kȡP>>',6r-tl5y0ŋ/5*LXJWP,Q Bx!q+@ %\EpW/\>>LYl]+}M!@x˱/q љUt 9t!a ) Da,\%995Hp})}N_ʷmɱݫ>ҧŋ/ @QMRB%Q^0BXD:5& җkֱ)](ww]Ӥk@#6"`C!Bs B\b m]DlcűCƃ=c%y7,/^xrjOtp-]*- C gӻ/ "+4d(?3ʼn@)Kֱgo)r6}rV5NL^xKL~cYxZ!OtKȽB,c "bשzOBȡPNJUB/^xJ;TFm!ĔAT1!s (R݄u Y馊gKV@+eN\T(1HDwp>G/^xr @L ҵB M!H>dJ1R9;6q}̑A/^xr zd !֩yuj!u&BaNhWI&(*Mo)z;܏!@:>α &NË/^ kc=iWYDBfWL/$".DJew "mԫ +%ΗcRX붏2\;(zŋ/U]B4H' K#L, d- d)\`&w-ZCf1Ht {M:% 2/^x@~k{<{:1EB^*RR!*0TPA ǵS #R5vubQj{]Yi^xr +I 3`<)R衣s!"&yHævH;+u@7z?/WJ~z8>Խ8B@xK2]8@mtۘDcMۿrH2di'!druH&81ɡN!tċ/^ @~kChBF%d<0I[ΐnȔŦLYl!}CK(Pd{>eq..xKQMm! &@:hK$b/W@rmV,E܈p Ća` e*w}rj_8v\ċ/^w|EU*+xHQ`/]} 2X؏ ib )g n"M!c2` .S:;]F]^/^xR@I), NA!t]$@v5XS/Ĕ%&ej?6\;zR{)iu;}f1;&kTi;ŋ/^\ȿ}da!xAAٲBGק"8}(ZhS"U.X:+ DRPگkIOʪ>xtsq ^x=o>ui &6bU%4A<>y"ʃ;,ЀUj"5g|,q$' l8/^x>uDWgJ[}UV,tDݱDpTĉt8smB!9[yeStxA϶ν9qW5tx!ċ/^~kGv2p!UeKJ`eȢ%X !jm@3oO]$?H8rq`xŋ*']?«~ԅC"M/y"CVcP8K2U|TĎ) Nޞ|PlI9X/^x@~k7<>7ꭀ}EWy󸐲f-,Y{IrϪk X:[Y!C(f!q v]( 1ˋ/^x1os ȮBTnYW#b#R=.Y#n_NXCK^BH1x& r*VcVW@xŋ/]=«k .Y*]q!c :.]܇"KFa"a۠t[(Q2fu?gyxŋ/}p Hᣩ;VS! y iP~SXCnEMD4l ǒץ2=C.jxŋ/6;ÿvWB1gOB".%@Csɲ$trώ\ Snu ̃/^xi(5G~6T} T}5B".U^/cS4&R5v`#6ٰP)*1m,CirLk}3#;#dӋ/^ާc4=[@ãR6`F(JEB\ܫ"] >\W KйcqV =ʆ.xaƒJmaϹ;D1\Ee \\"6$֐7%k.6D#!\ >gZ.jU/^<\x`ҠkO6t5)V(ƈ*UL0|ձ?{b!ԫRu Z:޳)1W,xB<hCk'q\BJTZ=tPtP*.,7^%vnYU֐4@uh Ŷ6ɦu  @*^!^xxA`Om.X» .: BL馪UV)H}Ϣ<.Ym iY|#e 3*M:_VQm嘡])fxs`::^Ń"hpϿ3|vJ@_ 0@7ʳc ZC4$[cRvV%HXf>@)Եe/4z;C !|.d'd~}!Axhe/Ƚ(\ Џ57?H (2gՉ ۦ V'GTV;R[+^A;fP@/^8“ۏ{:WQ˧ ]09@ 8L֐qB֐|e:o@Vo XWuvDiQN{0)MhRc]/^~㢼 ?p >`nWwֵ>ʝ(^kXAY"C7kZ@h= tdBOox*۫UUPt)*74Yn%E 98kEg=IDzS'kaQq&OU1?@xh{Ε}nv -?}߬tdԉQŖkH"/`cC䖏Tb+U mK ;+ui7%scxEWckũ]w;q$65ΝoHipF"eۦLV0JR {U1EUK[e)F0aMg-g޲]9 c fuŋw n|[^d/zxvtD 5dXAiہd y!E޵7R ց I4u-lw)1U ?%䈬=STsx鮭˅()hЁ)3. mU»smIc R-] *wh a[?$ [ D*, [A`6tu'S~ )[{<'lTk>>ٕ;-p;mahCH]g]@~k'0wy:֐!9;V%^ .Yi{!"cVlSYP.^vNW.Z%'K>U+6Zqp[>N+cc[.1.,\x\MtCi*u ;2!MuB4i"6d.!3!}e "c֣!P?*+UD.luW iﳿ2{w8~/@g 'E5|'h #OpvpM!iڧB@~; M;,i D"Ux5z.,"c4 TK0ĦnP,]L>u Ʊԑ!x(ǰQ[#U6вh/*r u萙ں`9&a˨ <'{ }6Vt(Է(3ZCܲ> .[6RWXI R`6q!\}h\Ӽim.!X|Jm‹d9)UiG+e=~Bϧ.f(n]U\lbʤÞaU"إU=ܲka<@={#@$?3ņ3HU糱g&DW"cK'xmx]…k(AG\3inRֶ \rkXIap{m8dJf:-g i~*ؼ*ttm!$ɂ* Jm"pˢM[H&՗k#t+jXMSʼnF1-&2cc=K`^7p,X qѲݮuX=96I <Δ&6{8nŏc:ut4lS+u'm a4g>J⾊O @ޕHL^-SQUp@-\İ@i^STrtT'MYuVtmnF,8l:*Nj{㧅%5!A`Pe%!OlX>V`$4(RS)QX|65k  c 8Sp{ opQYOYlZrW9e5)@.D*RTWAU1ױAbqzߠQ8l(&'nXՊh&(,Ώ-`H7gTB[_GVZG 4 &aK1:H!KCvn?IwH "oS|i=7og\k:r5\i =~jMkH ^ۈlY8i{ŇO"+5 ":hЁV6NDtD뺶`>59]x9tPSȨ #d uv̮!@%wo %Ū@ (iۦp٢:x]s3/-߶4RO:֝<kycv;ɐx{MTN7oca WK:w:Vl)r|ȫ:Y?,k{NArNŶ\&ʆvv@BQ# \g~8P(D$tQf"w65S(*ul`ŔAQF:9A2Sƪk,FpH*[14]lʲ5b&^XJ 3TuJQrIprZ%9cζ8H1co"r*V5"C xЫR)gSaw؀GӌXU>ǔA-Lt KCkQAFbPT6S_ʟ^ P!lqC0b k BiʙEiHƳzRT$6 uXob2:׿pHX ,&(` 2@@EcBt "kVDL@"wJ7V PdWٶz: ,bF\gjϩ&TO@Ҷ*z\sbsWW&Hbi.T5',25&bnϊyG(Jv`R@(S[H?NQSI\s#0[A:׽+_]VtN*4 *xH%t V/,")˫Uu i:m-A޿&vy_F>>oG7ۂc ,hW2]3as(59ۺGX/ja`g.R4\li3x JR H/=كRT;@oPkU&LO!Bp{AmD Uc"v"ŊA `eeo:&끄maXqcRit6nZEƻ.?>{}X`[5 iSKB=saob.L)yIRZ/l04Vq^Pš!hI֙ۀEUH^hȰr*nceFd aK^ *kanYw1}Q|!2Iqv׾TGöR@EE,ͪ 8+-LtU!ٛ:Z0d(M|̖cv91ϡQIHū;zBu?u؞X1Hh.lTv@@4חX^:+R%UJ=SUy@;BufPԽ`XL.͛Ef' Ep@2Zʋr >UϾdz~(] / ¦ @_uQfBI{y9ɛQ-˔&,T!V klLi bh m2U(60bbfݹ1_u\lݪ*\,#cTAFC)Y+  @= q1^nd%ؤ12ErUAQ& ` 0 @ ' Fp !gBD LAhEQ:oqh(HX696j fnSfs`%%xB{SP9T"% ]g$+2KXckZ<d Q>\i7fyُ`ï@n iDm2eAMPQKĎ虔PY se"@vGRRm *@6)pYlG*vqlbuԩ ^¡C.l؀m@zx9 ac@FǸ[`,9Ll1'X1,Fd+d Y"}RfdH F g'F @FAABcD`q8 1#& g9坂]s]v*h/[Ý@Ouc*`O@PbwX|/jT xa[:xZhThd}]!Ti쀄61x{ye@Ȫ)7FV 8a"O?|x_sk#X8oP O7NA "tLj RT+F iٸm*h*9؇:>DIGlU]@GsW}bqY`%Xkq&{D%H9Fe8E)9tlN "p"bM1 Ƙ ΢)3I`c!&,/څ8l0|0JdyV74Īyaݘ`?vRe`_@\.jc27iF3xr})r̰]LM I(ADTJ,A9="H?ѹ2\ "G?GHWΗ߂ ix |mpMRVYLdkI)Dӽ,",h1:{ [ccT\YpjsRPLuWe;eTe͎"m6YG616V@"a#D:zu%##V#6q#ٿ`DhQt933\a61ULH_UBGx,NKHrpXLZTKMGռdi&mնs[*k3̅XX%hjǛŸT_)3?/^~!@ ?ae)Tt/AUTPW_ qxVb#rqZdbh*+LMaNHϩ}>(8꽰)ukh&UMvlՍOig2z6xXX%9ti-T>"1c9G8_UBE d i[ mƨX4@#9JHh$35siޓ z]]Mjpe :4;o.,e@csvʮW}Sq]CI[Ѝq5 Xba;Y.8@pkݸ]/׸bF 8<U,9J׫2%ve7+m*l+[5uTLvn6tt0՘D@$t!ീj#g,@sk;T).CoϰN8\.?g >zAMtDL R>n\f]J@+Rڽ.ZKlDL0ٞm곪q#649:3OMUqkG +Ǔēl߷pdNc\np^vd[7 Qx R AQ0Fp/ & #z\Id g2fAk8lS PpAxg q1PdpJ@zpVUombm\t0†Ŵ:im -vu2*"[V5ȭ!\ ۺu;Cimۺd+dKSg*GX& ~O~s vMƋ#D)p< ۹>3H` 4JJ)|vy]T'r dwإ`e0Mɣ)x># .0K!C7  %~"#@FYU0=t-6oZhh00 p01! F !·[Gaˑ;);%W"nƌ5t%IȲ dN6XK$)'H<>bQdB@DpIt p9z0@%~!Q3V( 9ܱ8Ԁ],bven*j"*<Y+j jRiӯ<첻<^/?2^`Mbgxb${s roe"IUt)V)w,\IfὯ{=kɞU<Ж]UYEڸbԬX1 M2\*~7 4T cTe\GKY8D׫[]-pbserM 8 "DFpq88khL# ghcWKd`;U.%& q{8ü&]!~DXlxMgb$Y Ik0 (DH .sy,lp&RRp;,灲_U*؎k@*:ҴUg i_]bܐ]B7"kV`BsU?~eW 2LΗߌI<|+5rj{['@rr次%rl͞ ݊z"b@NkŰfXW`7 d1qcq1M[ZX8@nwd׫{mc\QQ! c)FpQ44clBA$, ,Y5*:/B,+[m!H qycCcubdUz$Y"r.}a83\g8q5y!I&/%ښPS@29H!vnj3qhFP ="FTfU/ r]_I|p~U p>·<0Jp[H5 ~|sKg4Ε.֘dn17\cbqƜƁK2fG3\/0a><ó3a^d $nc4Yml PՅ9N:6YL#r4Smx/ܳy^c-t"RwD.Ï@c!_)Y Y4ËK|oK˵e ]ȯ pk "^@D":*6,gM X-+{,;םl'@SHl_\e9zǦ>*xԬSl3|"-et^^cbs8۴rYAA00`a>aq6|8t0t0]y J+"#CMCwJXgka%"m!wD3 p>rt*ځ(Xb&cH|sw<~ZN:?=]Ʈqn c[_Bh-5d7>CBItg_Ϟ#XX="gP+fRB52Gw^%(T~f̕##})Bi"|V[)V$B&HM+ ۮ4U !UUI}{S*}|׫;^^n}qCE3֍9 f)/1 { %j2PUY]kpwş2TS1n?dQUV/-a2oopCdMFŢIXXÆ 9).Fs\  QU4pͶf Y/`]pO b!mp+E P2'Ȳ|C|%k3.?$ ͟I g5 NuNY@ UEEM"p}~X xOrZ!T \:Wagǐʶ&*ƬN<b4y7{|pbmd @͈0&gg|8] rM@56tA# H +g^-ʟ*6$x.HfX1H2v}-7[,e+ "C)ƃ3̇s\ g|8Ùmk $u{MCUܢuZq!U,  ZSe/k8Fi1~_bs«BZuv.רJ".v-)4tHPPLHA(@F*r`ߗR5fEueذn=!ԁβvR؎aOdjuf?z_eݧc C,>{Wv}dF00q9>pfXN:@5nQ*bZFl<" LXm`ZVx H!^X,q Ue5o׉E{Ƅ׫[npC|e*i-w 0 GD#Lff)G^HuQgꌏd6tP,0KS(UBTb`oHf)F$\q&-Bdv r]a$E|H a:]yҰP КE|JkUpSvѺ.Zԟ4n#66! kU{0i T8ᱮ*ӵCjqR>@=W­G[|V 'kEF#Ls p> Q+[AH~ >A4rL"R \X?s ⤮N~\>0tZ[AKd#qnUn[qVHQ0VS nd;םޓLP)[GWUv)|qRNvʭq^[|v\GNu2bq1:xK\Ra(T秪zM{B0"M)oR*LkՅ />9 ,vUw$l&$_Ȧy e7{ܭ I$tֵc(0Rf ·ṠgJ$T3͘N2Mfn?nS~z!bJ$SSlPN~gCJRY! g"TB_rNS bwbg|.3{eEnDWuFU*7,fTgu媚p{[(ml7L^QB~uIlP>@!-[k+Ra4$:l8Nj9.Ggx18ҖF5zL5 U,ADR`.2΄+d8"[c0e8p,ʱi+FBҨYXHv@fy#wXX&$k-G9/^98:(b8ppM -YؼM]X@qd1f3]}@#m-gl<^c?`Nm/_w$蓵LAQR u~ @y2H@7:/ð҆ k&NZ-2{&"Jf,x%\:l*bGp.4_^md !c5^/oq~:CNI6N$eBGh`&Ό1Nlr%Q(Q];fEL];>sn-\EWi]--| 3 _ww"F z r H՝8J;1 } ָ 2lMUdQZIEP0E"1z֗l Jk"i v9Zm'M;35܏tQT}Q#<^4HG*v|xⓇ7XwX'+ Dg f_/& &"KU* H7)o %,\aGu#1#EJBI$"j쪊}\a0V}TޞͰb5/O[ N]0r^v-ӕ#0 8a2b s(_mch[=UXFUB}},IhpH 2Xlfy)_@HD|t;[1 &D  xUv.ok eP:g՟rTPz TLPe L Pm1U~/`H{& ^)\طٰJd IӘ`b bP 05<8bgJísر *Geᣇk|y7Q\iH`gx>9ɳܵp-L6D@<.rTiسrEQU%EKtBƦ ˲\vT(K9Ww}/4+Pe@C{WZDJ[XL٣V9خ+LTd"(`p`Y{o ދԾ;B ?˴\嚡Yİ644.Q||Ty!> j&qᢐpEoՇ׸]uttj 0DHViV!h`Fg*?McRYݪy8;^ # t-PPK:R7AgJ QY7lWq 1\ρh,qz6 q;}( 0Fc)ġ# FF΅e%S*j[ఘ38Iuk?YnnqZ`q~FLVEbM0>^(1 ⩻uў{{ZtqXٟw EX؂J]iRUi D8"KQk?]9퀮 -6,3꠭Uy -PwYY[|5 g9^=b6PsTh檊C:/cH10s,^@Gxq766Ew TnZ>8C8d~Ҟg8جp/q^%$F tt! օkN1 ǘ &!f!D+,r$ ru15C.Xla#:]~}cc>~:Yb/6}.Ӟ] js\.r _8{pҭi^E o] }q$?bY@JZv`s ȃ@p _*b]1h/هti:-*xbWP%9Pj_ n |Lg7}ژj|1Wej`\LNMM[qTw|y>}|֊*(a:8;{Wt䫰)*i3=[`Ek?INplFXa X`k*8tpdĚ߳nt|6aE<)׫mqYcYb?b $J @H" # pA88!0 Fa$M pzR#` \C̸_c907+0Ia*IN7Htx  ,C۷"4c6/JdKEb\_yrQ5?XAzWrz\/P{ D*b4M[2 ^32YEU<\KR?`szRFPRe(L*m@fafvJ0T&7-};^h[_zuE|$Mؤpit^N.jz+D!ۤjsyA:E[ @ Ч~4|Ayq:[dR?$"Cյx},GFLG>r-h mB4.W& T,%dH1 wmX16X'K$/_P<(B#P))q" VRiR NH5202Nf)2#C, aWt0f_" !<2rګ4' `oHpZ!_O@X/,Պ WQ #׽ HčKZE{\a:)/Da!A;]N`l'[v M\ kE[+Mto\H[#] R`fg1f9&9^M.0uyeZzg\eͰ<YnoRa-"81X4 w}[8->rbS2RX'-΋6 s^F9G<<&11GkQ, pg#A3!3rλF ).<p6 D*Ldw &c M蛁0KcGv`G"V.:9oVZT_r CJ/B- "{V`j[5S9p$jmKb0VFXbp1bF\M. HBԾI̽$YBmlQ ~* C$ԵJK"Ŋ\/{e}:w{=ZXEA`޷rm#}V&i U~͑"{Va^B@Jix_+uoW8T5:k*(#G(\8wR(dp9>_]r|RHD6}, 66ٮ稂 QrkPu*U !RF"{6p d?j`Jk3dϪ-SW@ -zYˆd"cT#0xdxMbǥ@5l8q]p',.t6$Aa$((0Cf")ȴGºAŹ@36 Ú37Ƥ >''A%+lw=W 0MuuҭV)Tu#m` gۜE$/hDZs + Vz m@C58 WY**6DyV'OF .l|ϟ=̯DlG(j+ Mފ}X9 R\4ʹ8 w8m E;ɭEFNdJد~v(8!:2in2-y: i J :YzvMbl1c$H3F&˶iB*A½3a0B (dyY41#danT۔ERVϬa3́pJ|_ZxfT5%>%8 t7V2'zVX xAIRE n_/l!H 80-mn *mi:"iZ0j9w<%wly⽔=/ 7[ 2 Lh B p9z ][ ʤ8dh-X3>[ATἔ /8oW"q!1 R~@ #[~('xqR\MBTSMh# sHڷiBjV?TNי,%[ Y }Vimvν骃L@:8zb:jZ=:bݧx"ۦ (8`>sg5+<nVH gU 6vC˖ 93&+XHT 3[,Wo[/(4s`j.%Vu$N [Jy@ҴPvo ^}Uem`A>?+ "'~e; 6W@<W64g.Z:T=u`v5Hh(Uf/I\ $H#"1۾nU[Bdjsu'kAiQY="!^/:_3{?p(Y%xjQ#]@pw,,]V*RuA{0ڵ=nbl Cs߹]8WoRT,:*͜ @ #]=e{IIm%Qow F-|M'دn-U]^>1l"uaIHJǐhQ$)4S) $maBܹx-j< ))OKLr5&\u$nח ;.>݌#nw1>~ ;A^4 3̇#HJXW:Klp*E3a8 Z:t?Jʸ ذU8:Zgb%ڴ2>lVZ@bi }JUYM0a[CO^Ld?q1ny3`:rt?C?U֎*Ƞ!W D@8zLT[]B]R!Q] mjU 6XEq[n.ͫ~Nj61Uj?pQ aE:sJiڴPxSBZzN)o5A ΁/4^1^]i۫5|W1 4`2;uc=PWe J. >UXJ$lWi EUtq&K Rjr1F6wմp`: )rh- V&,Ofylq>_|o<ID PMԨbe|%A) 1JP!J![6VR {VQm+y[h ,`p4a]U6@ҪA Vub @t`am]*-@<.61} S~ER{`ȅ# #Զt4jb]d(ҀH`QQY{mb l%|E Vx"s1Y4}GPA|O%Pv\(׌3|Qt9ujh5G eU6W7*GUg)|tL[|{ ֹkoS$cP&>WYE(ǵ>ekmw2o3iYID7Zqi'y"Gk ydh^Fh*}>flfSHOuE+8A9eRnt )+O&rcCGˆH3u#԰W-!C+Y*o~&˽p2o)W% E }8P2(mt*oȉ>[ } ,3:CeYXUߣ>U&]0~x3r op)~zFOòynj %pȈF}^ i %Ah?*3`dhm^&f"&5q fp1͈O+68uR2 (\^"@Fi ~z o1zlqظnցR](: .zmY@ cARG40(K^yƤiէ^Y `# ahT?o뚑W.ȓ TۢC@_Ν`?EsX7G_~_%8x ص"MrFbf|^WV}QXHW :lpP59WIc$ # /uc6LߥXe|"@.'xrG|-{yTMXM̬Uַ8VmW@;.//Jk-!\~ɤդiRGgm;$?B2B'0$o>B:۞[a-8mt}Vv05&ywC Ѕb`n ۈHs" {~S2.=2\)weO'Q[dߍON'p (D.+2Rwo ahR й~Y$/3g!b\r!Wjgt/du,$; j:2 %MP{G@:_V]5.|=1ܷ2.D)6z 08<}a~u/fdJWGѓߢGb' ÌXIjՌ 6RĪe@Th4"Ƨ|v:DQM[箕˧Y[~8"r~t>-|_|U漍,-<@VY@.|gB-Ό׺̨Gǀ1TE|5L.aD}5` ,@ӆ2y E=-3NGXnco6|>BWeh>R'S(aYk"ǘdQ -k}6 X8JHd.l4Hqy$ Jb7B*gOqDw]btR %յ2=2ٺ臱==ߕ_; 8 ܧ[">WR;e]>.nb$k1nxgÚj_9->ATA>K& \x TΧwCt)2AMge¬h8\䳰!U sxKq`Yɓ7[!M{ c1IiO z ɴ`0{dpU(9CL1%[Ftyku#t"g[:=戄uS2dRcsuyM6k'Rn7Y|N|^31.,[ܨ"#$1<emۺ[{fxF_ GҢ RfP.zK9@PҴKkk<8u_}֬¥LBz_Xt?Hۭȧ7I Z@%*RI ةZUjC,~ "= _w`4Fowvpw:ֻ^4r^ 6V~$c0RU6ж b$+AN܀w_Ձ>SkY.wX\@,j~ tIݡam0;&\ B96;6#ױzj*CR `o zȱ#|w'po{l]z7CgxTTݒ'x{YOIfd#5ɖS86'b|&v,ϖ:R귩 P;@ wL֜-gGzl |&"C1=Rc_ͼ6tuªH} e?:^(aUojX傌+ӎ`#fo$%ppI.9`d\HZw7 T*h&!U@ vbIQl$aNDNԲ"$A,\bvF?яn`EiGz;.n#y:f铊<&gW GEQ>uYM}[*:}dXjUS_xT^o{ cӱM pP8>Z?[^ W_OZ6ISF? "P-ǹ9ytI`=VmUYi۱30""Gώs<ZpmJJ +6^U˴ gdt,On؈ /]\ U.o7x E?|' {_0!˅Q1 : UcJ2oԼq%X.ˈ ցGpU82mԸAc`AQ3oS[@@v ~E?aGWp{5jj9x\\ks췮1_X-+Nh:3&bګd}NkHd.rEUݺr*i; w-n +`D?fW.1o#k8poJ*`"uN|UW&Ne3+̾u^+AI]ώԪ.&"``#dt|bՕ`0|πy?K `@`_u<@4_YN @L'=kcz5+w$/!ǀ=֠_$h/!E&6_m˯50sܕpc!яvĄIPخT}F}>fozug?8"TI:\m!P )A#Xc/F7(rHt?/LO' <.Ya/үPm% B5h#B.8r^D|ed9\ 뜞`>7멋A@Q 6;ny t>0FO~‡D'd.b>7=%^*)$%7;BAG< :̪Xy piQAQTw'eρe0[W^B7 % ׫`*Hir ؝|Gax_ۀրQ "eկQWvw SM‡';?6 l\JD)_,cqDBr?lN Z7,+!$&I mFϥ(HՄRu ,cas=&,E-ܵ-rRc\entR:8=. 7E_EA@W݉:oE59}*5ϒ @ vL!Ir5IB6Y%AQTR#^Qa E>bwzy EE8qeR|OLܙr8B󶓚'dNFQ}oaY+ܚeU ",۹w??j]q_E^1'dP(1t B9JxOwEqjǩ<-ʹ44L(AQ":x%z?eedIߋAQ*ʧl|`$lSEq9]E@CQԪtTD51E๻ߙ\(Z46H_jɁEq P)lIDATxinY7;ܚZj `ʔ\\qʙ*Tى]J%`;Nlb0 nw;o>ϻ$mI~W}9߷>ճyn ))Ue9c(BRRJE,FL~(,XĮ2EA w9t6uӇW+.^ص\g"Aow.C22QMѿ ys˨zpHU&Ga"F2= zeB^]m֛jUՕ+xQNjFJ/C=TJI4 XNuK2<;;¿xM\d2ϪgPt&CI8-ZorL]DItd8 *di"29l (J@A~of 1*[MK}RryᚶRV1C 0 ,z^,r%A4a:~\w?gٸ|e}ۭ 'LM-$;u#XjdUUҲ"TNiu1u $izuriyo}TW0Uƾ&#.+^WTw2 &4ˣPܺym!n32$Mʲ-D~ZY;3'z4@Ƃ1!\bi*,T q90'~1_UeuUKN .*`2iV2Yl>.aХ\'fe>6f @BfuBXﮗ̔kB`S.M-o`![O@8Kn>#);![:;F#hI./ NS8:nlvA\hJ#ˬVd q`ca TLJ}nݒ1#'K;; cnkeWo 7J˥z^˾JV{ |\/=QjBc/\a>V|#Lg,U^M >ɜ9'Ccοb%jc @&l^w %FM>PJW(ʴ3}}`ǦLY&X";;9Z:&l7[)4-ȶv bz0DTT=^eu0;hřַQ8Mf3BR(Ðeg92rY3#їHŶ~ K w>$.XLq|V17b4 iדZ O~k; TW(nݷ{aMS+۵n {N:;/$D=erԐnK&JL /QI.e +. ٞ2ъbutAi\8蠵L,֫hۮdZb*VeKrM_!&sA~-߬k0 &c%20J2)rwU[Zn!4C2);;9’+jFQ׆RybzJ,~ExARU24XD(/1ky"衮VPF yUkfPg%xH"]ɵfYV2rOVA,`gQ43|YA'"##-`ψ}Wl[lbFN :;/SDHah([+Yn@f+YccԺfeQ5{n ZB?v}GppMy \<]S}LGmDfUIXu'MLAQ'j+ï̪8Q`u@laQ 3}5چZ1L*Da*aLwwsڮa bLygYAF]M% Y$Vo_D4Fz߷rz]$,H糖;\|Y{)k[yTS i($+de~1)D@yBoXxH%Yv:@ZTJ!›LJ!&H 㚶MeRl?arȂlE8%sw?`鄶!-*}(r-2V Ħz-Bd]:`5ˋ!RCLƪ|~? `aJ֘T׶\U~@ml6Ra$L;6I*ZO>{ђ٬ml^c:ÁC60Zt}wwWoR{KN`4DSVڳ  2kDxmk=<#'CU ӽ@W] -x[Cjg RmB<S6esK2ns}rMM,wkۮ]i ʮͫ=le5h7ww᯸P#̱E 2ЫtGd@H4[L"'rUP/Ɯhz.!]oK{ZFU.(]&ECj4v 6o=ND*dܺ)!fXi&r#x:fbw?zI(#xR +YSl< YP5iMi揘ܬtt!0}, $˨6q@utN&\.A#XeT7ji oBHgyyC 6;SEäsPv436wwŧߘ-fKEf슜ٔш ^!0Tt bvPw- &3ģ\fPU* M ֱNVi{metfXi8c,l/?؁JC,a&TC"Ykq@kZA =B?Rb[!mwwJ~b) coʼyX`*2/y|h[2"A2HJMDD1FS퓩 rJ;Hs^H#xu]Ww-Jl#'٬EWrẩAl lYjIHQdYamFS"ngR=ɐ#8 w?s摮ꡨ-r 5!Ko^&qY62&;/B֛5yY«hZ{@#Y?:#t;hfDAXwppPLD! Y ]Ϊ!(k>,-RP9T۶2S ɶ![:;V2UnB Zƶ:3 7pD?#Gt ڷ{`uۮd|FŒYoJ8\XLU$d]uN.JO糹arҔpUvDR5uĶ -,}֡䆀vmێ\;;ÿ|⩧wiE2R4IA#C=T@ R59n GV)ؐR(J2:4 ''/ @Z'i?裏lUiH;e#SBOhHJ#$Y`47qzC/M&e;;_ʀp%Pa-;]h ,!3D41YKU hZdx u5VZP7!~ɄF%\.Pg{iz*qU8[䥃´iemBLΥ!CR?ʴπ{$6of wwQYۧ_{|PPS:aAp"chI;c]v{"H}' SuY(:9L?3Kb&gGhj@4M`G:lց\ݷSG&hnoUkd0Ft, >"kn)$F;+`ML9h֞c0P_䀌e9Tj'X=>GJؒPըjB,fi ·$sioUMm֬MNC(#'up) efΚ^4?*ܬ+w 2V9BEzJ-V ҝww]}/8rTDw 3T=lR/LcȃSR=&J]W +D>U)twz,rUΔDq" t`fd,MА <.4 j" ~]7řj`P͌5tJe0FEРA]vg,;;9?b V 7*F Uk@}YO Jj +:ȳ ,;uF,W, ň'WЃj@FW5eGx+'c¥"]Y~ffُKThpj50 /SquzN$z6҂@i½dl<;; OXaͣyM@,=߃NfI0_FggI E#,y1rȚ/;,Ri^HfmmIi 1%&_Ɛ#l>0kFuؼ4^n_O028P3 >nӀ*&a]6SiU0ɅKTZnѶmXLJ!TB+a;;9ÿ3.oKͬͧfia4Tƪ*wBQ6Ŧ75̆B2%l6EA#(wvZOhg9ᵪ~1#,dAȝX :ix[NnBƹGl>!asE 8!Ɩ&r1 { vDJ8"!8;VueFͧF 5,|jIdO.$*4PXBF2D!;q`m)K%C> "B9OL޾ \pN=5”8X-ÏTr -/;!PHTE_DAͥPP7oKʑ2d⎿;3nܤ#~*o,5ZV/걎)ݑLSt0UꆱVԍ3"}1 2Qu-,&1"! 12Em!v.J,|d"4&J"X(\ 54qd#h<ҧ,hlQ|`br19;0Z .G6 x5 =3Ir9\.+Ɓ"ا#Vad޲m`6a%_ȦMB tfVUe8l<߀0vmz2g#`}H!QZ3$Y!`W2)d.\Czߒfmdn/G6pMdww.lZo*/,l>IrCK^;YlMXo6}ߍXb^)x}|({OёR plS'7k_YDcT)wi[{QÛDLr%,- ho޼!w'zbNv (3[a!aⶨ%'7wwO= G} $%R֟r (+TdvTC5sdrn\h1E(*H#̀f Y*L 2zj͘Z^C֐µk9}f]װ R%VaYCЬnۮT*BuUi5q%;*5,-}d1;2<u^|Ő;CqYy2J Z3siT4M48JY=632&K*J#:B.3!~ fAyyF88] YL6 &BQi ~ՠ,K6a#(˗7\brddn6Sk׆6dZ~ttt$qw?Oknӡp*E|]g~=hBO98]){U .֜ Jپ(l?MT1rUudh2 *0X;o#TQ$?9/65D3 01IQn܅% >M [ؚ/ʃAA69;/S@lѰ`#FiII"um'rƁ[)%/m"}(M0 DcS%Lvi $jp`,FI|3B`%'35k3+ o۳34R[-,;;?^c? DD~$DŽ$< Fz#Zk1%c̺,6;4bqW s^  T1!m,._zjZ C??'Kh(pŃd<Զ-qSȅoc-#1dH 6{eyt hw;?wr:m\DˑjJu!UT_.$eLO";r'B,MEO5Qū]lT* =b5W\5ٕ@NWbDf&O+s:<:t"Xxf6ܘ`m Ѻd9~mm-Mj|pw_~{Gym7[A>Қ,-j$7M.\(la,Dm@:HԠeڒYXZaۈQ 5G5 WKvٚ.?c6U?L݌BSƐI%@l62.]0d[+t$ ,4odH?q, tdB6-`1[)1iIdJe<;; O_AGQ21*zM"f/p_&Dvkp')^ƐSh X1InDŘlx(S)*Q };)Xe! tOA"sNeq7X!rbPhYnUUvp,FTQ 9c>X~;3'~jm뺩#Ej3m>E%54I,YfG4p?QC6m `[~TcT ȹE\T(ꪚzx6ٺRxb9\k:;/֛~gz^]NTPUszPL7e|HFj)ޣ Y Y_֬DM#.KV+ΞJX17fgDV3`u2ѶaU5& D RtIno% |0k'&&בŖקkp r>kI`w?g+#Coݺi@qXAa| 2e滑F hh%*6}Y!­Ndo#DU=*h"dP :/x:Z3˦7 eu[M(Ї)p CӥB-WS!a>-,V Jՠ[;)rgَ2z LK( `lww;|Rl@dYKp~dG(}Y>TY_wJZ\n2W%Bl97aYO ?ӔdfL)23 :f]*[ 4d*3!=E.ј:ҿ#}Xf65P&Dx=s3k F}lww'd>Uj4qlMZфY5i=t߶àAcCPCu^H!N&v5h)XFųd_r Jsƌ4js߄W(fM,cN8M*4<1Ur!0{wwJB |͙:h&7a۷ yq i$e^?!tsM>F-R}v[,X(bJpsjV.`cUEQ[7kh>&0OJplw /jkR3yxD5͖%dhkϔ4G2Y8V?0$:X N6IK Kys`{zҒݤd)RnC[i:;"w\AV5p"`8oPM?ABzh!chL6,,pęJl\l~@ +s*L +#9?4Ȓ`sR-=P |33rO5 U * AMn`>tFjSJӃI;SV?aPXb6aJ ou]?HSINCT6n/`Z&''2f< u]/^xfZ&IV5:*ccr(NlchUb!W[,r9#z3RݔdRN$edڬs sȋC/!1c:#e&R2k9#koGJ!w=tb+ >2?--7Ef1" !r?`[4בwws^DUV9铢yRU"ne{QtL䕜@4i6&^E/8L6mdz7*Ų2PlY'SnFN:2ez0ڰse^vM(dGvԓŞ뒆KadvČ;Cw=Ķ[* ë;@lP1+g@Y55V+[ 3~AՐ EbDD$rd0 5d#Cq3JYXس DPkPѦ' ET3.]L%+*PWŏ;. qIC$}F9~J aR\sw'RњDT& :Wkb`v!s9J#BglDD gV}LRն>r@e |V:;VS 8KD)9vSq캎ml6gPNW͎lF?Ҁo$Huҡ %KEG|}*;;_U1^ \xX8K@p`!i I[827"†B OoVHi&j='ݾO mP_75yv=1k^ j;#Pm\+W^ E׶0٢QBX!!ܷd.qlʨ:/-2o;;ÿի_2|A.f_cm<h$1N݌gEMjq9QlkaRρd'-vqb>:"Xo@BU,?Y.YPyzt\wj9Ĕ4QZ#.(oJEШ'R/~w0NBAilpkKvm6&> V=';wws\.W4)R8!v:ZY?}i '"r )O#q!ZO.Ib_w(| Sڋ*TωE Nj/a^ ?7nޔ7bB66B1q7ksjD\ mPa+Ѧ}f8ܼus>-}tr(+G>J5v;;O?mʭu^ Axi}vO}`r1LF]º(g[C(!y"E!}۲P`bYqM%bTܷpøtRRU%Ё͙2ZvmĢ4wKWդAYm뺡9Q]k`s2*zT(Td+G0 !?_,4 ;3w>${Y !hd}k餩jK@Т2fͥzVRCuHXq鉭umAHe~kI)c10%bݾҚ$Kpoŗ. 7n\8@=;d-2< oVx$Don\ww**o^SKT*0~ iR ^NFrǞO…r&c0͌ZRw}pl:*'%9Ze(' >|AסZHԴaO8r*!1-!e\*e Z@"9"aCm,J=}g@dQA]4`B3(9d0%;;ÿm8hS>*YUPJ9Z Jյ:eצ chKC!%.|&)\FfX7%#BF8Cs@ܰ Ւbh%5~9lf3.jB0\Ӻ`M=2АMH! ,D+7/8;/y+F~͜ /LU(O*h o.&bJ.b9pgu!4Ee&.P_2@ bߡ/KrͿCScg*b<-zmCO{#zlNk׮=裄;/g0B; IR;'RNTd %P<ƙ a;%iQCgEm;RFrA@PX6kU~)]S\}FUrmeM:>>vͶ,枔}Wɭ[%ƯS. &28r/3)xH68z[Jt/'Lkڞ(;;ÿ|U1Ln: , gGYby"854kqE %.wwvoWrDJkl b> M2ɗ, ,+H_~ppAuu7QYȐ>XTNߤAQ 4ǁ 6vv]_וָi /~ACNsxVv;; ]O==I*^8:y_c_EAa{ hඬSʖ:>*p9o%c36Φ1[̰^2Wb*K.AA׸Xt}`#OWwd0%5goѧC,7°i(+2^tt=ov|m}ť}s|V>P5쟿\AP{pRzxzz:zb۵yZfX$)`"VIO"{rD\"E5Fr}Y`Jr<z+( vZgUJlptG| *E [Zf";ehwgؑ& Hv >kP)˧uӯJz+|k_;vr… n)kw$ɭṏC?3Kon _7|ݦK_&UTGX7n^|Rla[kdtGU$Mj[Fm+8%$GQK-rԟlbVG1;1iLh}\׌^0T:;3[a2$€s$L.~a>rM9\,@@i2hvZKlz`pr;{?_}:Op߫p/D,\rZ=TϿݸKk =1 UT>0e2S09\ï; ʮFx17d4j*Vuuvup53,g2.N_v6SBޒ.h60IE4pNs+m*HN%oܔvO ٔ&qeʑjcQ;džڟGó K#C_B0!qy%y<ż4JJx0\/E3u HărO-D)3,fz:*ҖJyP#˜X4-S: ݥK 9: [6&`PД%2S~-"ЗV!;s˻oC*|~,͗nI:k|: =ml(S;cVl50^J=jr7FFI1 R.DCI2i+W5!* '0IZF;UkcȻҠS@\-WCc-ɥ>7)zIR~*ܭ;;?k߾[q䯆/«o_{b7g}I/w}l6)j<Jϝxm}K{:a*SXYa˝VŔS[#Evrl7ց. hav~F)N<진2J'߇?,~W0}3; Tg! m7|b>UBd%t-9IZ``ZdȾSЀ;O[çB^ɫkX񯮪͡Κmӵ@<5MK10Y3+B >ʃJnnD't,5uƵaHGIQx\ȶ/j喋EV^Fe5jפ>u┗{lc}mfoIE^&1>X``=[;;>KJGׇg~v}^<_}ڮGA5gYL =S-dUэiKNR]43df6-r]͉ IXKI䔧N`Badq(zLnw[z^sd-2(eE{xr|hfʊ 3rl JpJDn;7_bWt77}U7?_~{[@5~8QS^@X&c⬭ZPگv.kIBNW(D2g%Ƴ[pdҪ,H9xQ6VPZؓ+K.~;u_jY 지2*^k.ȣR 8/WBY=Ew??NW?L^O zz^EwSiZ%.j9'ľ&+gn2Ium19S͉ [׵XӍ8FA㐲㓑YU8U Via!P!GgQܹ5I'ivhVRAY} G^ʵ!Oar4u)ޠn]ߏHv{LJn;;ڟ _Vto׽O<4]x+p{ղ@)!iZ$ҮVw|r[>d:oKpK2,z:8L$mIh~Vf3&2Pr夥ṭ;@7Оv `͎;.s?uǿ|൯*j,{͊ j*x}">c]?U`,1fs/ZX-bҦ hѨb*/r*c C~Hk)loqM58{Mci2fSi*fօ.d Lq vc$V#5}{R||Ru0jș;>o'?eJ-mz/ Ī`V߶o.ͤІ4 H>c(ϸ"5OHpF0ˌX9+ MU"S &S g84d݀. iS,(A0)ũfkJ߲tz['S7JJi0:+D/^c{4eȒX6Fg8;}/A10ЇyT[ת)phmXmpXg50Ɨ"t%k>jʧ5 Hc̒hyϓCކow"gl+BA4Z0?Hﺞ|SrjE5x>f͌IeݣB >S>7lS}h㏿ ߫yzul岩 kYjYwNvﯾZ8HW򉧞̣Z'h7)FqNF\.l0!bK akn[Huz%;Ea6H% -i̋j<0x:c`dFqf tP肔6AY-.J<Q7EなH.[=bQ^ ;}?x,}z[{5"w#¯ LgA7vFH42b} R"ZZDv4 K_4M\,1M*}~Oo ) ߃62'ㄢn(Y%/ ט-HHgr~K۶1\- Mn6W]#]"+(#;g=wwi__pokyvv=h7B()]*}ZLero:Zӽ1M G4G ]·~eqP-KnSa|Vиn%B0C93WD' иY) dt6{M-W({Yp謑B``T{9S+T֐ [Ɠ_wBpRO8tw;x"V׵)dzW@@.Kbiceáagk\Y#'rY"Wwzw9A x࣒gDDM7b{$:\*Y?!U1wg_z/0z1׼_멧$d&?(X<_2ɫ%TM"P?q) 9]@p G ؓf}3obzw03s `ݑY[]!mm9Bsz6Z6 3 >AY~cܘi榙MZu \D5ƅ>|mJztSWy;;(OnWZvᢙE#K&OUQG~c&n{k1Xƈdp^Y4zOZMa_xᅲdL %&-5D^YllۅIx.=U伩)XPςqThk+Caƃ'wL9;wcPgMOw"d_S]a#^h[{8ok`lYCK%zRP.g:w2D#ATDE}_YNl+FkX[CL}<8f6c6d$^2z9[TA`k*rӺ(=^&Y@``+,9GX AwwE7~k U]._3]E"S:]po~0ka>`ljv9|pxz^Yc*뺞ew)#? #tD稦fL: >u\2*#=zkKv-@qCկ @kFXН ;;=?/CTo|z?|?x=6r|uFV+%#bdavv"MGZS%tvb@68`lzhDH!#+ȑ|˾gD AR^7~&lwx#܊Uә [Sn$}Rwd0h 0Ȝ=˔s#̧F }eNPUQ/;;~|Q+P4~W %<<<\ Nq qr :|yO}B+ǿ|{KmIUd* Nm ۚ).^y(jK'ÌJdYEMI=?6cT[b<[9Gor\nHGF})HAk:EvYfMgx'sgd x02"ܑn |T1N+zD_.UE召4M2хww)O| ˁWŃ˳owWϭԟ㟨xM7o6Ml4F{>EƱoi>ŀܝ (:UP}vQ'(1!5^* Yբ\9}0.^+' Wi:'''˗RmixT $z}) ㊆mwД ;?Z8_TD,>.4vS9Rww-ݶ| UQ5bxqn/^C T_ny0O>3C_j~7 )8+i : 7x2xcr)̎>t)PU1HvC%l;nhY8uu-p#Kv=̭uj.Q)_iCH)U-M-Gjv.Q7u6By7y0@Kݰf6cV(*~Tp% ʌL\kU ] Oj%Tu;;ƫ|)UQWZ#|uk,k~wm/Ʈ_ NO-9x֋_ x-,5z"tG:ﻟ#ρPѤCCqPcA]Ұ>L Ժ"y\k>lcLE5 i0_,xmB[Eg 2be]KQO!#wpخfK, lv9Xww_Uu.|d5\-,w&c2ׯߺu5y|>2GP~.пb{R+ǿN@2SBj=EAN݉" fH*Q:ik(jubBV'''2\}nPr=40QXhFY(D[|18 [HǾ1,dRH+&/6XO9}|CWz[&; Y ww%oZW\nï\˱@vuppʶ_Pn\:>lx[^9"6V6ap: RA^Di'L\]^0 !m 77ݑ( ެ_SP>.O3D}xl[L,[R*Վ%ͧd`nߖD}FӧWHAcwJW i`iY}w^ԫz}>+M? aW.\ z{?6'\0~w93Q2 -|S2cuC8<=TkY2n'7Ќ`Y_Cuschv\ɹ'aM5UuIkS!&pfv~hJq2l6b\.IՊaN^}fYd³ }b( a0;;W]]V)U%t瞓{1aWdZg7)B}] W531* \A[0 o3 a\ SĶ/_Gջy == YL.mҏ\lVvCO6W jWd{8]+LJȣ+q uSyo)t[NyEL3fCrbjUha6;AAF}61+XșzKU#q45OӜb}4- hs;oEbof=-(^xի.\x8͘#6Eo9dyaWW6X 8LY]ޛNnEB"̆q}TAixz+('bܔ XAW ۴L CFD3(*af&xg}#gz':rJs5v˖|öcQ 50u[;;~wwW?_G?`u^zGyS;Uk?V%aWzɭR⬺u e'*.1q=(LYrur^e*pOomgN-_Yz84' .q5֞#r|`}=1-f &jpL-7>svM E`mZir"L4^!eѼeHw.'՟ϱ[P~ڵgyF~z!֘yحL voisbd B{Tev-á;-,TwaĮ䇙qfiKIrk29bʪ36YCDFHayX9]iK1G*WR)dSA3 {ǐ|hn,ٌp&-,O9S>>ikK;k]?S>ߕZ,?W>oy[(0]{7Vۻ?WU'-WQtdvl;d{Ɋ2aL|6GsYؓ1J [kI8.k6[i0SxlU*)/#TbVu,-Z 'Þ˺sb%\X6D1ٓMKq" ͧ Ј55wJ eOnf,IY@y\c;sJ>s.w;#DS=cOquگ;R W ţ)LTpotGYvf6[/6_5>C#'Y@Nj^].^HN^ tN@4wnV_?]gVj@mTim+"'?Oj!+-ӛ+ kfyQZ)xAؠ1oD5ic+-ݦ׬As8wISF0N(c'f˭xbT@4 h@['~ ˄4^W:jnI׊ 54'cu*pK$:uAOwS;[*<4o7F.(7nܐ<g:fC<=w=Rb6o47ZKf8sq|[XOelD5neXUw0ʅ w/櫻BǫGۨ套^_u!XW\y;׿̓]?U\ UHK,]9&l1PJGeh-nʥwp}5$)nYKv} +R$+eًMr+W)iOU>*X,7 QY & Ss+, 1U^ u{q@ YGԍ>T *w45C;/,䕳TWO¡sJBZ]zҥKo7g%l:{*ݺ N1_@f!!:$6%j2hl`?DPXdsA&b׵-³B*,GÅuTuLdMMd6;$Ph$FsHHSHS&O528jˊ?"\29~Dk -bRѬvEOӋBCI>[ {L/ eW_`mD|]?4X Fʄ荛7קJ۵8`0Rʈ~lrͲ 6Z*:ϙê`Gzãv'TzbL9wV/ 35^NNsP'\|Rb |dRJH` 7KY9#-sOU z2_'!Lw?^y.0?Ș?7yZQ+Rk??=}U|%JAxgR8rTG7nMXja0 Ile1nay_ɑK5eHmI͵\[)h!qC.Nd{b4JQYwʓuݹU`ngd.Tt$PVlOl'рfKGG;o?|ïWf,4}kWy޺|mf<1 ؎ANDBRJCB"@6*ҤVUZ5OZTUZUJcJıes;}];9glaYG{zw9n馛oY/ÿq1r/+NxcXݺilk 0xR"ۏ¸UYr81%of3M?Bul Sj@Md'`~p} D.*sX<2ta2&BF>N*O' S_i]2wo|/0[oȑ#cwKݾp?~o{3NQ+ :է_z8(X,PEfeZm,RQ-MD#ǥ?_)@L@=_lM)89a? q4VJ WŐeؐ3i?Zg踣ᚘSO[> {c/] LG*;j)%F 5QFOr ήMGO' uy]sg'uG~W5;?ʧo+7.ɫ]I/*k NujM^d< S|+36="zaR% Ek3LenmmEy O!Q|aaOPlc}mrX[_~IrsPkQ rb]>9jԆ.ҕ")#PU :FEAUFv! ' > u"@':ƂGFď3O' j#~b7u?lNRO]5 p fO^?} V*j?֑8>R~r >Y**;mCY]U)ޅ]اݵ1$n- [s`6#B+ QVӵiGgw(t1$ۨ3Z׶5dw[fNZˀ6 %|pbYUeJW7]1ZW 5ND2.]Iٱ0O' n8_|;ʫ{޷{<_̥C5Oѓ.i?mw.5;sDqΔ7&UvEhuUW1}6{]^3a4dZ!dKiv,l[\F1֥~ss3M-ª2Y߆]fߴ]>ްu8RD%':{Ka"m۱SA4wIG <NERy쑆GoYZ ;F{GK\4['PnZ|)h0XD2$/ڄrp8%n,બ #O' ԭnYpĥ|?Bow]r#Po֘f~Q3| b)XW)quuGn{U?e. mYm`].e\j}yKPJ ɧeOSةzouք˖eE3{L46EIJTѤP #CW#,e\E괘b!lm!]9a@mZy5u}9TnA]闋Ū^umIWY6F?O'[;-'Ngbr7iPě ?jrW,xazW УgχHrLZ;Lad&c!Agi9=P)Ba$k\F{kp1π跇HޣL 0mԨsX0 {b !GCkNڧ臍dY,B& PXF̭.T O : sn o#8/;zT$+`܎*f2*؇ sRjrn"]M:@ / KE'g-:TUkJ5D$W]6FlG\ǖO' =zs돽DteUо*'_ǟzK~߁}xׇQ7h'ۗ776äPs0= :@BhGo^sr+Vr w!"kEzvvؙXM^;\^eoPa1+X`(n8Z*p \e]fY% jO4=p _3(MÌ +1l ?77r}LS'kc)+ ҵ5 Q6D3fBPC Az)L9"p-[½ժ/BwJ)8&fЎ5Q PiVrk!_ E,3n9a&BcX4D{& ׫|`ES p*iڍWY6 g/KP4² ?O_fWW~ص#FK|NxF5$ X3{{RO aL04Mfx* ?NZ-'ՄLl; f}wY;l-Z %hq qBjI0N](HTC!G7v,Z*,Sp%QEA{>^& ?XϞ_?=ntWf5L'eYqd:ZTѠuQ,[6QfxnYrТa &5T3Izʫ@L4z*S,N8Ƴw#hG6V`>M&6ECF)N)sasȔ*"8δ|Wn p 5Q̲C0 ?OS=bt#?U}q]'Ph5(:G1l^QBMz bkTE,Dl(fXoIzb3NYfa3cy4\TqQ²ض>GE98**!W6QZi]s­ɳ& ]4od[ܻ>O' Cv'g'!|yQ֪wLvɱQn3sVar4Q~6l{kkaϳZ6r, xPM_% 00Qn-1bsχOA\.Nր9^'u+taB9HBh&NFcbBT1UU[b-9X9`Wexaȉg ??j׿pUjビO|.?c:@8T%7ԘC 9r.÷8ͪ;#-wg]S "pۆ_nE6 p$cܻ!lF x@rILUs+(rY_:ۡU­8!ֳ͆ΫV# IQpRڈͷ ??gzoj_? /P|E5} 쵵)N?mҴ"8fVr4Wȶ ǕQV0fIZ UMOGt?$ *+ef$-""\{E!J/EzUH2j?vIʶ5FɽZI7^djPOhBd}#þQ?O'-~hq{o5m3\~ZW ۊggɫGY7۟]|Yƣ{i~yĉ d+\Uiy5<_B@͒4m*K =4hUd`;-bUeu4&|Kp?y[b{)E^մSG&v\I=c1O a+O2d& ?W8uKf0߻&Y}gw5wԫX#(n2hUHD4@ $ "kVŶa W/HcNUe#!QW4yl'JqԎiIjo(;4iw!ܹ5M pRA̢2U%9j%͉g_8YeQa+JT]{V * |dWC<'D i9hJo1_ 6֏"?)vp;NYyEm&H[feW@[2ZaB5|ӫ<@#xBÖR% ?O_R.6gZw;KYrb׷qs?u78vr(& ,+$S(+—oZu"X'hj|>˳\cTҎzhfPH%pfԣI18(!Dę4rSH37c՜aA1X ݆wv*be ^ Xd0Ngr3P:WLc՚*!\XB?O' C~JVҬb+B5_9:E} Q@ƪ$X$1CcR5:)Vש}H 3NE|W޿\ftæ=*ܢ2'm\ܬzv+/Ry1J+xbR,7a ?O2~s/+ʂшS;-? S҃PME[ ӀkIͽiI}h wX&"^}~-.^Tq:-u#Ν@Y búN 5;;a!=YoŎT{633%bꝩ O-N6"pb?O' Æ A\۴k5{`nc>ym9QUP!uLeX^k**+B-9 2 B+dQˣty "kkHl2H`0ϲ(oHZ9M-'L` # U5sXlG7Ҕe;;(QF젞4fU( L (oC+=`vv ?O2?€66euIw^E4Giy0U奊*&tɲJ]lzŜB$6Q"G|\.ڶ01ckg'm`[iŠ9Oj/s#|A6C=(زEQL=! d3 {ЌsY Vmy ?O'2,ϴ(Tt>r{AmBTY-Īcb}pF$'B/ #=Lt:Ue5x{,0 aN6jcmdfLЅ`v XUsNg3rI߯VDC%e`5EV {Va$@bжaT9(BZ'v{{[E)6i"9cu0p^#ӛXEd^NUToMxBbٕ/f{Qu  5d&)蠲E$?O' #0uz?}uCӍNLfT0EyT¨ZlϚ(#9mA"TaQŊЫBvPʥt Q\*'ד29{lUUBzPsy6Ȉe fy]7ZeV^eAdxJ̛M_`E3Ky4UkL nm+ʊ ZN' ?yfѷr@URdZj90jatpQZ^-192wUDA)iIUR`NJZlyűQ(11 IJx(ʂg*2eYeAO4*"WF+~H1N:]W?imlL' ?x#F*1}Qc$q ?O&D؄ ΘjnO±]KFz)ЋkS7^[-^E$䈬3Rm ۏbbec';;I:HD0h3yܹbA*)te)-|v+!oW4B_iDb ;N(% ??d9CReD'@ؘKdkd GOn#rUX!Vt]!~qduvmmrbQQD_mG)#kb*l*K(4 Ӓcag4-^Z#jC+c~rLhӳLȊdevHR_Q>zh+YGC;EQs"USGqgV& C>s66% իH|H' ? B@o-IENDB`dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/page-t/rabbit.png000066400000000000000000000062101230033266200253350ustar00rootroot00000000000000PNG  IHDR LsBIT|d pHYs  ~tEXtCreation Time13/02/08GMtEXtSoftwareAdobe Fireworks CS3FtEXtXML:com.adobe.xmp Adobe Fireworks CS3 2008-02-13T15:04:00Z 2008-02-15T00:30:27Z image/png M|IDATxmhQ@ @K tt`A t:޽0 l;tnV*'cS%@@@@@ ]e|IIII&_IHZ"-Dȹm>s!kF*W 9wA>O2as[ 9_zc矿Z80:ɴ?-DTIFWb"ǟ}q  m+}1k[ׁ@|Ώbnd綹wFr0lwA^bf$@ eȸ$;$F @ o;-|؃sESˏSMZA9݃@ _as HrGHll B[.=X f,ߊfǟo@ NjYL @ bQ,^{Rv@ !K)8@N"d8Ml%@ "~>Н@ 'wB{@!L*Bj #WO rGO2 rߐ r#Y?: @!  i;d*@ ޺u wq}-wEH9M[kz]UIHH2 dR!e3)}>f q  y&sxKEc,L𥃫|F.:ux Y(9"fq  qXEh˝-BH|,D|MUvD| 9 Vm|xؼ9Wal` @NmK{>6׻crFusr}띏-~& @|'g ֫>fG3 G1mr$q۞w;F-~Ptq[x}&(:@6z~!@ /zstEPl,tE=%T́jFw>UGs (9@V΁I2ﮮ:@2 H7RkU=́Yk{z@  vُ9 k[ H2W HR *@V:fmuMD"@ D @t +qvOUs (1@jqv}̴ƛ풌7[T́@.=?|.@(9@&M@P\/uG<  9 Adobe Fireworks CS3 2008-02-13T15:04:00Z 2008-02-14T17:05:04Z image/png S֎(IDATxKn#YvZ%2vArIj8s Ğx ڀ-UkІF.lQUhEaMo$*S^sq__V/B!PB!B"B! B!BA@B!D!B!B!!B!H΋9y/-"Q*PM;y՟3W2@@+`|XrCUr)r2OM(մ2% @@eO7Y-.3i!ϫ[O!#iǽ5~AL3"3@9i97Y@nթ;*~uU)~9w-1sk'ʟQѐ+B@vu|?!G$cz`VLR9.wuJ)VXI k;f^fT(ijiɥG ! 8##=be\b9u]`a>;9P8|}4?Xچwud D6>#;F.Y|(7MJHW6 u%$_MHV\{Nr`QACӸsL4i@@3ɱ<熴*!1=V?ܷ$ xL8dTJr^{{:aƚC @.HH,B fBmkawܧ!~)V#[@ص,y{ *lThG,[BYbD4=:DBtIBFsS`C-Wxsi@b[?- [g*P2PvrAB-@dV^= ӟl VLe>)W tT߮H l67untLR! @6]7$nXp-H0{G%tX> secMU4oX2P( EY_3,#"u)XN4 ! @VLi t؇x!a]S}X{g\y̹Q/R)r9.vXH.v*{UƩQnbȰ,jB@nPp!- z`J@zXY?4:r(@7N}ѐqk0 o#"1+pߟT-1pb"qNwiSB@Sת']w"!ݺϻۢ~U sLJUE&B@kj׮&|D (_.Ht\^%+so6ވl^}Dy\ @O5 yO@Ǯv& ^>ơ/=;i&'8 r' X/,ܞC>^cDc@Xb`] @5DK@θ\C>nxA5K@@D SI7T#$'3 |MO$ KȔ Z@BZwyfbQv$ f?1^7- SO@ r|!-<DzL+ -qZ2"C;+Ue\% r]]E+oWMO>&!mLM_s`1G>(sC \VQ@dhkoߍE@@4&!iMٜ5@BQ?D}آji _N0=&71Z>CgӁ>Q4|A h/_ih4M͞q.ܰwCۈ#xFdqYeצWZ5$ /؟B萄v|ImQ[3SY9xox":dzUJvWT>W9\)DQU~dv鎍{"yDiϟDEikabD! @g^~A$6S:3ꐀ6KXE2**JQYEGZl :1i~d)OEۂ>OJWaCH4$%!t:+^E3q"^Z$o;kB⿯/O(G"ٷ\6؏hQs`\@'|LB@cErKgiP}SR gMT-蓀<ΏPĔSM7 @ry;eu|^6P>~g@@"R Hl:oqha @@:ևʶg-  .RBnJ!_|Kp9>,ٗUi Y@<Ǣ^> <⬑cd#b?s%sy=ZW}ݧ5 N! @> HY! @r:)p6:wJ61{kN9}K]#@O->[uKp>Ud{7iC=QsJsB@nbO-% $~{Mt[92C)9I@6$:"μAxiU3#oQ(ڙ $vzT)`sB@ΫNO 5UΟ[OŔច-šUg,6+cܛv@+ylCf 9hx}Ǯ)W<U}cJ9oych%g1% ])G-Gh-wU7itȡ˜Źp4%&ErH>^yB>&!+Ӯ4}Wi& @ f@[/tOVzIENDB`dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/page-t/roadrunner-2.png000066400000000000000000000214451230033266200264170ustar00rootroot00000000000000PNG  IHDR LsBIT|d pHYs  ~tEXtCreation Time13/02/08GMtEXtSoftwareAdobe Fireworks CS3FtEXtXML:com.adobe.xmp Adobe Fireworks CS3 2008-02-13T15:04:00Z 2008-02-13T17:15:43Z image/png \R`IDATxݏT}}ELl]—v|$,|YF65-Dnq8][9,5ޘ䦗oscwf؝}Ǚ3>z ?ޛZw ֹKSwZ}Ϥ]n޼Hn1H>>=v ]x7CDDDD|4KB(VXV۷7CDDDDKHaڕ̑7|3][i\mHزضau'i~G}Tl\زvek*~I@8KDDDD7.98R~UӅSs599iDDDDdp!i۷oXү~o'=Y A ]jŅ'ƒ|>HǚO8vo"2:]ػ846T;I>cccmQ" vQ@D*'v_}~:A:rD[n]pW& iNJԖWݵ>=D mIB>X=`!2G,:j"GGG4|$y#ьf<ԫFR$GJ( "CuGU#[9qE82=X"""" H@@s_j 1Hjwv( ҇PAsGF|*YT$wlNHG<F( "E`9O}kJ5ԫñZ%"""" 1E1v~e*zʁ+}EDDD I 6UBjEcX*:_bٌڑkvQ@D>yu xR@==DXүڙ."""" 1D@rhlB+fTp}_Q@D$tj& L|ػ9 輪n)JD(˗/OQ:!*僎W;ݷ. Q@D (DHYt̢8J>ƚ-DHQ!tD$P;W)""""H{Xr<|tEΫyCDDDDi 5Swir0ۉT}=Rb]Q@)֮~Q?iZ?gǿlCDDDDiNDA Xݺu+‡?t񌴫W*?|"Q:aJ>زveLO<# ")""""" uHWCVN^LlYS;2Z; Y"""""tb;v,ׯUpJ<&Y7rEԃgIwlK!_abٳgi]t)]pj=R#ADB( s(bsM!{7뾈-v)f||n\;Bkߚтh&D2N:D#7n(N<"upۇ~h_7t\>.U\{YE=2Q@ŋtTqݹs'EXrHgx ==+_\@5p_CHDDDDo) {.h AʩW,:`AŪˊWfH΃y 4HBݠSRNugg4d'Mn`""""" H]~ի+ѣ]}DX(DFHrby9ED$/4ܞ7CښG""""" Hvl R ` rKA>ԨPQ$ciݭGrTm}OMׇЎ$"""" H#؄-+84NzNւuɍzG:UU-#$1?8|hT= +ʼn= IlHBDDDDD ͩ EzIbpk=;N"O1Z]S`;mя#vN|ڼqUsۦ޻׋q ( u+OQ:ǏydF\"qj 玌*nCln8;C>X#EDD^ GdQQ@ e^|΃=P1EhPO¼"s997һ"Rc$Y(* |@B@Pt^% !q-WăjMQϟQBDDDD_fU,,رcZMQ5|nͪG,RZ` cӅuBJa֭[S]^Q+ #&B+ҥ[LB^jC!ׇ\tԬFi^BIk 0o :n5jUKg,}i#-UW\R(FޣY""""5l{ MX։lW\]t)d5kϋQ!mn3wˤc5Rǜ""""=D z BtTMU+aE9{lS ko$$ i~XDDDDE>'E8+Sȑ-kRkIMzvRuEENhK9SU%8""""-$d``@ Q@>gۍNTltCn =eMүc!")OSGN(>fEDDDDYfE";ݲ8X7[nMqHuHJ)ZԄܱzwZ@ۯ'R^NPQ@F>bzI|/Ӿ{JͥK3!BҨ ( R>EA:R( wơ_޽{k2L%"""" H ׯ_OݮQxg:2Ɯ"#DvLQԃ:HGo=D<%Qj ( F'OV^jsĦxt"ӋȒ0Xh& +ocw+D:W7k$x}DYBܹZ[䊈Ȓ|`,ZȶZABEv;QnD$x} Ƅsv"""" H1GըGҚXs,! aL݀Aoyo:=QDDDDEQcrrrGe\Y66V yr޽>KD AF4DA5%) u-EI첇cIFHu ދH԰"ĥE#ZRb ( Oز846=زveqt$Ȫ˦n۞5%!&,eMDL:M[pby¹)!""""1IFBN)?lӅx\9+]xjMW&>vcʼnY!s͒oxh"gc1 u#yug7RR@DDDD$:Z4_Wԇv*̧pFED8VcEIDyԄZVyܽ."""" HawlI|PN(F9FtEDDDDͩG '/P_AFD.+A((d:DtAܖ 녀Ԩ[i9sjx!pIWH 3;Hk!`ŧTuqi"*s!ݜEx |79Ԕ >E""""җF\yQ4$6 :±.fG*ο.Qվ8*Y&#-׎Ft!!Y"""""}) lяfX~tvfؐJDC 26&VH Q!j11UYAB%%""""wBԂ }.rDF]9 R`LWhe8ч<GnXk;@DbǔS9N>/DDDDDDDN@;_LfiBl)>;)Z%*9:FҲWiRxrA"zY|1t-PuH @ԢIlcH|Zc๫s:~4 1=|g y#L͐ /DIh%*ܗtc2ݼQoQQY"Գg@ H(-%fȔ[Exq۩SR""""ҷDo @6uB̈́PI"B4 _:xP"""Ku2u2@F ( }KV l\Rng(W#Y]DDDz#M\)UDYP\Biؚ/VvfY4A4fK7֥ )EgV71I aYr2PWD)1>Ү&MI/ }0m*>u!('D/GW e)&LBETrC)",!**O0c2\ : 8:4Rt46#OPNDBp2)}Ĝw9ٜp|dHH^# 1)NY(W!dkg)R!'B|LlY3=$6^i_fIC Jg#ke| \g(""" 6mL:惨C> Xlظ'"'{!#,"s('d|Dy|d?Ə4M>t9nQ}'lַ ?Vظ*]s$$DNyOy7 =O 8)]DDDD R{AөaҎ9(G;)XD:x VGwOr]! $i)t虀Dq|^gB$e}d&M?͇V?yzҨ"ҵBp_d"OMjQ; xU'""""" "ihV@5YYH mt HC*ϑ&6N@!2]G+%Fy"""""""""""" """"""t؟IENDB`dotclear-2.6.2+dfsg/plugins/blowupConfig/alpha-img/page-t/typo.png000066400000000000000000000360051230033266200250720ustar00rootroot00000000000000PNG  IHDR kgAMA asRGBtIME (5CfbKGDC pHYs  ~;uIDATx Vu44bt͘2(4̜K2ZD4L\DA Ȼ0xEE1(5{<߳syz׳Ͼ_:p@kY\@' m;\#Di#Bm"$v]}1_d" /pi^iޖiy[oϋqq p AB&ɓ'R\,^8͝;Ҙ1ck|ʹ`r&QxhQ'7I@@@WQ_K0Dφ>}z ay;>O<17)EyK (W\Y,s^GDahp(?a% _{+&MFN=tg>8}C*F/?#u>}'>?64εPHSw]ED9cƌ>rZ>}qyF D"䮻9*h"[Ӓ%K:n + gg5D!GEIhB&C^YP2wQotTwy}K!oᆕy⋋iӦM&@¥40FaPE . ͚5+?jDA,>]wr";??/~WG:YHT –:9PhUxO %+T"k2XxH8,k6*!;Պ=H^$E}˃ChYQ%6lL{Ja%Dr1LƢj/\ цhPaԩE_7L|A{6H>x}\{"QlKƿWEL, zawߝ/_<Wwp@uE@X Htc7G^r%Q/yW 6d"\f^$e{EG.IhhP4q 8"k#1TXuFooM!N4Q("2hdGC7zaѥ1X]3EH‚bᥑS׍;C$Dɽ7c"F4[C4L;9};I{W0`@ѡKD xx}5ǴtzDĈX8K!W H.ǽB&NX۹[(>:DpLR(Q7u#ёw8q@L,`3a!@`Ĉ W>ƨ$CyUUWcȐ!/ әޏ#A˗YR"#vzZ }$w}oOثa!b͛W2*>(}UmOO^S+ Z_/;\T],yYWR9ުMDEq2iҤoKQ?~y,"b9] hUW]UR{l!N=Ԛ{ k,ei:SU( {.͚5+ 4<)n76*!fBï4qu}>rp>}Q>[ +V(֑qE`b. ĕl۰oeX;}BO o7My?+XyUyH,d6+?6tӴhѢR$u\.$qս^za /Du3r,U~ʕi=1ԫR7\Pz~}\&*&[H[6tMECFMW]뮻ʾ)IѱW]O>/^\Wۗގ\d-t 2Q+!z衚 UC`c3*KӟgOUbɓɫ1fϞ]l_@BO,m1pW/z?wعKK1 e3%| Щ^o!w̘1W"]z3V7n\q\(_⭷JFJcǎ- {-& bSڿk(p jjYj_y8X{mIN)ۣfh*ӷ }52dYT>(;byv嗧k;~6ErWOG!>OB",Gs=K!_(|>y9KL j}ݗ<4s#"{ TH^oq:䓋{~]!BŐxatl ~EP*CU__B~;"\ƿ/ܦRED)=y-)O1bDkć_曥h7|syr W=S.!_|sWU;y!j:CeiSN9%}ӟٿB9.R=P<,=㊞]iӦX_~GV/UUKxݪ]w]˾j /0~E!P%cyȑ騣* Tm>D]W\qE) bv}PҼBG~yBh䥅vqtI'[n8CGK%uc\o.\qrm6ekGFCxI;z!vVdɒt7̙SVk|U2- 4}})yڮ{qDJX^y2L*măf֫*ajĦL|̡f]/5HDm`@O!1hMˠ bFtL(wۯc:sӮZomw[cF| -io Q(%wTթ|UBDވ!hQկKtt1L^婑hذa&<ݹ,h6dˆ1sMG Cx{kFļވ"GJoWb {O@D!FKSN-׭mQUQtTdžC1tlu;lkСi5[~ѵEK L# \Ƞ05]m/C-MWU(x˽{\];iXbAvD/3q1>&/]vl&E u2W(>&y~JF%S=zt/xbHOĕb`Tm#_gsW&T O1%Z(l0zYOXUKI^˫|FѨ/r;|m|==Ytݗ/_=⼔&?p>?~z'8~[WXS45&Oki}Ɉ^/ђ7b&o^ :묳*=: ,(KƜs{GBhY&>X'^|#FaJI<%[]#BCթF1v2dG%pմ.̇v,@] {Fѿt饗%yIa]+%nǚ4St;N;e˖ǕtwEk \IFWWU>DwtJ.O~Rӄ 'U=H1kU@{Fܨ]bG2zkP<;l V.:sYfΜY(DV{GQEjРAi*;y >X_ WWYBW#"O4^ t؃#ϯC/s'bJw%q?9X/b8O5ڋ^6H=؝vfLFg}J#>z=_ҰUT*:u;3];PQp P~,`YhQs Ijם„jfGh+œ9sI'N;w|,X\5{bHO!swy4}MU<=U7V[yGXW3L)ͪk{舤KBCV\b`+QǸqjԷ^N'47T!;4xe^ccpF^6$1aWWUy)|q~P'Wh7Tn^[4QMb=d~ӃQq6[Iŋv$G0yNS2`Ϋ 5Ao8]P*;3vbK/RpC8Ppl\qs)F,Df̘#s9*oלsE5,@8묳jbYx\]`Сecs![ h)Sk/|-R9]~e+6  <u(CWDr߾}K2yb{ҫ:(ꢨ} Rt1կJQ?FĪ{Xf,:qV65i [o^>|xyc #o;l]v)ZGFE*KIqpTFl 韚sAmݖ|27]l@j/ )F6j,Xm %r~ml;XӢ+|JlMq>>|!ui6cCDt.p^]x_38؎[Q/ &˗-/Hꉒȏ5{]9utv( K_RѨv_Q :[ /[Ug{֔W+9HZ?&;GyqzYmy,¤ Bʕ+  >hĪx&駟. @9*ώ?>ܛ4Dzy^ǺEχ!P ɱ‹~t=+VtX6Gվ96_{{wKm\`>kEoۃswnGh/bDf{"@Oi0{<ՠnv5|1#&s)˘1c:"SѸ o}Н6mZ뮻?_veZ* qez%:rOӫ5U4=nHX=ꫥ^8 7hr-t1Z_)U=*@1l.$>2U7ި\'e;65`n;nܸBETeU5yΎM,4Ӎq5lj4D8\у.G,q%uQ }SL*IQ`]yEb%vԃaWh\`~m{Av)5 G|߬qއ䘒`ۯj1Ŀ#cQze_05*w/B;EK~Z%*(?8x<91&kDۤU\xO/ćm.{;ʪk룪Ra==dQsoztY^/CՉuWyMã0 U h\iKdu:thXplDQN?ׯ_ӧ?t '=1^J~}DUSz/19'dɻ%]U K+F[+oqyՈWrhVBAb&J(!zԮ"yf>I !Glg/H45"7ԢVbm)8@w[^4o޼A^+?{h8{ƌehT^4IFñFD|hyzB/dguB݆aQKTW]uUs*uțޙV+l^2|4Đh]5}??`.lƞ.@6s4K+'ݡ}l:cjW1~VaS djO1=|tr;r=µ6l":O,mhEB_wɹӝ'PLg}v/xQ$Tz#mݶx>zF|.kBXlnByBXy=bB'?ɢ](ܦ"cS/GklO !c :'xFQ>I*FQJ7Q<.+8y晲Tsxm_4x(|dC=4}k_K{o|Ğ"?яGX`7VM|勨{OU=QNMc;zy@RI*nʔ)ew\b@&excX^+\,.M05շ5yM.{TuTZ9O6mZ]1Wcv>K.#i3g2N#yMQ.Ş{Yt~ Pl?ԧ>Uya^&@ZGq*yO/N>t9I ۊlP%k(kBlo=hưC=T4NǙ g""5bv : oS}N0}ƀe~WJC< .LcǎMSN-mh/qeРP$ s5mўIfۈh_)@ߙ;ŁKƘ;)O4+37ZwNP]iWJ΅+=ЪnZVۊaM= ۫5t&Իa2Ws"Jw$>)RFb]dUۊ@UhNd?XdIz'oSkfm`yN[oqo y 6c娮"&#+]-IIx5&ci4AIWuTiV S]Qի5eMņҲ"Ey!mD5ShG6獨{HW~ܝy|W^XY7* ԙBT2#r3q"hv+<**;x馛3<3͟??==3tR^NtO4e&i1۔]1rpʯG.4teҥU띅oɓ'wܱ{G=zt1_]uK 7ܮq_MJc~4&;}ZU(ډwygWE}${3k<(]. ]%DbSzj]O=|_sblvu=k9]aȮ.>.6R%u5h/g:OUF{躩| _(Fx(bHD|`^8vT'#_ W"alHo wj4FitC|JF*o?:5jT+؇䀴R͹u=Gtw_m +W}qrQȋ[YbEi#c$r/l,}$n;3}3)-3H(wg?ٲtnTNHgn->\kYm[Бtjq=V2ė/]+|e!YsUWz ݾ!/8x}ЀEH|tӭSV[ y8ӧOaX͒W .({/ 0Fh^>nG۽sQ}K/.<8B_KA@W{kwUg;[j4hpկ~Ue`ʼn-(\WA-[VcĉmBr/%$b#XW۫RRZw-,\'H$K^O%A@w?ݕZiY<装hт$2ue롞>}z!s4h (pg-Y&x޶±6`}c~)B,,N &ǪϢ8=U t/'Eȑ=Y믿^K }& z &;LJӢHnX|dr!my>Im˿K)o2eJ:#W_]W|aTq?1߿Z`AKW#@gwwީPYȶ};m٦hb$6oQF!\ '7ůѸ6M5ڞմ /ؖ۝,o>ƊV&[POZ֕ z% }~ժb~lgUrgvibZnA bDZ = 1K䢋.*܍?MUAaXQ7o޼o<,0aByRG}t#zCi;Y7&JJXN{eE>}92iҤ6ճ}5(Sc\މ95*BEY OP{._aaq7aРAEfU:餓 OpU6mKz5^7޸#^~iԩq _dI>#^G۷F̞=F"" u^x~Qx;IyؖK\J8o>[cKO>d:UW]U#BBUTN7p@5C I=PGSO-{ۯFhbX=\Vx 5H/Wz h4k<"yEË#G,<U<*,qWami44+!]9Uy6#hGU-nBXlm<qUaJ1?tA+J *1Qh_*!(Q]#_㷈«տfΜu5Gw4qD 8U荈{nQQ/*]mhEm.[|%=cEMUrއNhPK(|iܹ59$UXv2^jUNӼiӦ!eiЫHH_!/yubh٪H>,D;+V!@!XP%4 HѠsrqGc/ QX /<~~TjD| "$x /3 @-1\jEX!zI.n}AzN@,+l9T/&MjHtxpsX6 S<ů+pv$ ]ú[J{rgp\ L _Lb}_,ª1Y} 7,LJ ^}U.* @O($>lذ2"oG (n(pEdɒFUa= -#]t P`y|֬Ye)<^)^wܱF @ i˗/Oԧ yhD!\ ]J"V\YPH֜9sR߾}*WUX$Vnv.( @';C3  '); $(styles_combo).append(''); $(styles_combo).attr('title',dotclear.msg.predefined_style_title); for (var style in dotclear.blowup_styles) { styles_option = document.createElement('option'); styles_option.value = dotclear.blowup_styles[style]; $(styles_option).append(style); $(styles_combo).append(styles_option); } $('#theme_config').prepend(styles_combo); $(styles_combo).wrap('
        ').before('

        ' + dotclear.msg.predefined_styles + '

        ').wrap('

        '); $(styles_combo).change(function() { $(this.form).find('input[type=text]').val('').css({backgroundColor: '#FFF', color: '#000'}); $(this.form).find('select').not($(this)).val(''); $(this.form).find('#extra_css').val(''); $('#top_image').val('default'); if (this.value != 'none') { applyBlowupValues(this.value); } }); // Code import var e = $('#bu_export_content'); e.toggle(); var img = document.createElement('img'); img.src = dotclear.img_plus_src; img.alt = dotclear.img_plus_alt; img.className = 'expand'; $(img).css('cursor','pointer'); $(document.createTextNode(' ')).prependTo('#bu_export'); $(img).prependTo('#bu_export'); $(img).click(function() { if (e.css('display') == 'none') { this.src = dotclear.img_minus_src; this.alt = dotclear.img_minus_alt; } else { this.src = dotclear.img_plus_src; this.alt = dotclear.img_plus_alt; } e.toggle(); }); var a = document.createElement('a'); a.href = '#'; $(a).text(dotclear.msg.apply_code); e.append(a); $(a).click(function() { var code = e.find('#export_code'); if (code.size() == 0) { return false; } applyBlowupValues(code.val()); return false; }); function toggleDisable(e) { if (e.attr('disabled')) { e.removeAttr('disabled'); } else { e.attr('disabled','disabled'); } } function applyBlowupValues(code) { code = code.replace("\n",""); var re = /(^| )([a-zA-Z0-9_]+):"([^"]*?)"(;|$)/g; var reg = /^(.+):"([^"]*)"(;?)\s*$/; var s = code.match(re); if (typeof(s) == 'object' && s.length > 0) { var member, target, value, t_e; for (var i=0,s_length=s.length; i 0.5 ? '#000' : '#fff' }); } } function getColorLum(color) { var rgb = [parseInt('0x' + color.substring(1, 3)) / 255, parseInt('0x' + color.substring(3, 5)) / 255, parseInt('0x' + color.substring(5, 7)) / 255]; return (Math.min(rgb[0], Math.min(rgb[1], rgb[2])) + Math.max(rgb[0], Math.max(rgb[1], rgb[2]))) / 2; } }); dotclear.blowup_styles = { 'Plumetis 2.6' :'body_bg_c:"#F5F5F5"; body_bg_g:"solid"; body_txt_f:"ss1"; body_txt_s:"14px"; body_txt_c:"#333333"; body_line_height:"24px"; top_image:"plumetis"; blog_title_hide:"0"; blog_title_f:"ss1"; blog_title_s:"36px"; blog_title_c:"#333333"; blog_title_a:"left"; blog_title_p:"20:94"; body_link_c:"#000000"; body_link_f_c:"#D33800"; body_link_v_c:"#333333"; sidebar_position:""; sidebar_text_f:"ss1"; sidebar_text_s:"12px"; sidebar_text_c:""; sidebar_title_f:""; sidebar_title_s:"14px"; sidebar_title_c:"#666666"; sidebar_title2_f:""; sidebar_title2_s:"12px"; sidebar_title2_c:"#000000"; sidebar_line_c:"#A6D9DC"; sidebar_link_c:""; sidebar_link_f_c:"#D33800"; sidebar_link_v_c:""; date_title_f:""; date_title_s:"12px"; date_title_c:"#666666"; post_title_f:"ss1"; post_title_s:"24px"; post_title_c:"#D33800"; post_comment_bg_c:"#E2EDED"; post_comment_c:"#333333"; post_commentmy_bg_c:"#A6D9DC"; post_commentmy_c:"#000000"; prelude_c:"#A6D9DC"; footer_f:""; footer_s:"12px"; footer_c:"#FFFFFF"; footer_l_c:"#FFFFFF"; footer_bg_c:"#999999"; extra_css:"h1, .post-title {font-weight: normal;text-shadow: 1px 1px 0 #fff;}#footer {background-image: none}body {border-top: 72px solid #A6D9DC}#top {margin-top: -36px}.post a {border-bottom: 1px solid #999}.post-title a, .post-info-co a {border-bottom: none}a:hover {background-color: #eee;text-decoration:none;}"', 'Forest' :'body_bg_c:"#80661A"; body_bg_g:"light"; body_txt_f:""; body_txt_s:""; body_txt_c:"#0A0A00"; body_line_height:"1.4em"; top_image:"default"; blog_title_hide:"0"; blog_title_f:"s3"; blog_title_s:"4em"; blog_title_c:"#D9D9BF"; blog_title_a:""; blog_title_p:""; body_link_c:"#666600"; body_link_f_c:"#CC9933"; body_link_v_c:"#8D8D40"; sidebar_position:""; sidebar_text_f:""; sidebar_text_s:""; sidebar_text_c:"#0A0A00"; sidebar_title_f:"s2"; sidebar_title_s:"1.6em"; sidebar_title_c:"#4D4D00"; sidebar_title2_f:"s2"; sidebar_title2_s:""; sidebar_title2_c:"#575700"; sidebar_line_c:"#D9D9BF"; sidebar_link_c:"#40330D"; sidebar_link_f_c:"#666600"; sidebar_link_v_c:"#40330D"; date_title_f:""; date_title_s:""; date_title_c:"#B3B380"; post_title_f:"s2"; post_title_s:"2em"; post_title_c:"#4D4D00"; post_comment_bg_c:"#F0F0E6"; post_comment_c:"#0A0A00"; prelude_c:"#140F05"; footer_f:""; footer_s:""; footer_c:"#FFFFFF"; footer_l_c:"#D9AD2B"; footer_bg_c:"#33260D"', 'Flamingo' :'body_bg_c:"#CC9999"; body_bg_g:"light"; body_txt_f:"ss3"; body_txt_s:"1.2em"; body_txt_c:"#1A1A00"; body_line_height:"1.5em"; top_image:"flamingo"; blog_title_hide:"0"; blog_title_f:"ss1"; blog_title_s:"3.5em"; blog_title_c:"#FFFFFF"; blog_title_a:""; blog_title_p:""; body_link_c:"#AD8282"; body_link_f_c:"#8282D9"; body_link_v_c:"#997373"; sidebar_position:""; sidebar_text_f:""; sidebar_text_s:""; sidebar_text_c:""; sidebar_title_f:"ss4"; sidebar_title_s:"1.4em"; sidebar_title_c:"#8282D9"; sidebar_title2_f:"ss3"; sidebar_title2_s:"1.2em"; sidebar_title2_c:"#AD8282"; sidebar_line_c:"#CDCDFF"; sidebar_link_c:"#262640"; sidebar_link_f_c:"#AD8282"; sidebar_link_v_c:"#262640"; date_title_f:"ss4"; date_title_s:""; date_title_c:"#D9B3B3"; post_title_f:"ss4"; post_title_s:"1.8em"; post_title_c:"#8282D9"; post_comment_bg_c:"#F2E5E5"; post_comment_c:""; prelude_c:"#140F0F"; footer_f:""; footer_s:""; footer_c:"#FFFFFF"; footer_l_c:""; footer_bg_c:"#140F0F"', 'Iceberg' :'body_bg_c:"#5280A3"; body_bg_g:"dark"; body_txt_f:"ss3"; body_txt_s:"1.1em"; body_txt_c:"#757575"; body_line_height:"1.5em"; top_image:"default"; blog_title_hide:"0"; blog_title_f:"s2"; blog_title_s:"3em"; blog_title_c:"#FFFFFF"; blog_title_a:""; blog_title_p:""; body_link_c:"#BDB000"; body_link_f_c:"#F3E66D"; body_link_v_c:"#BDB000"; sidebar_position:"left"; sidebar_text_f:""; sidebar_text_s:""; sidebar_text_c:""; sidebar_title_f:"ss3"; sidebar_title_s:"1.4em"; sidebar_title_c:"#689B9C"; sidebar_title2_f:"ss3"; sidebar_title2_s:"1.2em"; sidebar_title2_c:"#737300"; sidebar_line_c:"#E6E6CD"; sidebar_link_c:"#66664D"; sidebar_link_f_c:"#5280A3"; sidebar_link_v_c:"#66664D"; date_title_f:""; date_title_s:""; date_title_c:"#000000"; post_title_f:"s2"; post_title_s:"1.8em"; post_title_c:"#6F6800"; post_comment_bg_c:"#E4E4E2"; post_comment_c:""; prelude_c:"#0E2734"; footer_f:""; footer_s:""; footer_c:"#FFFFFF"; footer_l_c:""; footer_bg_c:"#0E2734"', 'Night' :'body_bg_c:"#0D1A26"; body_bg_g:"dark"; body_txt_f:"ss3"; body_txt_s:"1.1em"; body_txt_c:"#050A0F"; body_line_height:"1.5em"; top_image:"default"; blog_title_hide:"0"; blog_title_f:"s2"; blog_title_s:"3.5em"; blog_title_c:"#F2F2E5"; blog_title_a:""; body_link_c:"#336699"; body_link_f_c:"#66664D"; body_link_v_c:"#2B5782"; sidebar_position:""; sidebar_text_f:""; sidebar_text_s:""; sidebar_text_c:""; sidebar_title_f:"ss3"; sidebar_title_s:"1.4em"; sidebar_title_c:"#336699"; sidebar_title2_f:"ss3"; sidebar_title2_s:"1.2em"; sidebar_title2_c:"#737300"; sidebar_line_c:"#E6E6CD"; sidebar_link_c:"#66664D"; sidebar_link_f_c:"#336699"; sidebar_link_v_c:"#66664D"; date_title_f:""; date_title_s:""; date_title_c:"#ADAD82"; post_title_f:"s2"; post_title_s:"1.8em"; post_title_c:"#737300"; post_comment_bg_c:"#E6E6CD"; post_comment_c:""; prelude_c:"#070E14"; footer_f:""; footer_s:""; footer_c:"#FFFFFF"; footer_l_c:""; footer_bg_c:"#14140F"; blog_title_p:""', 'Peas & Carrots' :'body_bg_c:"#9DCA25"; body_bg_g:"light"; body_txt_f:"ss1"; body_txt_s:"1.2em"; body_txt_c:"#383839"; body_line_height:"1.5em"; top_image:"butterflies"; blog_title_hide:"0"; blog_title_f:"ss4"; blog_title_s:"3em"; blog_title_c:"#DBDB9D"; blog_title_a:"left"; blog_title_p:""; body_link_c:"#646B10"; body_link_f_c:"#DF6C01"; body_link_v_c:"#919924"; sidebar_position:"left"; sidebar_text_f:""; sidebar_text_s:""; sidebar_text_c:""; sidebar_title_f:"ss4"; sidebar_title_s:""; sidebar_title_c:"#FE9017"; sidebar_title2_f:"s2"; sidebar_title2_s:"1.2em"; sidebar_title2_c:"#826228"; sidebar_line_c:"#D3EB8B"; sidebar_link_c:"#858547"; sidebar_link_f_c:"#FE9017"; sidebar_link_v_c:"#8F9645"; date_title_f:""; date_title_s:""; date_title_c:"#826228"; post_title_f:"ss4"; post_title_s:"1.8em"; post_title_c:"#806432"; post_comment_bg_c:"#EFFDCC"; post_comment_c:"#826228"; prelude_c:"#C8E186"; footer_f:""; footer_s:"1em"; footer_c:"#FFFFFF"; footer_l_c:"#FFFFFF"; footer_bg_c:"#484432"', 'Rabbit' :'body_bg_c:"#8F9645"; body_bg_g:"solid"; body_txt_f:"ss1"; body_txt_s:"1.2em"; body_txt_c:"#625D47"; body_line_height:"1.4em"; top_image:"rabbit"; blog_title_hide:"0"; blog_title_f:"ss1"; blog_title_s:"3.5em"; blog_title_c:"#DBDB9D"; blog_title_a:""; blog_title_p:"130:70"; body_link_c:"#646B10"; body_link_f_c:"#484C12"; body_link_v_c:"#919924"; sidebar_position:""; sidebar_text_f:""; sidebar_text_s:""; sidebar_text_c:"#858547"; sidebar_title_f:""; sidebar_title_s:""; sidebar_title_c:"#8F9645"; sidebar_title2_f:"s2"; sidebar_title2_s:""; sidebar_title2_c:"#826228"; sidebar_line_c:"#95956B"; sidebar_link_c:"#858547"; sidebar_link_f_c:"#826228"; sidebar_link_v_c:"#8F9645"; date_title_f:"s2"; date_title_s:"1em"; date_title_c:"#826228"; post_title_f:"s2"; post_title_s:"1.6em"; post_title_c:"#806432"; post_comment_bg_c:"#D6DE91"; post_comment_c:"#826228"; prelude_c:"#484432"; footer_f:""; footer_s:"1em"; footer_c:"#A6AF50"; footer_l_c:"#DBDB9D"; footer_bg_c:"#484432"', 'Rec Room' :'body_bg_c:"#9B5E1C"; body_bg_g:"dark"; body_txt_f:"ss3"; body_txt_s:"1.1em"; body_txt_c:"#757575"; body_line_height:"1.5em"; top_image:"default"; blog_title_hide:"0"; blog_title_f:"s2"; blog_title_s:"3em"; blog_title_c:"#F9FAD6"; blog_title_a:""; blog_title_p:""; body_link_c:"#D1BF1D"; body_link_f_c:"#EEE168"; body_link_v_c:"#D1BF1D"; sidebar_position:"left"; sidebar_text_f:""; sidebar_text_s:""; sidebar_text_c:""; sidebar_title_f:"ss3"; sidebar_title_s:"1.2em"; sidebar_title_c:"#689B9C"; sidebar_title2_f:"ss3"; sidebar_title2_s:"1.2em"; sidebar_title2_c:"#737300"; sidebar_line_c:"#E6E6CD"; sidebar_link_c:"#66664D"; sidebar_link_f_c:"#689B9C"; sidebar_link_v_c:"#66664D"; date_title_f:""; date_title_s:""; date_title_c:"#000000"; post_title_f:"s2"; post_title_s:"1.8em"; post_title_c:"#689B9C"; post_comment_bg_c:"#E4E4E2"; post_comment_c:""; prelude_c:"#3B2C16"; footer_f:""; footer_s:""; footer_c:"#FFFFFF"; footer_l_c:""; footer_bg_c:"#3B2C16"', 'Seville' :'body_bg_c:"#B51A0D"; body_bg_g:"dark"; body_txt_f:"ss3"; body_txt_s:"1.1em"; body_txt_c:"#383839"; body_line_height:"1.5em"; top_image:"default"; blog_title_hide:"0"; blog_title_f:"s2"; blog_title_s:"3em"; blog_title_c:"#FFFFFF"; blog_title_a:""; blog_title_p:""; body_link_c:"#F18A32"; body_link_f_c:"#F1B232"; body_link_v_c:"#F18A32"; sidebar_position:"left"; sidebar_text_f:""; sidebar_text_s:""; sidebar_text_c:""; sidebar_title_f:"ss3"; sidebar_title_s:"1.4em"; sidebar_title_c:"#97471C"; sidebar_title2_f:"ss3"; sidebar_title2_s:"1.2em"; sidebar_title2_c:"#737300"; sidebar_line_c:"#E6E6CD"; sidebar_link_c:"#6E6E72"; sidebar_link_f_c:"#F18A32"; sidebar_link_v_c:"#6E6E72"; date_title_f:""; date_title_s:""; date_title_c:"#97471C"; post_title_f:"s2"; post_title_s:"1.8em"; post_title_c:"#F18A32"; post_comment_bg_c:"#E4E4E2"; post_comment_c:""; prelude_c:"#381A1A"; footer_f:""; footer_s:""; footer_c:"#FFFFFF"; footer_l_c:""; footer_bg_c:"#381A1A"', 'Spring Time' :'body_bg_c:"#E0E0E0"; body_bg_g:"light"; body_txt_f:"ss1"; body_txt_s:"1.2em"; body_txt_c:"#6B6B6B"; body_line_height:"1.4em"; top_image:"light-trails-1"; blog_title_hide:"0"; blog_title_f:""; blog_title_s:"3.5em"; blog_title_c:"#9AC528"; blog_title_a:"center"; blog_title_p:""; body_link_c:"#279AC4"; body_link_f_c:"#6D8824"; body_link_v_c:"#279AC4"; sidebar_position:""; sidebar_text_f:""; sidebar_text_s:""; sidebar_text_c:"#6B6B6B"; sidebar_title_f:""; sidebar_title_s:""; sidebar_title_c:"#8FB22F"; sidebar_title2_f:""; sidebar_title2_s:""; sidebar_title2_c:"#279AC4"; sidebar_line_c:"#FFD02C"; sidebar_link_c:"#6B6B6B"; sidebar_link_f_c:"#9AC528"; sidebar_link_v_c:"#6B6B6B"; date_title_f:""; date_title_s:"1em"; date_title_c:"#279AC4"; post_title_f:""; post_title_s:"1.7em"; post_title_c:"#9AC528"; post_comment_bg_c:"#FFFAD1"; post_comment_c:"#6B6B6B"; post_commentmy_bg_c:"#F5F9D9"; post_commentmy_c:"#6B6B6B"; prelude_c:"#EDEDED"; footer_f:""; footer_s:"1.2em"; footer_c:"#9AC528"; footer_l_c:"#6D8824"; footer_bg_c:"#E0E0E0"', 'Typo' :'body_bg_c:"#FFFFFF"; body_bg_g:"solid"; body_txt_f:"ss1"; body_txt_s:"1.2em"; body_txt_c:"#000000"; body_line_height:"1.4em"; top_image:"typo"; blog_title_hide:"0"; blog_title_f:"s2"; blog_title_s:"3.5em"; blog_title_c:"#B11508"; blog_title_a:"left"; blog_title_p:"140:50"; body_link_c:"#B11508"; body_link_f_c:"#000000"; body_link_v_c:"#4D4D4D"; sidebar_position:""; sidebar_text_f:""; sidebar_text_s:""; sidebar_text_c:"#000000"; sidebar_title_f:"s2"; sidebar_title_s:""; sidebar_title_c:"#B11508"; sidebar_title2_f:"s2"; sidebar_title2_s:""; sidebar_title2_c:"#000000"; sidebar_line_c:"#000000"; sidebar_link_c:"#000000"; sidebar_link_f_c:"#B11508"; sidebar_link_v_c:"#000000"; date_title_f:"s2"; date_title_s:"1em"; date_title_c:"#000000"; post_title_f:"s2"; post_title_s:"1.6em"; post_title_c:"#B11508"; post_comment_bg_c:"#FFFFFF"; post_comment_c:"#000000"; prelude_c:"#FFFFFF"; footer_f:""; footer_s:"1em"; footer_c:"#000000"; footer_l_c:"#B11508"; footer_bg_c:"#FFFFFF"' }; dotclear-2.6.2+dfsg/plugins/blowupConfig/index.php000066400000000000000000000457221230033266200222030ustar00rootroot00000000000000error->flag()) { $notices = $core->error->toHTML(); $core->error->reset(); } $blowup_base = array( 'body_bg_c' => null, 'body_bg_g' => 'light', 'body_txt_f' => null, 'body_txt_s' => null, 'body_txt_c' => null, 'body_line_height' => null, 'top_image' => 'default', 'top_height' => null, 'uploaded' => null, 'blog_title_hide' => null, 'blog_title_f' => null, 'blog_title_s' => null, 'blog_title_c' => null, 'blog_title_a' => null, 'blog_title_p' => null, 'body_link_c' => null, 'body_link_f_c' => null, 'body_link_v_c' => null, 'sidebar_position' => null, 'sidebar_text_f' => null, 'sidebar_text_s' => null, 'sidebar_text_c' => null, 'sidebar_title_f' => null, 'sidebar_title_s' => null, 'sidebar_title_c' => null, 'sidebar_title2_f' => null, 'sidebar_title2_s' => null, 'sidebar_title2_c' => null, 'sidebar_line_c' => null, 'sidebar_link_c' => null, 'sidebar_link_f_c' => null, 'sidebar_link_v_c' => null, 'date_title_f' => null, 'date_title_s' => null, 'date_title_c' => null, 'post_title_f' => null, 'post_title_s' => null, 'post_title_c' => null, 'post_comment_bg_c' => null, 'post_comment_c' => null, 'post_commentmy_bg_c' => null, 'post_commentmy_c' => null, 'prelude_c' => null, 'footer_f' => null, 'footer_s' => null, 'footer_c' => null, 'footer_l_c' => null, 'footer_bg_c' => null, 'extra_css' => null ); $blowup_user = $core->blog->settings->themes->blowup_style; $blowup_user = @unserialize($blowup_user); if (!is_array($blowup_user)) { $blowup_user = array(); } $blowup_user = array_merge($blowup_base,$blowup_user); $gradient_types = array( __('Light linear gradient') => 'light', __('Medium linear gradient') => 'medium', __('Dark linear gradient') => 'dark', __('Solid color') => 'solid' ); $top_images = array(__('Custom...') => 'custom'); $top_images = array_merge($top_images,array_flip(blowupConfig::$top_images)); if (!empty($_POST)) { try { $blowup_user['body_txt_f'] = $_POST['body_txt_f']; $blowup_user['body_txt_s'] = blowupConfig::adjustFontSize($_POST['body_txt_s']); $blowup_user['body_txt_c'] = blowupConfig::adjustColor($_POST['body_txt_c']); $blowup_user['body_line_height'] = blowupConfig::adjustFontSize($_POST['body_line_height']); $blowup_user['blog_title_hide'] = (integer) !empty($_POST['blog_title_hide']); $update_blog_title = !$blowup_user['blog_title_hide'] && ( !empty($_POST['blog_title_f']) || !empty($_POST['blog_title_s']) || !empty($_POST['blog_title_c']) || !empty($_POST['blog_title_a']) || !empty($_POST['blog_title_p']) ); if ($update_blog_title) { $blowup_user['blog_title_f'] = $_POST['blog_title_f']; $blowup_user['blog_title_s'] = blowupConfig::adjustFontSize($_POST['blog_title_s']); $blowup_user['blog_title_c'] = blowupConfig::adjustColor($_POST['blog_title_c']); $blowup_user['blog_title_a'] = preg_match('/^(left|center|right)$/',$_POST['blog_title_a']) ? $_POST['blog_title_a'] : null; $blowup_user['blog_title_p'] = blowupConfig::adjustPosition($_POST['blog_title_p']); } $blowup_user['body_link_c'] = blowupConfig::adjustColor($_POST['body_link_c']); $blowup_user['body_link_f_c'] = blowupConfig::adjustColor($_POST['body_link_f_c']); $blowup_user['body_link_v_c'] = blowupConfig::adjustColor($_POST['body_link_v_c']); $blowup_user['sidebar_text_f'] = $_POST['sidebar_text_f']; $blowup_user['sidebar_text_s'] = blowupConfig::adjustFontSize($_POST['sidebar_text_s']); $blowup_user['sidebar_text_c'] = blowupConfig::adjustColor($_POST['sidebar_text_c']); $blowup_user['sidebar_title_f'] = $_POST['sidebar_title_f']; $blowup_user['sidebar_title_s'] = blowupConfig::adjustFontSize($_POST['sidebar_title_s']); $blowup_user['sidebar_title_c'] = blowupConfig::adjustColor($_POST['sidebar_title_c']); $blowup_user['sidebar_title2_f'] = $_POST['sidebar_title2_f']; $blowup_user['sidebar_title2_s'] = blowupConfig::adjustFontSize($_POST['sidebar_title2_s']); $blowup_user['sidebar_title2_c'] = blowupConfig::adjustColor($_POST['sidebar_title2_c']); $blowup_user['sidebar_line_c'] = blowupConfig::adjustColor($_POST['sidebar_line_c']); $blowup_user['sidebar_link_c'] = blowupConfig::adjustColor($_POST['sidebar_link_c']); $blowup_user['sidebar_link_f_c'] = blowupConfig::adjustColor($_POST['sidebar_link_f_c']); $blowup_user['sidebar_link_v_c'] = blowupConfig::adjustColor($_POST['sidebar_link_v_c']); $blowup_user['sidebar_position'] = ($_POST['sidebar_position'] == 'left') ? 'left' : null; $blowup_user['date_title_f'] = $_POST['date_title_f']; $blowup_user['date_title_s'] = blowupConfig::adjustFontSize($_POST['date_title_s']); $blowup_user['date_title_c'] = blowupConfig::adjustColor($_POST['date_title_c']); $blowup_user['post_title_f'] = $_POST['post_title_f']; $blowup_user['post_title_s'] = blowupConfig::adjustFontSize($_POST['post_title_s']); $blowup_user['post_title_c'] = blowupConfig::adjustColor($_POST['post_title_c']); $blowup_user['post_comment_c'] = blowupConfig::adjustColor($_POST['post_comment_c']); $blowup_user['post_commentmy_c'] = blowupConfig::adjustColor($_POST['post_commentmy_c']); $blowup_user['footer_f'] = $_POST['footer_f']; $blowup_user['footer_s'] = blowupConfig::adjustFontSize($_POST['footer_s']); $blowup_user['footer_c'] = blowupConfig::adjustColor($_POST['footer_c']); $blowup_user['footer_l_c'] = blowupConfig::adjustColor($_POST['footer_l_c']); $blowup_user['footer_bg_c'] = blowupConfig::adjustColor($_POST['footer_bg_c']); $blowup_user['extra_css'] = blowupConfig::cleanCSS($_POST['extra_css']); if ($can_write_images) { $uploaded = null; if ($blowup_user['uploaded'] && is_file(blowupConfig::imagesPath().'/'.$blowup_user['uploaded'])) { $uploaded = blowupConfig::imagesPath().'/'.$blowup_user['uploaded']; } if (!empty($_FILES['upfile']) && !empty($_FILES['upfile']['name'])) { files::uploadStatus($_FILES['upfile']); $uploaded = blowupConfig::uploadImage($_FILES['upfile']); $blowup_user['uploaded'] = basename($uploaded); } $blowup_user['top_image'] = in_array($_POST['top_image'],$top_images) ? $_POST['top_image'] : 'default'; $blowup_user['body_bg_c'] = blowupConfig::adjustColor($_POST['body_bg_c']); $blowup_user['body_bg_g'] = in_array($_POST['body_bg_g'],$gradient_types) ? $_POST['body_bg_g'] : ''; $blowup_user['post_comment_bg_c'] = blowupConfig::adjustColor($_POST['post_comment_bg_c']); $blowup_user['post_commentmy_bg_c'] = blowupConfig::adjustColor($_POST['post_commentmy_bg_c']); $blowup_user['prelude_c'] = blowupConfig::adjustColor($_POST['prelude_c']); blowupConfig::createImages($blowup_user,$uploaded); } if ($can_write_css) { blowupConfig::createCss($blowup_user); } $core->blog->settings->addNamespace('themes'); $core->blog->settings->themes->put('blowup_style',serialize($blowup_user)); $core->blog->triggerBlog(); dcPage::addSuccessNotice(__('Theme configuration has been successfully updated.')); http::redirect($p_url); } catch (Exception $e) { $core->error->add($e->getMessage()); } } ?> <?php echo __('Blowup configuration'); ?> blog->name) => '', __('Blog appearance') => 'blog_theme.php', __('Blowup configuration') => '' )).dcPage::notices(); echo '

        '.__('Back to Blog appearance').'

        '; if (!$can_write_images) { dcPage::message(__('For the following reasons, images cannot be created. You won\'t be able to change some background properties.'). $notices,false,true); } echo '
        '; echo '

        '.__('Customization').'

        '. '

        '.__('General').'

        '; if ($can_write_images) { echo '

        '. form::field('body_bg_c',7,7,$blowup_user['body_bg_c'],'colorpicker').'

        '. '

        '. form::combo('body_bg_g',$gradient_types,$blowup_user['body_bg_g']).'

        '; } echo '

        '. form::combo('body_txt_f',blowupConfig::fontsList(),$blowup_user['body_txt_f']).'

        '. '

        '. form::field('body_txt_s',7,7,$blowup_user['body_txt_s']).'

        '. '

        '. form::field('body_txt_c',7,7,$blowup_user['body_txt_c'],'colorpicker').'

        '. '

        '. form::field('body_line_height',7,7,$blowup_user['body_line_height']).'

        '. '

        '.__('Links').'

        '. '

        '. form::field('body_link_c',7,7,$blowup_user['body_link_c'],'colorpicker').'

        '. '

        '. form::field('body_link_v_c',7,7,$blowup_user['body_link_v_c'],'colorpicker').'

        '. '

        '. form::field('body_link_f_c',7,7,$blowup_user['body_link_f_c'],'colorpicker').'

        '. '

        '.__('Page top').'

        '; if ($can_write_images) { echo '

        '. form::field('prelude_c',7,7,$blowup_user['prelude_c'],'colorpicker').'

        '; } echo '

        '. form::checkbox('blog_title_hide',1,$blowup_user['blog_title_hide']).'

        '. '

        '. form::combo('blog_title_f',blowupConfig::fontsList(),$blowup_user['blog_title_f']).'

        '. '

        '. form::field('blog_title_s',7,7,$blowup_user['blog_title_s']).'

        '. '

        '. form::field('blog_title_c',7,7,$blowup_user['blog_title_c'],'colorpicker').'

        '. '

        '. form::combo('blog_title_a',array(__('center')=>'center',__('left')=>'left',__('right')=>'right'),$blowup_user['blog_title_a']).'

        '. '

        '. form::field('blog_title_p',7,7,$blowup_user['blog_title_p']).'

        '; if ($can_write_images) { if ($blowup_user['top_image'] == 'custom' && $blowup_user['uploaded']) { $preview_image = http::concatURL($core->blog->url,blowupConfig::imagesURL().'/page-t.png'); } else { $preview_image = 'index.php?pf=blowupConfig/alpha-img/page-t/'.$blowup_user['top_image'].'.png'; } echo '
        '.__('Top image').'
        '. '

        '. form::combo('top_image',$top_images,($blowup_user['top_image'] ? $blowup_user['top_image'] : 'default')).'

        '. '

        '.__('Choose "Custom..." to upload your own image.').'

        '. '

        '. ' ('.sprintf(__('JPEG or PNG file, 800 pixels wide, maximum size %s'),files::size(DC_MAX_UPLOAD_SIZE)).')'. ''. '

        '. '
        '.__('Preview').'
        '. '
        '. ''. '
        '; } echo '

        '.__('Sidebar').'

        '. '

        '. form::combo('sidebar_position',array(__('right')=>'right',__('left')=>'left'),$blowup_user['sidebar_position']).'

        '. '

        '. form::combo('sidebar_text_f',blowupConfig::fontsList(),$blowup_user['sidebar_text_f']).'

        '. '

        '. form::field('sidebar_text_s',7,7,$blowup_user['sidebar_text_s']).'

        '. '

        '. form::field('sidebar_text_c',7,7,$blowup_user['sidebar_text_c'],'colorpicker').'

        '. '

        '. form::combo('sidebar_title_f',blowupConfig::fontsList(),$blowup_user['sidebar_title_f']).'

        '. '

        '. form::field('sidebar_title_s',7,7,$blowup_user['sidebar_title_s']).'

        '. '

        '. form::field('sidebar_title_c',7,7,$blowup_user['sidebar_title_c'],'colorpicker').'

        '. '

        '. form::combo('sidebar_title2_f',blowupConfig::fontsList(),$blowup_user['sidebar_title2_f']).'

        '. '

        '. form::field('sidebar_title2_s',7,7,$blowup_user['sidebar_title2_s']).'

        '. '

        '. form::field('sidebar_title2_c',7,7,$blowup_user['sidebar_title2_c'],'colorpicker').'

        '. '

        '. form::field('sidebar_line_c',7,7,$blowup_user['sidebar_line_c'],'colorpicker').'

        '. '

        '. form::field('sidebar_link_c',7,7,$blowup_user['sidebar_link_c'],'colorpicker').'

        '. '

        '. form::field('sidebar_link_v_c',7,7,$blowup_user['sidebar_link_v_c'],'colorpicker').'

        '. '

        '. form::field('sidebar_link_f_c',7,7,$blowup_user['sidebar_link_f_c'],'colorpicker').'

        '. '

        '.__('Entries').'

        '. '

        '. form::combo('date_title_f',blowupConfig::fontsList(),$blowup_user['date_title_f']).'

        '. '

        '. form::field('date_title_s',7,7,$blowup_user['date_title_s']).'

        '. '

        '. form::field('date_title_c',7,7,$blowup_user['date_title_c'],'colorpicker').'

        '. '

        '. form::combo('post_title_f',blowupConfig::fontsList(),$blowup_user['post_title_f']).'

        '. '

        '. form::field('post_title_s',7,7,$blowup_user['post_title_s']).'

        '. '

        '. form::field('post_title_c',7,7,$blowup_user['post_title_c'],'colorpicker').'

        '; if ($can_write_images) { echo '

        '. form::field('post_comment_bg_c',7,7,$blowup_user['post_comment_bg_c'],'colorpicker').'

        '; } echo '

        '. form::field('post_comment_c',7,7,$blowup_user['post_comment_c'],'colorpicker').'

        '; if ($can_write_images) { echo '

        '. form::field('post_commentmy_bg_c',7,7,$blowup_user['post_commentmy_bg_c'],'colorpicker').'

        '; } echo '

        '. form::field('post_commentmy_c',7,7,$blowup_user['post_commentmy_c'],'colorpicker').'

        '. '

        '.__('Footer').'

        '. '

        '. form::combo('footer_f',blowupConfig::fontsList(),$blowup_user['footer_f']).'

        '. '

        '. form::field('footer_s',7,7,$blowup_user['footer_s']).'

        '. '

        '. form::field('footer_c',7,7,$blowup_user['footer_c'],'colorpicker').'

        '. '

        '. form::field('footer_l_c',7,7,$blowup_user['footer_l_c'],'colorpicker').'

        '. '

        '. form::field('footer_bg_c',7,7,$blowup_user['footer_bg_c'],'colorpicker').'

        '; echo '

        '.__('Additional CSS').'

        '. '

        '. form::textarea('extra_css',72,5,html::escapeHTML($blowup_user['extra_css']),'maximal','',false,'title="'.__('Additional CSS').'"'). '

        '. '
        '; // Import / Export configuration $tmp_array = array(); $tmp_exclude = array('uploaded','top_height'); if ($blowup_user['top_image'] == 'custom') { $tmp_exclude[] = 'top_image'; } foreach ($blowup_user as $k => $v) { if (!in_array($k,$tmp_exclude)) { $tmp_array[] = $k.':'.'"'.$v.'"'; } } echo '
        '. '

        '.__('Configuration import / export').'

        '. '
        '. '

        '.__('You can share your configuration using the following code. To apply a configuration, paste the code, click on "Apply code" and save.').'

        '. '

        '.form::textarea('export_code',72,5,implode('; ',$tmp_array),'maximal','',false,'title="'.__('Copy this code:').'"').'

        '. '
        '. '
        '; echo '

        '. $core->formNonce().'

        '. '
        '; dcPage::helpBlock('blowupConfig'); ?> dotclear-2.6.2+dfsg/plugins/blowupConfig/lib/000077500000000000000000000000001230033266200211175ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/blowupConfig/lib/class.blowup.config.php000066400000000000000000000502521230033266200255140ustar00rootroot00000000000000 array( 'ss1' => 'Arial, Helvetica, sans-serif', 'ss2' => 'Verdana,Geneva, Arial, Helvetica, sans-serif', 'ss3' => '"Lucida Grande", "Lucida Sans Unicode", sans-serif', 'ss4' => '"Trebuchet MS", Helvetica, sans-serif', 'ss5' => 'Impact, Charcoal, sans-serif' ), 'serif' => array( 's1' => 'Times, "Times New Roman", serif', 's2' => 'Georgia, serif', 's3' => 'Baskerville, "Palatino Linotype", serif' ), 'monospace' => array( 'm1' => '"Andale Mono", "Courier New", monospace', 'm2' => '"Courier New", Courier, mono, monospace' ) ); protected static $fonts_combo = array(); protected static $fonts_list = array(); public static $top_images = array( 'default' => 'Default', 'blank' => 'Blank', 'light-trails-1' => 'Light Trails 1', 'light-trails-2' => 'Light Trails 2', 'light-trails-3' => 'Light Trails 3', 'light-trails-4' => 'Light Trails 4', 'butterflies' => 'Butterflies', 'flourish-1' => 'Flourished 1', 'flourish-2' => 'Flourished 2', 'animals' => 'Animals', 'plumetis' => 'Plumetis', 'flamingo' => 'Flamingo', 'rabbit' => 'Rabbit', 'roadrunner-1' => 'Road Runner 1', 'roadrunner-2' => 'Road Runner 2', 'typo' => 'Typo' ); public static function fontsList() { if (empty(self::$fonts_combo)) { self::$fonts_combo[__('default')] = ''; foreach (self::$fonts as $family => $g) { $fonts = array(); foreach ($g as $code => $font) { $fonts[str_replace('"','',$font)] = $code; } self::$fonts_combo[$family] = $fonts; } } return self::$fonts_combo; } public static function fontDef($c) { if (empty(self::$fonts_list)) { foreach (self::$fonts as $family => $g) { foreach ($g as $code => $font) { self::$fonts_list[$code] = $font; } } } return isset(self::$fonts_list[$c]) ? self::$fonts_list[$c] : null; } public static function adjustFontSize($s) { if (preg_match('/^([0-9.]+)\s*(%|pt|px|em|ex)?$/',$s,$m)) { if (empty($m[2])) { $m[2] = 'px'; } return $m[1].$m[2]; } return null; } public static function adjustPosition($p) { if (!preg_match('/^[0-9]+(:[0-9]+)?$/',$p)) { return null; } $p = explode(':',$p); return $p[0].(count($p) == 1 ? ':0' : ':'.$p[1]); } public static function adjustColor($c) { if ($c === '') { return ''; } $c = strtoupper($c); if (preg_match('/^[A-F0-9]{3,6}$/',$c)) { $c = '#'.$c; } if (preg_match('/^#[A-F0-9]{6}$/',$c)) { return $c; } if (preg_match('/^#[A-F0-9]{3,}$/',$c)) { return '#'.substr($c,1,1).substr($c,1,1).substr($c,2,1).substr($c,2,1).substr($c,3,1).substr($c,3,1); } return ''; } public static function cleanCSS($css) { // TODO ? return $css; } public static function cssPath() { global $core; return path::real($core->blog->public_path).'/blowup-css'; } public static function cssURL() { global $core; return $core->blog->settings->system->public_url.'/blowup-css'; } public static function canWriteCss($create=false) { global $core; $public = path::real($core->blog->public_path); $css = self::cssPath(); if (!is_dir($public)) { $core->error->add(__('The \'public\' directory does not exist.')); return false; } if (!is_dir($css)) { if (!is_writable($public)) { $core->error->add(sprintf(__('The \'%s\' directory cannot be modified.'),'public')); return false; } if ($create) { files::makeDir($css); } return true; } if (!is_writable($css)) { $core->error->add(sprintf(__('The \'%s\' directory cannot be modified.'),'public/blowup-css')); return false; } return true; } public static function createCss($s) { global $core; if ($s === null) { return; } $css = array(); /* Sidebar position ---------------------------------------------- */ if ($s['sidebar_position'] == 'left') { $css['#wrapper']['background-position'] = '-300px 0'; $css['#main']['float'] = 'right'; $css['#sidebar']['float'] = 'left'; } /* Properties ---------------------------------------------- */ self::prop($css,'body','background-color',$s['body_bg_c']); self::prop($css,'body','color',$s['body_txt_c']); self::prop($css,'.post-tags li a:link, .post-tags li a:visited, .post-info-co a:link, .post-info-co a:visited','color',$s['body_txt_c']); self::prop($css,'#page','font-size',$s['body_txt_s']); self::prop($css,'body','font-family',self::fontDef($s['body_txt_f'])); self::prop($css,'.post-content, .post-excerpt, #comments dd, #pings dd, dd.comment-preview','line-height',$s['body_line_height']); if (!$s['blog_title_hide']) { self::prop($css,'#top h1 a','color',$s['blog_title_c']); self::prop($css,'#top h1','font-size',$s['blog_title_s']); self::prop($css,'#top h1','font-family',self::fontDef($s['blog_title_f'])); if ($s['blog_title_a'] == 'right' || $s['blog_title_a'] == 'left') { $css['#top h1'][$s['blog_title_a']] = '0px'; $css['#top h1']['width'] = 'auto'; } if ($s['blog_title_p']) { $_p = explode(':',$s['blog_title_p']); $css['#top h1']['top'] = $_p[1].'px'; if ($s['blog_title_a'] != 'center') { $_a = $s['blog_title_a'] == 'right' ? 'right' : 'left'; $css['#top h1'][$_a] = $_p[0].'px'; } } } else { self::prop($css,'#top h1 span','text-indent','-5000px'); self::prop($css,'#top h1','top','0px'); $css['#top h1 a'] = array( 'display' => 'block', 'height' => $s['top_height'] ? ($s['top_height']-10).'px' : '120px', 'width' => '800px' ); } self::prop($css,'#top','height',$s['top_height']); self::prop($css,'.day-date','color',$s['date_title_c']); self::prop($css,'.day-date','font-family',self::fontDef($s['date_title_f'])); self::prop($css,'.day-date','font-size',$s['date_title_s']); self::prop($css,'a','color',$s['body_link_c']); self::prop($css,'a:visited','color',$s['body_link_v_c']); self::prop($css,'a:hover, a:focus, a:active','color',$s['body_link_f_c']); self::prop($css,'#comment-form input, #comment-form textarea','color',$s['body_link_c']); self::prop($css,'#comment-form input.preview','color',$s['body_link_c']); self::prop($css,'#comment-form input.preview:hover','background',$s['body_link_f_c']); self::prop($css,'#comment-form input.preview:hover','border-color',$s['body_link_f_c']); self::prop($css,'#comment-form input.submit','color',$s['body_link_c']); self::prop($css,'#comment-form input.submit:hover','background',$s['body_link_f_c']); self::prop($css,'#comment-form input.submit:hover','border-color',$s['body_link_f_c']); self::prop($css,'#sidebar','font-family',self::fontDef($s['sidebar_text_f'])); self::prop($css,'#sidebar','font-size',$s['sidebar_text_s']); self::prop($css,'#sidebar','color',$s['sidebar_text_c']); self::prop($css,'#sidebar h2','font-family',self::fontDef($s['sidebar_title_f'])); self::prop($css,'#sidebar h2','font-size',$s['sidebar_title_s']); self::prop($css,'#sidebar h2','color',$s['sidebar_title_c']); self::prop($css,'#sidebar h3','font-family',self::fontDef($s['sidebar_title2_f'])); self::prop($css,'#sidebar h3','font-size',$s['sidebar_title2_s']); self::prop($css,'#sidebar h3','color',$s['sidebar_title2_c']); self::prop($css,'#sidebar ul','border-top-color',$s['sidebar_line_c']); self::prop($css,'#sidebar li','border-bottom-color',$s['sidebar_line_c']); self::prop($css,'#topnav ul','border-bottom-color',$s['sidebar_line_c']); self::prop($css,'#sidebar li a','color',$s['sidebar_link_c']); self::prop($css,'#sidebar li a:visited','color',$s['sidebar_link_v_c']); self::prop($css,'#sidebar li a:hover, #sidebar li a:focus, #sidebar li a:active','color',$s['sidebar_link_f_c']); self::prop($css,'#search input','color',$s['sidebar_link_c']); self::prop($css,'#search .submit','color',$s['sidebar_link_c']); self::prop($css,'#search .submit:hover','background',$s['sidebar_link_f_c']); self::prop($css,'#search .submit:hover','border-color',$s['sidebar_link_f_c']); self::prop($css,'.post-title','color',$s['post_title_c']); self::prop($css,'.post-title a, .post-title a:visited','color',$s['post_title_c']); self::prop($css,'.post-title','font-family',self::fontDef($s['post_title_f'])); self::prop($css,'.post-title','font-size',$s['post_title_s']); self::prop($css,'#comments dd','background-color',$s['post_comment_bg_c']); self::prop($css,'#comments dd','color',$s['post_comment_c']); self::prop($css,'#comments dd.me','background-color',$s['post_commentmy_bg_c']); self::prop($css,'#comments dd.me','color',$s['post_commentmy_c']); self::prop($css,'#prelude, #prelude a','color',$s['prelude_c']); self::prop($css,'#footer p','background-color',$s['footer_bg_c']); self::prop($css,'#footer p','color',$s['footer_c']); self::prop($css,'#footer p','font-size',$s['footer_s']); self::prop($css,'#footer p','font-family',self::fontDef($s['footer_f'])); self::prop($css,'#footer p a','color',$s['footer_l_c']); /* Images ------------------------------------------------------ */ self::backgroundImg($css,'body',$s['body_bg_c'],'body-bg.png'); self::backgroundImg($css,'body',$s['body_bg_g'] != 'light','body-bg.png'); self::backgroundImg($css,'body',$s['prelude_c'],'body-bg.png'); self::backgroundImg($css,'#top',$s['body_bg_c'],'page-t.png'); self::backgroundImg($css,'#top',$s['body_bg_g'] != 'light','page-t.png'); self::backgroundImg($css,'#top',$s['uploaded'] || $s['top_image'],'page-t.png'); self::backgroundImg($css,'#footer',$s['body_bg_c'],'page-b.png'); self::backgroundImg($css,'#comments dt',$s['post_comment_bg_c'],'comment-t.png'); self::backgroundImg($css,'#comments dd',$s['post_comment_bg_c'],'comment-b.png'); self::backgroundImg($css,'#comments dt.me',$s['post_commentmy_bg_c'],'commentmy-t.png'); self::backgroundImg($css,'#comments dd.me',$s['post_commentmy_bg_c'],'commentmy-b.png'); $res = ''; foreach ($css as $selector => $values) { $res .= $selector." {\n"; foreach ($values as $k => $v) { $res .= $k.':'.$v.";\n"; } $res .= "}\n"; } $res .= $s['extra_css']; if (!self::canWriteCss(true)) { throw new Exception(__('Unable to create css file.')); } # erase old css file self::dropCss($core->blog->settings->system->theme); # create new css file into public blowup-css subdirectory self::writeCss($core->blog->settings->system->theme, $res); return $res; } protected static function prop(&$css,$selector,$prop,$value) { if ($value) { $css[$selector][$prop] = $value; } } protected static function backgroundImg(&$css,$selector,$value,$image) { $file = self::imagesPath().'/'.$image; if ($value && file_exists($file)){ $css[$selector]['background-image'] = 'url('.self::imagesURL().'/'.$image.')'; } } private static function writeCss($theme,$css) { file_put_contents(self::cssPath().'/'.$theme.'.css', $css); } public static function dropCss($theme) { $file = path::real(self::cssPath().'/'.$theme.'.css'); if (is_writable(dirname($file))) { @unlink($file); } } public static function publicCssUrlHelper() { $theme = $GLOBALS['core']->blog->settings->system->theme; $url = blowupConfig::cssURL(); $path = blowupConfig::cssPath(); if (file_exists($path.'/'.$theme.'.css')) { return $url.'/'.$theme.'.css'; } return null; } public static function imagesPath() { global $core; return path::real($core->blog->public_path).'/blowup-images'; } public static function imagesURL() { global $core; return $core->blog->settings->system->public_url.'/blowup-images'; } public static function canWriteImages($create=false) { global $core; $public = path::real($core->blog->public_path); $imgs = self::imagesPath(); if (!function_exists('imagecreatetruecolor') || !function_exists('imagepng') || !function_exists('imagecreatefrompng')) { $core->error->add(__('At least one of the following functions is not available: '. 'imagecreatetruecolor, imagepng & imagecreatefrompng.')); return false; } if (!is_dir($public)) { $core->error->add(__('The \'public\' directory does not exist.')); return false; } if (!is_dir($imgs)) { if (!is_writable($public)) { $core->error->add(sprintf(__('The \'%s\' directory cannot be modified.'),'public')); return false; } if ($create) { files::makeDir($imgs); } return true; } if (!is_writable($imgs)) { $core->error->add(sprintf(__('The \'%s\' directory cannot be modified.'),'public/blowup-images')); return false; } return true; } public static function uploadImage($f) { if (!self::canWriteImages(true)) { throw new Exception(__('Unable to create images.')); } $name = $f['name']; $type = files::getMimeType($name); if ($type != 'image/jpeg' && $type != 'image/png') { throw new Exception(__('Invalid file type.')); } $dest = self::imagesPath().'/uploaded'.($type == 'image/png' ? '.png' : '.jpg'); if (@move_uploaded_file($f['tmp_name'],$dest) === false) { throw new Exception(__('An error occurred while writing the file.')); } $s = getimagesize($dest); if ($s[0] != 800) { throw new Exception(__('Uploaded image is not 800 pixels wide.')); } return $dest; } public static function createImages(&$config,$uploaded) { $body_color = $config['body_bg_c']; $prelude_color = $config['prelude_c']; $gradient = $config['body_bg_g']; $comment_color = $config['post_comment_bg_c']; $comment_color_my = $config['post_commentmy_bg_c']; $top_image = $config['top_image']; $config['top_height'] = null; if ($top_image != 'custom' && !isset(self::$top_images[$top_image])) { $top_image = 'default'; } if ($uploaded && !is_file($uploaded)) { $uploaded = null; } if (!self::canWriteImages(true)) { throw new Exception(__('Unable to create images.')); } $body_fill = array( 'light' => dirname(__FILE__).'/../alpha-img/gradient-l.png', 'medium' => dirname(__FILE__).'/../alpha-img/gradient-m.png', 'dark' => dirname(__FILE__).'/../alpha-img/gradient-d.png' ); $body_g = isset($body_fill[$gradient]) ? $body_fill[$gradient] : false; if ($top_image == 'custom' && $uploaded) { $page_t = $uploaded; } else { $page_t = dirname(__FILE__).'/../alpha-img/page-t/'.$top_image.'.png'; } $body_bg = dirname(__FILE__).'/../alpha-img/body-bg.png'; $page_t_mask = dirname(__FILE__).'/../alpha-img/page-t/image-mask.png'; $page_b = dirname(__FILE__).'/../alpha-img/page-b.png'; $comment_t = dirname(__FILE__).'/../alpha-img/comment-t.png'; $comment_b = dirname(__FILE__).'/../alpha-img/comment-b.png'; $default_bg = '#e0e0e0'; $default_prelude = '#ededed'; self::dropImage(basename($body_bg)); self::dropImage('page-t.png'); self::dropImage(basename($page_b)); self::dropImage(basename($comment_t)); self::dropImage(basename($comment_b)); $body_color = self::adjustColor($body_color); $prelude_color = self::adjustColor($prelude_color); $comment_color = self::adjustColor($comment_color); if ($top_image || $body_color || $gradient != 'light' || $prelude_color || $uploaded) { if (!$body_color) { $body_color = $default_bg; } $body_color = sscanf($body_color,'#%2X%2X%2X'); # Create body gradient with color $d_body_bg = imagecreatetruecolor(50,180); $fill = imagecolorallocate($d_body_bg,$body_color[0],$body_color[1],$body_color[2]); imagefill($d_body_bg,0,0,$fill); # User choosed a gradient if ($body_g) { $s_body_bg = imagecreatefrompng($body_g); imagealphablending($s_body_bg,true); imagecopy($d_body_bg,$s_body_bg,0,0,0,0,50,180); imagedestroy($s_body_bg); } if (!$prelude_color) { $prelude_color = $default_prelude; } $prelude_color = sscanf($prelude_color,'#%2X%2X%2X'); $s_prelude = imagecreatetruecolor(50,30); $fill = imagecolorallocate($s_prelude,$prelude_color[0],$prelude_color[1],$prelude_color[2]); imagefill($s_prelude,0,0,$fill); imagecopy($d_body_bg,$s_prelude,0,0,0,0,50,30); imagepng($d_body_bg,self::imagesPath().'/'.basename($body_bg)); } if ($top_image || $body_color || $gradient != 'light') { # Create top image from uploaded image $size = getimagesize($page_t); $size = $size[1]; $type = files::getMimeType($page_t); $d_page_t = imagecreatetruecolor(800,$size); if ($type == 'image/png') { $s_page_t = @imagecreatefrompng($page_t); } else { $s_page_t = @imagecreatefromjpeg($page_t); } if (!$s_page_t) { throw new exception(__('Unable to open image.')); } $fill = imagecolorallocate($d_page_t,$body_color[0],$body_color[1],$body_color[2]); imagefill($d_page_t,0,0,$fill); if ($type == 'image/png') { # PNG, we only add body gradient and image imagealphablending($s_page_t,true); imagecopyresized($d_page_t,$d_body_bg,0,0,0,50,800,130,50,130); imagecopy($d_page_t,$s_page_t,0,0,0,0,800,$size); } else { # JPEG, we add image and a frame with rounded corners imagecopy($d_page_t,$s_page_t,0,0,0,0,800,$size); imagecopy($d_page_t,$d_body_bg,0,0,0,50,8,4); imagecopy($d_page_t,$d_body_bg,0,4,0,54,4,4); imagecopy($d_page_t,$d_body_bg,792,0,0,50,8,4); imagecopy($d_page_t,$d_body_bg,796,4,0,54,4,4); $mask = imagecreatefrompng($page_t_mask); imagealphablending($mask,true); imagecopy($d_page_t,$mask,0,0,0,0,800,11); imagedestroy($mask); $fill = imagecolorallocate($d_page_t,255,255,255); imagefilledrectangle($d_page_t,0,11,3,$size-1,$fill); imagefilledrectangle($d_page_t,796,11,799,$size-1,$fill); imagefilledrectangle($d_page_t,0,$size-9,799,$size-1,$fill); } $config['top_height'] = ($size).'px'; imagepng($d_page_t,self::imagesPath().'/page-t.png'); imagedestroy($d_body_bg); imagedestroy($d_page_t); imagedestroy($s_page_t); # Create bottom image with color $d_page_b = imagecreatetruecolor(800,8); $fill = imagecolorallocate($d_page_b,$body_color[0],$body_color[1],$body_color[2]); imagefill($d_page_b,0,0,$fill); $s_page_b = imagecreatefrompng($page_b); imagealphablending($s_page_b,true); imagecopy($d_page_b,$s_page_b,0,0,0,0,800,160); imagepng($d_page_b,self::imagesPath().'/'.basename($page_b)); imagedestroy($d_page_b); imagedestroy($s_page_b); } if ($comment_color) { self::commentImages($comment_color,$comment_t,$comment_b,basename($comment_t),basename($comment_b)); } if ($comment_color_my) { self::commentImages($comment_color_my,$comment_t,$comment_b,'commentmy-t.png','commentmy-b.png'); } } protected static function commentImages($comment_color,$comment_t,$comment_b,$dest_t,$dest_b) { $comment_color = sscanf($comment_color,'#%2X%2X%2X'); $d_comment_t = imagecreatetruecolor(500,25); $fill = imagecolorallocate($d_comment_t,$comment_color[0],$comment_color[1],$comment_color[2]); imagefill($d_comment_t,0,0,$fill); $s_comment_t = imagecreatefrompng($comment_t); imagealphablending($s_comment_t,true); imagecopy($d_comment_t,$s_comment_t,0,0,0,0,500,25); imagepng($d_comment_t,self::imagesPath().'/'.$dest_t); imagedestroy($d_comment_t); imagedestroy($s_comment_t); $d_comment_b = imagecreatetruecolor(500,7); $fill = imagecolorallocate($d_comment_b,$comment_color[0],$comment_color[1],$comment_color[2]); imagefill($d_comment_b,0,0,$fill); $s_comment_b = imagecreatefrompng($comment_b); imagealphablending($s_comment_b,true); imagecopy($d_comment_b,$s_comment_b,0,0,0,0,500,7); imagepng($d_comment_b,self::imagesPath().'/'.$dest_b); imagedestroy($d_comment_b); imagedestroy($s_comment_b); } public static function dropImage($img) { $img = path::real(self::imagesPath().'/'.$img); if (is_writable(dirname($img))) { @unlink($img); @unlink(dirname($img).'/.'.basename($img,'.png').'_sq.jpg'); @unlink(dirname($img).'/.'.basename($img,'.png').'_m.jpg'); @unlink(dirname($img).'/.'.basename($img,'.png').'_s.jpg'); @unlink(dirname($img).'/.'.basename($img,'.png').'_sq.jpg'); @unlink(dirname($img).'/.'.basename($img,'.png').'_t.jpg'); } } } dotclear-2.6.2+dfsg/plugins/blowupConfig/locales/000077500000000000000000000000001230033266200217735ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/blowupConfig/locales/en/000077500000000000000000000000001230033266200223755ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/blowupConfig/locales/en/help/000077500000000000000000000000001230033266200233255ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/blowupConfig/locales/en/help/help.html000066400000000000000000000046361230033266200251540ustar00rootroot00000000000000 Blowup theme configuration

        Modifying Blowup theme configuration enables you to customize your theme very easily. To do so, simply fill in the configuration fields or choose a predefined style.

        Predefined styles

        You can choose a predefined style in the Predefined styles drop-down list. Once you have chosen the style, you have to submit the form to apply the modifications.

        You may then modify the predefined style according to your taste and needs.

        Colors

        When you have to enter a color value, you should use the hexadecimal format. For example: #FF0000 will give you red. You may also use the color picker located next to every color field.

        If you lack inspiration, try and visit the following pages:

        Measurement units

        When you have to indicate a size, it must be followed by a measurement unit. For example: 1em. If you do not include the unit, pixels will be used as default measurement unit.

        The following measurement units are available:

        • px
        • em
        • ex
        • pt
        • %

        Header images

        You can choose a header image among the list to replace the default one.

        By choosing Custom... in the image list, you will be able to upload your own image. The image file must be in JPG or PNG format and must be precisely 800px wide.

        If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).

        Configuration import and export

        At the bottom of the page, you can display an area called Configuration import/export. This text area contains the configuration you are currently using. You can copy it to share it with others.

        To apply (import) a configuration, you simply need to replace the content of the text area with the configuration you want to use. Don't forget to click on Apply code.

        dotclear-2.6.2+dfsg/plugins/blowupConfig/locales/en/resources.php000066400000000000000000000007621230033266200251250ustar00rootroot00000000000000 Configuration du thème Blowup

        En modifiant la configuration du thème Blowup, vous pouvez personnaliser votre thème très facilement : il suffit pour cela de renseigner les champs de configuration ou de choisir un style prédéfini.

        Couleurs

        Quand vous devez indiquer une valeur de couleur, celle-ci doit être au format hexadécimal (exemple:"#FF0000" donnera du rouge). Vous pouvez vous aider de la pipette à côté de chaque champ de couleur.

        Afin de vous aider, vous pouvez consulter les liens suivants :

        Unités de mesure

        Quand vous devez indiquer une taille, celle-ci doit être suivie d'une unité de mesure. Si elle n'est pas suivie d'une unité, celle-ci sera indiquée en pixel. Les autres unités possibles sont : em, ex, pt, %.

        Images d'en-tête

        Vous pouvez choisir une image d'en-tête parmi la liste proposée afin de remplacer celle utilisée par défaut.

        En choisissant "Personnalisé..." parmi la liste d'images, vous pourrez déposer votre propre image. Celle-ci doit être au format JPG ou PNG et avoir une largeur exacte de 800 pixels.

        Si vous déposez une image au format JPG, un cadre sera ajouté autours de l'image, ce qui n'est pas le cas avec une image au format PNG (dont la transparence sera également préservée).

        Styles prédéfinis

        Vous pouvez choisir un style prédéfini dans la liste d'option "Styles prédéfinis". Une fois le style choisi, vous devez valider le formulaire pour appliquer les changements mais vous en servir de base pour personnaliser.

        Import / export de configuration

        En fin de page, vous pouvez afficher une zone appelée "Import / export de configuration". Dans cette zone de texte se trouve la configuration en cours d'utilisation. Vous pouvez la copier pour l'utiliser dans un autre blog sans avoir à faire de nouveau les réglages.

        Pour appliquer (importer) une configuration, il suffit simplement de remplacer le contenu de la zone de texte par celui que vous voulez utiliser et de veiller à bien cliquer sur le lien "Appliquer le code".

        dotclear-2.6.2+dfsg/plugins/blowupConfig/locales/fr/resources.php000066400000000000000000000007621230033266200251320ustar00rootroot00000000000000registerModule( /* Name */ "Fair Trackbacks", /* Description*/ "Trackback validity check", /* Author */ "Olivier Meunier", /* Version */ '1.1', array( 'permissions' => 'usage,contentadmin', 'priority' => 200, 'type' => 'plugin' ) ); dotclear-2.6.2+dfsg/plugins/fairTrackbacks/_prepend.php000066400000000000000000000012451230033266200231340ustar00rootroot00000000000000spamfilters[] = 'dcFilterFairTrackbacks'; } dotclear-2.6.2+dfsg/plugins/fairTrackbacks/_public.php000066400000000000000000000011141230033266200227500ustar00rootroot00000000000000spamfilters[] = 'dcFilterFairTrackbacks'; } dotclear-2.6.2+dfsg/plugins/fairTrackbacks/class.dc.filter.fairtrackbacks.php000066400000000000000000000040671230033266200272740ustar00rootroot00000000000000description = __('Checks trackback source for a link to the post'); } public function isSpam($type,$author,$email,$site,$ip,$content,$post_id,&$status) { if ($type != 'trackback') { return; } try { $default_parse = array('scheme'=>'','host'=>'','path'=>'','query'=>''); $S = array_merge($default_parse,parse_url($site)); if ($S['scheme'] != 'http' || !$S['host'] || !$S['path']) { throw new Exception('Invalid URL'); } # Check incomink link page $post = $this->core->blog->getPosts(array('post_id' => $post_id)); $post_url = $post->getURL(); $P = array_merge($default_parse,parse_url($post_url)); if ($post_url == $site) { throw new Exception('Same source and destination'); } $o = netHttp::initClient($site,$path); $o->setTimeout(3); $o->get($path); # Trackback source does not return 200 status code if ($o->getStatus() != 200) { throw new Exception('Invalid Status Code'); } $tb_page = $o->getContent(); # Do we find a link to post in trackback source? if ($S['host'] == $P['host']) { $pattern = $P['path'].($P['query'] ? '?'.$P['query'] : ''); } else { $pattern = $post_url; } $pattern = preg_quote($pattern,'/'); if (!preg_match('/'.$pattern.'/',$tb_page)) { throw new Exception('Unfair'); } } catch (Exception $e) { throw new Exception('Trackback not allowed for this URL.'); } } } dotclear-2.6.2+dfsg/plugins/importExport/000077500000000000000000000000001230033266200204275ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/importExport/_admin.php000066400000000000000000000024051230033266200223700ustar00rootroot00000000000000addItem( __('Import/Export'), 'plugin.php?p=importExport', 'index.php?pf=importExport/icon.png', preg_match('/plugin.php\?p=importExport(&.*)?$/',$_SERVER['REQUEST_URI']), $core->auth->check('admin',$core->blog->id) ); $core->addBehavior('adminDashboardFavorites','importExportDashboardFavorites'); function importExportDashboardFavorites($core,$favs) { $favs->register('importExport', array( 'title' => __('Import/Export'), 'url' => 'plugin.php?p=importExport', 'small-icon' => 'index.php?pf=importExport/icon.png', 'large-icon' => 'index.php?pf=importExport/icon-big.png', 'permissions' => 'admin' )); } $core->addBehavior('dcMaintenanceInit', 'ieMaintenanceInit'); function ieMaintenanceInit($maintenance) { $maintenance ->addTask('ieMaintenanceExportblog') ->addTask('ieMaintenanceExportfull') ; } dotclear-2.6.2+dfsg/plugins/importExport/_define.php000066400000000000000000000012461230033266200225340ustar00rootroot00000000000000registerModule( /* Name */ "Import / Export", /* Description*/ "Import and Export your blog", /* Author */ "Olivier Meunier & Contributors", /* Version */ '3.2', array( 'permissions' => 'admin', 'type' => 'plugin' ) ); dotclear-2.6.2+dfsg/plugins/importExport/_prepend.php000066400000000000000000000035401230033266200227360ustar00rootroot00000000000000addBehavior('importExportModules','registerIeModules'); function registerIeModules($modules, $core) { $modules['import'] = array_merge($modules['import'], array('dcImportFlat')); $modules['import'] = array_merge($modules['import'], array('dcImportFeed')); $modules['export'] = array_merge($modules['export'], array('dcExportFlat')); if ($core->auth->isSuperAdmin()) { $modules['import'] = array_merge($modules['import'], array('dcImportDC1')); $modules['import'] = array_merge($modules['import'], array('dcImportWP')); } } $__autoload['ieMaintenanceExportblog'] = dirname(__FILE__).'/inc/lib.ie.maintenance.php'; $__autoload['ieMaintenanceExportfull'] = dirname(__FILE__).'/inc/lib.ie.maintenance.php'; dotclear-2.6.2+dfsg/plugins/importExport/icon-big.png000066400000000000000000000033101230033266200226210ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<jIDATx[1ocE^GuH!]C *H^$D{vmlZ  $)h HHW\Q d_w HHpQP,M&FZ]|;;ͬPBkx<-hG_=x6(!{׫)?ǹ TgW.|E]`B,`N+?524[Kɽ1 k`L u[@級0v@P9i1`jC8s_b8#*z@1{=w<ǩ$!J+ֽ:h3fHEVD+)@-`3@Ps1c"vT*H4Ў Vti(6nHƧ)_%h_?O+F@{%eUm#%6]q)'`m`X)*[bCѩglO?/ VY1Xs1mS\dbV,+ܮ~Z6k |泗-`8BN n<|{ZR!'CwdA ):sb[-@,0>J=W9R<@<4VuʂpQ.T@26Qޞ.sP`!&Xɓ1uKX+;Lܑ=!+2 @DjA-6$_-|O%_CxZ0/I;%@JM\8`jmЀ<+!+{sZ_& _C+F.ʏYKFbag[`5Ӓ=zyïo^;7,WWGB7N=N<jD $7 Wg)wp+CB3H_W k0n6$y\}VlijM0 .}Rܘ*'-;7P0/kSa%K^Uo6i t V̳,} i~U⟻R+xh Hғ{DsvPtcX+)'CF7HBu6 w$aGy=0!>QHcrJS ׏;.i^w=@&m{LٌO=fCH<(Ȑ!\y~3-0Yc&pkЕ;#WyD +_#q#IR/+$8|I$okRUHfNV@vQV1n#%@6iO ,D(nJjJӞ;m3U3 on8L}I:BQG.e2c\H oVu<9VEKbZqh] si%T3u 0{IENDB`dotclear-2.6.2+dfsg/plugins/importExport/icon.png000066400000000000000000000007411230033266200220670ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATx|R1N@t<.H7QD)P0 ?pb %E $,[aXi5 %n|b<6뭡KQ8|H>8 J>V(B_=. ZprW48-)u >|*1j6 GMSd{⋱y޿'B9 _Y,\|vzI}P`,ƚ)&F\ң1Mءm5Jl4>=eCjaj{]5KyH_K5oDIENDB`dotclear-2.6.2+dfsg/plugins/importExport/inc/000077500000000000000000000000001230033266200212005ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/importExport/inc/class.dc.export.flat.php000066400000000000000000000164421230033266200256570ustar00rootroot00000000000000type = 'export'; $this->name = __('Flat file export'); $this->description = __('Exports a blog or a full Dotclear installation to flat file.'); } public function process($do) { # Export a blog if ($do == 'export_blog' && $this->core->auth->check('admin',$this->core->blog->id)) { $fullname = $this->core->blog->public_path.'/.backup_'.sha1(uniqid()); $blog_id = $this->core->con->escape($this->core->blog->id); try { $exp = new flatExport($this->core->con,$fullname,$this->core->prefix); fwrite($exp->fp,'///DOTCLEAR|'.DC_VERSION."|single\n"); $exp->export('category', 'SELECT * FROM '.$this->core->prefix.'category '. "WHERE blog_id = '".$blog_id."'" ); $exp->export('link', 'SELECT * FROM '.$this->core->prefix.'link '. "WHERE blog_id = '".$blog_id."'" ); $exp->export('setting', 'SELECT * FROM '.$this->core->prefix.'setting '. "WHERE blog_id = '".$blog_id."'" ); $exp->export('post', 'SELECT * FROM '.$this->core->prefix.'post '. "WHERE blog_id = '".$blog_id."'" ); $exp->export('meta', 'SELECT meta_id, meta_type, M.post_id '. 'FROM '.$this->core->prefix.'meta M, '.$this->core->prefix.'post P '. 'WHERE P.post_id = M.post_id '. "AND P.blog_id = '".$blog_id."'" ); $exp->export('media', 'SELECT * FROM '.$this->core->prefix."media WHERE media_path = '". $this->core->con->escape($this->core->blog->settings->system->public_path)."'" ); $exp->export('post_media', 'SELECT media_id, M.post_id '. 'FROM '.$this->core->prefix.'post_media M, '.$this->core->prefix.'post P '. 'WHERE P.post_id = M.post_id '. "AND P.blog_id = '".$blog_id."'" ); $exp->export('ping', 'SELECT ping.post_id, ping_url, ping_dt '. 'FROM '.$this->core->prefix.'ping ping, '.$this->core->prefix.'post P '. 'WHERE P.post_id = ping.post_id '. "AND P.blog_id = '".$blog_id."'" ); $exp->export('comment', 'SELECT C.* '. 'FROM '.$this->core->prefix.'comment C, '.$this->core->prefix.'post P '. 'WHERE P.post_id = C.post_id '. "AND P.blog_id = '".$blog_id."'" ); # --BEHAVIOR-- exportSingle $this->core->callBehavior('exportSingle',$this->core,$exp,$blog_id); $_SESSION['export_file'] = $fullname; $_SESSION['export_filename'] = $_POST['file_name']; $_SESSION['export_filezip'] = !empty($_POST['file_zip']); http::redirect($this->getURL().'&do=ok'); } catch (Exception $e) { @unlink($fullname); throw $e; } } # Export all content if ($do == 'export_all' && $this->core->auth->isSuperAdmin()) { $fullname = $this->core->blog->public_path.'/.backup_'.sha1(uniqid()); try { $exp = new flatExport($this->core->con,$fullname,$this->core->prefix); fwrite($exp->fp,'///DOTCLEAR|'.DC_VERSION."|full\n"); $exp->exportTable('blog'); $exp->exportTable('category'); $exp->exportTable('link'); $exp->exportTable('setting'); $exp->exportTable('user'); $exp->exportTable('pref'); $exp->exportTable('permissions'); $exp->exportTable('post'); $exp->exportTable('meta'); $exp->exportTable('media'); $exp->exportTable('post_media'); $exp->exportTable('log'); $exp->exportTable('ping'); $exp->exportTable('comment'); $exp->exportTable('spamrule'); $exp->exportTable('version'); # --BEHAVIOR-- exportFull $this->core->callBehavior('exportFull',$this->core,$exp); $_SESSION['export_file'] = $fullname; $_SESSION['export_filename'] = $_POST['file_name']; $_SESSION['export_filezip'] = !empty($_POST['file_zip']); http::redirect($this->getURL().'&do=ok'); } catch (Exception $e) { @unlink($fullname); throw $e; } } # Send file content if ($do == 'ok') { if (!file_exists($_SESSION['export_file'])) { throw new Exception(__('Export file not found.')); } ob_end_clean(); if (substr($_SESSION['export_filename'],-4) == '.zip') { $_SESSION['export_filename'] = substr($_SESSION['export_filename'],0,-4);//.'.txt'; } # Flat export if (empty($_SESSION['export_filezip'])) { header('Content-Disposition: attachment;filename='.$_SESSION['export_filename']); header('Content-Type: text/plain; charset=UTF-8'); readfile($_SESSION['export_file']); unlink($_SESSION['export_file']); unset($_SESSION['export_file'],$_SESSION['export_filename'],$_SESSION['export_filezip']); exit; } # Zip export else { try { $file_zipname = $_SESSION['export_filename'].'.zip'; $fp = fopen('php://output','wb'); $zip = new fileZip($fp); $zip->addFile($_SESSION['export_file'],$_SESSION['export_filename']); header('Content-Disposition: attachment;filename='.$file_zipname); header('Content-Type: application/x-zip'); $zip->write(); unlink($_SESSION['export_file']); unset($zip,$_SESSION['export_file'],$_SESSION['export_filename'],$file_zipname); exit; } catch (Exception $e) { unset($zip,$_SESSION['export_file'],$_SESSION['export_filename'],$file_zipname); @unlink($_SESSION['export_file']); throw new Exception(__('Failed to compress export file.')); } } } } public function gui() { echo '
        '. '

        '.__('Single blog').'

        '. '

        '.sprintf(__('This will create an export of your current blog: %s'),''.html::escapeHTML($this->core->blog->name)).'.

        '. '

        '. form::field(array('file_name','file_name'),50,255,date('Y-m-d-H-i-').html::escapeHTML($this->core->blog->id.'-backup.txt')). '

        '. '

        '. '

        '. '

        '. __('You may also want to download your media directory as a zip file').'

        '. '

        '. form::hidden(array('do'),'export_blog'). $this->core->formNonce().'

        '. '
        '; if ($this->core->auth->isSuperAdmin()) { echo '
        '. '

        '.__('Multiple blogs').'

        '. '

        '.__('This will create an export of all the content of your database.').'

        '. '

        '. form::field(array('file_name','file_name2'),50,255,date('Y-m-d-H-i-').'dotclear-backup.txt'). '

        '. '

        '. '

        '. '

        '. form::hidden(array('do'),'export_all'). $this->core->formNonce().'

        '. '
        '; } } } dotclear-2.6.2+dfsg/plugins/importExport/inc/class.dc.ieModule.php000066400000000000000000000036511230033266200251520ustar00rootroot00000000000000core =& $core; $this->setInfo(); if (!in_array($this->type,array('import','export'))) { throw new Exception(sprintf('Unknow type for module %s',get_class($this))); } if (!$this->name) { $this->name = get_class($this); } $this->id = get_class($this); $this->url = sprintf('plugin.php?p=importExport&type=%s&module=%s',$this->type,$this->id); } public function init() { } abstract protected function setInfo(); final public function getURL($escape=false) { return $escape ? html::escapeHTML($this->url) : $this->url; } abstract public function process($do); abstract public function gui(); protected function progressBar($percent) { $percent = ceil($percent); if ($percent > 100) { $percent = 100; } return '
        '.$percent.' %
        '; } protected function autoSubmit() { return form::hidden(array('autosubmit'),1); } protected function congratMessage() { return '

        '.__('Congratulation!').'

        '. '

        '.__('Your blog has been successfully imported. Welcome on Dotclear 2!').'

        '. ''; } } dotclear-2.6.2+dfsg/plugins/importExport/inc/class.dc.import.dc1.php000066400000000000000000000421261230033266200253670ustar00rootroot00000000000000 '', 'db_name' => '', 'db_user' => '', 'db_pwd' => '', 'db_prefix' => 'dc_', 'post_limit' => 20, 'cat_ids' => array() ); protected function setInfo() { $this->type = 'import'; $this->name = __('Dotclear 1.2 import'); $this->description = __('Import a Dotclear 1.2 installation into your current blog.'); } public function init() { $this->con =& $this->core->con; $this->prefix = $this->core->prefix; $this->blog_id = $this->core->blog->id; if (!isset($_SESSION['dc1_import_vars'])) { $_SESSION['dc1_import_vars'] = $this->base_vars; } $this->vars =& $_SESSION['dc1_import_vars']; if ($this->vars['post_limit'] > 0) { $this->post_limit = $this->vars['post_limit']; } } public function resetVars() { $this->vars = $this->base_vars;; unset($_SESSION['dc1_import_vars']); } public function process($do) { $this->action = $do; } # We handle process in another way to always display something to # user protected function guiprocess($do) { switch ($do) { case 'step1': $this->vars['db_host'] = $_POST['db_host']; $this->vars['db_name'] = $_POST['db_name']; $this->vars['db_user'] = $_POST['db_user']; $this->vars['db_pwd'] = $_POST['db_pwd']; $this->vars['post_limit'] = abs((integer) $_POST['post_limit']) > 0 ? $_POST['post_limit'] : 0; $this->vars['db_prefix'] = $_POST['db_prefix']; $db = $this->db(); $db->close(); $this->step = 2; echo $this->progressBar(1); break; case 'step2': $this->step = 2; $this->importUsers(); $this->step = 3; echo $this->progressBar(3); break; case 'step3': $this->step = 3; $this->importCategories(); if ($this->core->plugins->moduleExists('blogroll')) { $this->step = 4; echo $this->progressBar(5); } else { $this->step = 5; echo $this->progressBar(7); } break; case 'step4': $this->step = 4; $this->importLinks(); $this->step = 5; echo $this->progressBar(7); break; case 'step5': $this->step = 5; $this->post_offset = !empty($_REQUEST['offset']) ? abs((integer) $_REQUEST['offset']) : 0; if ($this->importPosts($percent) === -1) { http::redirect($this->getURL().'&do=ok'); } else { echo $this->progressBar(ceil($percent*0.93)+7); } break; case 'ok': $this->resetVars(); $this->core->blog->triggerBlog(); $this->step = 6; echo $this->progressBar(100); break; } } public function gui() { try { $this->guiprocess($this->action); } catch (Exception $e) { $this->error($e); } switch ($this->step) { case 1: echo '

        '.sprintf(__('Import the content of a Dotclear 1.2\'s blog in the current blog: %s.'), ''.html::escapeHTML($this->core->blog->name).'').'

        '. '

        '.__('Please note that this process '. 'will empty your categories, blogroll, entries and comments on the current blog.').'

        '; printf($this->imForm(1,__('General information'),__('Import my blog now')), '

        '.__('We first need some information about your old Dotclear 1.2 installation.').'

        '. '

        '. form::field('db_host',30,255,html::escapeHTML($this->vars['db_host'])).'

        '. '

        '. form::field('db_name',30,255,html::escapeHTML($this->vars['db_name'])).'

        '. '

        '. form::field('db_user',30,255,html::escapeHTML($this->vars['db_user'])).'

        '. '

        '. form::password('db_pwd',30,255).'

        '. '

        '. form::field('db_prefix',30,255,html::escapeHTML($this->vars['db_prefix'])).'

        '. '

        '.__('Entries import options').'

        '. '

        '. form::field('post_limit',3,3,html::escapeHTML($this->vars['post_limit'])).'

        ' ); break; case 2: printf($this->imForm(2,__('Importing users')), $this->autoSubmit() ); break; case 3: printf($this->imForm(3,__('Importing categories')), $this->autoSubmit() ); break; case 4: printf($this->imForm(4,__('Importing blogroll')), $this->autoSubmit() ); break; case 5: $t = sprintf(__('Importing entries from %d to %d / %d'),$this->post_offset, min(array($this->post_offset+$this->post_limit,$this->post_count)),$this->post_count); printf($this->imForm(5,$t), form::hidden(array('offset'),$this->post_offset). $this->autoSubmit() ); break; case 6: echo '

        '.__('Please read carefully').'

        '. '
          '. '
        • '.__('Every newly imported user has received a random password '. 'and will need to ask for a new one by following the "I forgot my password" link on the login page '. '(Their registered email address has to be valid.)').'
        • '. '
        • '.sprintf(__('Please note that Dotclear 2 has a new URL layout. You can avoid broken '. 'links by installing DC1 redirect plugin and activate it in your blog configuration.'), 'http://plugins.dotaddict.org/dc2/details/dc1redirect').'
        • '. '
        '. $this->congratMessage(); break; } } # Simple form for step by step process protected function imForm($step,$legend,$submit_value=null) { if (!$submit_value) { $submit_value = __('next step').' >'; } return '
        '. '

        '.$legend.'

        '. '
        '.$this->core->formNonce(). form::hidden(array('do'),'step'.$step). '%s'.'
        '. '

        '. '

        '.__('Depending on the size of your blog, it could take a few minutes.').'

        '. '
        '; } # Error display protected function error($e) { echo '
        '.__('Errors:').''. '

        '.$e->getMessage().'

        '; } # Database init protected function db() { $db = dbLayer::init('mysql',$this->vars['db_host'],$this->vars['db_name'],$this->vars['db_user'],$this->vars['db_pwd']); $rs = $db->select("SHOW TABLES LIKE '".$this->vars['db_prefix']."%'"); if ($rs->isEmpty()) { throw new Exception(__('Dotclear tables not found')); } while ($rs->fetch()) { $this->has_table[$rs->f(0)] = true; } # Set this to read data as they were written in Dotclear 1 try { $db->execute('SET NAMES DEFAULT'); } catch (Exception $e) {} $db->execute('SET CHARACTER SET DEFAULT'); $db->execute("SET COLLATION_CONNECTION = DEFAULT"); $db->execute("SET COLLATION_SERVER = DEFAULT"); $db->execute("SET CHARACTER_SET_SERVER = DEFAULT"); $db->execute("SET CHARACTER_SET_DATABASE = DEFAULT"); $this->post_count = $db->select( 'SELECT COUNT(post_id) FROM '.$this->vars['db_prefix'].'post ' )->f(0); return $db; } protected function cleanStr($str) { return text::cleanUTF8(@text::toUTF8($str)); } # Users import protected function importUsers() { $db = $this->db(); $prefix = $this->vars['db_prefix']; $rs = $db->select('SELECT * FROM '.$prefix.'user'); try { $this->con->begin(); while ($rs->fetch()) { if (!$this->core->userExists($rs->user_id)) { $cur = $this->con->openCursor($this->prefix.'user'); $cur->user_id = $rs->user_id; $cur->user_name = $rs->user_nom; $cur->user_firstname = $rs->user_prenom; $cur->user_displayname = $rs->user_pseudo; $cur->user_pwd = crypt::createPassword(); $cur->user_email = $rs->user_email; $cur->user_lang = $rs->user_lang; $cur->user_tz = $this->core->blog->settings->system->blog_timezone; $cur->user_post_status = $rs->user_post_pub ? 1 : -2; $cur->user_options = new ArrayObject(array( 'edit_size' => (integer) $rs->user_edit_size, 'post_format' => $rs->user_post_format )); $permissions = array(); switch ($rs->user_level) { case '0': $cur->user_status = 0; break; case '1': # editor $permissions['usage'] = true; break; case '5': # advanced editor $permissions['contentadmin'] = true; $permissions['categories'] = true; $permissions['media_admin'] = true; break; case '9': # admin $permissions['admin'] = true; break; } $this->core->addUser($cur); $this->core->setUserBlogPermissions( $rs->user_id, $this->blog_id, $permissions ); } } $this->con->commit(); $db->close(); } catch (Exception $e) { $this->con->rollback(); $db->close(); throw $e; } } # Categories import protected function importCategories() { $db = $this->db(); $prefix = $this->vars['db_prefix']; $rs = $db->select('SELECT * FROM '.$prefix.'categorie ORDER BY cat_ord ASC'); try { $this->con->execute( 'DELETE FROM '.$this->prefix.'category '. "WHERE blog_id = '".$this->con->escape($this->blog_id)."' " ); $ord = 2; while ($rs->fetch()) { $cur = $this->con->openCursor($this->prefix.'category'); $cur->blog_id = $this->blog_id; $cur->cat_title = $this->cleanStr(htmlspecialchars_decode($rs->cat_libelle)); $cur->cat_desc = $this->cleanStr($rs->cat_desc); $cur->cat_url = $this->cleanStr($rs->cat_libelle_url); $cur->cat_lft = $ord++; $cur->cat_rgt = $ord++; $cur->cat_id = $this->con->select( 'SELECT MAX(cat_id) FROM '.$this->prefix.'category' )->f(0) + 1; $this->vars['cat_ids'][$rs->cat_id] = $cur->cat_id; $cur->insert(); } $db->close(); } catch (Exception $e) { $db->close(); throw $e; } } # Blogroll import protected function importLinks() { $db = $this->db(); $prefix = $this->vars['db_prefix']; $rs = $db->select('SELECT * FROM '.$prefix.'link ORDER BY link_id ASC'); try { $this->con->execute( 'DELETE FROM '.$this->prefix.'link '. "WHERE blog_id = '".$this->con->escape($this->blog_id)."' " ); while ($rs->fetch()) { $cur = $this->con->openCursor($this->prefix.'link'); $cur->blog_id = $this->blog_id; $cur->link_href = $this->cleanStr($rs->href); $cur->link_title = $this->cleanStr($rs->label); $cur->link_desc = $this->cleanStr($rs->title); $cur->link_lang = $this->cleanStr($rs->lang); $cur->link_xfn = $this->cleanStr($rs->rel); $cur->link_position = (integer) $rs->position; $cur->link_id = $this->con->select( 'SELECT MAX(link_id) FROM '.$this->prefix.'link' )->f(0) + 1; $cur->insert(); } $db->close(); } catch (Exception $e) { $db->close(); throw $e; } } # Entries import protected function importPosts(&$percent) { $db = $this->db(); $prefix = $this->vars['db_prefix']; $count = $db->select('SELECT COUNT(post_id) FROM '.$prefix.'post')->f(0); $rs = $db->select( 'SELECT * FROM '.$prefix.'post ORDER BY post_id ASC '. $db->limit($this->post_offset,$this->post_limit) ); try { if ($this->post_offset == 0) { $this->con->execute( 'DELETE FROM '.$this->prefix.'post '. "WHERE blog_id = '".$this->con->escape($this->blog_id)."' " ); } while ($rs->fetch()) { $this->importPost($rs,$db); } $db->close(); } catch (Exception $e) { $db->close(); throw $e; } if ($rs->count() < $this->post_limit) { return -1; } else { $this->post_offset += $this->post_limit; } if ($this->post_offset > $this->post_count) { $percent = 100; } else { $percent = $this->post_offset * 100 / $this->post_count; } } protected function importPost($rs,$db) { $cur = $this->con->openCursor($this->prefix.'post'); $cur->blog_id = $this->blog_id; $cur->user_id = $rs->user_id; $cur->cat_id = (integer) $this->vars['cat_ids'][$rs->cat_id]; $cur->post_dt = $rs->post_dt; $cur->post_creadt = $rs->post_creadt; $cur->post_upddt = $rs->post_upddt; $cur->post_title = html::decodeEntities($this->cleanStr($rs->post_titre)); $cur->post_url = date('Y/m/d/',strtotime($cur->post_dt)).$rs->post_id.'-'.$rs->post_titre_url; $cur->post_url = substr($cur->post_url,0,255); $cur->post_format = $rs->post_content_wiki == '' ? 'xhtml' : 'wiki'; $cur->post_content_xhtml = $this->cleanStr($rs->post_content); $cur->post_excerpt_xhtml = $this->cleanStr($rs->post_chapo); if ($cur->post_format == 'wiki') { $cur->post_content = $this->cleanStr($rs->post_content_wiki); $cur->post_excerpt = $this->cleanStr($rs->post_chapo_wiki); } else { $cur->post_content = $this->cleanStr($rs->post_content); $cur->post_excerpt = $this->cleanStr($rs->post_chapo); } $cur->post_notes = $this->cleanStr($rs->post_notes); $cur->post_status = (integer) $rs->post_pub; $cur->post_selected = (integer) $rs->post_selected; $cur->post_open_comment = (integer) $rs->post_open_comment; $cur->post_open_tb = (integer) $rs->post_open_tb; $cur->post_lang = $rs->post_lang; $cur->post_words = implode(' ',text::splitWords( $cur->post_title.' '. $cur->post_excerpt_xhtml.' '. $cur->post_content_xhtml )); $cur->post_id = $this->con->select( 'SELECT MAX(post_id) FROM '.$this->prefix.'post' )->f(0) + 1; $cur->insert(); $this->importComments($rs->post_id,$cur->post_id,$db); $this->importPings($rs->post_id,$cur->post_id,$db); # Load meta if we have some in DC1 if (isset($this->has_table[$this->vars['db_prefix'].'post_meta'])) { $this->importMeta($rs->post_id,$cur->post_id,$db); } } # Comments import protected function importComments($post_id,$new_post_id,$db) { $count_c = $count_t = 0; $rs = $db->select( 'SELECT * FROM '.$this->vars['db_prefix'].'comment '. 'WHERE post_id = '.(integer) $post_id.' ' ); while ($rs->fetch()) { $cur = $this->con->openCursor($this->prefix.'comment'); $cur->post_id = (integer) $new_post_id; $cur->comment_author = $this->cleanStr($rs->comment_auteur); $cur->comment_status = (integer) $rs->comment_pub; $cur->comment_dt = $rs->comment_dt; $cur->comment_upddt = $rs->comment_upddt; $cur->comment_email = $this->cleanStr($rs->comment_email); $cur->comment_content = $this->cleanStr($rs->comment_content); $cur->comment_ip = $rs->comment_ip; $cur->comment_trackback = (integer) $rs->comment_trackback; $cur->comment_site = $this->cleanStr($rs->comment_site); if ($cur->comment_site != '' && !preg_match('!^http://.*$!',$cur->comment_site)) { $cur->comment_site = substr('http://'.$cur->comment_site,0,255); } if ($rs->exists('spam') && $rs->spam && $rs->comment_status = 0) { $cur->comment_status = -2; } $cur->comment_words = implode(' ',text::splitWords($cur->comment_content)); $cur->comment_id = $this->con->select( 'SELECT MAX(comment_id) FROM '.$this->prefix.'comment' )->f(0) + 1; $cur->insert(); if ($cur->comment_trackback && $cur->comment_status == 1) { $count_t++; } elseif ($cur->comment_status == 1) { $count_c++; } } if ($count_t > 0 || $count_c > 0) { $this->con->execute( 'UPDATE '.$this->prefix.'post SET '. 'nb_comment = '.$count_c.', '. 'nb_trackback = '.$count_t.' '. 'WHERE post_id = '.(integer) $new_post_id.' ' ); } } # Pings import protected function importPings($post_id,$new_post_id,$db) { $urls = array(); $rs = $db->select( 'SELECT * FROM '.$this->vars['db_prefix'].'ping '. 'WHERE post_id = '.(integer) $post_id ); while ($rs->fetch()) { $url = $this->cleanStr($rs->ping_url); if (isset($urls[$url])) { continue; } $cur = $this->con->openCursor($this->prefix.'ping'); $cur->post_id = (integer) $new_post_id; $cur->ping_url = $url; $cur->ping_dt = $rs->ping_dt; $cur->insert(); $urls[$url] = true; } } # Meta import protected function importMeta($post_id,$new_post_id,$db) { $rs = $db->select( 'SELECT * FROM '.$this->vars['db_prefix'].'post_meta '. 'WHERE post_id = '.(integer) $post_id.' ' ); if ($rs->isEmpty()) { return; } while ($rs->fetch()) { $this->core->meta->setPostMeta($new_post_id,$this->cleanStr($rs->meta_key),$this->cleanStr($rs->meta_value)); } } } dotclear-2.6.2+dfsg/plugins/importExport/inc/class.dc.import.feed.php000066400000000000000000000050011230033266200256120ustar00rootroot00000000000000type = 'import'; $this->name = __('RSS or Atom feed import'); $this->description = __('Add a feed content to the blog.'); } public function process($do) { if ($do == 'ok') { $this->status = true; return; } if (empty($_POST['feed_url'])) { return; } $this->feed_url = $_POST['feed_url']; $feed = feedReader::quickParse($this->feed_url); if ($feed === false) { throw new Exception(__('Cannot retrieve feed URL.')); } if (count($feed->items) == 0) { throw new Exception(__('No items in feed.')); } $cur = $this->core->con->openCursor($this->core->prefix.'post'); $this->core->con->begin(); foreach ($feed->items as $item) { $cur->clean(); $cur->user_id = $this->core->auth->userID(); $cur->post_content = $item->content ? $item->content : $item->description; $cur->post_title = $item->title ? $item->title : text::cutString(html::clean($cur->post_content),60); $cur->post_format = 'xhtml'; $cur->post_status = -2; $cur->post_dt = strftime('%Y-%m-%d %H:%M:%S',$item->TS); try { $post_id = $this->core->blog->addPost($cur); } catch (Exception $e) { $this->core->con->rollback(); throw $e; } foreach ($item->subject as $subject) { $this->core->meta->setPostMeta($post_id,'tag',dcMeta::sanitizeMetaID($subject)); } } $this->core->con->commit(); http::redirect($this->getURL().'&do=ok'); } public function gui() { if ($this->status) { dcPage::success(__('Content successfully imported.')); } echo '
        '. '

        '.sprintf(__('Add a feed content to the current blog: %s.'),html::escapeHTML($this->core->blog->name)).'

        '. '

        '. form::field('feed_url',50,300,html::escapeHTML($this->feed_url)).'

        '. '

        '. $this->core->formNonce(). form::hidden(array('do'),1). '

        '. '
        '; } } dotclear-2.6.2+dfsg/plugins/importExport/inc/class.dc.import.flat.php000066400000000000000000000210351230033266200256420ustar00rootroot00000000000000type = 'import'; $this->name = __('Flat file import'); $this->description = __('Imports a blog or a full Dotclear installation from flat file.'); } public function process($do) { if ($do == 'single' || $do == 'full') { $this->status = $do; return; } $to_unlink = false; # Single blog import $files = $this->getPublicFiles(); $single_upl = null; if (!empty($_POST['public_single_file']) && in_array($_POST['public_single_file'],$files)) { $single_upl = false; } elseif (!empty($_FILES['up_single_file'])) { $single_upl = true; } if ($single_upl !== null) { if ($single_upl) { files::uploadStatus($_FILES['up_single_file']); $file = DC_TPL_CACHE.'/'.md5(uniqid()); if (!move_uploaded_file($_FILES['up_single_file']['tmp_name'],$file)) { throw new Exception(__('Unable to move uploaded file.')); } $to_unlink = true; } else { $file = $_POST['public_single_file']; } try { # Try to unzip file $unzip_file = $this->unzip($file); if (false !== $unzip_file) { $bk = new flatImport($this->core,$unzip_file); } # Else this is a normal file else { $bk = new flatImport($this->core,$file); } $bk->importSingle(); } catch (Exception $e) { @unlink($unzip_file); if ($to_unlink) { @unlink($file); } throw $e; } @unlink($unzip_file); if ($to_unlink) { @unlink($file); } http::redirect($this->getURL().'&do=single'); } # Full import $full_upl = null; if (!empty($_POST['public_full_file']) && in_array($_POST['public_full_file'],$files)) { $full_upl = false; } elseif (!empty($_FILES['up_full_file'])) { $full_upl = true; } if ($full_upl !== null && $this->core->auth->isSuperAdmin()) { if (empty($_POST['your_pwd']) || !$this->core->auth->checkPassword(crypt::hmac(DC_MASTER_KEY,$_POST['your_pwd']))) { throw new Exception(__('Password verification failed')); } if ($full_upl) { files::uploadStatus($_FILES['up_full_file']); $file = DC_TPL_CACHE.'/'.md5(uniqid()); if (!move_uploaded_file($_FILES['up_full_file']['tmp_name'],$file)) { throw new Exception(__('Unable to move uploaded file.')); } $to_unlink = true; } else { $file = $_POST['public_full_file']; } try { # Try to unzip file $unzip_file = $this->unzip($file); if (false !== $unzip_file) { $bk = new flatImport($this->core,$unzip_file); } # Else this is a normal file else { $bk = new flatImport($this->core,$file); } $bk->importFull(); } catch (Exception $e) { @unlink($unzip_file); if ($to_unlink) { @unlink($file); } throw $e; } @unlink($unzip_file); if ($to_unlink) { @unlink($file); } http::redirect($this->getURL().'&do=full'); } header('content-type:text/plain'); var_dump($_POST); exit; $this->status = true; } public function gui() { if ($this->status == 'single') { dcPage::success(__('Single blog successfully imported.')); return; } if ($this->status == 'full') { dcPage::success(__('Content successfully imported.')); return; } $public_files = array_merge(array('-' => ''),$this->getPublicFiles()); $has_files = (boolean) (count($public_files) - 1); echo '\n"; echo '
        '. '

        '.__('Single blog').'

        '. '

        '.sprintf(__('This will import a single blog backup as new content in the current blog: %s.'),html::escapeHTML($this->core->blog->name)).'

        '. '

        '. ' '. '

        '; if ($has_files) { echo '

        '. form::combo('public_single_file',$public_files). '

        '; } echo '

        '. $this->core->formNonce(). form::hidden(array('do'),1). form::hidden(array('MAX_FILE_SIZE'),DC_MAX_UPLOAD_SIZE). '

        '. '
        '; if ($this->core->auth->isSuperAdmin()) { echo '
        '. '

        '.__('Multiple blogs').'

        '. '

        '.__('This will reset all the content of your database, except users.').'

        '. '

        '. ''. '

        '; if ($has_files) { echo '

        '. form::combo('public_full_file',$public_files). '

        '; } echo '

        '. form::password('your_pwd',20,255).'

        '. '

        '. $this->core->formNonce(). form::hidden(array('do'),1). form::hidden(array('MAX_FILE_SIZE'),DC_MAX_UPLOAD_SIZE). '

        '. '
        '; } } protected function getPublicFiles() { $public_files = array(); $dir = @dir($this->core->blog->public_path); if ($dir) { while (($entry = $dir->read()) !== false) { $entry_path = $dir->path.'/'.$entry; if (is_file($entry_path) && is_readable($entry_path)) { # Do not test each zip file content here, its too long if (substr($entry_path,-4) == '.zip') { $public_files[$entry] = $entry_path; } elseif (self::checkFileContent($entry_path)) { $public_files[$entry] = $entry_path; } } } } return $public_files; } protected static function checkFileContent($entry_path) { $ret = false; $fp = fopen($entry_path,'rb'); $ret = strpos(fgets($fp),'///DOTCLEAR|') === 0; fclose($fp); return $ret; } private function unzip($file) { $zip = new fileUnzip($file); if ($zip->isEmpty()) { $zip->close(); return false;//throw new Exception(__('File is empty or not a compressed file.')); } foreach($zip->getFilesList() as $zip_file) { # Check zipped file name if (substr($zip_file,-4) != '.txt') { continue; } # Check zipped file contents $content = $zip->unzip($zip_file); if (strpos($content,'///DOTCLEAR|') !== 0) { unset($content); continue; } $target = path::fullFromRoot($zip_file,dirname($file)); # Check existing files with same name if (file_exists($target)) { $zip->close(); unset($content); throw new Exception(__('Another file with same name exists.')); } # Extract backup content if (file_put_contents($target,$content) === false) { $zip->close(); unset($content); throw new Exception(__('Failed to extract backup file.')); } $zip->close(); unset($content); # Return extracted file name return $target; } $zip->close(); throw new Exception(__('No backup in compressed file.')); } } dotclear-2.6.2+dfsg/plugins/importExport/inc/class.dc.import.wp.php000066400000000000000000000565771230033266200253650ustar00rootroot00000000000000 '', 'db_name' => '', 'db_user' => '', 'db_pwd' => '', 'db_prefix' => 'wp_', 'ignore_first_cat' => 1, 'cat_import' => 1, 'cat_as_tags' => '', 'cat_tags_prefix' => 'cat: ', 'post_limit' => 20, 'post_formater' => 'xhtml', 'comment_formater' => 'xhtml', 'user_ids' => array(), 'cat_ids' => array(), 'permalink_template' => 'p=%post_id%', 'permalink_tags' => array( '%year%', '%monthnum%', '%day%', '%hour%', '%minute%', '%second%', '%postname%', '%post_id%', '%category%', '%author%' ) ); protected $formaters; protected function setInfo() { $this->type = 'import'; $this->name = __('WordPress import'); $this->description = __('Import a WordPress installation into your current blog.'); } public function init() { $this->con =& $this->core->con; $this->prefix = $this->core->prefix; $this->blog_id = $this->core->blog->id; if (!isset($_SESSION['wp_import_vars'])) { $_SESSION['wp_import_vars'] = $this->base_vars; } $this->vars =& $_SESSION['wp_import_vars']; if ($this->vars['post_limit'] > 0) { $this->post_limit = $this->vars['post_limit']; } $this->formaters = dcAdminCombos::getFormatersCombo(); } public function resetVars() { $this->vars = $this->base_vars;; unset($_SESSION['wp_import_vars']); } public function process($do) { $this->action = $do; } # We handle process in another way to always display something to # user protected function guiprocess($do) { switch ($do) { case 'step1': $this->vars['db_host'] = $_POST['db_host']; $this->vars['db_name'] = $_POST['db_name']; $this->vars['db_user'] = $_POST['db_user']; $this->vars['db_pwd'] = $_POST['db_pwd']; $this->vars['db_prefix'] = $_POST['db_prefix']; $this->vars['ignore_first_cat'] = isset($_POST['ignore_first_cat']); $this->vars['cat_import'] = isset($_POST['cat_import']); $this->vars['cat_as_tags'] = isset($_POST['cat_as_tags']); $this->vars['cat_tags_prefix'] = $_POST['cat_tags_prefix']; $this->vars['post_limit'] = abs((integer) $_POST['post_limit']) > 0 ? $_POST['post_limit'] : 0; $this->vars['post_formater'] = isset($this->formaters[$_POST['post_formater']]) ? $_POST['post_formater'] : 'xhtml'; $this->vars['comment_formater'] = isset($this->formaters[$_POST['comment_formater']]) ? $_POST['comment_formater'] : 'xhtml'; $db = $this->db(); $db->close(); $this->step = 2; echo $this->progressBar(1); break; case 'step2': $this->step = 2; $this->importUsers(); $this->step = 3; echo $this->progressBar(3); break; case 'step3': $this->step = 3; $this->importCategories(); if ($this->core->plugins->moduleExists('blogroll')) { $this->step = 4; echo $this->progressBar(5); } else { $this->step = 5; echo $this->progressBar(7); } break; case 'step4': $this->step = 4; $this->importLinks(); $this->step = 5; echo $this->progressBar(7); break; case 'step5': $this->step = 5; $this->post_offset = !empty($_REQUEST['offset']) ? abs((integer) $_REQUEST['offset']) : 0; if ($this->importPosts($percent) === -1) { http::redirect($this->getURL().'&do=ok'); } else { echo $this->progressBar(ceil($percent*0.93)+7); } break; case 'ok': $this->resetVars(); $this->core->blog->triggerBlog(); $this->step = 6; echo $this->progressBar(100); break; } } public function gui() { try { $this->guiprocess($this->action); } catch (Exception $e) { $this->error($e); } switch ($this->step) { case 1: echo '

        '.sprintf(__('This will import your WordPress content as new content in the current blog: %s.'), ''.html::escapeHTML($this->core->blog->name).'').'

        '. '

        '.__('Please note that this process '. 'will empty your categories, blogroll, entries and comments on the current blog.').'

        '; printf($this->imForm(1,__('General information'),__('Import my blog now')), '

        '.__('We first need some information about your old WordPress installation.').'

        '. '

        '. form::field('db_host',30,255,html::escapeHTML($this->vars['db_host'])).'

        '. '

        '. form::field('db_name',30,255,html::escapeHTML($this->vars['db_name'])).'

        '. '

        '. form::field('db_user',30,255,html::escapeHTML($this->vars['db_user'])).'

        '. '

        '. form::password('db_pwd',30,255).'

        '. '

        '. form::field('db_prefix',30,255,html::escapeHTML($this->vars['db_prefix'])).'

        '. '

        '.__('Entries import options').'

        '. '
        '. '
        '. '

        '.__('WordPress and Dotclear\'s handling of categories are quite different. '. 'You can assign several categories to a single post in WordPress. In the Dotclear world, '. 'we see it more like "One category, several tags." Therefore Dotclear can only import one '. 'category per post and will chose the lowest numbered one. If you want to keep a trace of '. 'every category, you can import them as tags, with an optional prefix.').'

        '. '

        '.__('On the other hand, in WordPress, a post can not be uncategorized, and a '. 'default installation has a first category labelised "Uncategorized".'. 'If you did not change that category, you can just ignore it while '. 'importing your blog, as Dotclear allows you to actually keep your posts '. 'uncategorized.').'

        '. '
        '. '
        '. '

        '. '

        '. '

        '. '

        '. form::field('cat_tags_prefix',10,20,html::escapeHTML($this->vars['cat_tags_prefix'])).'

        '. '

        '. form::field('post_limit',3,3,html::escapeHTML($this->vars['post_limit'])).'

        '. '
        '. '
        '. '

        '.__('Content filters').'

        '. '

        '.__('You may want to process your post and/or comment content with the following filters.').'

        '. '

        '. form::combo('post_formater',$this->formaters,$this->vars['post_formater']).'

        '. '

        ' .form::combo('comment_formater',$this->formaters,$this->vars['comment_formater']).'

        ' ); break; case 2: printf($this->imForm(2,__('Importing users')), $this->autoSubmit() ); break; case 3: printf($this->imForm(3,__('Importing categories')), $this->autoSubmit() ); break; case 4: printf($this->imForm(4,__('Importing blogroll')), $this->autoSubmit() ); break; case 5: $t = sprintf(__('Importing entries from %d to %d / %d'),$this->post_offset, min(array($this->post_offset+$this->post_limit,$this->post_count)),$this->post_count); printf($this->imForm(5,$t), form::hidden(array('offset'),$this->post_offset). $this->autoSubmit() ); break; case 6: echo '

        '.__('Every newly imported user has received a random password '. 'and will need to ask for a new one by following the "I forgot my password" link on the login page '. '(Their registered email address has to be valid.)').'

        '. $this->congratMessage(); break; } } # Simple form for step by step process protected function imForm($step,$legend,$submit_value=null) { if (!$submit_value) { $submit_value = __('next step').' >'; } return '
        '. '

        '.$legend.'

        '. '
        '.$this->core->formNonce(). form::hidden(array('do'),'step'.$step). '%s'.'
        '. '

        '. '

        '.__('Depending on the size of your blog, it could take a few minutes.').'

        '. '
        '; } # Error display protected function error($e) { echo '
        '.__('Errors:').''. '

        '.$e->getMessage().'

        '; } # Database init protected function db() { $db = dbLayer::init('mysql',$this->vars['db_host'],$this->vars['db_name'],$this->vars['db_user'],$this->vars['db_pwd']); $rs = $db->select("SHOW TABLES LIKE '".$this->vars['db_prefix']."%'"); if ($rs->isEmpty()) { throw new Exception(__('WordPress tables not found')); } while ($rs->fetch()) { $this->has_table[$rs->f(0)] = true; } # Set this to read data as they were written try { $db->execute('SET NAMES DEFAULT'); } catch (Exception $e) {} $db->execute('SET CHARACTER SET DEFAULT'); $db->execute("SET COLLATION_CONNECTION = DEFAULT"); $db->execute("SET COLLATION_SERVER = DEFAULT"); $db->execute("SET CHARACTER_SET_SERVER = DEFAULT"); $db->execute("SET CHARACTER_SET_DATABASE = DEFAULT"); $this->post_count = $db->select( 'SELECT COUNT(ID) FROM '.$this->vars['db_prefix'].'posts '. 'WHERE post_type = \'post\' OR post_type = \'page\'' )->f(0); return $db; } protected function cleanStr($str) { return text::cleanUTF8(@text::toUTF8($str)); } # Users import protected function importUsers() { $db = $this->db(); $prefix = $this->vars['db_prefix']; $rs = $db->select('SELECT * FROM '.$prefix.'users'); try { $this->con->begin(); while ($rs->fetch()) { $user_login = preg_replace('/[^A-Za-z0-9@._-]/','-',$rs->user_login); $this->vars['user_ids'][$rs->ID] = $user_login; if (!$this->core->userExists($user_login)) { $cur = $this->con->openCursor($this->prefix.'user'); $cur->user_id = $user_login; $cur->user_pwd = crypt::createPassword(); $cur->user_displayname = $rs->user_nicename; $cur->user_email = $rs->user_email; $cur->user_url = $rs->user_url; $cur->user_creadt = $rs->user_registered; $cur->user_lang = $this->core->blog->settings->system->lang; $cur->user_tz = $this->core->blog->settings->system->blog_timezone; $permissions = array(); $rs_meta = $db->select('SELECT * FROM '.$prefix.'usermeta WHERE user_id = '.$rs->ID); while ($rs_meta->fetch()) { switch ($rs_meta->meta_key) { case 'first_name': $cur->user_firstname = $this->cleanStr($rs_meta->meta_value); break; case 'last_name': $cur->user_name = $this->cleanStr($rs_meta->meta_value); break; case 'description': $cur->user_desc = $this->cleanStr($rs_meta->meta_value); break; case 'rich_editing': $cur->user_options = new ArrayObject(array( 'enable_wysiwyg' => $rs_meta->meta_value == 'true' ? true : false )); break; case 'wp_user_level': switch ($rs_meta->meta_value) { case '0': # Subscriber $cur->user_status = 0; break; case '1': # Contributor $permissions['usage'] = true; $permissions['publish'] = true; $permissions['delete'] = true; break; case '2': # Author case '3': case '4': $permissions['contentadmin'] = true; $permissions['media'] = true; break; case '5': # Editor case '6': case '7': $permissions['contentadmin'] = true; $permissions['categories'] = true; $permissions['media_admin'] = true; $permissions['pages'] = true; $permissions['blogroll'] = true; break; case '8': # Administrator case '9': case '10': $permissions['admin'] = true; break; } break; } } $this->core->addUser($cur); $this->core->setUserBlogPermissions( $cur->user_id, $this->blog_id, $permissions ); } } $this->con->commit(); $db->close(); } catch (Exception $e) { $this->con->rollback(); $db->close(); throw $e; } } # Categories import protected function importCategories() { $db = $this->db(); $prefix = $this->vars['db_prefix']; $rs = $db->select( 'SELECT * FROM '.$prefix.'terms AS t, '.$prefix.'term_taxonomy AS x '. 'WHERE x.taxonomy = \'category\' '. 'AND t.term_id = x.term_id '. ($this->vars['ignore_first_cat'] ? 'AND t.term_id <> 1 ' : ''). 'ORDER BY t.term_id ASC' ); try { $this->con->execute( 'DELETE FROM '.$this->prefix.'category '. "WHERE blog_id = '".$this->con->escape($this->blog_id)."' " ); $ord = 2; while ($rs->fetch()) { $cur = $this->con->openCursor($this->prefix.'category'); $cur->blog_id = $this->blog_id; $cur->cat_title = $this->cleanStr($rs->name); $cur->cat_desc = $this->cleanStr($rs->description); $cur->cat_url = $this->cleanStr($rs->slug); $cur->cat_lft = $ord++; $cur->cat_rgt = $ord++; $cur->cat_id = $this->con->select( 'SELECT MAX(cat_id) FROM '.$this->prefix.'category' )->f(0) + 1; $this->vars['cat_ids'][$rs->term_id] = $cur->cat_id; $cur->insert(); } $db->close(); } catch (Exception $e) { $db->close(); throw $e; } } # Blogroll import protected function importLinks() { $db = $this->db(); $prefix = $this->vars['db_prefix']; $rs = $db->select('SELECT * FROM '.$prefix.'links ORDER BY link_id ASC'); try { $this->con->execute( 'DELETE FROM '.$this->prefix.'link '. "WHERE blog_id = '".$this->con->escape($this->blog_id)."' " ); while ($rs->fetch()) { $cur = $this->con->openCursor($this->prefix.'link'); $cur->blog_id = $this->blog_id; $cur->link_href = $this->cleanStr($rs->link_url); $cur->link_title = $this->cleanStr($rs->link_name); $cur->link_desc = $this->cleanStr($rs->link_description); $cur->link_xfn = $this->cleanStr($rs->link_rel); $cur->link_id = $this->con->select( 'SELECT MAX(link_id) FROM '.$this->prefix.'link' )->f(0) + 1; $cur->insert(); } $db->close(); } catch (Exception $e) { $db->close(); throw $e; } } # Entries import protected function importPosts(&$percent) { $db = $this->db(); $prefix = $this->vars['db_prefix']; $plink = $db->select( 'SELECT option_value FROM '.$prefix.'options '. "WHERE option_name = 'permalink_structure'" )->option_value; if ($plink) { $this->vars['permalink_template'] = substr($plink,1); } $rs = $db->select( 'SELECT * FROM '.$prefix.'posts '. 'WHERE post_type = \'post\' OR post_type = \'page\' '. 'ORDER BY ID ASC '. $db->limit($this->post_offset,$this->post_limit) ); try { if ($this->post_offset == 0) { $this->con->execute( 'DELETE FROM '.$this->prefix.'post '. "WHERE blog_id = '".$this->con->escape($this->blog_id)."' " ); } while ($rs->fetch()) { $this->importPost($rs,$db); } $db->close(); } catch (Exception $e) { $db->close(); throw $e; } if ($rs->count() < $this->post_limit) { return -1; } else { $this->post_offset += $this->post_limit; } if ($this->post_offset > $this->post_count) { $percent = 100; } else { $percent = $this->post_offset * 100 / $this->post_count; } } protected function importPost($rs,$db) { $post_date = !@strtotime($rs->post_date) ? '1970-01-01 00:00' : $rs->post_date; if (!isset($this->vars['user_ids'][$rs->post_author])) { $user_id = $this->core->auth->userID(); } else { $user_id = $this->vars['user_ids'][$rs->post_author]; } $cur = $this->con->openCursor($this->prefix.'post'); $cur->blog_id = $this->blog_id; $cur->user_id = $user_id; $cur->post_dt = $post_date; $cur->post_creadt = $post_date; $cur->post_upddt = $rs->post_modified; $cur->post_title = $this->cleanStr($rs->post_title); if (!$cur->post_title) { $cur->post_title = 'No title'; } if ($this->vars['cat_import'] || $this->vars['cat_as_tags']) { $old_cat_ids = $db->select( 'SELECT * FROM '.$this->vars['db_prefix'].'terms AS t, '. $this->vars['db_prefix'].'term_taxonomy AS x, '. $this->vars['db_prefix'].'term_relationships AS r '. 'WHERE t.term_id = x.term_id '. ($this->vars['ignore_first_cat'] ? 'AND t.term_id <> 1 ' : ''). 'AND x.taxonomy = \'category\' '. 'AND t.term_id = r.term_taxonomy_id '. 'AND r.object_id ='.$rs->ID. ' ORDER BY t.term_id ASC ' ); if (!$old_cat_ids->isEmpty() && $this->vars['cat_import']) { $cur->cat_id = $this->vars['cat_ids'][(integer) $old_cat_ids->term_id]; } } $permalink_infos = array( date('Y',strtotime($cur->post_dt)), date('m',strtotime($cur->post_dt)), date('d',strtotime($cur->post_dt)), date('H',strtotime($cur->post_dt)), date('i',strtotime($cur->post_dt)), date('s',strtotime($cur->post_dt)), $rs->post_name, $rs->ID, $cur->cat_id, $cur->user_id ); $cur->post_url = str_replace( $this->vars['permalink_tags'], $permalink_infos, $rs->post_type== 'post' ? $this->vars['permalink_template'] : '%postname%' ); $cur->post_url = substr($cur->post_url,0,255); if (!$cur->post_url) { $cur->post_url = $rs->ID; } $cur->post_format = $this->vars['post_formater']; $_post_content = explode('',$rs->post_content,2); if (count($_post_content) == 1) { $cur->post_excerpt = NULL; $cur->post_content = $this->cleanStr(array_shift($_post_content)); } else { $cur->post_excerpt = $this->cleanStr(array_shift($_post_content)); $cur->post_content = $this->cleanStr(array_shift($_post_content)); } $cur->post_content_xhtml = $this->core->callFormater($this->vars['post_formater'],$cur->post_content); $cur->post_excerpt_xhtml = $this->core->callFormater($this->vars['post_formater'],$cur->post_excerpt); switch ($rs->post_status) { case 'publish': $cur->post_status = 1; break; case 'draft': $cur->post_status = 0; break; case 'pending': $cur->post_status = -2; break; default: $cur->post_status = -2; } $cur->post_type = $rs->post_type; $cur->post_password = $rs->post_password ? $rs->post_password : NULL; $cur->post_open_comment = $rs->comment_status == 'open' ? 1 : 0; $cur->post_open_tb = $rs->ping_status == 'open' ? 1 : 0; $cur->post_words = implode(' ',text::splitWords( $cur->post_title.' '. $cur->post_excerpt_xhtml.' '. $cur->post_content_xhtml )); $cur->post_id = $this->con->select( 'SELECT MAX(post_id) FROM '.$this->prefix.'post' )->f(0) + 1; $cur->post_url = $this->core->blog->getPostURL($cur->post_url,$cur->post_dt,$cur->post_title,$cur->post_id); $cur->insert(); $this->importComments($rs->ID,$cur->post_id,$db); $this->importPings($rs->ID,$cur->post_id,$db); # Create tags $this->importTags($rs->ID,$cur->post_id,$db); if (isset($old_cat_ids)) { if (!$old_cat_ids->isEmpty() && $this->vars['cat_as_tags']) { $old_cat_ids->moveStart(); while ($old_cat_ids->fetch()) { $this->core->meta->setPostMeta($cur->post_id,'tag',$this->cleanStr($this->vars['cat_tags_prefix'].$old_cat_ids->name)); } } } } # Comments import protected function importComments($post_id,$new_post_id,$db) { $count_c = $count_t = 0; $rs = $db->select( 'SELECT * FROM '.$this->vars['db_prefix'].'comments '. 'WHERE comment_post_ID = '.(integer) $post_id.' ' ); while ($rs->fetch()) { $cur = $this->con->openCursor($this->prefix.'comment'); $cur->post_id = (integer) $new_post_id; $cur->comment_author = $this->cleanStr($rs->comment_author); $cur->comment_status = (integer) $rs->comment_approved ; $cur->comment_dt = $rs->comment_date; $cur->comment_email = $this->cleanStr($rs->comment_author_email); $cur->comment_content = $this->core->callFormater($this->vars['comment_formater'],$this->cleanStr($rs->comment_content)); $cur->comment_ip = $rs->comment_author_IP; $cur->comment_trackback = $rs->comment_type == 'trackback' ? 1 : 0; $cur->comment_site = substr($this->cleanStr($rs->comment_author_url),0,255); if ($cur->comment_site == '') $cur->comment_site = NULL; if ($rs->comment_approved == 'spam') { $cur->comment_status = -2; } $cur->comment_words = implode(' ',text::splitWords($cur->comment_content)); $cur->comment_id = $this->con->select( 'SELECT MAX(comment_id) FROM '.$this->prefix.'comment' )->f(0) + 1; $cur->insert(); if ($cur->comment_trackback && $cur->comment_status == 1) { $count_t++; } elseif ($cur->comment_status == 1) { $count_c++; } } if ($count_t > 0 || $count_c > 0) { $this->con->execute( 'UPDATE '.$this->prefix.'post SET '. 'nb_comment = '.$count_c.', '. 'nb_trackback = '.$count_t.' '. 'WHERE post_id = '.(integer) $new_post_id.' ' ); } } # Pings import protected function importPings($post_id,$new_post_id,$db) { $urls = array(); $pings = array(); $rs = $db->select( 'SELECT pinged FROM '.$this->vars['db_prefix'].'posts '. 'WHERE ID = '.(integer) $post_id ); $pings = explode ("\n",$rs->pinged); unset ($pings[0]); foreach($pings as $ping_url) { $url = $this->cleanStr($ping_url); if (isset($urls[$url])) { continue; } $cur = $this->con->openCursor($this->prefix.'ping'); $cur->post_id = (integer) $new_post_id; $cur->ping_url = $url; $cur->insert(); $urls[$url] = true; } } # Meta import protected function importTags($post_id,$new_post_id,$db) { $rs = $db->select( 'SELECT * FROM '.$this->vars['db_prefix'].'terms AS t, '. $this->vars['db_prefix'].'term_taxonomy AS x, '. $this->vars['db_prefix'].'term_relationships AS r '. 'WHERE t.term_id = x.term_id '. 'AND x.taxonomy = \'post_tag\' '. 'AND t.term_id = r.term_taxonomy_id '. 'AND r.object_id ='.$post_id. ' ORDER BY t.term_id ASC' ); if ($rs->isEmpty()) { return; } while ($rs->fetch()) { $this->core->meta->setPostMeta($new_post_id,'tag',$this->cleanStr($rs->name)); } } } dotclear-2.6.2+dfsg/plugins/importExport/inc/flat/000077500000000000000000000000001230033266200221265ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/importExport/inc/flat/class.flat.backup.php000066400000000000000000000056471230033266200261510ustar00rootroot00000000000000(\\\\\\\\)*+)(\\\\n)/u' => "\$1\n", '/(?(\\\\\\\\)*+)(\\\\r)/u' => "\$1\r", '/(?(\\\\\\\\)*+)(\\\\")/u' => '$1"', '/(\\\\\\\\)/' => '\\' ); public function __construct($file) { if (file_exists($file) && is_readable($file)) { $this->fp = fopen($file,'rb'); $this->line_num = 1; } else { throw new Exception(__('No file to read.')); } } public function __destruct() { if ($this->fp) { fclose($this->fp); } } public function getLine() { if (($line = $this->nextLine()) === false) { return false; } if (substr($line,0,1) == '[') { $this->line_name = substr($line,1,strpos($line,' ')-1); $line = substr($line,strpos($line,' ')+1,-1); $this->line_cols = explode(',',$line); return $this->getLine(); } elseif (substr($line,0,1) == '"') { $line = preg_replace('/^"|"$/','',$line); $line = preg_split('/(^"|","|(?line_cols) != count($line)) { throw new Exception(sprintf('Invalid row count at line %s',$this->line_num)); } $res = array(); for ($i=0; $iline_cols[$i]] = preg_replace(array_keys($this->replacement),array_values($this->replacement),$line[$i]); } return new flatBackupItem($this->line_name,$res,$this->line_num); } else { return $this->getLine(); } } private function nextLine() { if (feof($this->fp)) { return false; } $this->line_num++; $line = fgets($this->fp); $line = trim($line); return empty($line) ? $this->nextLine() : $line; } } class flatBackupItem { public $__name; public $__line; private $__data = array(); public function __construct($name,$data,$line) { $this->__name = $name; $this->__data = $data; $this->__line = $line; } public function f($name) { return iconv('UTF-8','UTF-8//IGNORE',$this->__data[$name]); } public function __get($name) { return $this->f($name); } public function __set($n,$v) { $this->__data[$n] = $v; } public function exists($n) { return isset($this->__data[$n]); } public function drop() { foreach (func_get_args() as $n) { if (isset($this->__data[$n])) { unset($this->__data[$n]); } } } public function substitute($old,$new) { if (isset($this->__data[$old])) { $this->__data[$new] = $this->__data[$old]; unset($this->__data[$old]); } } } dotclear-2.6.2+dfsg/plugins/importExport/inc/flat/class.flat.export.php000066400000000000000000000037671230033266200262260ustar00rootroot00000000000000con =& $con; $this->prefix = $prefix; if (($this->fp = fopen($out,'w')) === false) { return false; } @set_time_limit(300); } function __destruct() { if (is_resource($this->fp)) { fclose($this->fp); } } function export($name,$sql) { $rs = $this->con->select($sql); if (!$rs->isEmpty()) { fwrite($this->fp,"\n[".$name.' '.implode(',',$rs->columns())."]\n"); while ($rs->fetch()) { fwrite($this->fp,$this->getLine($rs)); } fflush($this->fp); } } function exportAll() { $tables = $this->getTables(); foreach ($tables as $table) { $this->exportTable($table); } } function exportTable($table) { $req = 'SELECT * FROM '.$this->con->escapeSystem($this->prefix.$table); $this->export($table,$req); } function getTables() { $schema = dbSchema::init($this->con); $db_tables = $schema->getTables(); $tables = array(); foreach ($db_tables as $t) { if ($this->prefix) { if (strpos($t,$this->prefix) === 0) { $tables[] = $t; } } else { $tables[] = $t; } } return $tables; } function getLine($rs) { $l = array(); $cols = $rs->columns(); foreach ($cols as $i => &$c) { $s = $rs->f($c); $s = preg_replace($this->line_reg,$this->line_rep,$s); $s = '"'.$s.'"'; $l[$i] = $s; } return implode(',',$l)."\n"; } } dotclear-2.6.2+dfsg/plugins/importExport/inc/flat/class.flat.import.php000066400000000000000000000673741230033266200262230ustar00rootroot00000000000000 array(), 'post' => array(), 'media' => array() ); public $stack = array( 'categories'=>null, 'cat_id'=>1, 'cat_lft'=>array(), 'post_id'=>1, 'media_id'=>1, 'comment_id'=>1, 'link_id'=>1, 'log_id' => 1 ); public $has_categories = false; public function __construct($core,$file) { parent::__construct($file); $first_line = fgets($this->fp); if (strpos($first_line,'///DOTCLEAR|') !== 0) { throw new Exception(__('File is not a DotClear backup.')); } @set_time_limit(300); $l = explode('|',$first_line); if (isset($l[1])) { $this->dc_version = $l[1]; } $this->mode = isset($l[2]) ? strtolower(trim($l[2])) : 'single'; if ($this->mode != 'full' && $this->mode != 'single') { $this->mode = 'single'; } if (version_compare('1.2',$this->dc_version,'<=') && version_compare('1.3',$this->dc_version,'>')) { $this->dc_major_version = '1.2'; } else { $this->dc_major_version = '2.0'; } $this->core =& $core; $this->con =& $core->con; $this->prefix = $core->prefix; $this->cur_blog = $this->con->openCursor($this->prefix.'blog'); $this->cur_category = $this->con->openCursor($this->prefix.'category'); $this->cur_link = $this->con->openCursor($this->prefix.'link'); $this->cur_setting = $this->con->openCursor($this->prefix.'setting'); $this->cur_user = $this->con->openCursor($this->prefix.'user'); $this->cur_pref = $this->con->openCursor($this->prefix.'pref'); $this->cur_permissions = $this->con->openCursor($this->prefix.'permissions'); $this->cur_post = $this->con->openCursor($this->prefix.'post'); $this->cur_meta = $this->con->openCursor($this->prefix.'meta'); $this->cur_media = $this->con->openCursor($this->prefix.'media'); $this->cur_post_media = $this->con->openCursor($this->prefix.'post_media'); $this->cur_log = $this->con->openCursor($this->prefix.'log'); $this->cur_ping = $this->con->openCursor($this->prefix.'ping'); $this->cur_comment = $this->con->openCursor($this->prefix.'comment'); $this->cur_spamrule = $this->con->openCursor($this->prefix.'spamrule'); $this->cur_version = $this->con->openCursor($this->prefix.'version'); # --BEHAVIOR-- importInit $this->core->callBehavior('importInit',$this,$this->core); } public function importSingle() { if ($this->mode != 'single') { throw new Exception(__('File is not a single blog export.')); } if (!$this->core->auth->check('admin',$this->core->blog->id)) { throw new Exception(__('Permission denied.')); } $this->blog_id = $this->core->blog->id; $this->stack['categories'] = $this->con->select( 'SELECT cat_id, cat_title, cat_url '. 'FROM '.$this->prefix.'category '. "WHERE blog_id = '".$this->con->escape($this->blog_id)."' " ); $rs = $this->con->select('SELECT MAX(cat_id) FROM '.$this->prefix.'category'); $this->stack['cat_id'] = ((integer) $rs->f(0))+1; $rs = $this->con->select('SELECT MAX(link_id) FROM '.$this->prefix.'link'); $this->stack['link_id'] = ((integer) $rs->f(0))+1; $rs = $this->con->select('SELECT MAX(post_id) FROM '.$this->prefix.'post'); $this->stack['post_id'] = ((integer) $rs->f(0))+1; $rs = $this->con->select('SELECT MAX(media_id) FROM '.$this->prefix.'media'); $this->stack['media_id'] = ((integer) $rs->f(0))+1; $rs = $this->con->select('SELECT MAX(comment_id) FROM '.$this->prefix.'comment'); $this->stack['comment_id'] = ((integer) $rs->f(0))+1; $rs = $this->con->select('SELECT MAX(log_id) FROM '.$this->prefix.'log'); $this->stack['log_id'] = ((integer) $rs->f(0))+1; $rs = $this->con->select( 'SELECT MAX(cat_rgt) AS cat_rgt FROM '.$this->prefix.'category '. "WHERE blog_id = '".$this->con->escape($this->core->blog->id)."'" ); if ((integer) $rs->cat_rgt > 0) { $this->has_categories = true; $this->stack['cat_lft'][$this->core->blog->id] = (integer) $rs->cat_rgt + 1; } $this->con->begin(); try { $last_line_name = ''; $constrained = array('post', 'meta', 'post_media', 'ping', 'comment'); while (($line = $this->getLine()) !== false) { # import DC 1.2.x, we fix lines before insert if ($this->dc_major_version == '1.2') { $this->prepareDC12line($line); } if ($last_line_name != $line->__name) { if (in_array($last_line_name,$constrained)) { # UNDEFER if ($this->con->driver() == 'mysql' || $this->con->driver() == 'mysqli') $this->con->execute('SET foreign_key_checks = 1'); if ($this->con->driver() == 'pgsql') $this->con->execute('SET CONSTRAINTS ALL DEFERRED'); } if (in_array($line->__name,$constrained)) { # DEFER if ($this->con->driver() == 'mysql' || $this->con->driver() == 'mysqli') $this->con->execute('SET foreign_key_checks = 0'); if ($this->con->driver() == 'pgsql') $this->con->execute('SET CONSTRAINTS ALL IMMEDIATE'); } $last_line_name = $line->__name; } switch ($line->__name) { case 'category': $this->insertCategorySingle($line); break; case 'link': $this->insertLinkSingle($line); break; case 'post': $this->insertPostSingle($line); break; case 'meta': $this->insertMetaSingle($line); break; case 'media': $this->insertMediaSingle($line); break; case 'post_media': $this->insertPostMediaSingle($line); break; case 'ping': $this->insertPingSingle($line); break; case 'comment': $this->insertCommentSingle($line); break; } # --BEHAVIOR-- importSingle $this->core->callBehavior('importSingle',$line,$this,$this->core); } if ($this->con->driver() == 'mysql' || $this->con->driver() == 'mysqli') $this->con->execute('SET foreign_key_checks = 1'); if ($this->con->driver() == 'pgsql') $this->con->execute('SET CONSTRAINTS ALL DEFERRED'); } catch (Exception $e) { @fclose($this->fp); $this->con->rollback(); throw new Exception($e->getMessage().' - '.sprintf(__('Error raised at line %s'),$line->__line)); } @fclose($this->fp); $this->con->commit(); } public function importFull() { if ($this->mode != 'full') { throw new Exception(__('File is not a full export.')); } if (!$this->core->auth->isSuperAdmin()) { throw new Exception(__('Permission denied.')); } $this->con->begin(); $this->con->execute('DELETE FROM '.$this->prefix.'blog'); $this->con->execute('DELETE FROM '.$this->prefix.'media'); $this->con->execute('DELETE FROM '.$this->prefix.'spamrule'); $this->con->execute('DELETE FROM '.$this->prefix.'setting'); $this->con->execute('DELETE FROM '.$this->prefix.'log'); try { while (($line = $this->getLine()) !== false) { switch ($line->__name) { case 'blog': $this->insertBlog($line); break; case 'category': $this->insertCategory($line); break; case 'link': $this->insertLink($line); break; case 'setting': $this->insertSetting($line); break; case 'user': $this->insertUser($line); break; case 'pref': $this->insertPref($line); break; case 'permissions': $this->insertPermissions($line); break; case 'post': $this->insertPost($line); break; case 'meta': $this->insertMeta($line); break; case 'media': $this->insertMedia($line); break; case 'post_media': $this->insertPostMedia($line); break; case 'log'; $this->insertLog($line); break; case 'ping': $this->insertPing($line); break; case 'comment': $this->insertComment($line); break; case 'spamrule': $this->insertSpamRule($line); break; } # --BEHAVIOR-- importFull $this->core->callBehavior('importFull',$line,$this,$this->core); } } catch (Exception $e) { @fclose($this->fp); $this->con->rollback(); throw new Exception($e->getMessage().' - '.sprintf(__('Error raised at line %s'),$line->__line)); } @fclose($this->fp); $this->con->commit(); } private function insertBlog($blog) { $this->cur_blog->clean(); $this->cur_blog->blog_id = (string) $blog->blog_id; $this->cur_blog->blog_uid = (string) $blog->blog_uid; $this->cur_blog->blog_creadt = (string) $blog->blog_creadt; $this->cur_blog->blog_upddt = (string) $blog->blog_upddt; $this->cur_blog->blog_url = (string) $blog->blog_url; $this->cur_blog->blog_name = (string) $blog->blog_name; $this->cur_blog->blog_desc = (string) $blog->blog_desc; $this->cur_blog->blog_status = $blog->exists('blog_status') ? (integer) $blog->blog_status : 1; $this->cur_blog->insert(); } private function insertCategory($category) { $this->cur_category->clean(); $this->cur_category->cat_id = (string) $category->cat_id; $this->cur_category->blog_id = (string) $category->blog_id; $this->cur_category->cat_title = (string) $category->cat_title; $this->cur_category->cat_url = (string) $category->cat_url; $this->cur_category->cat_desc = (string) $category->cat_desc; if (!$this->has_categories && $category->exists('cat_lft') && $category->exists('cat_rgt')) { $this->cur_category->cat_lft = (integer) $category->cat_lft; $this->cur_category->cat_rgt = (integer) $category->cat_rgt; } else { if (!isset($this->stack['cat_lft'][$category->blog_id])) { $this->stack['cat_lft'][$category->blog_id] = 2; } $this->cur_category->cat_lft = $this->stack['cat_lft'][$category->blog_id]++; $this->cur_category->cat_rgt = $this->stack['cat_lft'][$category->blog_id]++; } $this->cur_category->insert(); } private function insertLink($link) { $this->cur_link->clean(); $this->cur_link->link_id = (integer) $link->link_id; $this->cur_link->blog_id = (string) $link->blog_id; $this->cur_link->link_href = (string) $link->link_href; $this->cur_link->link_title = (string) $link->link_title; $this->cur_link->link_desc = (string) $link->link_desc; $this->cur_link->link_lang = (string) $link->link_lang; $this->cur_link->link_xfn = (string) $link->link_xfn; $this->cur_link->link_position = (integer) $link->link_position; $this->cur_link->insert(); } private function insertSetting($setting) { $this->cur_setting->clean(); $this->cur_setting->setting_id = (string) $setting->setting_id; $this->cur_setting->blog_id = !$setting->blog_id ? null : (string) $setting->blog_id; $this->cur_setting->setting_ns = (string) $setting->setting_ns; $this->cur_setting->setting_value = (string) $setting->setting_value; $this->cur_setting->setting_type = (string) $setting->setting_type; $this->cur_setting->setting_label = (string) $setting->setting_label; $this->cur_setting->insert(); } private function insertPref($pref) { if ($this->prefExists($pref->pref_ws,$pref->pref_id,$pref->user_id)) { return; } $this->cur_pref->clean(); $this->cur_pref->pref_id = (string) $pref->pref_id; $this->cur_pref->user_id = !$pref->user_id ? null : (string) $pref->user_id; $this->cur_pref->pref_ws = (string) $pref->pref_ws; $this->cur_pref->pref_value = (string) $pref->pref_value; $this->cur_pref->pref_type = (string) $pref->pref_type; $this->cur_pref->pref_label = (string) $pref->pref_label; $this->cur_pref->insert(); } private function insertUser($user) { if ($this->userExists($user->user_id)) { return; } $this->cur_user->clean(); $this->cur_user->user_id = (string) $user->user_id; $this->cur_user->user_super = (integer) $user->user_super; $this->cur_user->user_pwd = (string) $user->user_pwd; $this->cur_user->user_recover_key = (string) $user->user_recover_key; $this->cur_user->user_name = (string) $user->user_name; $this->cur_user->user_firstname = (string) $user->user_firstname; $this->cur_user->user_displayname = (string) $user->user_displayname; $this->cur_user->user_email = (string) $user->user_email; $this->cur_user->user_url = (string) $user->user_url; $this->cur_user->user_default_blog = !$user->user_default_blog ? null : (string) $user->user_default_blog; $this->cur_user->user_lang = (string) $user->user_lang; $this->cur_user->user_tz = (string) $user->user_tz; $this->cur_user->user_post_status = (integer) $user->user_post_status; $this->cur_user->user_creadt = (string) $user->user_creadt; $this->cur_user->user_upddt = (string) $user->user_upddt; $this->cur_user->user_desc = $user->exists('user_desc') ? (string) $user->user_desc : null; $this->cur_user->user_options = $user->exists('user_options') ? (string) $user->user_options : null; $this->cur_user->user_status = $user->exists('user_status') ? (integer) $user->user_status : 1; $this->cur_user->insert(); $this->stack['users'][$user->user_id] = true; } private function insertPermissions($permissions) { $this->cur_permissions->clean(); $this->cur_permissions->user_id = (string) $permissions->user_id; $this->cur_permissions->blog_id = (string) $permissions->blog_id; $this->cur_permissions->permissions = (string) $permissions->permissions; $this->cur_permissions->insert(); } private function insertPost($post) { $this->cur_post->clean(); $cat_id = (integer) $post->cat_id; if (!$cat_id) { $cat_id = null; } $post_password = $post->post_password ? (string) $post->post_password : null; $this->cur_post->post_id = (integer) $post->post_id; $this->cur_post->blog_id = (string) $post->blog_id; $this->cur_post->user_id = (string) $this->getUserId($post->user_id); $this->cur_post->cat_id = $cat_id; $this->cur_post->post_dt = (string) $post->post_dt; $this->cur_post->post_creadt = (string) $post->post_creadt; $this->cur_post->post_upddt = (string) $post->post_upddt; $this->cur_post->post_password = $post_password; $this->cur_post->post_type = (string) $post->post_type; $this->cur_post->post_format = (string) $post->post_format; $this->cur_post->post_url = (string) $post->post_url; $this->cur_post->post_lang = (string) $post->post_lang; $this->cur_post->post_title = (string) $post->post_title; $this->cur_post->post_excerpt = (string) $post->post_excerpt; $this->cur_post->post_excerpt_xhtml = (string) $post->post_excerpt_xhtml; $this->cur_post->post_content = (string) $post->post_content; $this->cur_post->post_content_xhtml = (string) $post->post_content_xhtml; $this->cur_post->post_notes = (string) $post->post_notes; $this->cur_post->post_words = (string) $post->post_words; $this->cur_post->post_meta = (string) $post->post_meta; $this->cur_post->post_status = (integer) $post->post_status; $this->cur_post->post_selected = (integer) $post->post_selected; $this->cur_post->post_open_comment = (integer) $post->post_open_comment; $this->cur_post->post_open_tb = (integer) $post->post_open_tb; $this->cur_post->nb_comment = (integer) $post->nb_comment; $this->cur_post->nb_trackback = (integer) $post->nb_trackback; $this->cur_post->post_tz = $post->exists('post_tz') ? (string) $post->post_tz : 'UTC'; $this->cur_post->insert(); } private function insertMeta($meta) { $this->cur_meta->clean(); $this->cur_meta->meta_id = (string) $meta->meta_id; $this->cur_meta->meta_type = (string) $meta->meta_type; $this->cur_meta->post_id = (integer) $meta->post_id; $this->cur_meta->insert(); } private function insertMedia($media) { $this->cur_media->clean(); $this->cur_media->media_id = (integer) $media->media_id; $this->cur_media->user_id = (string) $media->user_id; $this->cur_media->media_path = (string) $media->media_path; $this->cur_media->media_title = (string) $media->media_title; $this->cur_media->media_file = (string) $media->media_file; $this->cur_media->media_meta = (string) $media->media_meta; $this->cur_media->media_dt = (string) $media->media_dt; $this->cur_media->media_creadt = (string) $media->media_creadt; $this->cur_media->media_upddt = (string) $media->media_upddt; $this->cur_media->media_private = (integer) $media->media_private; $this->cur_media->media_dir = $media->exists('media_dir') ? (string) $media->media_dir : dirname($media->media_file); if (!$this->mediaExists()) { $this->cur_media->insert(); } } private function insertPostMedia($post_media) { $this->cur_post_media->clean(); $this->cur_post_media->media_id = (integer) $post_media->media_id; $this->cur_post_media->post_id = (integer) $post_media->post_id; $this->cur_post_media->insert(); } private function insertLog($log) { $this->cur_log->clean(); $this->cur_log->log_id = (integer) $log->log_id; $this->cur_log->user_id = (string) $log->user_id; $this->cur_log->log_table = (string) $log->log_table; $this->cur_log->log_dt = (string) $log->log_dt; $this->cur_log->log_ip = (string) $log->log_ip; $this->cur_log->log_msg = (string) $log->log_msg; $this->cur_log->insert(); } private function insertPing($ping) { $this->cur_ping->clean(); $this->cur_ping->post_id = (integer) $ping->post_id; $this->cur_ping->ping_url = (string) $ping->ping_url; $this->cur_ping->ping_dt = (string) $ping->ping_dt; $this->cur_ping->insert(); } private function insertComment($comment) { $this->cur_comment->clean(); $this->cur_comment->comment_id = (integer) $comment->comment_id; $this->cur_comment->post_id = (integer) $comment->post_id; $this->cur_comment->comment_dt = (string) $comment->comment_dt; $this->cur_comment->comment_upddt = (string) $comment->comment_upddt; $this->cur_comment->comment_author = (string) $comment->comment_author; $this->cur_comment->comment_email = (string) $comment->comment_email; $this->cur_comment->comment_site = (string) $comment->comment_site; $this->cur_comment->comment_content = (string) $comment->comment_content; $this->cur_comment->comment_words = (string) $comment->comment_words; $this->cur_comment->comment_ip = (string) $comment->comment_ip; $this->cur_comment->comment_status = (integer) $comment->comment_status; $this->cur_comment->comment_spam_status = (integer) $comment->comment_spam_status; $this->cur_comment->comment_trackback = (integer) $comment->comment_trackback; $this->cur_comment->comment_tz = $comment->exists('comment_tz') ? (string) $comment->comment_tz : 'UTC'; $this->cur_comment->comment_spam_filter = $comment->exists('comment_spam_filter') ? (integer) $comment->comment_spam_filter : null; $this->cur_comment->insert(); } private function insertSpamRule($spamrule) { $this->cur_spamrule->clean(); $this->cur_spamrule->rule_id = (integer) $spamrule->rule_id; $this->cur_spamrule->blog_id = !$spamrule->blog_id ? null : (string) $spamrule->blog_id; $this->cur_spamrule->rule_type = (string) $spamrule->rule_type; $this->cur_spamrule->rule_content = (string) $spamrule->rule_content; $this->cur_spamrule->insert(); } private function insertCategorySingle($category) { $this->cur_category->clean(); $m = $this->searchCategory($this->stack['categories'],$category->cat_url); $old_id = $category->cat_id; if ($m !== false) { $cat_id = $m; } else { $cat_id = $this->stack['cat_id']; $category->cat_id = $cat_id; $category->blog_id = $this->blog_id; $this->insertCategory($category); $this->stack['cat_id']++; } $this->old_ids['category'][(integer) $old_id] = $cat_id; } private function insertLinkSingle($link) { $link->blog_id = $this->blog_id; $link->link_id = $this->stack['link_id']; $this->insertLink($link); $this->stack['link_id']++; } private function insertPostSingle($post) { if (!$post->cat_id || isset($this->old_ids['category'][(integer) $post->cat_id])) { $post_id = $this->stack['post_id']; $this->old_ids['post'][(integer) $post->post_id] = $post_id; $cat_id = $post->cat_id ? $this->old_ids['category'][(integer) $post->cat_id] : null; $post->post_id = $post_id; $post->cat_id = $cat_id; $post->blog_id = $this->blog_id; $post->post_url = $this->core->blog->getPostURL( $post->post_url,$post->post_dt,$post->post_title,$post->post_id ); $this->insertPost($post); $this->stack['post_id']++; } else { self::throwIdError($post->__name,$post->__line,'category'); } } private function insertMetaSingle($meta) { if (isset($this->old_ids['post'][(integer) $meta->post_id])) { $meta->post_id = $this->old_ids['post'][(integer) $meta->post_id]; $this->insertMeta($meta); } else { self::throwIdError($meta->__name,$meta->__line,'post'); } } private function insertMediaSingle($media) { $media_id = $this->stack['media_id']; $old_id = $media->media_id; $media->media_id = $media_id; $media->media_path = $this->core->blog->settings->system->public_path; $media->user_id = $this->getUserId($media->user_id); $this->insertMedia($media); $this->stack['media_id']++; $this->old_ids['media'][(integer) $old_id] = $media_id; } private function insertPostMediaSingle($post_media) { if (isset($this->old_ids['media'][(integer) $post_media->media_id]) && isset($this->old_ids['post'][(integer) $post_media->post_id])) { $post_media->media_id = $this->old_ids['media'][(integer) $post_media->media_id]; $post_media->post_id = $this->old_ids['post'][(integer) $post_media->post_id]; $this->insertPostMedia($post_media); } elseif (!isset($this->old_ids['media'][(integer) $post_media->media_id])) { self::throwIdError($post_media->__name,$post_media->__line,'media'); }else { self::throwIdError($post_media->__name,$post_media->__line,'post'); } } private function insertPingSingle($ping) { if (isset($this->old_ids['post'][(integer) $ping->post_id])) { $ping->post_id = $this->old_ids['post'][(integer) $ping->post_id]; $this->insertPing($ping); } else { self::throwIdError($ping->__name,$ping->__line,'post'); } } private function insertCommentSingle($comment) { if (isset($this->old_ids['post'][(integer) $comment->post_id])) { $comment_id = $this->stack['comment_id']; $comment->comment_id = $comment_id; $comment->post_id = $this->old_ids['post'][(integer) $comment->post_id]; $this->insertComment($comment); $this->stack['comment_id']++; } else { self::throwIdError($comment->__name,$comment->__line,'post'); } } private static function throwIdError($name,$line,$related) { throw new Exception(sprintf( __('ID of "%3$s" does not match on record "%1$s" at line %2$s of backup file.'), html::escapeHTML($name), html::escapeHTML($line), html::escapeHTML($related) )); } public function searchCategory($rs,$url) { while ($rs->fetch()) { if ($rs->cat_url == $url) { return $rs->cat_id; } } return false; } public function getUserId($user_id) { if (!$this->userExists($user_id)) { if ($this->core->auth->isSuperAdmin()) { # Sanitizes user_id and create a lambda user $user_id = preg_replace('/[^A-Za-z0-9]$/','',$user_id); $user_id .= strlen($user_id) < 2 ? '-a' : ''; # We change user_id, we need to check again if (!$this->userExists($user_id)) { $this->cur_user->clean(); $this->cur_user->user_id = (string) $user_id; $this->cur_user->user_pwd = md5(uniqid()); $this->core->addUser($this->cur_user); $this->stack['users'][$user_id] = true; } } else { # Returns current user id $user_id = $this->core->auth->userID(); } } return $user_id; } private function userExists($user_id) { if (isset($this->stack['users'][$user_id])) { return $this->stack['users'][$user_id]; } $strReq = 'SELECT user_id '. 'FROM '.$this->prefix.'user '. "WHERE user_id = '".$this->con->escape($user_id)."' "; $rs = $this->con->select($strReq); $this->stack['users'][$user_id] = !$rs->isEmpty(); return $this->stack['users'][$user_id]; } private function prefExists($pref_ws,$pref_id,$user_id) { $strReq = 'SELECT pref_id,pref_ws,user_id '. 'FROM '.$this->prefix.'pref '. "WHERE pref_id = '".$this->con->escape($pref_id)."' ". "AND pref_ws = '".$this->con->escape($pref_ws)."' "; if (!$user_id) { $strReq .= "AND user_id IS NULL "; } else { $strReq .= "AND user_id = '".$this->con->escape($user_id)."' "; } $rs = $this->con->select($strReq); return !$rs->isEmpty(); } private function mediaExists() { $strReq = 'SELECT media_id '. 'FROM '.$this->prefix.'media '. "WHERE media_path = '".$this->con->escape($this->cur_media->media_path)."' ". "AND media_file = '".$this->con->escape($this->cur_media->media_file)."' "; $rs = $this->con->select($strReq); return !$rs->isEmpty(); } private function prepareDC12line(&$line) { $settings = array('dc_theme','dc_nb_post_per_page','dc_allow_comments', 'dc_allow_trackbacks','dc_comment_pub','dc_comments_ttl', 'dc_wiki_comments','dc_use_smilies','dc_date_format','dc_time_format', 'dc_url_scan'); switch ($line->__name) { case 'categorie': $line->substitute('cat_libelle','cat_title'); $line->substitute('cat_libelle_url','cat_url'); $line->__name = 'category'; $line->blog_id = 'default'; break; case 'link': $line->substitute('href','link_href'); $line->substitute('label','link_title'); $line->substitute('title','link_desc'); $line->substitute('lang','link_lang'); $line->substitute('rel','link_xfn'); $line->substitute('position','link_position'); $line->blog_id = 'default'; break; case 'post': $line->substitute('post_titre','post_title'); $line->post_title = html::decodeEntities($line->post_title); $line->post_url = date('Y/m/d/',strtotime($line->post_dt)).$line->post_id.'-'.$line->post_titre_url; $line->post_url = substr($line->post_url,0,255); $line->post_format = $line->post_content_wiki == '' ? 'xhtml' : 'wiki'; $line->post_content_xhtml = $line->post_content; $line->post_excerpt_xhtml = $line->post_chapo; if ($line->post_format == 'wiki') { $line->post_content = $line->post_content_wiki; $line->post_excerpt = $line->post_chapo_wiki; } else { $line->post_content = $line->post_content; $line->post_excerpt = $line->post_chapo; } $line->post_status = (integer) $line->post_pub; $line->post_type = 'post'; $line->blog_id = 'default'; $line->drop('post_titre_url','post_content_wiki','post_chapo','post_chapo_wiki','post_pub'); break; case 'post_meta': $line->drop('meta_id'); $line->substitute('meta_key','meta_type'); $line->substitute('meta_value','meta_id'); $line->__name = 'meta'; $line->blog_id = 'default'; break; case 'comment': $line->substitute('comment_auteur','comment_author'); if ($line->comment_site != '' && !preg_match('!^http://.*$!', $line->comment_site,$m)) { $line->comment_site = 'http://'.$line->comment_site; } $line->comment_status = (integer) $line->comment_pub; $line->drop('comment_pub'); break; } # --BEHAVIOR-- importPrepareDC12 $this->core->callBehavior('importPrepareDC12',$line,$this,$this->core); } } dotclear-2.6.2+dfsg/plugins/importExport/inc/img/000077500000000000000000000000001230033266200217545ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/importExport/inc/img/progress.png000066400000000000000000000015321230033266200243270ustar00rootroot00000000000000PNG  IHDR(isBITOzPLTEfedab^a__]V\ZXUWY~W~X}VyM{UzSyPzStGySrCwQwOvPsJqEtNrHrGtMsLqIrLpHqJk;pHoHi7nHoIf3f4mGg6h:d1hc:]*b:^.\)^0Z'_4a:Y&X%]4V#V%U"T"U%S T$T%QS%T(R"V,S'ONMLK}J}Mz K{H{FxFyExDuCvCtDtCrAt?r >q 6UImWb6iI0uF=ykB5\RC1R`r59k˥+ J: д'[4T/" oF:[nm9{ ކH+=S6須IJϽ#!oRo4 ׯk8?ҵ ""DIENDB`dotclear-2.6.2+dfsg/plugins/importExport/inc/lib.ie.maintenance.php000066400000000000000000000067011230033266200253400ustar00rootroot00000000000000name = __('Database export'); $this->task = __('Download database of current blog'); $this->export_name = html::escapeHTML($this->core->blog->id.'-backup.txt'); $this->export_type = 'export_blog'; } public function execute() { // Create zip file if (!empty($_POST['file_name'])) { // This process make an http redirect $ie = new maintenanceDcExportFlat($this->core); $ie->setURL($this->id); $ie->process($this->export_type); } // Go to step and show form else { return 1; } } public function step() { // Download zip file if (isset($_SESSION['export_file']) && file_exists($_SESSION['export_file'])) { // Log task execution here as we sent file and stop script $this->log(); // This process send file by http and stop script $ie = new maintenanceDcExportFlat($this->core); $ie->setURL($this->id); $ie->process('ok'); } else { return '

        '. form::field('file_name', 50, 255, date('Y-m-d-H-i-').$this->export_name). '

        '. '

        '. '

        '; } } } class ieMaintenanceExportfull extends dcMaintenanceTask { protected $tab = 'backup'; protected $group = 'zipfull'; protected $export_name; protected $export_type; protected function init() { $this->name = __('Database export'); $this->task = __('Download database of all blogs'); $this->export_name = 'dotclear-backup.txt'; $this->export_type = 'export_all'; } public function execute() { // Create zip file if (!empty($_POST['file_name'])) { // This process make an http redirect $ie = new maintenanceDcExportFlat($this->core); $ie->setURL($this->id); $ie->process($this->export_type); } // Go to step and show form else { return 1; } } public function step() { // Download zip file if (isset($_SESSION['export_file']) && file_exists($_SESSION['export_file'])) { // Log task execution here as we sent file and stop script $this->log(); // This process send file by http and stop script $ie = new maintenanceDcExportFlat($this->core); $ie->setURL($this->id); $ie->process('ok'); } else { return '

        '. form::field('file_name', 50, 255, date('Y-m-d-H-i-').$this->export_name). '

        '. '

        '. '

        '; } } } class maintenanceDcExportFlat extends dcExportFlat { /** * Set redirection URL of bakcup process. * * Bad hack to change redirection of dcExportFlat::process() * * @param id string Task id */ public function setURL($id) { $this->url = sprintf('plugin.php?p=maintenance&task=%s', $id); } } dotclear-2.6.2+dfsg/plugins/importExport/index.php000066400000000000000000000047571230033266200222640ustar00rootroot00000000000000'.html::escapeHTML($o->name).''. '
        '.html::escapeHTML($o->description).'
        '; unset($o); } return '
        '.$res.'
        '; } $modules = new ArrayObject(array('import' => array(),'export' => array())); # --BEHAVIOR-- importExportModules $core->callBehavior('importExportModules', $modules, $core); $type = null; if (!empty($_REQUEST['type']) && in_array($_REQUEST['type'],array('export','import'))) { $type = $_REQUEST['type']; } $module = null; if ($type && !empty($_REQUEST['module'])) { if (isset($modules[$type]) && in_array($_REQUEST['module'],$modules[$type])) { $module = new $_REQUEST['module']($core); $module->init(); } } if ($type && $module !== null && !empty($_REQUEST['do'])) { try { $module->process($_REQUEST['do']); } catch (Exception $e) { $core->error->add($e->getMessage()); } } $title = __('Import/Export'); echo ' '.$title.' '.dcPage::jsLoad('index.php?pf=importExport/js/script.js').' '; if ($type && $module !== null) { echo dcPage::breadcrumb( array( __('Plugins') => '', $title => $p_url, html::escapeHTML($module->name) => '' )). dcPage::notices(); echo '
        '; $module->gui(); echo '
        '; } else { echo dcPage::breadcrumb( array( __('Plugins') => '', $title => '' )). dcPage::notices(); echo '

        '.__('Import').'

        '.listImportExportModules($core,$modules['import']); echo '

        '.__('Export').'

        '. '

        '.sprintf( __('Export functions are in the page %s.'), ''.__('Maintenance').'' ).'

        '; } dcPage::helpBlock('import'); echo ''; dotclear-2.6.2+dfsg/plugins/importExport/js/000077500000000000000000000000001230033266200210435ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/importExport/js/script.js000066400000000000000000000004441230033266200227070ustar00rootroot00000000000000 $(function(){if($('*.error').length>0){return;} $('#ie-gui form[method=post]:has(input[type=hidden][name=autosubmit])').each(function(){$('input[type=submit]',this).remove();$(this).after('

        '+dotclear.msg.please_wait+'

        ');$(this).submit();});}); dotclear-2.6.2+dfsg/plugins/importExport/locales/000077500000000000000000000000001230033266200220515ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/importExport/locales/en/000077500000000000000000000000001230033266200224535ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/importExport/locales/en/help/000077500000000000000000000000001230033266200234035ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/importExport/locales/en/help/import.html000066400000000000000000000060371230033266200256110ustar00rootroot00000000000000 Import

        Flat file import

        Imports a blog or a full Dotclear installation from a flat file.

        Single blog

        Select the backup file (exported from another Dotclear install) or select one from the root directory of your media manager and click on the Import button to start the import process.

        Note: the content imported during this process will be added to the existing content of the current blog, nothing will be lost.

        Multiple blogs

        Select the full backup file from your computer or select one from the root folder of your media manager, enter your password and click on the Import button to start the full import process.

        Warning: the whole content of the current blog will be deleted and replaced by the content of the backup file. Only current users will be kept. Additional users from the backup file will be added to the current users list.

        RSS or Atom feed import

        Add a feed content to the current blog.

        Enter the URL of the RSS or Atom feed you want to import and click on Import. The content found in the feed will be added to your current blog content.

        Dotclear 1.2 import

        This feature allows you to import a Dotclear 1.2 installation into your current blog. This process will replace the categories, blogrolls, entries and comments of the current blog.

        Enter the server URL where the Dotclear 1.2 database to import is located, then input the database name, the user name and password to connect to the database and the database tables prefix used in the Dotclear 1.2 installation. You can find this information in the conf/config.php file from your Dotclear 1.2 installation.

        Click on the Import my blog now button to start the import process.

        You can decrease or increase the amount of entries imported at once using the Number of entries to import at once field, depending on the access speed of your Dotclear 1.2 installation.

        Wordpress import

        This feature allows you to import a Wordpress installation into your current blog. This process will replace the categories, blogrolls, entries and comments of the current blog.

        Enter the server URL where the Wordpress database to import is located, then input the database name, the user name and password to connect to the database and the database tables prefix used in the Wordpress installation.

        You can set up a few import options regarding the categories import and the number of entries to import at once. You can also define the syntax used for the entries and the comments content (XHTML, Wiki or others depending on the currently installed and activated syntaxes).

        Click on Import my blog now to start the import process.


        Note: the export functions are now located in theMaintenance page.

        dotclear-2.6.2+dfsg/plugins/importExport/locales/en/resources.php000066400000000000000000000007531230033266200252030ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/importExport/locales/fr/000077500000000000000000000000001230033266200224605ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/importExport/locales/fr/help/000077500000000000000000000000001230033266200234105ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/importExport/locales/fr/help/import.html000066400000000000000000000067501230033266200256200ustar00rootroot00000000000000 Importation

        Importation d'un fichier « à plat »

        Importe un blog ou une installation Dotclear complète depuis un fichier « à plat ».

        Importation d'un blog simple

        Sélectionnez le fichier de sauvegarde (habituellement exporté depuis une installation Dotclear) ou sélectionnez-en un présent dans votre répertoire racine de votre médiathèque puis cliquez ensuite sur le bouton Importer pour lancer l'importation.

        Notez que cette importation s'ajoutera au contenu existant de votre blog, il n'est donc pas destructeur.

        Tous les blogs

        Sélectionnez le fichier de sauvegarde complet ou sélectionnez-en un présent dans votre répertoire racine de votre médiathèque, indiquez votre mot de passe puis cliquez ensuite sur le bouton Importer pour lancer l'importation.

        Attention : Tout le contenu actuel de votre installation sera au préalable supprimé et remplacé par le contenu de la sauvegarde importée, à l'exception des utilisateurs existants qui seront préservés. Les utilisateurs additionnels de la sauvegarde importée seront ajoutés à la liste existante.

        Importation d'un flux RSS ou Atom

        Ajouter les contenus d'un flux au blog.

        Indiquez l'URL du flux RSS ou Atom que vous voulez importer puis cliquez sur le bouton Importer. Les contenus trouvés dans le flux seront alors ajoutés au contenu existant de votre blog.

        Importation depuis Dotclear 1.2

        Cette fonction permet d'importer une installation Dotclear 1.2 dans votre blog courant. Cette importation remplacera les catégories, la liste des liens, les billets et les commentaires présents dans votre blog.

        Indiquez l'URL du serveur où est accessible la base de données de l'installation Dotclear 1.2, indiquez ensuite le nom de la base de données, le nom et le mot de passe de l'utilisateur permettant de s'y connecter et enfin le préfixe de table utilisé pour Dotclear 1.2. Vous pouvez trouver ces informations dans le fichier conf/config.php de votre installation Dotclear 1.2.

        Cliquez ensuite sur le bouton Importer mon blog maintenant pour lancer le processus.

        Vous pouvez réduire (ou augmenter) le nombre de billets importés à chaque passe, positionné à 20 par défaut, en fonction de la vitesse d'accès constatée à votre installation Dotclear 1.2

        Importation Wordpress

        Cette fonction vous permet d'importer une installation WordPress dans le blog courant.

        Indiquez l'URL du serveur où est accessible la base de données de l'installation Wordpress, indiquez ensuite le nom de la base de données, le nom et le mot de passe de l'utilisateur permettant de s'y connecter et enfin le préfixe de table utilisé pour Wordpress.

        Vous pouvez si nécessaire définir quelques options d'importation à propos de la récupération des catégories et du nombre de billets traités à chaque passe. Vous pouvez également définir la syntaxe utilisée pour le contenu des billets et des commentaires (XHTML, wiki, ou d'autres en fonction des syntaxes installées et actives).

        Cliquez ensuite sur le bouton Importer mon blog maintenant pour lancer le processus.


        Note : les fonctions d'export sont désormais dans la page de Maintenance.

        dotclear-2.6.2+dfsg/plugins/importExport/locales/fr/resources.php000066400000000000000000000007531230033266200252100ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/importExport/style.css000066400000000000000000000007011230033266200222770ustar00rootroot00000000000000dl.modules dt { font-weight: bold; font-size: 1.1em; margin: 1em 0 0 0; } dl.modules dd { margin: 0 0 1.5em 0; } div.ie-progress { background: #eee; margin: 1em 0; } div.ie-progress div { height: 10px; width: 0; font-size: 0.8em; line-height: 1em; height: 1em; padding: 2px 0; text-align: right; background: green url(index.php?pf=importExport/progress.png) repeat-x top left; color: white; font-weight: bold; border-radius: 2px; } dotclear-2.6.2+dfsg/plugins/maintenance/000077500000000000000000000000001230033266200201755ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/maintenance/_admin.php000066400000000000000000000223061230033266200221400ustar00rootroot00000000000000addItem( __('Maintenance'), 'plugin.php?p=maintenance', 'index.php?pf=maintenance/icon.png', preg_match('/plugin.php\?p=maintenance(&.*)?$/', $_SERVER['REQUEST_URI']), $core->auth->check('admin', $core->blog->id) ); // Admin behaviors $core->addBehavior('dcMaintenanceInit', array('dcMaintenanceAdmin', 'dcMaintenanceInit')); $core->addBehavior('adminDashboardFavorites', array('dcMaintenanceAdmin', 'adminDashboardFavorites')); $core->addBehavior('adminDashboardContents', array('dcMaintenanceAdmin', 'adminDashboardItems')); $core->addBehavior('adminDashboardOptionsForm', array('dcMaintenanceAdmin', 'adminDashboardOptionsForm')); $core->addBehavior('adminAfterDashboardOptionsUpdate', array('dcMaintenanceAdmin', 'adminAfterDashboardOptionsUpdate')); $core->addBehavior('adminPageHelpBlock', array('dcMaintenanceAdmin', 'adminPageHelpBlock')); $core->addBehavior('pluginsToolsHeaders', array('dcMaintenanceAdmin', 'pluginsToolsHeaders')); /** @ingroup PLUGIN_MAINTENANCE @nosubgrouping @brief Maintenance plugin admin class. Group of methods used on behaviors. */ class dcMaintenanceAdmin { /** * Register default tasks. * * @param $maintenance dcMaintenance dcMaintenance instance */ public static function dcMaintenanceInit($maintenance) { $maintenance ->addTab('maintenance', __('Servicing'), array('summary' => __('Tools to maintain the performance of your blogs.'))) ->addTab('backup', __('Backup'), array('summary' => __('Tools to back up your content.'))) ->addTab('dev', __('Development'), array('summary' => __('Tools to assist in development of plugins, themes and core.'))) ->addGroup('optimize', __('Optimize')) ->addGroup('index', __('Count and index')) ->addGroup('purge', __('Purge')) ->addGroup('other', __('Other')) ->addGroup('zipblog', __('Current blog')) ->addGroup('zipfull', __('All blogs')) ->addGroup('l10n', __('Translations'), array('summary' => __('Maintain translations'))) ->addTask('dcMaintenanceCache') ->addTask('dcMaintenanceIndexposts') ->addTask('dcMaintenanceIndexcomments') ->addTask('dcMaintenanceCountcomments') ->addTask('dcMaintenanceSynchpostsmeta') ->addTask('dcMaintenanceLogs') ->addTask('dcMaintenanceVacuum') ->addTask('dcMaintenanceZipmedia') ->addTask('dcMaintenanceZiptheme') ; } /** * Favorites. * * @param $core dcCore dcCore instance * @param $favs arrayObject Array of favs */ public static function adminDashboardFavorites($core, $favs) { $favs->register('maintenance', array( 'title' => __('Maintenance'), 'url' => 'plugin.php?p=maintenance', 'small-icon' => 'index.php?pf=maintenance/icon.png', 'large-icon' => 'index.php?pf=maintenance/icon-big.png', 'permissions' => 'admin', 'active_cb' => array('dcMaintenanceAdmin', 'adminDashboardFavoritesActive'), 'dashboard_cb' => array('dcMaintenanceAdmin', 'adminDashboardFavoritesCallback') )); } /** * Favorites selection. * * @param $request string Requested page * @param $params array Requested parameters */ public static function adminDashboardFavoritesActive($request, $params) { return $request == 'plugin.php' && isset($params['p']) && $params['p'] == 'maintenance'; } /** * Favorites hack. * * This updates maintenance fav icon text * if there are tasks required maintenance. * * @param $core dcCore dcCore instance * @param $fav arrayObject fav attributes */ public static function adminDashboardFavoritesCallback($core, $fav) { // Check user option $core->auth->user_prefs->addWorkspace('maintenance'); if (!$core->auth->user_prefs->maintenance->dashboard_icon) { return null; } // Check expired tasks $maintenance = new dcMaintenance($core); $count = 0; foreach($maintenance->getTasks() as $t) { if ($t->expired() !== false){ $count++; } } if (!$count) { return null; } $fav['title'] .= '
        '.sprintf(__('One task to execute', '%s tasks to execute', $count), $count); $fav['large-icon'] = 'index.php?pf=maintenance/icon-big-update.png'; } /** * Dashboard items stack. * * @param $core dcCore dcCore instance * @param $items arrayObject Dashboard items */ public static function adminDashboardItems($core, $items) { $core->auth->user_prefs->addWorkspace('maintenance'); if (!$core->auth->user_prefs->maintenance->dashboard_item) { return null; } $maintenance = new dcMaintenance($core); $lines = array(); foreach($maintenance->getTasks() as $t) { $ts = $t->expired(); if ($ts === false){ continue; } $lines[] = '
      • '.$t->task().'
      • '; } if (empty($lines)) { return null; } $items[] = new ArrayObject(array( '
        '. '

        '.__('Maintenance').'

        '. '

        '.sprintf(__('There is a task to execute.', 'There are %s tasks to execute.', count($lines)), count($lines)).'

        '. '
          '.implode('',$lines).'
        '. '

        '.__('Manage tasks').'

        '. '
        ' )); } /** * User preferences form. * * This add options for superadmin user * to show or not expired taks. * * @param $args object dcCore instance or record */ public static function adminDashboardOptionsForm($core) { $core->auth->user_prefs->addWorkspace('maintenance'); echo '
        '. '

        '.__('Maintenance').'

        '. '

        '. '

        '. '
        '; } /** * User preferences update. * * @param $user_id string User ID */ public static function adminAfterDashboardOptionsUpdate($user_id=null) { global $core; if (is_null($user_id)) { return null; } $core->auth->user_prefs->addWorkspace('maintenance'); $core->auth->user_prefs->maintenance->put('dashboard_icon', !empty($_POST['maintenance_dashboard_icon']), 'boolean'); $core->auth->user_prefs->maintenance->put('dashboard_item', !empty($_POST['maintenance_dashboard_item']), 'boolean'); } /** * Build a well sorted help for tasks. * * This method is not so good if used with lot of tranlsations * as it grows memory usage and translations files size, * it is better to use help ressource files * but keep it for exemple of how to use behavior adminPageHelpBlock. * Cheers, JC * * @param $block arrayObject Called helpblocks */ public static function adminPageHelpBlock($blocks) { $found = false; foreach($blocks as $block) { if ($block == 'maintenancetasks') { $found = true; break; } } if (!$found) { return null; } $maintenance = new dcMaintenance($GLOBALS['core']); $res_tab = ''; foreach($maintenance->getTabs() as $tab_obj) { $res_group = ''; foreach($maintenance->getGroups() as $group_obj) { $res_task = ''; foreach($maintenance->getTasks() as $t) { if ($t->group() != $group_obj->id() || $t->tab() != $tab_obj->id()) { continue; } if (($desc = $t->description()) != '') { $res_task .= '
        '.$t->task().'
        '. '
        '.$desc.'
        '; } } if (!empty($res_task)) { $desc = $group_obj->description ? $group_obj->description : $group_obj->summary; $res_group .= '
        '.$group_obj->name().'
        '. ($desc ? '

        '.$desc.'

        ' : ''). '
        '.$res_task.'
        '; } } if (!empty($res_group)) { $desc = $tab_obj->description ? $tab_obj->description : $tab_obj->summary; $res_tab .= '

        '.$tab_obj->name().'

        '. ($desc ? '

        '.$desc.'

        ' : ''). $res_group; } } if (!empty($res_tab)) { $res = new ArrayObject(); $res->content = $res_tab; $blocks[] = $res; } } /** * Add javascript for plugin configuration. * * @param $core dcCore dcCore instance * @param $module mixed Module ID or false if none * @return string Header code for js inclusion */ public static function pluginsToolsHeaders($core, $module) { if ($module == 'maintenance') { return dcPage::jsLoad('index.php?pf=maintenance/js/settings.js'); } } } dotclear-2.6.2+dfsg/plugins/maintenance/_define.php000066400000000000000000000012221230033266200222740ustar00rootroot00000000000000registerModule( /* Name */ "Maintenance", /* Description*/ "Maintain your installation", /* Author */ "Olivier Meunier & Association Dotclear", /* Version */ '1.3.1', array( 'permissions' => 'admin', 'type' => 'plugin' ) ); dotclear-2.6.2+dfsg/plugins/maintenance/_prepend.php000066400000000000000000000034211230033266200225020ustar00rootroot00000000000000core->rest->addFunction('dcMaintenanceStep', array('dcMaintenanceRest', 'step')); dotclear-2.6.2+dfsg/plugins/maintenance/_services.php000066400000000000000000000027001230033266200226670ustar00rootroot00000000000000dcCore
        dcCore instance * @param get array cleaned $_GET * @param post array cleaned $_POST * * @return xmlTag XML representation of response */ public static function step($core, $get, $post) { if (!isset($post['task'])) { throw new Exception('No task ID'); } if (!isset($post['code'])) { throw new Exception('No code ID'); } $maintenance = new dcMaintenance($core); if (($task = $maintenance->getTask($post['task'])) === null) { throw new Exception('Unknow task ID'); } $task->code((integer) $post['code']); if (($code = $task->execute()) === true) { $maintenance->setLog($task->id()); $code = 0; } $rsp = new xmlTag('step'); $rsp->code = $code; $rsp->title = html::escapeHTML($task->success()); return $rsp; } } dotclear-2.6.2+dfsg/plugins/maintenance/icon-big-update.png000066400000000000000000000020041230033266200236460ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<IDATxO@uL6eCpA.1L` ПW$hB$Qc_ lad]u/wh6o8r_^֟z<; |:%.SN ^*WC XC 7h\˞+J\9zڌ-ywO'd?;j.jڎihJs_h ^W6-zglHպ9/C^cPxЯCEm(6]F2E8}_(m{bֆbԇ I'fM&$0ȏ%>؋dL[3gGYŒ0AS 13B ~ \oCm?g"; @y`ϬS[b1uQ<n~1M0,BS~qMI@P(kCHM'.obsB)b["EQ{u>^}ϲTgxɯQ8''k5~M+~!#c ᠳ&M8Wv,yu9Œ\2\{$ə ; X~Spstring Tab ID * @param name string Tab name * @param options string Options */ public function __construct($id, $name, $options=array()) { $this->id = (string) $id; $this->name = (string) $name; $this->options = (array) $options; } /** * Get ID. * * @return string ID */ public function id() { return $this->id; } /** * Get name. * * @return string Name */ public function name() { return $this->name; } /** * Get option. * * Option called "summary" and "description" are used. * * @param key string Option key * @return string Option value */ public function option($key) { return isset($this->options[$key]) ? $this->options[$key] : null; } /* @ignore */ public function __get($key) { return $this->option($key); } /* @ignore */ public function __isset($key) { return isset($this->options[$key]); } } dotclear-2.6.2+dfsg/plugins/maintenance/inc/class.dc.maintenance.php000066400000000000000000000127571230033266200254460ustar00rootroot00000000000000dcCore dcCore instance */ public function __construct($core) { $this->core = $core; $logs = $this->getLogs(); $this->init(); } /** * Initialize list of tabs and groups and tasks. * * To register a tab or group or task, * use behavior dcMaintenanceInit then a method of * dcMaintenance like addTab('myTab', ...). */ protected function init() { # --BEHAVIOR-- dcMaintenanceInit $this->core->callBehavior('dcMaintenanceInit', $this); } /// @name Tab methods //@{ /** * Add a tab. * * @param id string Tab ID * @param name string Tab name * @param options string Options * @return dcMaintenance Self */ public function addTab($id, $name, $options=array()) { $this->tabs[$id] = new dcMaintenanceDescriptor($id, $name, $options); return $this; } /** * Get a tab. * * @param id string Tab ID * @return object dcMaintenanceDescriptor of a tab */ public function getTab($id) { return array_key_exists($id, $this->tabs) ? $this->tabs[$id] : null; } /** * Get tabs. * * @return array Array of tabs ID and name */ public function getTabs() { return $this->tabs; } //@} /// @name Group methods //@{ /** * Add a group. * * @param id string Group ID * @param name string Group name * @param options string Options * @return dcMaintenance Self */ public function addGroup($id, $name, $options=array()) { $this->groups[$id] = new dcMaintenanceDescriptor($id, $name, $options); return $this; } /** * Get a group. * * @param id string Group ID * @return object dcMaintenanceDescriptor of a group */ public function getGroup($id) { return array_key_exists($id, $this->groups) ? $this->groups[$id] : null; } /** * Get groups. * * @return array Array of groups ID and descriptor */ public function getGroups() { return $this->groups; } //@} /// @name Task methods //@{ /** * Add a task. * * @param task mixed Class name or object * @return boolean True if it is added * @return dcMaintenance Self */ public function addTask($task) { if (class_exists($task) && is_subclass_of($task, 'dcMaintenanceTask')) { $this->tasks[$task] = new $task($this); } return $this; } /** * Get a task object. * * @param id string task ID * @return mixed Task object or null if not exists */ public function getTask($id) { return array_key_exists($id, $this->tasks) ? $this->tasks[$id] : null; } /** * Get tasks. * * @return array Array of tasks objects */ public function getTasks() { return $this->tasks; } /** * Get headers for plugin maintenance admin page. * * @return string Page headers */ public function getHeaders() { $res = ''; foreach($this->tasks as $task) { $res .= $task->header(); } return $res; } //@} /// @name Log methods //@{ /** * Set log for a task. * * @param id string Task ID */ public function setLog($id) { // Check if taks exists if (!$this->getTask($id)) { return null; } // Get logs from this task $rs = $this->core->con->select ( 'SELECT log_id '. 'FROM '.$this->core->prefix.'log '. "WHERE log_msg = '".$this->core->con->escape($id)."' ". "AND log_table = 'maintenance' " ); $logs = array(); while ($rs->fetch()) { $logs[] = $rs->log_id; } // Delete old logs if (!empty($logs)) { $this->core->log->delLogs($logs); } // Add new log $cur = $this->core->con->openCursor($this->core->prefix.'log'); $cur->log_msg = $id; $cur->log_table = 'maintenance'; $cur->user_id = $this->core->auth->userID(); $this->core->log->addLog($cur); } /** * Delete all maintenance logs. */ public function delLogs() { // Retrieve logs from this task $rs = $this->core->log->getLogs(array( 'log_table' => 'maintenance', 'blog_id' => 'all' )); $logs = array(); while ($rs->fetch()) { $logs[] = $rs->log_id; } // Delete old logs if (!empty($logs)) { $this->core->log->delLogs($logs); } } /** * Get logs * * Return array( * task id => array( * timestamp of last execution, * logged on current blog or not * ) * ) * * @return array List of logged tasks */ public function getLogs() { if ($this->logs === null) { $rs = $this->core->log->getLogs(array( 'log_table' => 'maintenance', 'blog_id' => 'all' )); $this->logs = array(); while ($rs->fetch()) { $this->logs[$rs->log_msg] = array( 'ts' => strtotime($rs->log_dt), 'blog' => $rs->blog_id == $this->core->blog->id ); } } return $this->logs; } //@} } dotclear-2.6.2+dfsg/plugins/maintenance/inc/class.dc.maintenance.task.php000066400000000000000000000136201230033266200263750ustar00rootroot00000000000000dcMaintenance dcMaintenance instance * @param p_url string Maintenance plugin url */ public function __construct($maintenance) { $this->maintenance = $maintenance; $this->core = $maintenance->core; $this->init(); $this->id = null; if ($this->perm() === null && !$this->core->auth->isSuperAdmin() || !$this->core->auth->check($this->perm(), $this->core->blog->id)) { return null; } $this->p_url = $maintenance->p_url; $this->id = get_class($this); if (!$this->name) { $this->name = get_class($this); } if (!$this->error) { $this->error = __('Failed to execute task.'); } if (!$this->success) { $this->success = __('Task successfully executed.'); } $this->core->blog->settings->addNamespace('maintenance'); $ts = $this->core->blog->settings->maintenance->get('ts_'.$this->id); $this->ts = abs((integer) $ts); return true; } /** * Initialize task object. * * Better to set translated messages here than * to rewrite constructor. */ protected function init() { return null; } /** * Get task permission. * * Return user permission required to run this task * or null for super admin. * * @return mixed Permission. */ public function perm() { return $this->perm; } /** * Get task scope. *. * Is task limited to current blog. * * @return boolean Limit to blog */ public function blog() { return $this->blog; } /** * Set $code for task having multiple steps. * * @param code integer Code used for task execution */ public function code($code) { $this->code = (integer) $code; } /** * Get timestamp between maintenances. * * @return intetger Timestamp */ public function ts() { return $this->ts === false ? false : abs((integer) $this->ts); } /** * Get task expired. * * This return: * - Timstamp of last update if it expired * - False if it not expired or has no recall time * - Null if it has never been executed * * @return mixed Last update */ public function expired() { if ($this->expired === 0) { if (!$this->ts()) { $this->expired = false; } else { $this->expired = null; $logs = array(); foreach($this->maintenance->getLogs() as $id => $log) { if ($id != $this->id() || $this->blog && !$log['blog']) { continue; } $this->expired = $log['ts'] + $this->ts() < time() ? $log['ts'] : false; } } } return $this->expired; } /** * Get task ID. * * @return string Task ID (class name) */ public function id() { return $this->id; } /** * Get task name. * * @return string Task name */ public function name() { return $this->name; } /** * Get task description. * * @return string Description */ public function description() { return $this->description; } /** * Get task tab. * * @return mixed Task tab ID or null */ public function tab() { return $this->tab; } /** * Get task group. * * If task required a full tab, * this must be returned null. * * @return mixed Task group ID or null */ public function group() { return $this->group; } /** * Use ajax * * Is task use maintenance ajax script * for steps process. * * @return boolean Use ajax */ public function ajax() { return (boolean) $this->ajax; } /** * Get task message. * * This message is used on form button. * * @return string Message */ public function task() { return $this->task; } /** * Get step message. * * This message is displayed during task step execution. * * @return mixed Message or null */ public function step() { return $this->step; } /** * Get success message. * * This message is displayed when task is accomplished. * * @return mixed Message or null */ public function success() { return $this->success; } /** * Get error message. * * This message is displayed on error. * * @return mixed Message or null */ public function error() { return $this->error; } /** * Get header. * * Headers required on maintenance page. * * @return mixed Message or null */ public function header() { return null; } /** * Get content. * * Content for full tab task. * * @return string Tab's content */ public function content() { return null; } /** * Execute task. * * @return mixed : * - FALSE on error, * - TRUE if task is finished * - INTEGER if task required a next step */ public function execute() { return null; } /** * Log task execution. * * Sometimes we need to log task execution * direct from task itself. * */ protected function log() { $this->maintenance->setLog($this->id); } public function help() { return null; } } dotclear-2.6.2+dfsg/plugins/maintenance/inc/tasks/000077500000000000000000000000001230033266200220735ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/maintenance/inc/tasks/class.dc.maintenance.cache.php000066400000000000000000000021771230033266200276300ustar00rootroot00000000000000task = __('Empty templates cache directory'); $this->success = __('Templates cache directory emptied.'); $this->error = __('Failed to empty templates cache directory.'); $this->description = __("It may be useful to empty this cache when modifying a theme's .html or .css files (or when updating a theme or plugin). Notice : with some hosters, the templates cache cannot be emptied with this plugin. You may then have to delete the directory /cbtpl/ directly on the server with your FTP software."); } public function execute() { $this->core->emptyTemplatesCache(); return true; } } dotclear-2.6.2+dfsg/plugins/maintenance/inc/tasks/class.dc.maintenance.countcomments.php000066400000000000000000000020101230033266200314450ustar00rootroot00000000000000task = __('Count again comments and trackbacks'); $this->success = __('Comments and trackback counted.'); $this->error = __('Failed to count comments and trackbacks.'); $this->description = __('Count again comments and trackbacks allows to check their exact numbers. This operation can be useful when importing from another blog platform (or when migrating from dotclear 1 to dotclear 2).'); } public function execute() { $this->core->countAllComments(); return true; } } dotclear-2.6.2+dfsg/plugins/maintenance/inc/tasks/class.dc.maintenance.indexcomments.php000066400000000000000000000031171230033266200314350ustar00rootroot00000000000000name = __('Search engine index'); $this->task = __('Index all comments for search engine'); $this->step_task = __('Next'); $this->step = __('Indexing comment %d to %d.'); $this->success = __('Comments index done.'); $this->error = __('Failed to index comments.'); $this->description = __('Index all comments and trackbacks in search engine index. This operation is necessary, after importing content in your blog, to use internal search engine, on public and private pages.'); } public function execute() { $this->code = $this->core->indexAllComments($this->code, $this->limit); return $this->code ? $this->code : true; } public function task() { return $this->code ? $this->step_task : $this->task; } public function step() { return $this->code ? sprintf($this->step, $this->code - $this->limit, $this->code) : null; } public function success() { return $this->code ? sprintf($this->step, $this->code - $this->limit, $this->code) : $this->success; } } dotclear-2.6.2+dfsg/plugins/maintenance/inc/tasks/class.dc.maintenance.indexposts.php000066400000000000000000000030631230033266200307600ustar00rootroot00000000000000name = __('Search engine index'); $this->task = __('Index all entries for search engine'); $this->step_task = __('Next'); $this->step = __('Indexing entry %d to %d.'); $this->success = __('Entries index done.'); $this->error = __('Failed to index entries.'); $this->description = __('Index all entries in search engine index. This operation is necessary, after importing content in your blog, to use internal search engine, on public and private pages.'); } public function execute() { $this->code = $this->core->indexAllPosts($this->code, $this->limit); return $this->code ? $this->code : true; } public function task() { return $this->code ? $this->step_task : $this->task; } public function step() { return $this->code ? sprintf($this->step, $this->code - $this->limit, $this->code) : null; } public function success() { return $this->code ? sprintf($this->step, $this->code - $this->limit, $this->code) : $this->success; } } dotclear-2.6.2+dfsg/plugins/maintenance/inc/tasks/class.dc.maintenance.logs.php000066400000000000000000000022141230033266200275210ustar00rootroot00000000000000task = __('Delete all logs'); $this->success = __('Logs deleted.'); $this->error = __('Failed to delete logs.'); $this->description = __('Logs record all activity and connection to your blog history. Unless you need to keep this history, consider deleting these logs from time to time.'); } public function execute() { if (dcMaintenanceLogs::$keep_maintenance_logs) { $this->core->con->execute( 'DELETE FROM '.$this->core->prefix.'log '. "WHERE log_table <> 'maintenance' " ); } else { $this->core->log->delLogs(null, true); } return true; } } dotclear-2.6.2+dfsg/plugins/maintenance/inc/tasks/class.dc.maintenance.synchpostsmeta.php000066400000000000000000000050461230033266200316470ustar00rootroot00000000000000name = __('Entries metadata'); $this->task = __('Synchronize entries metadata'); $this->step_task = __('Next'); $this->step = __('Synchronize entry %d to %d.'); $this->success = __('Entries metadata synchronize done.'); $this->error = __('Failed to synchronize entries metadata.'); $this->description = __('Synchronize all entries metadata could be useful after importing content in your blog or do bad operation on database tables.'); } public function execute() { $this->code = $this->synchronizeAllPostsmeta($this->code, $this->limit); return $this->code ? $this->code : true; } public function task() { return $this->code ? $this->step_task : $this->task; } public function step() { return $this->code ? sprintf($this->step, $this->code - $this->limit, $this->code) : null; } public function success() { return $this->code ? sprintf($this->step, $this->code - $this->limit, $this->code) : $this->success; } protected function synchronizeAllPostsmeta($start=null,$limit=null) { // Get number of posts $rs = $this->core->con->select('SELECT COUNT(post_id) FROM '.$this->core->prefix.'post'); $count = $rs->f(0); // Get posts ids to update $req_limit = $start !== null && $limit !== null ? $this->core->con->limit($start, $limit) : ''; $rs = $this->core->con->select('SELECT post_id FROM '.$this->core->prefix.'post '.$req_limit, true); // Update posts meta while ($rs->fetch()) { $rs_meta = $this->core->con->select('SELECT meta_id, meta_type FROM '.$this->core->prefix.'meta WHERE post_id = '.$rs->post_id.' '); $meta = array(); while ($rs_meta->fetch()) { $meta[$rs_meta->meta_type][] = $rs_meta->meta_id; } $cur = $this->core->con->openCursor($this->core->prefix.'post'); $cur->post_meta = serialize($meta); $cur->update('WHERE post_id = '.$rs->post_id); } $this->core->blog->triggerBlog(); // Return next step return $start + $limit > $count ? null : $start + $limit; } } dotclear-2.6.2+dfsg/plugins/maintenance/inc/tasks/class.dc.maintenance.vacuum.php000066400000000000000000000023041230033266200300550ustar00rootroot00000000000000name = __('Optimise database'); $this->task = __('optimize tables'); $this->success = __('Optimization successful.'); $this->error = __('Failed to optimize tables.'); $this->description = __("After numerous delete or update operations on Dotclear's database, it gets fragmented. Optimizing will allow to defragment it. It has no incidence on your data's integrity. It is recommended to optimize before any blog export."); } public function execute() { $schema = dbSchema::init($this->core->con); foreach ($schema->getTables() as $table) { if (strpos($table, $this->core->prefix) === 0) { $this->core->con->vacuum($table); } } return true; } } dotclear-2.6.2+dfsg/plugins/maintenance/inc/tasks/class.dc.maintenance.zipmedia.php000066400000000000000000000030211230033266200303540ustar00rootroot00000000000000task = __('Download media folder of current blog'); $this->description = __('It may be useful to backup your media folder. This compress all content of media folder into a single zip file. Notice : with some hosters, the media folder cannot be compressed with this plugin if it is too big.'); } public function execute() { // Instance media $this->core->media = new dcMedia($this->core); $this->core->media->chdir(null); $this->core->media->getDir(); // Create zip @set_time_limit(300); $fp = fopen('php://output', 'wb'); $zip = new fileZip($fp); $zip->addExclusion('#(^|/).(.*?)_(m|s|sq|t).jpg$#'); $zip->addDirectory($this->core->media->root.'/', '', true); // Log task execution here as we sent file and stop script $this->log(); // Send zip header('Content-Disposition: attachment;filename=media.zip'); header('Content-Type: application/x-zip'); $zip->write(); unset($zip); exit(1); } } dotclear-2.6.2+dfsg/plugins/maintenance/inc/tasks/class.dc.maintenance.ziptheme.php000066400000000000000000000030171230033266200304040ustar00rootroot00000000000000task = __('Download active theme of current blog'); $this->description = __('It may be useful to backup the active theme before any change or update. This compress theme folder into a single zip file.'); } public function execute() { // Get theme path $path = $this->core->blog->themes_path; $theme =$this->core->blog->settings->system->theme; $dir = path::real($path.'/'.$theme); if (empty($path) || empty($theme) || !is_dir($dir)) { return false; } // Create zip @set_time_limit(300); $fp = fopen('php://output', 'wb'); $zip = new fileZip($fp); $zip->addExclusion('#(^|/).(.*?)_(m|s|sq|t).jpg$#'); $zip->addDirectory($dir.'/', '', true); // Log task execution here as we sent file and stop script $this->log(); // Send zip header('Content-Disposition: attachment;filename=theme-'.$theme.'.zip'); header('Content-Type: application/x-zip'); $zip->write(); unset($zip); exit(1); } } dotclear-2.6.2+dfsg/plugins/maintenance/index.php000066400000000000000000000211721230033266200220200ustar00rootroot00000000000000blog->settings->addNamespace('maintenance'); $maintenance = new dcMaintenance($core); $tasks = $maintenance->getTasks(); $headers = ''; $p_url = 'plugin.php?p=maintenance'; $task = null; $expired = array(); $code = empty($_POST['code']) ? null : (integer) $_POST['code']; $tab = empty($_REQUEST['tab']) ? '' : $_REQUEST['tab']; // Get task object if (!empty($_REQUEST['task'])) { $task = $maintenance->getTask($_REQUEST['task']); if ($task === null) { $core->error->add('Unknow task ID'); } $task->code($code); } // Execute task if ($task && !empty($_POST['task']) && $task->id() == $_POST['task']) { try { $code = $task->execute(); if (false === $code) { throw new Exception($task->error()); } if (true === $code) { $maintenance->setLog($task->id()); dcPage::addSuccessNotice($task->success()); http::redirect($p_url.'&task='.$task->id().'&tab='.$tab.'#'.$tab); } } catch (Exception $e) { $core->error->add($e->getMessage()); } } // Save settings if (!empty($_POST['save_settings'])) { try { $core->blog->settings->maintenance->put( 'plugin_message', !empty($_POST['settings_plugin_message']), 'boolean', 'Display alert message of late tasks on plugin page', true, true ); foreach($tasks as $t) { if (!$t->id()) { continue; } if (!empty($_POST['settings_recall_type']) && $_POST['settings_recall_type'] == 'all') { $ts = $_POST['settings_recall_time']; } else { $ts = empty($_POST['settings_ts_'.$t->id()]) ? 0 : $_POST['settings_ts_'.$t->id()]; } $core->blog->settings->maintenance->put( 'ts_'.$t->id(), abs((integer) $ts), 'integer', sprintf('Recall time for task %s', $t->id()), true, $t->blog() ); } dcPage::addSuccessNotice(__('Maintenance plugin has been successfully configured.')); http::redirect($p_url.'&tab='.$tab.'#'.$tab); } catch(Exception $e) { $core->error->add($e->getMessage()); } } // Combos $combo_ts = array( __('Never') => 0, __('Every week') => 604800, __('Every two weeks') => 1209600, __('Every month') => 2592000, __('Every two months') => 5184000 ); // Display page echo ' '.__('Maintenance').''. dcPage::jsPageTabs($tab). dcPage::jsLoad('index.php?pf=maintenance/js/settings.js'); if ($task && $task->ajax()) { echo ''. dcPage::jsLoad('index.php?pf=maintenance/js/dc.maintenance.js'); } echo $maintenance->getHeaders().' '; // Check if there is somthing to display according to user permissions if (empty($tasks)) { echo dcPage::breadcrumb( array( __('Plugins') => '', __('Maintenance') => '' ) ). '

        '.__('You have not sufficient permissions to view this page.').'

        '. ''; return null; } if ($task && ($res = $task->step()) !== null) { // Page title echo dcPage::breadcrumb( array( __('Plugins') => '', ''.__('Maintenance').'' => '', html::escapeHTML($task->name())=> '' ) ); // content if (substr($res, 0, 1) != '<') { $res = sprintf('

        %s

        ', $res); } // Intermediate task (task required several steps) echo '
        '. '

        '. ''.__('Back').''. '

        '. '

        '.html::escapeHTML($task->name()).'

        '. '
        '. $res. '

        '. ' '. form::hidden(array('task'), $task->id()). form::hidden(array('code'), (integer) $code). $core->formNonce(). '

        '. '
        '. '
        '; } else { // Page title echo dcPage::breadcrumb( array( __('Plugins') => '', __('Maintenance') => '' ) ); // Simple task (with only a button to start it) foreach($maintenance->getTabs() as $tab_obj) { $res_group = ''; foreach($maintenance->getGroups() as $group_obj) { $res_task = ''; foreach($tasks as $t) { if (!$t->id() || $t->group() != $group_obj->id() || $t->tab() != $tab_obj->id()) { continue; } $res_task .= '

        '.form::radio(array('task', $t->id()), $t->id()).' '. ''; // Expired task alert message $ts = $t->expired(); if ($core->blog->settings->maintenance->plugin_message && $ts !== false) { if ($ts === null) { $res_task .= '
        '. __('This task has never been executed.').' '. __('You should execute it now.').''; } else { $res_task .= '
        '.sprintf( __('Last execution of this task was on %s.'), dt::str($core->blog->settings->system->date_format, $ts).' '. dt::str($core->blog->settings->system->time_format, $ts) ).' '. __('You should execute it now.').''; } } $res_task .= '

        '; } if (!empty($res_task)) { $res_group .= '
        '. '

        '.$group_obj->name().'

        '. $res_task. '
        '; } } if (!empty($res_group)) { echo '
        '. '

        '.$tab_obj->name().'

        '. // ($tab_obj->option('summary') ? '

        '.$tab_obj->option('summary').'

        ' : ''). '
        '. $res_group. '

        '. form::hidden(array('tab'), $tab_obj->id()). $core->formNonce().'

        '. '

        '.__('This may take a very long time.').'

        '. '
        '. '
        '; } } // Advanced tasks (that required a tab) foreach($tasks as $t) { if (!$t->id() || $t->group() !== null) { continue; } echo '
        '. '

        '.$t->name().'

        '. '
        '. $t->content(). '

        '. form::hidden(array('task'), $t->id()). form::hidden(array('tab'), $t->id()). $core->formNonce().'

        '. '
        '. '
        '; } // Settings echo '
        '. '

        '.__('Alert settings').'

        '. '
        '. '

        '.__('Activation').'

        '. '

        '. '

        '.sprintf( __('You can place list of late tasks on your %s.'), ''.__('Dashboard').'' ).'

        '. '

        '.__('Frequency').'

        '. '

        '.form::radio(array('settings_recall_type', 'settings_recall_all'), 'all').' '. '

        '. '

        '. form::combo('settings_recall_time', $combo_ts, 'seperate', 'recall-for-all'). '

        '. '

        '.form::radio(array('settings_recall_type', 'settings_recall_separate'), 'separate', 1).' '. '

        '; foreach($tasks as $t) { if (!$t->id()) { continue; } echo '
        '. '

        '. form::combo('settings_ts_'.$t->id(), $combo_ts, $t->ts(), 'recall-per-task'). '

        '. '
        '; } echo '

        '. form::hidden(array('tab'), 'settings'). form::hidden(array('save_settings'), 1). $core->formNonce().'

        '. '
        '. '
        '; } dcPage::helpBlock('maintenance', 'maintenancetasks'); echo ''; dotclear-2.6.2+dfsg/plugins/maintenance/js/000077500000000000000000000000001230033266200206115ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/maintenance/js/dc.maintenance.js000066400000000000000000000021101230033266200240100ustar00rootroot00000000000000$(function(){ $('.step-box').each(function(){ var code = $('input[name=code]',this).val(); $('.step-submit',this).remove(); $('.step-back',this).hide(); $('.step-msg',this).after( $('

        ').addClass('step-wait').text( dotclear.msg.wait ) ); dcMaintenanceStep(this,code); function dcMaintenanceStep(box,code) { var params = { f: 'dcMaintenanceStep', xd_check: dotclear.nonce, task: $(box).attr('id'), code: code } $.post('services.php',params,function(data) { if ($('rsp[status=failed]',data).length > 0) { $('.step-msg',box).text( $('rsp',data).text() ); $('.step-wait',box).remove(); $('.step-back',box).show(); } else { $('.step-msg',box).text( $('rsp>step',data).attr('title') ); var code = $('rsp>step',data).attr('code'); if (code > 0){ dcMaintenanceStep(box,code); } else { $('#content h2').after($('

        ').addClass('success').append($('.step-msg',box))); $('.step-wait',box).remove(); $('.step-back',box).show(); } } }); } }); }); dotclear-2.6.2+dfsg/plugins/maintenance/js/settings.js000066400000000000000000000007331230033266200230120ustar00rootroot00000000000000$(function(){ $('.recall-for-all').attr('disabled','disabled'); $('#settings_recall_all').change(function(){ if($(this).attr('selected')!='selected'){ $('.recall-per-task').attr('disabled','disabled'); $('.recall-for-all').removeAttr('disabled'); } }); $('#settings_recall_separate').change(function(){ if($(this).attr('selected')!='selected'){ $('.recall-per-task').removeAttr('disabled'); $('.recall-for-all').attr('disabled','disabled'); } }); }); dotclear-2.6.2+dfsg/plugins/maintenance/locales/000077500000000000000000000000001230033266200216175ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/maintenance/locales/en/000077500000000000000000000000001230033266200222215ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/maintenance/locales/en/help/000077500000000000000000000000001230033266200231515ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/maintenance/locales/en/help/maintenance.html000066400000000000000000000012101230033266200263130ustar00rootroot00000000000000 Maintenance

        Alert settings

        Activation

        Check this box to display alert messages under tasks that are late or that have never been executed.

        Note: in My preferences, additional options allow you to display these tasks on your dashboard.

        Frequency

        Schedules the alert display of tasks to be done.

        This frequency can be common to all the tasks (select the Use one recall time for all tasks radio button) or can be set for each tasks.

        dotclear-2.6.2+dfsg/plugins/maintenance/locales/en/resources.php000066400000000000000000000007721230033266200247520ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/maintenance/locales/fr/000077500000000000000000000000001230033266200222265ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/maintenance/locales/fr/help/000077500000000000000000000000001230033266200231565ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/maintenance/locales/fr/help/maintenance.html000066400000000000000000000013741230033266200263330ustar00rootroot00000000000000 Maintenance

        Réglage des alertes

        Activation

        Cocher cette option pour afficher des messages d'alerte sous chaque tâche en retard ou n'ayant jamais été exécutée.

        Note : dans « Mes préférences », des options complémentaires permettent d'afficher également ces messages sur le tableau de bord.

        Périodicité

        Permet de choisir le délai de rappel des tâches à exécuter.

        Ce délai peut être commun à toutes les tâches (choisir le bouton radio « Utiliser le même délai pour toutes les tâches » ou différencié pour chacune d'elles.

        dotclear-2.6.2+dfsg/plugins/maintenance/locales/fr/resources.php000066400000000000000000000007721230033266200247570ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/pages/000077500000000000000000000000001230033266200170125ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/pages/_admin.php000066400000000000000000000050431230033266200207540ustar00rootroot00000000000000addBehavior('adminDashboardFavorites',array('pagesDashboard','pagesDashboardFavs')); $core->addBehavior('adminUsersActionsHeaders','pages_users_actions_headers'); class pagesDashboard { public static function pagesDashboardFavs($core,$favs) { $favs->register('pages', array( 'title' => __('Pages'), 'url' => 'plugin.php?p=pages', 'small-icon' => 'index.php?pf=pages/icon.png', 'large-icon' => 'index.php?pf=pages/icon-big.png', 'permissions' => 'contentadmin,pages', 'dashboard_cb' => array('pagesDashboard','pagesDashboardCB'), 'active_cb' => array('pagesDashboard','pagesActiveCB') )); $favs->register('newpage', array( 'title' => __('New page'), 'url' => 'plugin.php?p=pages&act=page', 'small-icon' => 'index.php?pf=pages/icon-np.png', 'large-icon' => 'index.php?pf=pages/icon-np-big.png', 'permissions' => 'contentadmin,pages', 'active_cb' => array('pagesDashboard','newPageActiveCB') )); } public static function pagesDashboardCB($core,$v) { $params = new ArrayObject(); $params['post_type'] = 'page'; $page_count = $core->blog->getPosts($params,true)->f(0); if ($page_count > 0) { $str_pages = ($page_count > 1) ? __('%d pages') : __('%d page'); $v['title'] = sprintf($str_pages,$page_count); } } public static function pagesActiveCB($request,$params) { return ($request == "plugin.php") && isset($params['p']) && $params['p'] == 'pages' && !(isset($params['act']) && $params['act']=='page'); } public static function newPageActiveCB($request,$params) { return ($request == "plugin.php") && isset($params['p']) && $params['p'] == 'pages' && isset($params['act']) && $params['act']=='page'; } } function pages_users_actions_headers() { return dcPage::jsLoad('index.php?pf=pages/_users_actions.js'); } $_menu['Blog']->addItem(__('Pages'),'plugin.php?p=pages','index.php?pf=pages/icon.png', preg_match('/plugin.php(.*)$/',$_SERVER['REQUEST_URI']) && !empty($_REQUEST['p']) && $_REQUEST['p']=='pages', $core->auth->check('contentadmin,pages',$core->blog->id)); $core->auth->setPermissionType('pages',__('manage pages')); require dirname(__FILE__).'/_widgets.php'; dotclear-2.6.2+dfsg/plugins/pages/_define.php000066400000000000000000000012271230033266200211160ustar00rootroot00000000000000registerModule( /* Name */ "Pages", /* Description*/ "Serve entries as simple web pages", /* Author */ "Olivier Meunier", /* Version */ '1.3', array( 'permissions' => 'contentadmin,pages', 'priority' => 999, 'type' => 'plugin' ) ); dotclear-2.6.2+dfsg/plugins/pages/_install.php000066400000000000000000000032211230033266200213260ustar00rootroot00000000000000plugins->moduleInfo('pages','version'); if (version_compare($core->getVersion('pages'),$version,'>=')) { return; } $core->blog->settings->addNamespace('pages'); if ($core->getVersion('pages') == null) { // Create a first pending page, only on a new installation of this plugin $params = array( 'post_type' => 'page', 'no_content' => true ); $counter = $core->blog->getPosts($params,true); If( $counter->f(0) == 0 && $core->blog->settings->pages->firstpage == null ) { $core->blog->settings->pages->put('firstpage',true, 'boolean'); $cur = $core->con->openCursor($core->prefix.'post'); $cur->user_id = $core->auth->userID(); $cur->post_type = 'page'; $cur->post_format = 'xhtml'; $cur->post_lang = $core->blog->settings->system->lang; $cur->post_title = __('My first page'); $cur->post_content = '

        '.__('This is your first page. When you\'re ready to blog, log in to edit or delete it.').'

        '; $cur->post_content_xhtml = $cur->post_content; $cur->post_excerpt = ''; $cur->post_excerpt_xhtml = $cur->post_excerpt; $cur->post_status = -2; // Pending status $cur->post_open_comment = 0; $cur->post_open_tb = 0; $post_id = $core->blog->addPost($cur); } } $core->setVersion('pages',$version); return true; dotclear-2.6.2+dfsg/plugins/pages/_prepend.php000066400000000000000000000016621230033266200213240ustar00rootroot00000000000000url->register('pages', 'pages', '^pages/(.+)$', array('urlPages', 'pages')); $core->url->register('pagespreview', 'pagespreview', '^pagespreview/(.+)$', array('urlPages', 'pagespreview')); $core->setPostType('page', 'plugin.php?p=pages&act=page&id=%d', $core->url->getURLFor('pages', '%s'), 'Pages'); # We should put this as settings later $GLOBALS['page_url_format'] = '{t}'; dotclear-2.6.2+dfsg/plugins/pages/_public.php000066400000000000000000000162201230033266200211410ustar00rootroot00000000000000blog->withoutPassword(false); $params = new ArrayObject(array( 'post_type' => 'page', 'post_url' => $args)); $core->callBehavior('publicPagesBeforeGetPosts',$params,$args); $_ctx->posts = $core->blog->getPosts($params); $_ctx->comment_preview = new ArrayObject(); $_ctx->comment_preview['content'] = ''; $_ctx->comment_preview['rawcontent'] = ''; $_ctx->comment_preview['name'] = ''; $_ctx->comment_preview['mail'] = ''; $_ctx->comment_preview['site'] = ''; $_ctx->comment_preview['preview'] = false; $_ctx->comment_preview['remember'] = false; $core->blog->withoutPassword(true); if ($_ctx->posts->isEmpty()) { # The specified page does not exist. self::p404(); } else { $post_id = $_ctx->posts->post_id; $post_password = $_ctx->posts->post_password; # Password protected entry if ($post_password != '' && !$_ctx->preview) { # Get passwords cookie if (isset($_COOKIE['dc_passwd'])) { $pwd_cookie = json_decode($_COOKIE['dc_passwd']); if ($pwd_cookie === NULL) { $pwd_cookie = array(); } else { $pwd_cookie = (array) $pwd_cookie; } } else { $pwd_cookie = array(); } # Check for match if ((!empty($_POST['password']) && $_POST['password'] == $post_password) || (isset($pwd_cookie[$post_id]) && $pwd_cookie[$post_id] == $post_password)) { $pwd_cookie[$post_id] = $post_password; setcookie('dc_passwd',json_encode($pwd_cookie),0,'/'); } else { self::serveDocument('password-form.html','text/html',false); return; } } $post_comment = isset($_POST['c_name']) && isset($_POST['c_mail']) && isset($_POST['c_site']) && isset($_POST['c_content']) && $_ctx->posts->commentsActive(); # Posting a comment if ($post_comment) { # Spam trap if (!empty($_POST['f_mail'])) { http::head(412,'Precondition Failed'); header('Content-Type: text/plain'); echo "So Long, and Thanks For All the Fish"; # Exits immediately the application to preserve the server. exit; } $name = $_POST['c_name']; $mail = $_POST['c_mail']; $site = $_POST['c_site']; $content = $_POST['c_content']; $preview = !empty($_POST['preview']); if ($content != '') { if ($core->blog->settings->system->wiki_comments) { $core->initWikiComment(); } else { $core->initWikiSimpleComment(); } $content = $core->wikiTransform($content); $content = $core->HTMLfilter($content); } $_ctx->comment_preview['content'] = $content; $_ctx->comment_preview['rawcontent'] = $_POST['c_content']; $_ctx->comment_preview['name'] = $name; $_ctx->comment_preview['mail'] = $mail; $_ctx->comment_preview['site'] = $site; if ($preview) { # --BEHAVIOR-- publicBeforeCommentPreview $core->callBehavior('publicBeforeCommentPreview',$_ctx->comment_preview); $_ctx->comment_preview['preview'] = true; } else { # Post the comment $cur = $core->con->openCursor($core->prefix.'comment'); $cur->comment_author = $name; $cur->comment_site = html::clean($site); $cur->comment_email = html::clean($mail); $cur->comment_content = $content; $cur->post_id = $_ctx->posts->post_id; $cur->comment_status = $core->blog->settings->system->comments_pub ? 1 : -1; $cur->comment_ip = http::realIP(); $redir = $_ctx->posts->getURL(); $redir .= $core->blog->settings->system->url_scan == 'query_string' ? '&' : '?'; try { if (!text::isEmail($cur->comment_email)) { throw new Exception(__('You must provide a valid email address.')); } # --BEHAVIOR-- publicBeforeCommentCreate $core->callBehavior('publicBeforeCommentCreate',$cur); if ($cur->post_id) { $comment_id = $core->blog->addComment($cur); # --BEHAVIOR-- publicAfterCommentCreate $core->callBehavior('publicAfterCommentCreate',$cur,$comment_id); } if ($cur->comment_status == 1) { $redir_arg = 'pub=1'; } else { $redir_arg = 'pub=0'; } header('Location: '.$redir.$redir_arg); } catch (Exception $e) { $_ctx->form_error = $e->getMessage(); $_ctx->form_error; } } } # The entry if ($_ctx->posts->trackbacksActive()) { header('X-Pingback: '.$core->blog->url.$core->url->getURLFor("xmlrpc",$core->blog->id)); } $core->tpl->setPath($core->tpl->getPath(), dirname(__FILE__).'/default-templates'); self::serveDocument('page.html'); } } } public static function pagespreview($args) { $core = $GLOBALS['core']; $_ctx = $GLOBALS['_ctx']; if (!preg_match('#^(.+?)/([0-9a-z]{40})/(.+?)$#',$args,$m)) { # The specified Preview URL is malformed. self::p404(); } else { $user_id = $m[1]; $user_key = $m[2]; $post_url = $m[3]; if (!$core->auth->checkUser($user_id,null,$user_key)) { # The user has no access to the entry. self::p404(); } else { $_ctx->preview = true; self::pages($post_url); } } } } class tplPages { # Widget function public static function pagesWidget($w) { global $core, $_ctx; if (($w->homeonly == 1 && $core->url->type != 'default') || ($w->homeonly == 2 && $core->url->type == 'default')) { return; } $params['post_type'] = 'page'; $params['limit'] = abs((integer) $w->limit); $params['no_content'] = true; $params['post_selected'] = false; $sort = $w->sortby; if (!in_array($sort,array('post_title','post_position','post_dt'))) { $sort = 'post_title'; } $order = $w->orderby; if ($order != 'asc') { $order = 'desc'; } $params['order'] = $sort.' '.$order; $rs = $core->blog->getPosts($params); if ($rs->isEmpty()) { return; } $res = ($w->content_only ? '' : '
        '). ($w->title ? '

        '.html::escapeHTML($w->title).'

        ' : ''). '
          '; while ($rs->fetch()) { $class = ''; if (($core->url->type == 'pages' && $_ctx->posts instanceof record && $_ctx->posts->post_id == $rs->post_id)) { $class = ' class="page-current"'; } $res .= ''. html::escapeHTML($rs->post_title).''; } $res .= '
        '.($w->content_only ? '' : '
        '); return $res; } } dotclear-2.6.2+dfsg/plugins/pages/_users_actions.js000066400000000000000000000016471230033266200224000ustar00rootroot00000000000000jQuery.fn.updatePagesPermissionsForm = function() { return this.each(function() { var perms = {}; var re = /^perm\[(.+?)\]\[(.+?)\]$/; var e,prop; // Building a nice object of form elements for (var i=0; iaddBehavior('initWidgets',array('pagesWidgets','initWidgets')); $core->addBehavior('initDefaultWidgets',array('pagesWidgets','initDefaultWidgets')); class pagesWidgets { public static function initWidgets($w) { $w->create('pages',__('Pages'),array('tplPages','pagesWidget'),null,'List of published pages'); $w->pages->setting('title',__('Title (optional)').' :',__('Pages')); $w->pages->setting('homeonly',__('Display on:'),1,'combo', array( __('All pages') => 0, __('Home page only') => 1, __('Except on home page') => 2 ) ); $w->pages->setting('sortby',__('Order by:'),'post_title','combo', array( __('Page title') => 'post_title', __('Page position') => 'post_position', __('Publication date') => 'post_dt' ) ); $w->pages->setting('orderby',__('Sort:'),'asc','combo', array(__('Ascending') => 'asc', __('Descending') => 'desc') ); $w->pages->setting('content_only',__('Content only'),0,'check'); $w->pages->setting('class',__('CSS class:'),''); } public static function initDefaultWidgets($w,$d) { $d['extra']->append($w->pages); } } dotclear-2.6.2+dfsg/plugins/pages/class.actionpage.php000066400000000000000000000067141230033266200227510ustar00rootroot00000000000000redirect_fields = array(); $this->caller_title = __('Pages'); } public function error(Exception $e) { $this->core->error->add($e->getMessage()); $this->beginPage(dcPage::breadcrumb( array( html::escapeHTML($this->core->blog->name) => '', __('Pages') => $this->getRedirection(true), __('Pages actions') => '' )) ); $this->endPage(); } public function beginPage($breadcrumb='',$head='') { echo ''.__('Pages').''. dcPage::jsLoad('js/_posts_actions.js'). $head. ''. $breadcrumb; echo '

        '.__('Back to pages list').'

        '; } public function endPage() { echo ''; } public function loadDefaults() { DefaultPagesActions::adminPagesActionsPage($this->core,$this); $this->actions['reorder']=array('dcPagesActionsPage','doReorderPages'); $this->core->callBehavior('adminPagesActionsPage',$this->core,$this); } public function process() { // fake action for pages reordering if (!empty($this->from['reorder'])) { $this->from['action']='reorder'; } $this->from['post_type']='page'; return parent::process(); } public static function doReorderPages($core, dcPostsActionsPage $ap, $post) { foreach($post['order'] as $post_id => $value) { if (!$core->auth->check('publish,contentadmin',$core->blog->id)) throw new Exception(__('You are not allowed to change this entry status')); $strReq = "WHERE blog_id = '".$core->con->escape($core->blog->id)."' ". "AND post_id ".$core->con->in($post_id); #If user can only publish, we need to check the post's owner if (!$core->auth->check('contentadmin',$core->blog->id)) $strReq .= "AND user_id = '".$core->con->escape($core->auth->userID())."' "; $cur = $core->con->openCursor($core->prefix.'post'); $cur->post_position = (integer) $value-1; $cur->post_upddt = date('Y-m-d H:i:s'); $cur->update($strReq); $core->blog->triggerBlog(); } dcPage::addSuccessNotice(__('Selected pages have been successfully reordered.')); $ap->redirect(false); } } class DefaultPagesActions { public static function adminPagesActionsPage($core, $ap) { if ($core->auth->check('publish,contentadmin',$core->blog->id)) { $ap->addAction( array(__('Status') => array( __('Publish') => 'publish', __('Unpublish') => 'unpublish', __('Schedule') => 'schedule', __('Mark as pending') => 'pending' )), array('dcDefaultPostActions','doChangePostStatus') ); } if ($core->auth->check('admin',$core->blog->id)) { $ap->addAction( array(__('Change') => array( __('Change author') => 'author')), array('dcDefaultPostActions','doChangePostAuthor') ); } if ($core->auth->check('delete,contentadmin',$core->blog->id)) { $ap->addAction( array(__('Delete') => array( __('Delete') => 'delete')), array('dcDefaultPostActions','doDeletePost') ); } } } dotclear-2.6.2+dfsg/plugins/pages/class.listpage.php000066400000000000000000000075351230033266200224510ustar00rootroot00000000000000rs->isEmpty()) { echo '

        '.__('No page').'

        '; } else { $pager = new dcPager($page,$this->rs_count,$nb_per_page,10); $entries = array(); if (isset($_REQUEST['entries'])) { foreach ($_REQUEST['entries'] as $v) { $entries[(integer)$v]=true; } } $html_block = '
        '. ''. ''. ''. ''. ''. ''. ''. '%s
        '.__('Title').''.__('Date').''.__('Author').''.__('Status').'
        '; if ($enclose_block) { $html_block = sprintf($enclose_block,$html_block); } echo $pager->getLinks(); $blocks = explode('%s',$html_block); echo $blocks[0]; $count = 0; while ($this->rs->fetch()) { echo $this->postLine($count,isset($entries[$this->rs->post_id])); $count ++; } echo $blocks[1]; echo $pager->getLinks(); } } private function postLine($count,$checked) { $img = '%1$s'; switch ($this->rs->post_status) { case 1: $img_status = sprintf($img,__('Published'),'check-on.png'); break; case 0: $img_status = sprintf($img,__('Unpublished'),'check-off.png'); break; case -1: $img_status = sprintf($img,__('Scheduled'),'scheduled.png'); break; case -2: $img_status = sprintf($img,__('Pending'),'check-wrn.png'); break; } $protected = ''; if ($this->rs->post_password) { $protected = sprintf($img,__('Protected'),'locker.png'); } $selected = ''; if ($this->rs->post_selected) { $selected = sprintf($img,__('Hidden'),'hidden.png'); } $attach = ''; $nb_media = $this->rs->countMedia(); if ($nb_media > 0) { $attach_str = $nb_media == 1 ? __('%d attachment') : __('%d attachments'); $attach = sprintf($img,sprintf($attach_str,$nb_media),'attach.png'); } $res = ''; $res .= ''.form::field(array('order['.$this->rs->post_id.']'),2,3,$count+1,'position','',false,'title="'.sprintf(__('position of %s'),html::escapeHTML($this->rs->post_title)).'"').''. ''. form::checkbox(array('entries[]'),$this->rs->post_id,$checked,'','',!$this->rs->isEditable(),'title="'.__('Select this page').'"').''. ''. html::escapeHTML($this->rs->post_title).''. ''.dt::dt2str(__('%Y-%m-%d %H:%M'),$this->rs->post_dt).''. ''.$this->rs->user_id.''. ''.$this->rs->nb_comment.''. ''.$this->rs->nb_trackback.''. ''.$img_status.' '.$selected.' '.$protected.' '.$attach.''. ''; return $res; } } dotclear-2.6.2+dfsg/plugins/pages/default-templates/000077500000000000000000000000001230033266200224325ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/pages/default-templates/page.html000066400000000000000000000221201230033266200242310ustar00rootroot00000000000000 {{tpl:EntryTitle encode_html="1"}} - {{tpl:BlogName encode_html="1"}} {{tpl:include src="_head.html"}}
        {{tpl:EntryPingData}} {{tpl:include src="_top.html"}}

        {{tpl:EntryTitle encode_html="1"}}

        {{tpl:SysBehavior behavior="publicEntryBeforeContent"}}
        {{tpl:EntryExcerpt}}
        {{tpl:EntryContent}}

        {{tpl:lang Published on}} {{tpl:EntryDate}} {{tpl:lang by}} {{tpl:EntryAuthorLink}}

        {{tpl:SysBehavior behavior="publicEntryAfterContent"}}

        {{tpl:lang Attachments}}

        {{tpl:lang Comments}}

        {{tpl:CommentOrderNumber}}. {{tpl:lang On}} {{tpl:CommentDate}}, {{tpl:CommentTime}} {{tpl:lang by}} {{tpl:CommentAuthorLink}}
        {{tpl:SysBehavior behavior="publicCommentBeforeContent"}} {{tpl:CommentContent}} {{tpl:SysBehavior behavior="publicCommentAfterContent"}}

        {{tpl:SysFormError}}

        {{tpl:lang Your comment has been published.}}

        {{tpl:lang Your comment has been submitted and will be reviewed for publication.}}

        {{tpl:lang Your comment}}

        {{tpl:CommentPreviewContent}}

        {{tpl:lang Add a comment}}

        {{tpl:SysBehavior behavior="publicCommentFormBeforeContent"}}

        {{tpl:CommentHelp}}

        {{tpl:SysBehavior behavior="publicCommentFormAfterContent"}}

        {{tpl:lang They posted on the same topic}}

        {{tpl:PingOrderNumber}}. {{tpl:lang On}} {{tpl:PingDate}}, {{tpl:PingTime}} {{tpl:lang by}} {{tpl:PingBlogName encode_html="1"}}
        {{tpl:SysBehavior behavior="publicPingBeforeContent"}}

        {{tpl:PingTitle encode_html="1"}}

        {{tpl:PingContent}} {{tpl:SysBehavior behavior="publicPingAfterContent"}}

        {{tpl:lang Trackback URL}} : {{tpl:EntryPingLink}}

        {{tpl:lang This page's comments feed}}

        {{tpl:include src="_footer.html"}}
        dotclear-2.6.2+dfsg/plugins/pages/icon-big.png000066400000000000000000000007321230033266200212110ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<|IDATxMj@'ՅA. n#xXܴnnUpBzo_JId!!03?;)x}7%)t?DKyT~^JDŽ`Q0yY5O7B3!syF@PyTxM}/_WuLSYu'>\U?Gr1x] .V3J vO| 8 Pn d|> JtSZ1Fw(7tl7Y4KpZѼ,ٝOſ AJoE|YV{'/Rj0KoQf*IENDB`dotclear-2.6.2+dfsg/plugins/pages/icon-np-big.png000066400000000000000000000013371230033266200216260ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<IDATx웽N0#R7hR6L,0>o@XR)73\Kql_|)j;/w%"в'иSO<}8+ڌ@T!0|63+nIB` 1_8L=9LJz8ե6L*u@:(3)!3 q~b=QX `4Olws͓9==IZ *i=W/A""+/ !/_ҕ`Jg#7lfD0(`l<!HAN Ȭd;RLv!,j [!,z@ 0A.cT2rMus 9 5<&'HcIa ,- e*)S{p\{t/HzBOn_YV'; } res += post; $(td).append(res); } } else { alert($(rsp).find('message').text()); } }); $(line).addClass('expand'); line.parentNode.insertBefore(tr,line.nextSibling); } else if (tr && tr.style.display == 'none' && ( action == 'toggle' || action == 'open' ) ) { $(tr).css('display', 'table-row'); $(line).addClass('expand'); } else if (tr && tr.style.display != 'none' && ( action == 'toggle' || action == 'close' ) ) { $(tr).css('display', 'none'); $(line).removeClass('expand'); } }; $(function() { $('#pageslist tr.line').prepend(''); $('#form-entries tr:not(.line) th:first').attr('colspan',4); $.expandContent({ line:$('#form-entries tr:not(.line)'), lines:$('#form-entries tr.line'), callback:dotclear.viewPostContent }); $('.checkboxes-helpers').each(function() { p = $('

        '); $(this).prepend(p); dotclear.checkboxesHelpers(p); }); $('#pageslist td input[type=checkbox]').enableShiftClick(); $("#pageslist tr.line td:not(.expander)").mousedown(function(){ $('#pageslist tr.line').each(function() { var td = this.firstChild; dotclear.viewPostContent(td.firstChild,td.firstChild.line,'close'); }); $('#pageslist tr:not(.line)').remove(); }); $("#pageslist").sortable({ cursor:'move', stop: function( event, ui ) { $("#pageslist tr td input.position").each(function(i) { $(this).val(i+1); }); } }); $("#pageslist tr").hover(function () { $(this).css({'cursor':'move'}); }, function () { $(this).css({'cursor':'auto'}); }); $("#pageslist tr td input.position").hide(); $("#pageslist tr td.handle").addClass('handler'); $("form input[type=submit]").click(function() { $("input[type=submit]", $(this).parents("form")).removeAttr("clicked"); $(this).attr("clicked", "true"); }) $('#form-entries').submit(function() { var action = $(this).find('select[name="action"]').val(); var checked = false; if ($("input[name=reorder][clicked=true]").val()) { return true; } $(this).find('input[name="entries[]"]').each(function() { if (this.checked) { checked = true; } }); if (!checked) { return false; } if (action == 'delete') { return window.confirm(dotclear.msg.confirm_delete_posts.replace('%s',$('input[name="entries[]"]:checked').size())); } return true; }); }); dotclear-2.6.2+dfsg/plugins/pages/list.php000066400000000000000000000066711230033266200205100ustar00rootroot00000000000000 'page' ); $page = !empty($_GET['page']) ? max(1,(integer) $_GET['page']) : 1; $nb_per_page = 30; if (!empty($_GET['nb']) && (integer) $_GET['nb'] > 0) { $nb_per_page = (integer) $_GET['nb']; } $params['limit'] = array((($page-1)*$nb_per_page),$nb_per_page); $params['no_content'] = true; $params['order'] = 'post_position ASC, post_title ASC'; try { $pages = $core->blog->getPosts($params); $counter = $core->blog->getPosts($params,true); $post_list = new adminPagesList($core,$pages,$counter->f(0)); } catch (Exception $e) { $core->error->add($e->getMessage()); } # Actions combo box $pages_actions_page = new dcPagesActionsPage($core,'plugin.php',array('p'=>'pages')); if (!$pages_actions_page->process()) { # --BEHAVIOR-- adminPagesActionsCombo $core->callBehavior('adminPagesActionsCombo',array(&$combo_action)); /* Display -------------------------------------------------------- */ ?> <?php echo __('Pages'); ?> '. "\n".'//'."\n". ''; ?> blog->name) => '', __('Pages') => '' )).dcPage::notices(); if (!empty($_GET['upd'])) { dcPage::success(__('Selected pages have been successfully updated.')); } elseif (!empty($_GET['del'])) { dcPage::success(__('Selected pages have been successfully deleted.')); } elseif (!empty($_GET['reo'])) { dcPage::success(__('Selected pages have been successfully reordered.')); } echo '

        '.__('New page').'

        '; if (!$core->error->flag()) { # Show pages $post_list->display($page,$nb_per_page, '
        '. '%s'. '
        '. '

        '. '

        '. form::combo('action',$pages_actions_page->getCombo()). ''. form::hidden(array('post_type'),'page'). form::hidden(array('p'),'pages'). form::hidden(array('act'),'list'). $core->formNonce(). '

        '. '

        '. __('To rearrange pages order, change number at the begining of the line, then click on “Save pages order” button.').'

        '. '

        '. __('To rearrange pages order, move items by drag and drop, then click on “Save pages order” button.').'

        '. '

        '. '
        '); } dcPage::helpBlock('pages'); ?> dotclear-2.6.2+dfsg/plugins/pages/locales/000077500000000000000000000000001230033266200204345ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/pages/locales/en/000077500000000000000000000000001230033266200210365ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/pages/locales/en/help/000077500000000000000000000000001230033266200217665ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/pages/locales/en/help/page.html000066400000000000000000000063641230033266200236010ustar00rootroot00000000000000 Editing a page

        Editing a page

        Page title
        Type in the page title. This field is mandatory.
        Excerpt
        This field is optional.
        Content
        The content of your page. This field is mandatory.
        Notes
        This text area is for personal use, for notes or memos. What you enter here will never be displayed on the blog.
        Page status
        Allows you to choose your page status:
        • Pending: The publication status has not yet been decided (not published yet).
        • Scheduled: The page will be set online at the time and date set in the Published on field.
        • Unpublished: The page is offline.
        • Published: The page is online.
        Publication date and hour
        Here you can change the page publication date and time. If the page status is Scheduled, it will be online at the given date and time.
        Page language
        Select the language code of your entry. It defaults to your (as a user) language but you can change it to whatever language code you want, e.g. "en" or "es-ar". This code is used for the entry's display.
        Text formatting
        Choose the page syntax. Wiki is a simplified syntax and will be converted to valid XHTML. Unless you have a perfect understanding of XHTML, we advise you to choose the Wiki syntax. See the Wiki syntax reference for more information.
        Page position
        Orders pages according to this number. This field is used by the Pages widget (Order by page position).
        Attachments
        Attachments are media files added to the page. You can use the Add files to this entry button to select media files to add to the entry.
        This option will appear after you save your entry.
        Please check the Media manager help for more information.
        Accept comments
        Check this box to allow your visitors to comment on this page. The corresponding global setting can be found in the blog settings.
        Accept trackbacks
        A trackback is a way to let a portion of your page as a comment on another blog. Check this box to allow others to trackback your page. The corresponding global setting is to be found in the blog settings.
        Hide in widget Pages
        If this option is checked, the page will be active but will not be listed in the Pages widget.
        Password
        You can enter a password for your page. A password protected page will not be displayed on your blog, it will only be accessible to those you will give the entry URL to (see the Go to this page on the site link) and password.
        Basename
        By clicking on its lock, you can unprotect this field and choose another URL for your page. If the URL you're trying to use is already used by another page, a number will be added to it.
        dotclear-2.6.2+dfsg/plugins/pages/locales/en/help/pages.html000066400000000000000000000014361230033266200237570ustar00rootroot00000000000000 Pages management

        Selected pages actions

        If your user permission level allows it, you can perform batch operations on the pages you select in the list.

        • Publish: set pages online,
        • Unpublish: set pages offline,
        • Schedule: schedule the page to go online at the date defined in the Publication date field,
        • Mark as pending: erase other publication status,
        • Change author: allows you to change the pages' author by entering the new author's ID,
        • Delete: delete the pages (this operation cannot be undone).
        dotclear-2.6.2+dfsg/plugins/pages/locales/en/resources.php000066400000000000000000000011321230033266200235560ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/pages/locales/fr/000077500000000000000000000000001230033266200210435ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/pages/locales/fr/help/000077500000000000000000000000001230033266200217735ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/pages/locales/fr/help/page.html000066400000000000000000000107361230033266200236040ustar00rootroot00000000000000 Rédaction d'une page

        Rédaction de la page

        Titre
        Inscrivez le titre de la page. Ce champ est obligatoire.
        Extrait
        Ce champ est optionnel.
        Contenu
        Le contenu de la page. Ce champ est obligatoire.
        Notes personnelles
        Cette zone de texte sert à la prise de notes ou pense-bête divers. Elle ne sera jamais affichée sur le blog.
        Etat de la page
        Permet de choisir l'état de la page après enregistrement :
        • En attente : en attente de publication.
        • Programmé : la page sera mise en ligne à la date et à l'heure indiquée dans le champ Publiée le.
        • Non publié : page hors ligne.
        • Publié : page en ligne.
        Publié le
        Permet de modifier la date et l'heure de publication de la page. Si vous avez choisi le statut Programmée elle sera mise en ligne aux dates et heures définis dans ce champ.
        Langue de la page
        Code langue de votre page. Par défaut, il s'agit du code de votre langue. Vous pouvez le changer, par le code d'une autre langue, par exemple "en", "fr-qc".
        Formatage du texte
        Permet de choisir la syntaxe de saisie de la page. Le wiki est une syntaxe simplifiée et sera converti en xhtml valide ; à moins que vous maîtrisiez parfaitement le xhtml nous vous conseillons de la choisir de préférence.
        Consultez la référence de la syntaxe Wiki pour plus d'informations.
        Position de la page
        Permet de classer les différentes pages en fonction de leur numéro d'ordre. Ce champ est utilisé par le widget Pages (Trier par position de la page).
        Accepter les commentaires
        Cochez ou décochez la case selon que vous souhaitez permettre ou interdire les commentaires sur la page en particulier. L'option pour permettre ou autoriser de façon générale les commentaires se situe dans le menu Paramètres du blog.
        Accepter les rétroliens
        Un rétrolien permet de signaler une page dans les commentaires d'un autre blog. Cochez ou décochez la case selon que vous souhaitez permettre ou interdire les rétroliens sur la page. L'option pour permettre ou autoriser de façon générale les rétroliens se situe dans le menu Paramètres du blog. Une page peut recevoir des rétroliens mais ne peut pas en faire.
        Ne pas lister dans le widget Pages
        Si coché cette page sera active mais non listée dans le widget Pages.
        Mot de passe de la page
        Permet de déterminer un mot de passe d'accès à une page dans le blog. Une page protégée par mot de passe ne sera visible nulle part sur votre blog, vous pourrez en donner l'adresse à vos lecteurs en vous rendant sur le lien Voir la page.
        URL spécifique
        Ce champ permet de choisir une URL pour une page autre que celle par défaut après avoir cliqué sur le petit verrou placé à sa droite. Si vous essayez d'utiliser une URL déjà existante, celle-ci se verra incrémentée d'un chiffre.
        Fichiers attachés
        Les fichiers attachés sont tous les médias ajoutés à la page. Le lien d'ajout d'un fichier attaché permet de choisir un fichier à ajouter à la page. L'option apparaîtra après le première enregistrement de votre billet Consultez l'aide du gestionnaire de médias pour plus de détails.

        Commentaires

        Liste les commentaires
        Depuis l'onglets Commentaires vous pouvez lire et changer l'état des commentaires de votre page. Suivant vos permissions, vous pouvez modifier, mettre en ligne ou hors ligne, supprimer ou classer comme commentaire indésirable.
        Ajouter un commentaire
        Depuis l'onglet Ajouter un commentaire vous pouvez ajouter ou répondre directement à un commentaire sans passer par votre blog. Cette interface vous permet également de saisir votre commentaire en XHTML, sans limitation. Vous devrez remplir les champs de la même manière qu'en modifiant un commentaire.
        dotclear-2.6.2+dfsg/plugins/pages/locales/fr/help/pages.html000066400000000000000000000016401230033266200237610ustar00rootroot00000000000000 Gestion des pages

        Actions par lot sur les pages

        Il est possible d'effectuer un ensemble d'actions sur plusieurs pages, d'un seul coup. Les actions possibles dépendent des permissions de l'utilisateur.

        • Publier : mettre la page en ligne.
        • Mettre hors ligne : mettre la page hors ligne.
        • Programmer : programmer la page pour mise en ligne à la date de publication.
        • Mettre en attente : en attente de publication.
        • Changer l'auteur : permet de changer l'auteur de la page en indiquant l'identifiant de l'utilisateur qui deviendra le nouvel auteur.
        • Supprimer : supprime la page (cette opération est irréversible).
        dotclear-2.6.2+dfsg/plugins/pages/locales/fr/resources.php000066400000000000000000000011321230033266200235630ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/pages/page.php000066400000000000000000000534451230033266200204520ustar00rootroot00000000000000auth->getOption('post_format'); $post_password = ''; $post_url = ''; $post_lang = $core->auth->getInfo('user_lang'); $post_title = ''; $post_excerpt = ''; $post_excerpt_xhtml = ''; $post_content = ''; $post_content_xhtml = ''; $post_notes = ''; $post_status = $core->auth->getInfo('user_post_status'); $post_position = 0; $post_open_comment = false; $post_open_tb = false; $post_selected = false; $post_media = array(); $page_title = __('New page'); $can_view_page = true; $can_edit_page = $core->auth->check('pages,usage',$core->blog->id); $can_publish = $core->auth->check('pages,publish,contentadmin',$core->blog->id); $can_delete = false; $post_headlink = ''; $post_link = '%s'; $next_link = $prev_link = $next_headlink = $prev_headlink = null; # If user can't publish if (!$can_publish) { $post_status = -2; } # Status combo $status_combo = dcAdminCombos::getPostStatusesCombo(); $img_status_pattern = '%1$s'; # Formaters combo $formaters_combo = dcAdminCombos::getFormatersCombo(); # Languages combo $rs = $core->blog->getLangs(array('order'=>'asc')); $lang_combo = dcAdminCombos::getLangsCombo($rs,true); # Validation flag $bad_dt = false; # Get page informations if (!empty($_REQUEST['id'])) { $params['post_type'] = 'page'; $params['post_id'] = $_REQUEST['id']; $post = $core->blog->getPosts($params); if ($post->isEmpty()) { $core->error->add(__('This page does not exist.')); $can_view_page = false; } else { $post_id = $post->post_id; $post_dt = date('Y-m-d H:i',strtotime($post->post_dt)); $post_format = $post->post_format; $post_password = $post->post_password; $post_url = $post->post_url; $post_lang = $post->post_lang; $post_title = $post->post_title; $post_excerpt = $post->post_excerpt; $post_excerpt_xhtml = $post->post_excerpt_xhtml; $post_content = $post->post_content; $post_content_xhtml = $post->post_content_xhtml; $post_notes = $post->post_notes; $post_status = $post->post_status; $post_position = (integer) $post->post_position; $post_open_comment = (boolean) $post->post_open_comment; $post_open_tb = (boolean) $post->post_open_tb; $post_selected = (boolean) $post->post_selected; $page_title = __('Edit page'); $can_edit_page = $post->isEditable(); $can_delete= $post->isDeletable(); $next_rs = $core->blog->getNextPost($post,1); $prev_rs = $core->blog->getNextPost($post,-1); if ($next_rs !== null) { $next_link = sprintf($post_link,$next_rs->post_id, html::escapeHTML($next_rs->post_title),__('Next page').' »'); $next_headlink = sprintf($post_headlink,'next', html::escapeHTML($next_rs->post_title),$next_rs->post_id); } if ($prev_rs !== null) { $prev_link = sprintf($post_link,$prev_rs->post_id, html::escapeHTML($prev_rs->post_title),'« '.__('Previous page')); $prev_headlink = sprintf($post_headlink,'previous', html::escapeHTML($prev_rs->post_title),$prev_rs->post_id); } try { $core->media = new dcMedia($core); $post_media = $core->media->getPostMedia($post_id); } catch (Exception $e) { $core->error->add($e->getMessage()); } } } # Format content if (!empty($_POST) && $can_edit_page) { $post_format = $_POST['post_format']; $post_excerpt = $_POST['post_excerpt']; $post_content = $_POST['post_content']; $post_title = $_POST['post_title']; if (isset($_POST['post_status'])) { $post_status = (integer) $_POST['post_status']; } if (empty($_POST['post_dt'])) { $post_dt = ''; } else { try { $post_dt = strtotime($_POST['post_dt']); if ($post_dt == false || $post_dt == -1) { $bad_dt = true; throw new Exception(__('Invalid publication date')); } $post_dt = date('Y-m-d H:i',$post_dt); } catch (Exception $e) { $core->error->add($e->getMessage()); } } $post_open_comment = !empty($_POST['post_open_comment']); $post_open_tb = !empty($_POST['post_open_tb']); $post_selected = !empty($_POST['post_selected']); $post_lang = $_POST['post_lang']; $post_password = !empty($_POST['post_password']) ? $_POST['post_password'] : null; $post_position = (integer) $_POST['post_position']; $post_notes = $_POST['post_notes']; if (isset($_POST['post_url'])) { $post_url = $_POST['post_url']; } $core->blog->setPostContent( $post_id,$post_format,$post_lang, $post_excerpt,$post_excerpt_xhtml,$post_content,$post_content_xhtml ); } # Delete page if (!empty($_POST['delete']) && $can_delete) { try { # --BEHAVIOR-- adminBeforePageDelete $core->callBehavior('adminBeforePageDelete',$post_id); $core->blog->delPost($post_id); http::redirect($p_url); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Create or update page if (!empty($_POST) && !empty($_POST['save']) && $can_edit_page && !$bad_dt) { $cur = $core->con->openCursor($core->prefix.'post'); # Magic tweak :) $core->blog->settings->system->post_url_format = $page_url_format; $cur->post_type = 'page'; $cur->post_title = $post_title; $cur->post_dt = $post_dt ? date('Y-m-d H:i:00',strtotime($post_dt)) : ''; $cur->post_format = $post_format; $cur->post_password = $post_password; $cur->post_lang = $post_lang; $cur->post_title = $post_title; $cur->post_excerpt = $post_excerpt; $cur->post_excerpt_xhtml = $post_excerpt_xhtml; $cur->post_content = $post_content; $cur->post_content_xhtml = $post_content_xhtml; $cur->post_notes = $post_notes; $cur->post_status = $post_status; $cur->post_position = $post_position; $cur->post_open_comment = (integer) $post_open_comment; $cur->post_open_tb = (integer) $post_open_tb; $cur->post_selected = (integer) $post_selected; if (isset($_POST['post_url'])) { $cur->post_url = $post_url; } # Update post if ($post_id) { try { # --BEHAVIOR-- adminBeforePageUpdate $core->callBehavior('adminBeforePageUpdate',$cur,$post_id); $core->blog->updPost($post_id,$cur); # --BEHAVIOR-- adminAfterPageUpdate $core->callBehavior('adminAfterPageUpdate',$cur,$post_id); http::redirect($redir_url.'&id='.$post_id.'&upd=1'); } catch (Exception $e) { $core->error->add($e->getMessage()); } } else { $cur->user_id = $core->auth->userID(); try { # --BEHAVIOR-- adminBeforePageCreate $core->callBehavior('adminBeforePageCreate',$cur); $return_id = $core->blog->addPost($cur); # --BEHAVIOR-- adminAfterPageCreate $core->callBehavior('adminAfterPageCreate',$cur,$return_id); http::redirect($redir_url.'&id='.$return_id.'&crea=1'); } catch (Exception $e) { $core->error->add($e->getMessage()); } } } /* DISPLAY -------------------------------------------------------- */ $default_tab = 'edit-entry'; if (!$can_edit_page) { $default_tab = ''; } if (!empty($_GET['co'])) { $default_tab = 'comments'; } ?> <?php echo $page_title.' - '.__('Pages'); ?> callBehavior('adminPageHeaders'). dcPage::jsPageTabs($default_tab). $next_headlink."\n".$prev_headlink; ?> blog->name) => '', __('Pages') => $p_url, $edit_entry_title => '' )); if (!empty($_GET['upd'])) { dcPage::success(__('Page has been successfully updated.')); } elseif (!empty($_GET['crea'])) { dcPage::success(__('Page has been successfully created.')); } elseif (!empty($_GET['attached'])) { dcPage::success(__('File has been successfully attached.')); } elseif (!empty($_GET['rmattach'])) { dcPage::success(__('Attachment has been successfully removed.')); } # XHTML conversion if (!empty($_GET['xconv'])) { $post_excerpt = $post_excerpt_xhtml; $post_content = $post_content_xhtml; $post_format = 'xhtml'; dcPage::message(__('Don\'t forget to validate your XHTML conversion by saving your post.')); } if ($post_id && $post->post_status == 1) { echo '

        '.__('Go to this page on the site').'

        '; } echo ''; if ($post_id) { echo ''; } # Exit if we cannot view page if (!$can_view_page) { echo ''; return; } /* Post form if we can edit page -------------------------------------------------------- */ if ($can_edit_page) { $sidebar_items = new ArrayObject(array( 'status-box' => array( 'title' => __('Status'), 'items' => array( 'post_status' => '

        '. form::combo('post_status',$status_combo,$post_status,'','',!$can_publish). '

        ', 'post_dt' => '

        '. form::field('post_dt',16,16,$post_dt,($bad_dt ? 'invalid' : '')). '

        ', 'post_lang' => '

        '. form::combo('post_lang',$lang_combo,$post_lang). '

        ', 'post_format' => '
        '. '
        '. '

        '.form::combo('post_format',$formaters_combo,$post_format,'maximal'). '

        '. '

        '. ''. __('Convert to XHTML').'

        ')), 'metas-box' => array( 'title' => __('Filing'), 'items' => array( 'post_position' => '

        '. form::field('post_position',3,3,(string) $post_position). '

        ')), 'options-box' => array( 'title' => __('Options'), 'items' => array( 'post_open_comment_tb' => '
        '. '
        '.__('Comments and trackbacks list').'
        '. '

        '. ($core->blog->settings->system->allow_comments ? (isContributionAllowed($post_id,strtotime($post_dt),true) ? '' : '

        '. __('Warning: Comments are not more accepted for this entry.').'

        ') : '

        '. __('Comments are not accepted on this blog so far.').'

        '). '

        '. ($core->blog->settings->system->allow_trackbacks ? (isContributionAllowed($post_id,strtotime($post_dt),false) ? '' : '

        '. __('Warning: Trackbacks are not more accepted for this entry.').'

        ') : '

        '.__('Trackbacks are not accepted on this blog so far.').'

        '). '
        ', 'post_hide' => '

        '. '

        ', 'post_password' => '

        '. form::field('post_password',10,32,html::escapeHTML($post_password),'maximal'). '

        ', 'post_url' => '
        '. '

        '. form::field('post_url',10,255,html::escapeHTML($post_url),'maximal'). '

        '. '

        '. __('Warning: If you set the URL manually, it may conflict with another page.'). '

        ' )))); $main_items = new ArrayObject(array( "post_title" => '

        '. ''. form::field('post_title',20,255,html::escapeHTML($post_title),'maximal'). '

        ', "post_excerpt" => '

        '. form::textarea('post_excerpt',50,5,html::escapeHTML($post_excerpt)). '

        ', "post_content" => '

        '. form::textarea('post_content',50,$core->auth->getOption('edit_size'),html::escapeHTML($post_content)). '

        ', "post_notes" => '

        '. form::textarea('post_notes',50,5,html::escapeHTML($post_notes)). '

        ' ) ); # --BEHAVIOR-- adminPostFormItems $core->callBehavior('adminPageFormItems',$main_items,$sidebar_items, isset($post) ? $post : null); echo '
        '; echo '
        '; echo '
        '; echo '
        '; echo '

        '.__('Edit page').'

        '; foreach ($main_items as $id => $item) { echo $item; } # --BEHAVIOR-- adminPageForm $core->callBehavior('adminPageForm',isset($post) ? $post : null); echo '

        '. ($post_id ? form::hidden('id',$post_id) : ''). ' '; if ($post_id) { $preview_url = $core->blog->url. $core->url->getURLFor('pagespreview', $core->auth->userID().'/'. http::browserUID(DC_MASTER_KEY.$core->auth->userID().$core->auth->getInfo('user_pwd')). '/'.$post->post_url); echo ''.__('Preview').' (p)'.''; } else { echo ''.__('Cancel').' (c)'; } echo ($can_delete ? '' : ''). $core->formNonce(). '

        '; echo '
        '; // End #entry-content echo '
        '; // End #entry-wrapper echo '
        '; foreach ($sidebar_items as $id => $c) { echo '
        '. '

        '.$c['title'].'

        '; foreach ($c['items'] as $e_name=>$e_content) { echo $e_content; } echo '
        '; } # --BEHAVIOR-- adminPageFormSidebar $core->callBehavior('adminPageFormSidebar',isset($post) ? $post : null); echo '
        '; // End #entry-sidebar echo '
        '; echo '
        '; // End if ($post_id && !empty($post_media)) { echo '
        '. '
        '.form::hidden(array('post_id'),$post_id). form::hidden(array('media_id'),''). form::hidden(array('remove'),1). $core->formNonce().'
        '; } } /* Comments and trackbacks -------------------------------------------------------- */ if ($post_id) { $params = array('post_id' => $post_id, 'order' => 'comment_dt ASC'); $comments = $core->blog->getComments(array_merge($params,array('comment_trackback'=>0))); $trackbacks = $core->blog->getComments(array_merge($params,array('comment_trackback'=>1))); # Actions combo box $combo_action = array(); if ($can_edit_page && $core->auth->check('publish,contentadmin',$core->blog->id)) { $combo_action[__('Publish')] = 'publish'; $combo_action[__('Unpublish')] = 'unpublish'; $combo_action[__('Mark as pending')] = 'pending'; $combo_action[__('Mark as junk')] = 'junk'; } if ($can_edit_page && $core->auth->check('delete,contentadmin',$core->blog->id)) { $combo_action[__('Delete')] = 'delete'; } $has_action = !empty($combo_action) && (!$trackbacks->isEmpty() || !$comments->isEmpty()); echo '
        '; echo '

        '.__('Add a comment').'

        '; if ($has_action) { echo '
        '; } echo '

        '.__('Trackbacks').'

        '; if (!$trackbacks->isEmpty()) { showComments($trackbacks,$has_action); } else { echo '

        '.__('No trackback').'

        '; } echo '

        '.__('Comments').'

        '; if (!$comments->isEmpty()) { showComments($comments,$has_action); } else { echo '

        '.__('No comment').'

        '; } if ($has_action) { echo '
        '. '

        '. '

        '. form::combo('action',$combo_action). form::hidden('redir',html::escapeURL($redir_url).'&id='.$post_id.'&co=1'). $core->formNonce(). '

        '. '
        '. '
        '; } /* Add a comment -------------------------------------------------------- */ echo '
        '. '

        '.__('Add a comment').'

        '. '
        '. '
        '. '

        '. form::field('comment_author',30,255,html::escapeHTML($core->auth->getInfo('user_cn'))). '

        '. '

        '. form::field('comment_email',30,255,html::escapeHTML($core->auth->getInfo('user_email'))). '

        '. '

        '. form::field('comment_site',30,255,html::escapeHTML($core->auth->getInfo('user_url'))). '

        '. '

        '. form::textarea('comment_content',50,8,html::escapeHTML('')). '

        '. '

        '.form::hidden('post_id',$post_id). $core->formNonce(). '

        '. '
        '. #constrained '
        '. '
        '. #add comment '
        '; #comments } # Controls comments or trakbacks capabilities function isContributionAllowed($id,$dt,$com=true) { global $core; if (!$id) { return true; } if ($com) { if (($core->blog->settings->system->comments_ttl == 0) || (time() - $core->blog->settings->system->comments_ttl*86400 < $dt)) { return true; } } else { if (($core->blog->settings->system->trackbacks_ttl == 0) || (time() - $core->blog->settings->system->trackbacks_ttl*86400 < $dt)) { return true; } } return false; } # Show comments or trackbacks function showComments($rs,$has_action) { echo ''. ''. ''. ''. ''. ''. ''; while($rs->fetch()) { $comment_url = 'comment.php?id='.$rs->comment_id; $img = '%1$s'; switch ($rs->comment_status) { case 1: $img_status = sprintf($img,__('Published'),'check-on.png'); break; case 0: $img_status = sprintf($img,__('Unpublished'),'check-off.png'); break; case -1: $img_status = sprintf($img,__('Pending'),'check-wrn.png'); break; case -2: $img_status = sprintf($img,__('Junk'),'junk.png'); break; } echo ''. ''. ''. ''. ''. ''. ''. ''; } echo '
        '.__('Author').''.__('Date').''.__('IP address').''.__('Status').''.__('Edit').'
        '. ($has_action ? form::checkbox(array('comments[]'),$rs->comment_id,'','','',0,'title="'.__('Select this comment').'"') : '').''.$rs->comment_author.''.dt::dt2str(__('%Y-%m-%d %H:%M'),$rs->comment_dt).''.$rs->comment_ip.''.$img_status.''. ' '.__('Edit').'
        '; } dcPage::helpBlock('page','core_wiki'); ?> dotclear-2.6.2+dfsg/plugins/pings/000077500000000000000000000000001230033266200170335ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/pings/_admin.php000066400000000000000000000042021230033266200207710ustar00rootroot00000000000000addItem(__('Pings'),'plugin.php?p=pings','index.php?pf=pings/icon.png', preg_match('/plugin.php\?p=pings/',$_SERVER['REQUEST_URI']), $core->auth->isSuperAdmin()); $__autoload['pingsAPI'] = dirname(__FILE__).'/lib.pings.php'; $__autoload['pingsBehaviors'] = dirname(__FILE__).'/lib.pings.php'; # Create settings if they don't exist if (!array_key_exists('pings',$core->blog->settings->dumpNamespaces())) { $default_pings_uris = array( 'Ping-o-Matic!' => 'http://rpc.pingomatic.com/', 'Google Blog Search' => 'http://blogsearch.google.com/ping/RPC2' ); $core->blog->settings->addNamespace('pings'); $core->blog->settings->pings->put('pings_active',1,'boolean','Activate pings plugin',true,true); $core->blog->settings->pings->put('pings_uris',serialize($default_pings_uris),'string','Pings services URIs',true,true); } $core->addBehavior('adminPostHeaders',array('pingsBehaviors','pingJS')); $core->addBehavior('adminPostFormItems',array('pingsBehaviors','pingsFormItems')); $core->addBehavior('adminAfterPostCreate',array('pingsBehaviors','doPings')); $core->addBehavior('adminAfterPostUpdate',array('pingsBehaviors','doPings')); $core->addBehavior('adminDashboardFavorites','pingDashboardFavorites'); function pingDashboardFavorites($core,$favs) { $favs->register('pings', array( 'title' => __('Pings'), 'url' => 'plugin.php?p=pings', 'small-icon' => 'index.php?pf=pings/icon.png', 'large-icon' => 'index.php?pf=pings/icon-big.png', )); } $core->addBehavior('adminPageHelpBlock', 'pingsPageHelpBlock'); function pingsPageHelpBlock($blocks) { $found = false; foreach($blocks as $block) { if ($block == 'core_post') { $found = true; break; } } if (!$found) { return null; } $blocks[] = 'pings_post'; } dotclear-2.6.2+dfsg/plugins/pings/_define.php000066400000000000000000000011621230033266200211350ustar00rootroot00000000000000registerModule( /* Name */ "Pings", /* Description*/ "Ping services", /* Author */ "Olivier Meunier", /* Version */ '1.2', array( 'permissions' => 'usage,contentadmin', 'type' => 'plugin' ) ); dotclear-2.6.2+dfsg/plugins/pings/icon-big.png000066400000000000000000000020701230033266200212270ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<IDATx[=@vVR,&]$ӥ >P؍RZ.]@Rz|pH 7a{x'K0XE-ϪX_^kEoaEj㣐tA:"2J@tŜHI$4J @OJ`I'J~B$TixVwb.}C0Ho p; g!M+R7RNqJ`myߝbBT~}pDt|>G: YKZ?!Ÿ qڜ@ OY<`p!/ep4n`z-Lŷ/,Lh4K: BDBPy@iE$\Y@u';օ_ԝGuS.v,{uuq!:FCIAB>+! y{GHܴ`눆ȰAƖV~:L7SufG Dd/k[@"<%GIЏ~0IgeKJlVX,7I[LN"V̰5rW,T @EJj#`e@8fi{~`J@,g “ ޠTok T -"m Dj0P"j>"/ﻒXtZ晦O@Q Ji3g  ?"ďy*qyIENDB`dotclear-2.6.2+dfsg/plugins/pings/icon.png000066400000000000000000000005751230033266200205000ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb` W aD@u|vH @T>+8h@| x!H# e ,x4[~&ʀ>~mbblog->settings->pings->pings_uris); if (!$pings_uris) { $pings_uris = array(); } if (isset($_POST['pings_srv_name'])) { $pings_srv_name = is_array($_POST['pings_srv_name']) ? $_POST['pings_srv_name'] : array(); $pings_srv_uri = is_array($_POST['pings_srv_uri']) ? $_POST['pings_srv_uri'] : array(); $pings_uris = array(); foreach ($pings_srv_name as $k => $v) { if (trim($v) && trim($pings_srv_uri[$k])) { $pings_uris[trim($v)] = trim($pings_srv_uri[$k]); } } $core->blog->settings->addNamespace('pings'); $core->blog->settings->pings->put('pings_active',!empty($_POST['pings_active']),null,null,true,true); $core->blog->settings->pings->put('pings_uris',serialize($pings_uris),null,null,true,true); dcPage::addSuccessNotice(__('Settings have been successfully updated.')); http::redirect($p_url); } } catch (Exception $e) { $core->error->add($e->getMessage()); } ?> <?php echo __('Pings'); ?> '', __('Pings configuration') => '' )); echo '
        '. '

        '; $i = 0; foreach ($pings_uris as $n => $u) { echo '

        '. form::field(array('pings_srv_name[]','pings_srv_name-'.$i),20,128,html::escapeHTML($n)).' '. ' '. form::field(array('pings_srv_uri[]','pings_srv_uri-'.$i),40,255,html::escapeHTML($u)); if (!empty($_GET['test'])) { try { pingsAPI::doPings($u,'Example site','http://example.com'); echo ' OK'; } catch (Exception $e) { echo ' '.__('Error').' '.$e->getMessage(); } } echo '

        '; $i++; } echo '

        '. form::field(array('pings_srv_name[]','pings_srv_name2'),20,128).' '. ' '. form::field(array('pings_srv_uri[]','pings_srv_uri2'),40,255). '

        '. '

        '. $core->formNonce().'

        '. '
        '; echo '

        '.__('Test ping services').'

        '; ?> dotclear-2.6.2+dfsg/plugins/pings/lib.pings.php000066400000000000000000000046361230033266200214420ustar00rootroot00000000000000timeout = 3; $rsp = $o->query('weblogUpdates.ping',$site_name,$site_url); if (isset($rsp['flerror']) && $rsp['flerror']) { throw new Exception($rsp['message']); } return true; } } class pingsBehaviors { public static function pingJS() { $res = "\n".dcPage::jsLoad('index.php?pf=pings/post.js'); return $res; } public static function pingsFormItems($main,$sidebar,$post) { $core =& $GLOBALS['core']; if (!$core->blog->settings->pings->pings_active) { return; } $pings_uris = @unserialize($core->blog->settings->pings->pings_uris); if (empty($pings_uris) || !is_array($pings_uris)) { return; } if (!empty($_POST['pings_do']) && is_array($_POST['pings_do'])) { $pings_do = $_POST['pings_do']; } else { $pings_do = array(); } $item = '
        '.__('Pings').'
        '; $i = 0; foreach ($pings_uris as $k => $v) { $item .= '

        '; $i++; } $sidebar['options-box']['items']['pings']=$item; } public static function doPings($cur,$post_id) { if (empty($_POST['pings_do']) || !is_array($_POST['pings_do'])) { return; } $core =& $GLOBALS['core']; if (!$core->blog->settings->pings->pings_active) { return; } $pings_uris = @unserialize($core->blog->settings->pings->pings_uris); if (empty($pings_uris) || !is_array($pings_uris)) { return; } foreach ($_POST['pings_do'] as $uri) { if (in_array($uri,$pings_uris)) { try { pingsAPI::doPings($uri,$core->blog->name,$core->blog->url); } catch (Exception $e) {} } } } } dotclear-2.6.2+dfsg/plugins/pings/locales/000077500000000000000000000000001230033266200204555ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/pings/locales/en/000077500000000000000000000000001230033266200210575ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/pings/locales/en/help/000077500000000000000000000000001230033266200220075ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/pings/locales/en/help/pings.html000066400000000000000000000006161230033266200240200ustar00rootroot00000000000000 Pings

        Pings

        What is a "ping"?

        To add a ping service, fill the name and URI fields and click on Save.

        To remove a ping service, empty the fields and click Save.

        dotclear-2.6.2+dfsg/plugins/pings/locales/en/help/pings_post.html000066400000000000000000000004011230033266200250550ustar00rootroot00000000000000 Pings

        Pings

        Check the services you want to ping when the entry is published.

        To add or remove a ping service, go to the pings admin page.

        dotclear-2.6.2+dfsg/plugins/pings/locales/en/resources.php000066400000000000000000000011551230033266200236040ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/pings/locales/fr/000077500000000000000000000000001230033266200210645ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/pings/locales/fr/help/000077500000000000000000000000001230033266200220145ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/pings/locales/fr/help/pings.html000066400000000000000000000007361230033266200240300ustar00rootroot00000000000000 Signalements (pings)

        Signalements (pings)

        Qu'est-ce qu'un service de signalement ? (“ping”).

        Pour ajouter un service de signalement, remplissez les champs de nom et d'URI puis cliquez sur le bouton Enregistrer.

        Pour supprimer un service, videz les champs nom et URI puis enregistrez.

        dotclear-2.6.2+dfsg/plugins/pings/locales/fr/help/pings_post.html000066400000000000000000000005571230033266200250760ustar00rootroot00000000000000 Signalements (pings)

        Signalements (pings)

        Cochez les services que vous souhaitez « pinguer » à la publication du billet.

        Pour ajouter ou supprimer des services de signalement, rendez-vous sur la page d'administration des signalements.

        dotclear-2.6.2+dfsg/plugins/pings/locales/fr/resources.php000066400000000000000000000011551230033266200236110ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/pings/post.js000066400000000000000000000006461230033266200203640ustar00rootroot00000000000000$(function() { $('#edit-entry').onetabload(function() { if ($('p.ping-services').length > 0) { p = $('

        '); p.addClass('ping-services'); $('p.ping-services:last').after(p); dotclear.checkboxesHelpers($('p.ping-services:last').get(0), $('.check-ping-services')); } $('h5.ping-services').toggleWithLegend($('p.ping-services'),{ user_pref: 'dcx_ping_services', legend_click: true }); }); }); dotclear-2.6.2+dfsg/plugins/tags/000077500000000000000000000000001230033266200166515ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/tags/_admin.php000066400000000000000000000264711230033266200206230ustar00rootroot00000000000000addItem(__('Tags'),'plugin.php?p=tags&m=tags','index.php?pf=tags/icon.png', preg_match('/plugin.php\?p=tags&m=tag(s|_posts)?(&.*)?$/',$_SERVER['REQUEST_URI']), $core->auth->check('usage,contentadmin',$core->blog->id)); require dirname(__FILE__).'/_widgets.php'; $core->addBehavior('adminPostFormItems',array('tagsBehaviors','tagsField')); $core->addBehavior('adminAfterPostCreate',array('tagsBehaviors','setTags')); $core->addBehavior('adminAfterPostUpdate',array('tagsBehaviors','setTags')); $core->addBehavior('adminPostHeaders',array('tagsBehaviors','postHeaders')); $core->addBehavior('adminPostsActionsPage',array('tagsBehaviors','adminPostsActionsPage')); $core->addBehavior('adminPreferencesForm',array('tagsBehaviors','adminUserForm')); $core->addBehavior('adminBeforeUserOptionsUpdate',array('tagsBehaviors','setTagListFormat')); $core->addBehavior('adminUserForm',array('tagsBehaviors','adminUserForm')); $core->addBehavior('adminBeforeUserCreate',array('tagsBehaviors','setTagListFormat')); $core->addBehavior('adminBeforeUserUpdate',array('tagsBehaviors','setTagListFormat')); $core->addBehavior('coreInitWikiPost',array('tagsBehaviors','coreInitWikiPost')); $core->addBehavior('adminDashboardFavorites',array('tagsBehaviors','dashboardFavorites')); $core->addBehavior('adminPageHelpBlock', array('tagsBehaviors', 'adminPageHelpBlock')); # BEHAVIORS class tagsBehaviors { public static function adminPageHelpBlock($blocks) { $found = false; foreach($blocks as $block) { if ($block == 'core_post') { $found = true; break; } } if (!$found) { return null; } $blocks[] = 'tag_post'; } public static function dashboardFavorites($core,$favs) { $favs->register('tags', array( 'title' => __('Tags'), 'url' => 'plugin.php?p=tags&m=tags', 'small-icon' => 'index.php?pf=tags/icon.png', 'large-icon' => 'index.php?pf=tags/icon-big.png', 'permissions' => 'usage,contentadmin' )); } public static function coreInitWikiPost($wiki2xhtml) { $wiki2xhtml->registerFunction('url:tag',array('tagsBehaviors','wiki2xhtmlTag')); } public static function wiki2xhtmlTag($url,$content) { $url = substr($url,4); if (strpos($content,'tag:') === 0) { $content = substr($content,4); } $tag_url = html::stripHostURL($GLOBALS['core']->blog->url.$GLOBALS['core']->url->getURLFor('tag')); $res['url'] = $tag_url.'/'.rawurlencode(dcMeta::sanitizeMetaID($url)); $res['content'] = $content; return $res; } public static function tagsField($main,$sidebar,$post) { $meta =& $GLOBALS['core']->meta; if (!empty($_POST['post_tags'])) { $value = $_POST['post_tags']; } else { $value = ($post) ? $meta->getMetaStr($post->post_meta,'tag') : ''; } $sidebar['metas-box']['items']['post_tags']= '
        '. '
        '.form::textarea('post_tags',20,3,$value,'maximal').'
        '; } public static function setTags($cur,$post_id) { $post_id = (integer) $post_id; if (isset($_POST['post_tags'])) { $tags = $_POST['post_tags']; $meta =& $GLOBALS['core']->meta; $meta->delPostMeta($post_id,'tag'); foreach ($meta->splitMetaValues($tags) as $tag) { $meta->setPostMeta($post_id,'tag',$tag); } } } public static function adminPostsActionsPage($core,$ap) { $ap->addAction( array(__('Tags') => array(__('Add tags') => 'tags')), array('tagsBehaviors','adminAddTags') ); if ($core->auth->check('delete,contentadmin',$core->blog->id)) { $ap->addAction( array(__('Tags') => array(__('Remove tags') => 'tags_remove')), array('tagsBehaviors','adminRemoveTags') ); } } public static function adminAddTags($core, dcPostsActionsPage $ap, $post) { if (!empty($post['new_tags'])) { $meta =& $core->meta; $tags = $meta->splitMetaValues($post['new_tags']); $posts = $ap->getRS(); while ($posts->fetch()) { # Get tags for post $post_meta = $meta->getMetadata(array( 'meta_type' => 'tag', 'post_id' => $posts->post_id)); $pm = array(); while ($post_meta->fetch()) { $pm[] = $post_meta->meta_id; } foreach ($tags as $t) { if (!in_array($t,$pm)) { $meta->setPostMeta($posts->post_id,'tag',$t); } } } dcPage::addSuccessNotice(sprintf( __( 'Tag has been successfully added to selected entries', 'Tags have been successfully added to selected entries', count($tags)) ) ); $ap->redirect(true); } else { $tag_url = $core->blog->url.$core->url->getURLFor('tag'); $opts = $core->auth->getOptions(); $type = isset($opts['tag_list_format']) ? $opts['tag_list_format'] : 'more'; $ap->beginPage( dcPage::breadcrumb( array( html::escapeHTML($core->blog->name) => '', __('Entries') => $ap->getRedirection(true), __('Add tags to this selection') => '' )), dcPage::jsLoad('js/jquery/jquery.autocomplete.js'). dcPage::jsMetaEditor(). '\n". ''. ''. '\n". '' ); echo '
        '. $ap->getCheckboxes(). '
        '. form::textarea('new_tags',60,3). '
        '. $core->formNonce().$ap->getHiddenFields(). form::hidden(array('action'),'tags'). '

        '. '
        '; $ap->endPage(); } } public static function adminRemoveTags($core, dcPostsActionsPage $ap, $post) { if (!empty($post['meta_id']) && $core->auth->check('delete,contentadmin',$core->blog->id)) { $meta =& $core->meta; $posts = $ap->getRS(); while ($posts->fetch()) { foreach ($_POST['meta_id'] as $v) { $meta->delPostMeta($posts->post_id,'tag',$v); } } dcPage::addSuccessNotice(sprintf( __( 'Tag has been successfully removed from selected entries', 'Tags have been successfully removed from selected entries', count($_POST['meta_id'])) ) ); $ap->redirect(true); } else { $meta =& $core->meta; $tags = array(); foreach ($ap->getIDS() as $id) { $post_tags = $meta->getMetadata(array( 'meta_type' => 'tag', 'post_id' => (integer) $id))->toStatic()->rows(); foreach ($post_tags as $v) { if (isset($tags[$v['meta_id']])) { $tags[$v['meta_id']]++; } else { $tags[$v['meta_id']] = 1; } } } if (empty($tags)) { throw new Exception(__('No tags for selected entries')); } $ap->beginPage( dcPage::breadcrumb( array( html::escapeHTML($core->blog->name) => '', __('Entries') => 'posts.php', __('Remove selected tags from this selection') => '' ))); $posts_count = count($_POST['entries']); echo '
        '. $ap->getCheckboxes(). '

        '.__('Following tags have been found in selected entries:').'

        '; foreach ($tags as $k => $n) { $label = ''; if ($posts_count == $n) { $label = sprintf($label,'%s','%s'); } echo '

        '.sprintf($label, form::checkbox(array('meta_id[]'),html::escapeHTML($k)), html::escapeHTML($k)). '

        '; } echo '

        '. $core->formNonce().$ap->getHiddenFields(). form::hidden(array('action'),'tags_remove'). '

        '; $ap->endPage(); } } public static function postHeaders() { $tag_url = $GLOBALS['core']->blog->url.$GLOBALS['core']->url->getURLFor('tag'); $opts = $GLOBALS['core']->auth->getOptions(); $type = isset($opts['tag_list_format']) ? $opts['tag_list_format'] : 'more'; return '\n". ''. ''. '\n". ''; } public static function adminUserForm($args) { if ($args instanceof dcCore) { $opts = $args->auth->getOptions(); } elseif ($args instanceof record) { $opts = $args->options(); } else { $opts = array(); } $combo = array(); $combo[__('Short')] = 'more'; $combo[__('Extended')] = 'all'; $value = array_key_exists('tag_list_format',$opts) ? $opts['tag_list_format'] : 'more'; echo '

        '. form::combo('user_tag_list_format',$combo,$value). '

        '; } public static function setTagListFormat($cur,$user_id = null) { if (!is_null($user_id)) { $cur->user_options['tag_list_format'] = $_POST['user_tag_list_format']; } } } dotclear-2.6.2+dfsg/plugins/tags/_define.php000066400000000000000000000012121230033266200207470ustar00rootroot00000000000000registerModule( /* Name */ "Tags", /* Description*/ "Tags for posts", /* Author */ "Olivier Meunier", /* Version */ '1.2.1', array( 'permissions' => 'usage,contentadmin', 'priority' => 998, 'type' => 'plugin' ) ); dotclear-2.6.2+dfsg/plugins/tags/_prepend.php000066400000000000000000000012121230033266200211520ustar00rootroot00000000000000url->register('tag', 'tag', '^tag/(.+)$', array('urlTags', 'tag')); $core->url->register('tags', 'tags', '^tags$', array('urlTags', 'tags')); $core->url->register('tag_feed', 'feed/tag', '^feed/tag/(.+)$', array('urlTags', 'tagFeed')); dotclear-2.6.2+dfsg/plugins/tags/_public.php000066400000000000000000000250221230033266200210000ustar00rootroot00000000000000tpl->addBlock('Tags',array('tplTags','Tags')); $core->tpl->addBlock('TagsHeader',array('tplTags','TagsHeader')); $core->tpl->addBlock('TagsFooter',array('tplTags','TagsFooter')); $core->tpl->addBlock('EntryTags',array('tplTags','EntryTags')); $core->tpl->addBlock('TagIf',array('tplTags','TagIf')); $core->tpl->addValue('TagID',array('tplTags','TagID')); $core->tpl->addValue('TagCount',array('tplTags','TagCount')); $core->tpl->addValue('TagPercent',array('tplTags','TagPercent')); $core->tpl->addValue('TagRoundPercent',array('tplTags','TagRoundPercent')); $core->tpl->addValue('TagURL',array('tplTags','TagURL')); $core->tpl->addValue('TagCloudURL',array('tplTags','TagCloudURL')); $core->tpl->addValue('TagFeedURL',array('tplTags','TagFeedURL')); # Kept for backward compatibility (for now) $core->tpl->addBlock('MetaData',array('tplTags','Tags')); $core->tpl->addBlock('MetaDataHeader',array('tplTags','TagsHeader')); $core->tpl->addBlock('MetaDataFooter',array('tplTags','TagsFooter')); $core->tpl->addValue('MetaID',array('tplTags','TagID')); $core->tpl->addValue('MetaPercent',array('tplTags','TagPercent')); $core->tpl->addValue('MetaRoundPercent',array('tplTags','TagRoundPercent')); $core->tpl->addValue('MetaURL',array('tplTags','TagURL')); $core->tpl->addValue('MetaAllURL',array('tplTags','TagCloudURL')); $core->tpl->addBlock('EntryMetaData',array('tplTags','EntryTags')); $core->addBehavior('templateBeforeBlock',array('behaviorsTags','templateBeforeBlock')); $core->addBehavior('publicBeforeDocument',array('behaviorsTags','addTplPath')); class behaviorsTags { public static function templateBeforeBlock($core,$b,$attr) { if (($b == 'Entries' || $b == 'Comments') && isset($attr['tag'])) { return "prefix.'meta META ';\n". "\$params['sql'] .= 'AND META.post_id = P.post_id ';\n". "\$params['sql'] .= \"AND META.meta_type = 'tag' \";\n". "\$params['sql'] .= \"AND META.meta_id = '".$core->con->escape($attr['tag'])."' \";\n". "?>\n"; } elseif (empty($attr['no_context']) && ($b == 'Entries' || $b == 'Comments')) { return 'exists("meta") && ($_ctx->meta->meta_type == "tag")) { '. "if (!isset(\$params)) { \$params = array(); }\n". "if (!isset(\$params['from'])) { \$params['from'] = ''; }\n". "if (!isset(\$params['sql'])) { \$params['sql'] = ''; }\n". "\$params['from'] .= ', '.\$core->prefix.'meta META ';\n". "\$params['sql'] .= 'AND META.post_id = P.post_id ';\n". "\$params['sql'] .= \"AND META.meta_type = 'tag' \";\n". "\$params['sql'] .= \"AND META.meta_id = '\".\$core->con->escape(\$_ctx->meta->meta_id).\"' \";\n". "} ?>\n"; } } public static function addTplPath($core) { $core->tpl->setPath($core->tpl->getPath(), dirname(__FILE__).'/default-templates'); } } class tplTags { public static function Tags($attr,$content) { $type = isset($attr['type']) ? addslashes($attr['type']) : 'tag'; $limit = isset($attr['limit']) ? (integer) $attr['limit'] : 'null'; $sortby = 'meta_id_lower'; if (isset($attr['sortby']) && $attr['sortby'] == 'count') { $sortby = 'count'; } $order = 'asc'; if (isset($attr['order']) && $attr['order'] == 'desc') { $order = 'desc'; } $res = "meta = \$core->meta->computeMetaStats(\$core->meta->getMetadata(array('meta_type'=>'" .$type."','limit'=>".$limit."))); ". "\$_ctx->meta->sort('".$sortby."','".$order."'); ". '?>'; $res .= 'meta->fetch()) : ?>'.$content.'meta = null; ?>'; return $res; } public static function TagsHeader($attr,$content) { return "meta->isStart()) : ?>". $content. ""; } public static function TagsFooter($attr,$content) { return "meta->isEnd()) : ?>". $content. ""; } public static function EntryTags($attr,$content) { $type = isset($attr['type']) ? addslashes($attr['type']) : 'tag'; $sortby = 'meta_id_lower'; if (isset($attr['sortby']) && $attr['sortby'] == 'count') { $sortby = 'count'; } $order = 'asc'; if (isset($attr['order']) && $attr['order'] == 'desc') { $order = 'desc'; } $res = "meta = \$core->meta->getMetaRecordset(\$_ctx->posts->post_meta,'".$type."'); ". "\$_ctx->meta->sort('".$sortby."','".$order."'); ". '?>'; $res .= 'meta->fetch()) : ?>'.$content.'meta = null; ?>'; return $res; } public static function TagIf($attr,$content) { $if = array(); $operateur = isset($attr['operator']) ? dcTemplate::getOperator($attr['operator']) : '&&'; if (isset($attr['has_entries'])) { $sign = (boolean) $attr['has_entries'] ? '' : '!'; $if[] = $sign.'$_ctx->meta->count'; } if (!empty($if)) { return ''.$content.''; } else { return $content; } } public static function TagID($attr) { $f = $GLOBALS['core']->tpl->getFilters($attr); return 'meta->meta_id').'; ?>'; } public static function TagCount($attr) { return 'meta->count; ?>'; } public static function TagPercent($attr) { return 'meta->percent; ?>'; } public static function TagRoundPercent($attr) { return 'meta->roundpercent; ?>'; } public static function TagURL($attr) { $f = $GLOBALS['core']->tpl->getFilters($attr); return 'blog->url.$core->url->getURLFor("tag",'. 'rawurlencode($_ctx->meta->meta_id))').'; ?>'; } public static function TagCloudURL($attr) { $f = $GLOBALS['core']->tpl->getFilters($attr); return 'blog->url.$core->url->getURLFor("tags")').'; ?>'; } public static function TagFeedURL($attr) { $type = !empty($attr['type']) ? $attr['type'] : 'rss2'; if (!preg_match('#^(rss2|atom)$#',$type)) { $type = 'rss2'; } $f = $GLOBALS['core']->tpl->getFilters($attr); return 'blog->url.$core->url->getURLFor("tag_feed",'. 'rawurlencode($_ctx->meta->meta_id)."/'.$type.'")').'; ?>'; } # Widget function public static function tagsWidget($w) { global $core; if (($w->homeonly == 1 && $core->url->type != 'default') || ($w->homeonly == 2 && $core->url->type == 'default')) { return; } $params = array('meta_type' => 'tag'); if ($w->limit !== '') { $params['limit'] = abs((integer) $w->limit); } $rs = $core->meta->computeMetaStats( $core->meta->getMetadata($params)); if ($rs->isEmpty()) { return; } $sort = $w->sortby; if (!in_array($sort,array('meta_id_lower','count'))) { $sort = 'meta_id_lower'; } $order = $w->orderby; if ($order != 'asc') { $order = 'desc'; } $rs->sort($sort,$order); $res = ($w->content_only ? '' : '
        '). ($w->title ? '

        '.html::escapeHTML($w->title).'

        ' : ''). ''; if ($core->url->getBase('tags') && !is_null($w->alltagslinktitle) && $w->alltagslinktitle !== '') { $res .= '

        '. html::escapeHTML($w->alltagslinktitle).'

        '; } $res .= ($w->content_only ? '' : '
        '); return $res; } } class urlTags extends dcUrlHandlers { public static function tag($args) { $n = self::getPageNumber($args); if ($args == '' && !$n) { self::p404(); } elseif (preg_match('%(.*?)/feed/(rss2|atom)?$%u',$args,$m)) { $type = $m[2] == 'atom' ? 'atom' : 'rss2'; $mime = 'application/xml'; $comments = !empty($m[3]); $GLOBALS['_ctx']->meta = $GLOBALS['core']->meta->computeMetaStats( $GLOBALS['core']->meta->getMetadata(array( 'meta_type' => 'tag', 'meta_id' => $m[1]))); if ($GLOBALS['_ctx']->meta->isEmpty()) { self::p404(); } else { $tpl = $type; if ($type == 'atom') { $mime = 'application/atom+xml'; } self::serveDocument($tpl.'.xml',$mime); } } else { if ($n) { $GLOBALS['_page_number'] = $n; } $GLOBALS['_ctx']->meta = $GLOBALS['core']->meta->computeMetaStats( $GLOBALS['core']->meta->getMetadata(array( 'meta_type' => 'tag', 'meta_id' => $args))); if ($GLOBALS['_ctx']->meta->isEmpty()) { self::p404(); } else { self::serveDocument('tag.html'); } } } public static function tags($args) { self::serveDocument('tags.html'); } public static function tagFeed($args) { if (!preg_match('#^(.+)/(atom|rss2)(/comments)?$#',$args,$m)) { self::p404(); } else { $tag = $m[1]; $type = $m[2]; $comments = !empty($m[3]); $GLOBALS['_ctx']->meta = $GLOBALS['core']->meta->computeMetaStats( $GLOBALS['core']->meta->getMetadata(array( 'meta_type' => 'tag', 'meta_id' => $tag))); if ($GLOBALS['_ctx']->meta->isEmpty()) { # The specified tag does not exist. self::p404(); } else { $GLOBALS['_ctx']->feed_subtitle = ' - '.__('Tag').' - '.$GLOBALS['_ctx']->meta->meta_id; if ($type == 'atom') { $mime = 'application/atom+xml'; } else { $mime = 'application/xml'; } $tpl = $type; if ($comments) { $tpl .= '-comments'; $GLOBALS['_ctx']->nb_comment_per_page = $GLOBALS['core']->blog->settings->system->nb_comment_per_feed; } else { $GLOBALS['_ctx']->nb_entry_per_page = $GLOBALS['core']->blog->settings->system->nb_post_per_feed; $GLOBALS['_ctx']->short_feed_items = $GLOBALS['core']->blog->settings->system->short_feed_items; } $tpl .= '.xml'; self::serveDocument($tpl,$mime); } } } } dotclear-2.6.2+dfsg/plugins/tags/_widgets.php000066400000000000000000000030601230033266200211660ustar00rootroot00000000000000addBehavior('initWidgets',array('tagsWidgets','initWidgets')); $core->addBehavior('initDefaultWidgets',array('tagsWidgets','initDefaultWidgets')); class tagsWidgets { public static function initWidgets($w) { $w->create('tags',__('Tags'),array('tplTags','tagsWidget'),null,'Tags cloud'); $w->tags->setting('title',__('Title (optional)').' :',__('Tags')); $w->tags->setting('limit',__('Limit (empty means no limit):'),'20'); $w->tags->setting('sortby',__('Order by:'),'meta_id_lower','combo', array(__('Tag name') => 'meta_id_lower', __('Entries count') => 'count') ); $w->tags->setting('orderby',__('Sort:'),'asc','combo', array(__('Ascending') => 'asc', __('Descending') => 'desc') ); $w->tags->setting('alltagslinktitle',__('Link to all tags:'),__('All tags')); $w->tags->setting('homeonly',__('Display on:'),0,'combo', array( __('All pages') => 0, __('Home page only') => 1, __('Except on home page') => 2 ) ); $w->tags->setting('content_only',__('Content only'),0,'check'); $w->tags->setting('class',__('CSS class:'),''); } public static function initDefaultWidgets($w,$d) { $d['nav']->append($w->tags); } } dotclear-2.6.2+dfsg/plugins/tags/_xmlrpc.php000066400000000000000000000025371230033266200210350ustar00rootroot00000000000000addBehavior('xmlrpcGetPostInfo',array('tagsXMLRPCbehaviors','getPostInfo')); $core->addBehavior('xmlrpcAfterNewPost',array('tagsXMLRPCbehaviors','editPost')); $core->addBehavior('xmlrpcAfterEditPost',array('tagsXMLRPCbehaviors','editPost')); class tagsXMLRPCbehaviors { public static function getPostInfo($x,$type,$res) { $res =& $res[0]; $rs = $x->core->meta->getMetadata(array( 'meta_type' => 'tag', 'post_id' => $res['postid'])); $m = array(); while($rs->fetch()) { $m[] = $rs->meta_id; } $res['mt_keywords'] = implode(', ',$m); } # Same function for newPost and editPost public static function editPost($x,$post_id,$cur,$content,$struct,$publish) { # Check if we have mt_keywords in struct if (isset($struct['mt_keywords'])) { $x->core->meta->delPostMeta($post_id,'tag'); foreach ($x->core->meta->splitMetaValues($struct['mt_keywords']) as $m) { $x->core->meta->setPostMeta($post_id,'tag',$m); } } } } dotclear-2.6.2+dfsg/plugins/tags/default-templates/000077500000000000000000000000001230033266200222715ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/tags/default-templates/tag.html000066400000000000000000000142241230033266200237350ustar00rootroot00000000000000 {{tpl:lang Tag}} - {{tpl:TagID}} - {{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf> - {{tpl:lang page}} {{tpl:PaginationCurrent}}" /> {{tpl:include src="_head.html"}}
        {{tpl:include src="_top.html"}}

        {{tpl:lang Tag}} - {{tpl:TagID}}

        {{tpl:lang Entries feed}} - {{tpl:lang Comments feed}}

        {{tpl:EntryDate}}

        {{tpl:EntryTitle encode_html="1"}}

        {{tpl:SysBehavior behavior="publicEntryBeforeContent"}}
        {{tpl:EntryExcerpt}}

        {{tpl:lang Continue reading}}...

        {{tpl:EntryContent}}
        {{tpl:SysBehavior behavior="publicEntryAfterContent"}}

        - {{tpl:lang page}} {{tpl:PaginationCurrent}} {{tpl:lang of}} {{tpl:PaginationCounter}} -

        {{tpl:include src="_footer.html"}}
        dotclear-2.6.2+dfsg/plugins/tags/default-templates/tags.html000066400000000000000000000043641230033266200241240ustar00rootroot00000000000000 {{tpl:lang Tags}} - {{tpl:BlogName encode_html="1"}} {{tpl:include src="_head.html"}}
        {{tpl:include src="_top.html"}}

        {{tpl:lang Tags}}

        {{tpl:include src="_footer.html"}}
        dotclear-2.6.2+dfsg/plugins/tags/icon-big.png000066400000000000000000000012531230033266200210470ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<MIDATx?N0ۈT=B# l 3C 202H GHK@“g6 Y]!|3Y&HT,!Yku %H{g* R$YW$@791 All^p7f0V`W3Bm:  84/ə %!%. ylb4K.ӌ4CilsE5IENDB`dotclear-2.6.2+dfsg/plugins/tags/img/000077500000000000000000000000001230033266200174255ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/tags/img/loader.gif000066400000000000000000000033111230033266200213600ustar00rootroot00000000000000GIF89aӽ٥⢢η뮮ۼ͜ೳӠߵƫк׶ο׹ѵڝܘզƩģ! NETSCAPE2.0!Created with ajaxload.info! ,#)-$*.6:7 %+/70=66 =?= 3@? ;E7A>B;>CD ;+F &03 8<݄!'14,< "PF`! ,;WX []<U Y-\$_&JOSHTJ^*\GP2 #7HKQ:6L=FF'MijNA:bIT@?R/D924I ::/E`ӃA&V,ZJCaTT9Ij! , i^,CK jl8^ghQCRk "dNJnj2H0T.-435GЄ`eC6:f:=σG5AT770/6@C(CBA;@/܆F r Z@! ,?(N!lG9'g[jNJA#HlF=B]ON*#F`8"p A/`9"07qE "T=36n F o)! ,aoe&? +qe4H2D< @33 %F8<;J @@ce[l>8TBjuaB7KAǐ0Cv^ ur6b?ՅY)3T3+'s 6F0:.ntn830֭! ,0@9(+ATA8cJq >`GT6:"VVA6@>/B4eb= oRTD3>hF^M'0F7BLd63Ӑ]jl7ۅ&NG+TTc1SOJvwn\-Yr;"0:TD AB8Q"6/37;(I@0=:GJ73QfA6D,<3e34.1&2*^Z\3#*N DK$+C9 \T6Jc -:gY(DZe u,AKXqoPt2Q=FAl!+ OjLM^aG1N\@ÕA;dotclear-2.6.2+dfsg/plugins/tags/img/tag-add.png000066400000000000000000000003671230033266200214420ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb`=ǃj)Gr4@]B6 @ j1R5@fj3`R;4T,@j HQFI籸?I!I |$q|' R6k@?LЎIENDB`dotclear-2.6.2+dfsg/plugins/tags/index.php000066400000000000000000000011021230033266200204630ustar00rootroot00000000000000 1 && !select.visible() ) { onChange(0, true); } } }).bind("search", function() { // TODO why not just specifying both arguments? var fn = (arguments.length > 1) ? arguments[1] : null; function findValueCallback(q, data) { var result; if( data && data.length ) { for (var i=0; i < data.length; i++) { if( data[i].result.toLowerCase() == q.toLowerCase() ) { result = data[i]; break; } } } if( typeof fn == "function" ) fn(result); else $input.trigger("result", result && [result.data, result.value]); } $.each(trimWords($input.val()), function(i, value) { request(value, findValueCallback, findValueCallback); }); }).bind("flushCache", function() { cache.flush(); }).bind("setOptions", function() { $.extend(true, options, arguments[1]); // if we've updated the data, repopulate if ( "data" in arguments[1] ) cache.populate(); }).bind("unautocomplete", function() { select.unbind(); $input.unbind(); $(input.form).unbind(".autocomplete"); }); function selectCurrent() { var selected = select.selected(); if( !selected ) return false; var v = selected.result; previousValue = v; if ( options.multiple ) { var words = trimWords($input.val()); if ( words.length > 1 ) { var seperator = options.multipleSeparator.length; var cursorAt = $(input).selection().start; var wordAt, progress = 0; $.each(words, function(i, word) { progress += word.length; if (cursorAt <= progress) { wordAt = i; return false; } progress += seperator; }); words[wordAt] = v; // TODO this should set the cursor to the right position, but it gets overriden somewhere //$.Autocompleter.Selection(input, progress + seperator, progress + seperator); v = words.join( options.multipleSeparator ); } v += options.multipleSeparator; } $input.val(v); hideResultsNow(); $input.trigger("result", [selected.data, selected.value]); return true; } function onChange(crap, skipPrevCheck) { if( lastKeyPressCode == KEY.DEL ) { select.hide(); return; } var currentValue = $input.val(); if ( !skipPrevCheck && currentValue == previousValue ) return; previousValue = currentValue; currentValue = lastWord(currentValue); if ( currentValue.length >= options.minChars) { $input.addClass(options.loadingClass); if (!options.matchCase) currentValue = currentValue.toLowerCase(); request(currentValue, receiveData, hideResultsNow); } else { stopLoading(); select.hide(); } }; function trimWords(value) { if (!value) return [""]; if (!options.multiple) return [$.trim(value)]; return $.map(value.split(options.multipleSeparator), function(word) { return $.trim(value).length ? $.trim(word) : null; }); } function lastWord(value) { if ( !options.multiple ) return value; var words = trimWords(value); if (words.length == 1) return words[0]; var cursorAt = $(input).selection().start; if (cursorAt == value.length) { words = trimWords(value) } else { words = trimWords(value.replace(value.substring(cursorAt), "")); } return words[words.length - 1]; } // fills in the input box w/the first match (assumed to be the best match) // q: the term entered // sValue: the first matching result function autoFill(q, sValue){ // autofill in the complete box w/the first match as long as the user hasn't entered in more data // if the last user key pressed was backspace, don't autofill if( options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE ) { // fill in the value (keep the case the user has typed) $input.val($input.val() + sValue.substring(lastWord(previousValue).length)); // select the portion of the value not typed by the user (so the next character will erase) $(input).selection(previousValue.length, previousValue.length + sValue.length); } }; function hideResults() { clearTimeout(timeout); timeout = setTimeout(hideResultsNow, 200); }; function hideResultsNow() { var wasVisible = select.visible(); select.hide(); clearTimeout(timeout); stopLoading(); if (options.mustMatch) { // call search and run callback $input.search( function (result){ // if no value found, clear the input box if( !result ) { if (options.multiple) { var words = trimWords($input.val()).slice(0, -1); $input.val( words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "") ); } else { $input.val( "" ); $input.trigger("result", null); } } } ); } }; function receiveData(q, data) { if ( data && data.length && hasFocus ) { stopLoading(); select.display(data, q); autoFill(q, data[0].value); select.show(); } else { hideResultsNow(); } }; function request(term, success, failure) { if (!options.matchCase) term = term.toLowerCase(); var data = cache.load(term); // recieve the cached data if (data) { if(data.length) { success(term, data); } else{ var parsed = options.parse && options.parse(options.noRecord) || parse(options.noRecord); success(term,parsed); } // if an AJAX url has been supplied, try loading the data now } else if( (typeof options.url == "string") && (options.url.length > 0) ){ var extraParams = { timestamp: +new Date() }; $.each(options.extraParams, function(key, param) { extraParams[key] = typeof param == "function" ? param() : param; }); $.ajax({ // try to leverage ajaxQueue plugin to abort previous requests mode: "abort", // limit abortion to this input port: "autocomplete" + input.name, dataType: options.dataType, url: options.url, data: $.extend({ q: lastWord(term), limit: options.max }, extraParams), success: function(data) { var parsed = options.parse && options.parse(data) || parse(data); cache.add(term, parsed); success(term, parsed); } }); } else { // if we have a failure, we need to empty the list -- this prevents the the [TAB] key from selecting the last successful match select.emptyList(); if(globalFailure != null) { globalFailure(); } else { failure(term); } } }; function parse(data) { var parsed = []; var rows = data.split("\n"); for (var i=0; i < rows.length; i++) { var row = $.trim(rows[i]); if (row) { row = row.split("|"); parsed[parsed.length] = { data: row, value: row[0], result: options.formatResult && options.formatResult(row, row[0]) || row[0] }; } } return parsed; }; function stopLoading() { $input.removeClass(options.loadingClass); }; }; $.Autocompleter.defaults = { inputClass: "ac_input", resultsClass: "ac_results", loadingClass: "ac_loading", minChars: 1, delay: 400, matchCase: false, matchSubset: true, matchContains: false, cacheLength: 100, max: 1000, mustMatch: false, extraParams: {}, selectFirst: true, formatItem: function(row) { return row[0]; }, formatMatch: null, autoFill: false, width: 0, multiple: false, multipleSeparator: " ", inputFocus: true, clickFire: false, highlight: function(value, term) { return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "$1"); }, scroll: true, scrollHeight: 180, scrollJumpPosition: true }; $.Autocompleter.Cache = function(options) { var data = {}; var length = 0; function matchSubset(s, sub) { if (!options.matchCase) s = s.toLowerCase(); var i = s.indexOf(sub); if (options.matchContains == "word"){ i = s.toLowerCase().search("\\b" + sub.toLowerCase()); } if (i == -1) return false; return i == 0 || options.matchContains; }; function add(q, value) { if (length > options.cacheLength){ flush(); } if (!data[q]){ length++; } data[q] = value; } function populate(){ if( !options.data ) return false; // track the matches var stMatchSets = {}, nullData = 0; // no url was specified, we need to adjust the cache length to make sure it fits the local data store if( !options.url ) options.cacheLength = 1; // track all options for minChars = 0 stMatchSets[""] = []; // loop through the array and create a lookup structure for ( var i = 0, ol = options.data.length; i < ol; i++ ) { var rawValue = options.data[i]; // if rawValue is a string, make an array otherwise just reference the array rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue; var value = options.formatMatch(rawValue, i+1, options.data.length); if ( typeof(value) === 'undefined' || value === false ) continue; var firstChar = value.charAt(0).toLowerCase(); // if no lookup array for this character exists, look it up now if( !stMatchSets[firstChar] ) stMatchSets[firstChar] = []; // if the match is a string var row = { value: value, data: rawValue, result: options.formatResult && options.formatResult(rawValue) || value }; // push the current match into the set list stMatchSets[firstChar].push(row); // keep track of minChars zero items if ( nullData++ < options.max ) { stMatchSets[""].push(row); } }; // add the data items to the cache $.each(stMatchSets, function(i, value) { // increase the cache size options.cacheLength++; // add to the cache add(i, value); }); } // populate any existing data setTimeout(populate, 25); function flush(){ data = {}; length = 0; } return { flush: flush, add: add, populate: populate, load: function(q) { if (!options.cacheLength || !length) return null; /* * if dealing w/local data and matchContains than we must make sure * to loop through all the data collections looking for matches */ if( !options.url && options.matchContains ){ // track all matches var csub = []; // loop through all the data grids for matches for( var k in data ){ // don't search through the stMatchSets[""] (minChars: 0) cache // this prevents duplicates if( k.length > 0 ){ var c = data[k]; $.each(c, function(i, x) { // if we've got a match, add it to the array if (matchSubset(x.value, q)) { csub.push(x); } }); } } return csub; } else // if the exact item exists, use it if (data[q]){ return data[q]; } else if (options.matchSubset) { for (var i = q.length - 1; i >= options.minChars; i--) { var c = data[q.substr(0, i)]; if (c) { var csub = []; $.each(c, function(i, x) { if (matchSubset(x.value, q)) { csub[csub.length] = x; } }); return csub; } } } return null; } }; }; $.Autocompleter.Select = function (options, input, select, config) { var CLASSES = { ACTIVE: "ac_over" }; var listItems, active = -1, data, term = "", needsInit = true, element, list; // Create results function init() { if (!needsInit) return; element = $("
        ") .hide() .addClass(options.resultsClass) .css("position", "absolute") .appendTo(document.body) .hover(function(event) { // Browsers except FF do not fire mouseup event on scrollbars, resulting in mouseDownOnSelect remaining true, and results list not always hiding. if($(this).is(":visible")) { input.focus(); } config.mouseDownOnSelect = false; }); list = $("
          ").appendTo(element).mouseover( function(event) { if(target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') { active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event)); $(target(event)).addClass(CLASSES.ACTIVE); } }).click(function(event) { $(target(event)).addClass(CLASSES.ACTIVE); select(); if( options.inputFocus ) input.focus(); return false; }).mousedown(function() { config.mouseDownOnSelect = true; }).mouseup(function() { config.mouseDownOnSelect = false; }); if( options.width > 0 ) element.css("width", options.width); needsInit = false; } function target(event) { var element = event.target; while(element && element.tagName != "LI") element = element.parentNode; // more fun with IE, sometimes event.target is empty, just ignore it then if(!element) return []; return element; } function moveSelect(step) { listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE); movePosition(step); var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE); if(options.scroll) { var offset = 0; listItems.slice(0, active).each(function() { offset += this.offsetHeight; }); if((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) { list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight()); } else if(offset < list.scrollTop()) { list.scrollTop(offset); } } }; function movePosition(step) { if (options.scrollJumpPosition || (!options.scrollJumpPosition && !((step < 0 && active == 0) || (step > 0 && active == listItems.size() - 1)) )) { active += step; if (active < 0) { active = listItems.size() - 1; } else if (active >= listItems.size()) { active = 0; } } } function limitNumberOfItems(available) { return options.max && options.max < available ? options.max : available; } function fillList() { list.empty(); var max = limitNumberOfItems(data.length); for (var i=0; i < max; i++) { if (!data[i]) continue; var formatted = options.formatItem(data[i].data, i+1, max, data[i].value, term); if ( formatted === false ) continue; var li = $("
        • ").html( options.highlight(formatted, term) ).addClass(i%2 == 0 ? "ac_even" : "ac_odd").appendTo(list)[0]; $.data(li, "ac_data", data[i]); } listItems = list.find("li"); if ( options.selectFirst ) { listItems.slice(0, 1).addClass(CLASSES.ACTIVE); active = 0; } // apply bgiframe if available if ( $.fn.bgiframe ) list.bgiframe(); } return { display: function(d, q) { init(); data = d; term = q; fillList(); }, next: function() { moveSelect(1); }, prev: function() { moveSelect(-1); }, pageUp: function() { if (active != 0 && active - 8 < 0) { moveSelect( -active ); } else { moveSelect(-8); } }, pageDown: function() { if (active != listItems.size() - 1 && active + 8 > listItems.size()) { moveSelect( listItems.size() - 1 - active ); } else { moveSelect(8); } }, hide: function() { element && element.hide(); listItems && listItems.removeClass(CLASSES.ACTIVE); active = -1; }, visible : function() { return element && element.is(":visible"); }, current: function() { return this.visible() && (listItems.filter("." + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]); }, show: function() { var offset = $(input).offset(); element.css({ width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(), top: offset.top + input.offsetHeight, left: offset.left }).show(); if(options.scroll) { list.scrollTop(0); list.css({ maxHeight: options.scrollHeight, overflow: 'auto' }); if(navigator.userAgent.indexOf("MSIE") != -1 && typeof document.body.style.maxHeight === "undefined") { var listHeight = 0; listItems.each(function() { listHeight += this.offsetHeight; }); var scrollbarsVisible = listHeight > options.scrollHeight; list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight ); if (!scrollbarsVisible) { // IE doesn't recalculate width when scrollbar disappears listItems.width( list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")) ); } } } }, selected: function() { var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE); return selected && selected.length && $.data(selected[0], "ac_data"); }, emptyList: function (){ list && list.empty(); }, unbind: function() { element && element.remove(); } }; }; $.fn.selection = function(start, end) { if (start !== undefined) { return this.each(function() { if( this.createTextRange ){ var selRange = this.createTextRange(); if (end === undefined || start == end) { selRange.move("character", start); selRange.select(); } else { selRange.collapse(true); selRange.moveStart("character", start); selRange.moveEnd("character", end); selRange.select(); } } else if( this.setSelectionRange ){ this.setSelectionRange(start, end); } else if( this.selectionStart ){ this.selectionStart = start; this.selectionEnd = end; } }); } var field = this[0]; if ( field.createTextRange ) { var range = document.selection.createRange(), orig = field.value, teststring = "<->", textLength = range.text.length; range.text = teststring; var caretAt = field.value.indexOf(teststring); field.value = orig; this.selection(caretAt, caretAt + textLength); return { start: caretAt, end: caretAt + textLength } } else if( field.selectionStart !== undefined ){ return { start: field.selectionStart, end: field.selectionEnd } } }; })(jQuery); dotclear-2.6.2+dfsg/plugins/tags/js/post.js000066400000000000000000000060751230033266200206200ustar00rootroot00000000000000$(function() { $('#edit-entry').onetabload(function() { var tags_edit = $('#tags-edit'); var post_id = $('#id'); var meta_field = null; if (tags_edit.length > 0) { post_id = (post_id.length > 0) ? post_id.get(0).value : false; if (post_id == false) { meta_field = $(''); meta_field.val($('#post_tags').val()); } var mEdit = new metaEditor(tags_edit,meta_field,'tag',editor_tags_options); mEdit.meta_url = 'plugin.php?p=tags&m=tag_posts&tag='; mEdit.displayMeta('tag',post_id); // mEdit object reference for toolBar window.dc_tag_editor = mEdit; } $('#post_meta_input').autocomplete(mEdit.service_uri, { extraParams: { 'f': 'searchMeta', 'metaType': 'tag' }, delay: 1000, multiple: true, multipleSeparator: ", ", matchSubset: false, matchContains: true, parse: function(xml) { var results = []; $(xml).find('meta').each(function(){ results[results.length] = { data: { "id": $(this).text(), "count": $(this).attr("count"), "percent": $(this).attr("roundpercent") }, result: $(this).text() }; }); return results; }, formatItem: function(tag) { return tag.id + ' (' + dotclear.msg.tags_autocomplete. replace('%p',tag.percent). replace('%e',tag.count + ' ' + (tag.count > 1 ? dotclear.msg.entries : dotclear.msg.entry) ) + ')'; }, formatResult: function(tag) { return tag.result; } }); }); $('h5 .s-tags').toggleWithLegend($('.s-tags').not('label'),{ user_pref: 'post_tags', legend_click: true }); }); // Toolbar button for tags jsToolBar.prototype.elements.tagSpace = { type: 'space', format:{ wysiwyg:true, wiki:true, xhtml:true } }; jsToolBar.prototype.elements.tag = {type: 'button', title: 'Keyword', fn:{} }; jsToolBar.prototype.elements.tag.context = 'post'; jsToolBar.prototype.elements.tag.icon = 'index.php?pf=tags/img/tag-add.png'; jsToolBar.prototype.elements.tag.fn.wiki = function() { this.encloseSelection('','',function(str) { if (str == '') { window.alert(dotclear.msg.no_selection); return ''; } if (str.indexOf(',') != -1) { return str; } else { window.dc_tag_editor.addMeta(str); return '['+str+'|tag:'+str+']'; } }); }; jsToolBar.prototype.elements.tag.fn.xhtml = function() { var url = this.elements.tag.url; this.encloseSelection('','',function(str) { if (str == '') { window.alert(dotclear.msg.no_selection); return ''; } if (str.indexOf(',') != -1) { return str; } else { window.dc_tag_editor.addMeta(str); return ''+str+''; } }); }; jsToolBar.prototype.elements.tag.fn.wysiwyg = function() { var t = this.getSelectedText(); if (t == '') { window.alert(dotclear.msg.no_selection); return; } if (t.indexOf(',') != -1) { return; } var n = this.getSelectedNode(); var a = document.createElement('a'); a.href = this.stripBaseURL(this.elements.tag.url+'/'+t); a.appendChild(n); this.insertNode(a); window.dc_tag_editor.addMeta(t); }; dotclear-2.6.2+dfsg/plugins/tags/js/posts_actions.js000066400000000000000000000027051230033266200225170ustar00rootroot00000000000000$(function() { var tag_field = $('#new_tags'); tag_field.after('
          '); tag_field.hide(); var target = $('#tags_list'); var mEdit = new metaEditor(target,tag_field,'tag',editor_tags_options); mEdit.meta_url = 'plugin.php?p=tags&m=tag_posts&tag='; mEdit.meta_dialog = $(''); mEdit.meta_dialog.attr('title',mEdit.text_add_meta.replace(/%s/,mEdit.meta_type)); mEdit.meta_dialog.attr('id','post_meta_input'); mEdit.meta_dialog.css('width','90%'); mEdit.addMetaDialog(); $('input[name="save_tags"]').click(function() { tag_field.val($('#post_meta_input').val()); }); $('#post_meta_input').autocomplete(mEdit.service_uri, { extraParams: { 'f': 'searchMeta', 'metaType': 'tag' }, delay: 1000, multiple: true, matchSubset: false, matchContains: true, parse: function(xml) { var results = []; $(xml).find('meta').each(function(){ results[results.length] = { data: { "id": $(this).text(), "count": $(this).attr("count"), "percent": $(this).attr("roundpercent") }, result: $(this).text() }; }); return results; }, formatItem: function(tag) { return tag.id + ' (' + dotclear.msg.tags_autocomplete. replace('%p',tag.percent). replace('%e',tag.count + ' ' + (tag.count > 1 ? dotclear.msg.entries : dotclear.msg.entry) ) + ')'; }, formatResult: function(tag) { return tag.result; } }); }); dotclear-2.6.2+dfsg/plugins/tags/locales/000077500000000000000000000000001230033266200202735ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/tags/locales/en/000077500000000000000000000000001230033266200206755ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/tags/locales/en/help/000077500000000000000000000000001230033266200216255ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/tags/locales/en/help/tag_post.html000066400000000000000000000007141230033266200243350ustar00rootroot00000000000000 Tags

          Tags

          You can assign a tag to an entry:

          • By filling the Tags field. This field has an autocomplete function: enter a few letters and the system will propose existing tags containing these letters;
          • By clicking on the Choose from list. Link to select existing tags.

          Tags have to be comma-separated.

          dotclear-2.6.2+dfsg/plugins/tags/locales/en/help/tag_posts.html000066400000000000000000000032211230033266200245140ustar00rootroot00000000000000 Tag details

          Available actions on a tag

          The first part of the page enables you to modify or delete a tag.

          Rename
          Enter a new word for the tag and click OK. This will modify all the entries containing this tag.
          Delete this tag
          This button will remove the tag from all the entries it is assigned to and will delete it from the tags list.

          List of entries with this tag

          From this list you can perform all the batch actions your user's permissions allow you to:

          • Publish: Publish the selected entries online.
          • Unpublish: Pull the selected entries offline.
          • Schedule: Schedule the selected entries to be set online at publication date.
          • Mark as pending: Mark selected entries as pending.
          • Mark as selected/unselected: Set the selected entries as selected/unselected./li>
          • Change category: Modify the category of the selected entries.
          • Change language: Modify the language of the selected entries.
          • Change author: Modify the selected entries' author by entering the new author's ID.
          • Delete: Delete the selected entries (this operation cannot be cancelled).
          • Add/Remove tags: Add or remove tags on the selected entries.

          The above list might contain other items if additional actions have been added by plugins active on your system.

          dotclear-2.6.2+dfsg/plugins/tags/locales/en/help/tags.html000066400000000000000000000005151230033266200234520ustar00rootroot00000000000000 Tags

          Tags list

          This page displays the list of tags used on the blog, alphabetically ordered.

          Tag details

          When clicking on a tag in this list, you will see all the entries this tag was added to and you will be able to rename or delete it.

          dotclear-2.6.2+dfsg/plugins/tags/locales/en/resources.php000066400000000000000000000013461230033266200234240ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/tags/locales/fr/000077500000000000000000000000001230033266200207025ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/tags/locales/fr/help/000077500000000000000000000000001230033266200216325ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/tags/locales/fr/help/tag_post.html000066400000000000000000000011311230033266200243340ustar00rootroot00000000000000 Tags

          Tags

          On peut affecter des mots-clés à un billet :

          • en remplissant le champ Mots-clés. Ce champ est doté d'une fonction d'auto-complétion : saisissez les premiers caractères, le système proposera les mots-clés existant déjà sur ce blog et comportant ces lettres ;
          • en cliquant sur le lien Liste des mots-clés pour choisir parmi ceux existant déjà sur le blog.

          Les mots-clés doivent être séparés par une virgule.

          dotclear-2.6.2+dfsg/plugins/tags/locales/fr/help/tag_posts.html000066400000000000000000000032311230033266200245220ustar00rootroot00000000000000 Détails d'un mot-clé

          Actions sur un mot-clé

          La première partie de la page permet de modifier ou supprimer un mot-clé.

          Renommer
          Indiquer un nouveau terme pour le mot-clé puis cliquer sur le bouton OK. La modification de ce terme se répercutera sur tous les billets concernés par ce mot-clé.
          Supprimer ce mot-clé
          Ce bouton enlèvera ce mot-clé de tous les billets concernés et le supprimera de la liste des mots-clés.

          Liste des billets avec ce mot-clé

          Depuis la liste des billets on peut procéder à toutes les actions par lot autorisées en fonction des permissions de l'utilisateur :

          • Publier : mettre le billet en ligne.
          • Hors ligne : mettre le billet hors ligne.
          • Programmer : programmer le billet pour mise en ligne à la date de publication.
          • En attente : en attente de publication.
          • Changer de catégorie : envoie sur la liste des catégories pour changer celle des billets sélectionnés.
          • Changer l'auteur : permet de changer l'auteur du billet en indiquant l'identifiant de l'utilisateur qui deviendra le nouvel auteur.
          • Supprimer : supprime le billet (cette opération est irréversible).

          Il se peut que la liste ci-dessus soit plus longue si d'autres actions possibles ont été ajoutées par des plugins activés sur votre installation.

          dotclear-2.6.2+dfsg/plugins/tags/locales/fr/help/tags.html000066400000000000000000000006571230033266200234660ustar00rootroot00000000000000 Mots-clés

          Liste des mots-clés

          Cette page affiche la liste des mots-clés utilisés sur le blog, triés dans l'ordre alphabétique.

          Détails d'un mot-clé

          En cliquant sur l'intitulé d'un mot-clé dans la liste on accède à la liste des billets auxquels ce mot-clé a été affecté et à la possibilité de le modifier ou supprimer.

          dotclear-2.6.2+dfsg/plugins/tags/locales/fr/resources.php000066400000000000000000000013461230033266200234310ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/tags/style.css000066400000000000000000000035641230033266200205330ustar00rootroot00000000000000.tag0 { } .tag10 { font-size: 140%; } .tag20 { font-size: 150%; } .tag30 { font-size: 160%; } .tag40 { font-size: 170%; } .tag50 { font-size: 180%; } .tag60 { font-size: 190%; } .tag70 { font-size: 200%; } .tag80 { font-size: 210%; } .tag90 { font-size: 220%; } .tag100 { font-size: 230%; } table.tags { margin-left: 3em; } tr.tagLetter span { font-size : 250%; border: none; display : block; width: 1ex; position: relative; top: 0.80em; left: -2ex; } ul.metaList { margin: 0 0 1em 0; padding: 0; } ul.metaList li { margin: 0; padding: 0; list-style: square; list-style-position: inside; } a.metaRemove { color : #999 !important; border: none; } a.metaRemove:hover, a.metaRemove:focus { color : #2373A8 !important; } .addMeta a { border: none; } .addMeta a:hover, .addMeta a:focus { background: #fc0; color: #000; } .addMeta a.metaGetMore { font-weight: bold; } /* Auto Complete */ .ac_results { padding: 0px; border: 1px dotted #f90; background-color: white; overflow: hidden; z-index: 99999; } .ac_results ul { width: 100%; list-style-position: outside; list-style: none; padding: 0; margin: 0; } .ac_results li { margin: 0px; padding: 2px 5px; cursor: default; display: block; /* if width will be 100% horizontal scrollbar will apear when scroll mode will be used */ /*width: 100%;*/ font: menu; font-size: 1em; /* it is very important, if line-height not setted or setted in relative units scroll will be broken in firefox */ line-height: 16px; overflow: hidden; } .ac_loading { background: transparent url('index.php?pf=tags/img/loader.gif') right center no-repeat; } .ac_odd { background-color: #eee; } .ac_over { background-color: #2373A8; color: white; } #post_meta_input:focus { -moz-box-sizing: content-box; } #tags-edit input[type=text] { width: 11.5em; } .tag-actions form { display: inline-block; margin-right: 1.5em; } dotclear-2.6.2+dfsg/plugins/tags/tag_posts.php000066400000000000000000000104021230033266200213620ustar00rootroot00000000000000meta->updateMeta($tag,$new_id,'tag')) { dcPage::addSuccessNotice(__('Tag has been successfully renamed')); http::redirect($p_url.'&m=tag_posts&tag='.$new_id); } } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Delete a tag if (!empty($_POST['delete']) && $core->auth->check('publish,contentadmin',$core->blog->id)) { try { $core->meta->delMeta($tag,'tag'); dcPage::addSuccessNotice(__('Tag has been successfully removed')); http::redirect($p_url.'&m=tags'); } catch (Exception $e) { $core->error->add($e->getMessage()); } } $params = array(); $params['limit'] = array((($page-1)*$nb_per_page),$nb_per_page); $params['no_content'] = true; $params['meta_id'] = $tag; $params['meta_type'] = 'tag'; $params['post_type'] = ''; # Get posts try { $posts = $core->meta->getPostsByMeta($params); $counter = $core->meta->getPostsByMeta($params,true); $post_list = new adminPostList($core,$posts,$counter->f(0)); } catch (Exception $e) { $core->error->add($e->getMessage()); } $posts_actions_page = new dcPostsActionsPage($core,'plugin.php',array('p'=>'tags', 'm'=>'tag_posts', 'tag'=> $tag)); if ($posts_actions_page->process()) { return; } ?> <?php echo __('Tags'); ?> blog->name) => '', __('Tags') => $p_url.'&m=tags', __('Tag').' “'.html::escapeHTML($tag).'”' => '' )). dcPage::notices(); ?> '.__('Back to tags list').'

          '; if (!$core->error->flag()) { if (!$posts->isEmpty()) { echo '
          '. '

          '.html::escapeHTML($tag).'

          '. '
          '. '

          '. form::field('new_tag_id',20,255,html::escapeHTML($tag)). ''. $core->formNonce(). '

          '; # Remove tag if (!$posts->isEmpty() && $core->auth->check('contentadmin',$core->blog->id)) { echo '
          '. '

          '. $core->formNonce(). '

          '; } echo '
          '; } # Show posts echo '

          '.sprintf(__('List of entries with the tag “%s”'),html::escapeHTML($tag)).'

          '; $post_list->display($page,$nb_per_page, '
          '. '%s'. '
          '. '

          '. '

          '. form::combo('action',$posts_actions_page->getCombo()). '

          '. form::hidden('post_type',''). form::hidden('p','tags'). form::hidden('m','tag_posts'). form::hidden('tag',$tag). $core->formNonce(). '
          '. '
          '); } dcPage::helpBlock('tag_posts'); ?> dotclear-2.6.2+dfsg/plugins/tags/tags.php000066400000000000000000000034441230033266200203250ustar00rootroot00000000000000 <?php echo __('Tags'); ?> blog->name) => '', __('Tags') => '' )). dcPage::notices(); ?> meta->getMetadata(array('meta_type' => 'tag')); $tags = $core->meta->computeMetaStats($tags); $tags->sort('meta_id_lower','asc'); $last_letter = null; $cols = array('',''); $col = 0; while ($tags->fetch()) { $letter = mb_strtoupper(mb_substr($tags->meta_id,0,1)); if ($last_letter != $letter) { if ($tags->index() >= round($tags->count()/2)) { $col = 1; } $cols[$col] .= ''.$letter.''; } $cols[$col] .= ''. ''.$tags->meta_id.''. ''.$tags->count.' '. (($tags->count==1) ? __('entry') : __('entries')).''. ''; $last_letter = $letter; } $table = '
          %s
          '; if ($cols[0]) { echo '
          '; printf($table,$cols[0]); if ($cols[1]) { printf($table,$cols[1]); } echo '
          '; } else { echo '

          '.__('No tags on this blog.').'

          '; } dcPage::helpBlock('tags'); ?> dotclear-2.6.2+dfsg/plugins/themeEditor/000077500000000000000000000000001230033266200201645ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/themeEditor/_admin.php000066400000000000000000000034441230033266200221310ustar00rootroot00000000000000addBehavior('adminCurrentThemeDetails', array('themeEditorBehaviors','theme_editor_details')); $core->addBehavior('adminBeforeUserOptionsUpdate',array('themeEditorBehaviors','adminBeforeUserUpdate')); $core->addBehavior('adminPreferencesForm',array('themeEditorBehaviors','adminPreferencesForm')); class themeEditorBehaviors { public static function theme_editor_details($core,$id) { if ($id != 'default' && $core->auth->isSuperAdmin()) { return '

          '.__('Edit theme files').'

          '; } } public static function adminBeforeUserUpdate($cur,$userID) { global $core; // Get and store user's prefs for plugin options $core->auth->user_prefs->addWorkspace('interface'); try { $core->auth->user_prefs->interface->put('colorsyntax',!empty($_POST['colorsyntax']),'boolean'); } catch (Exception $e) { $core->error->add($e->getMessage()); } } public static function adminPreferencesForm($core) { // Add fieldset for plugin options $core->auth->user_prefs->addWorkspace('interface'); echo '

          '. __('Syntax highlighting in theme editor'). '

          '; } } dotclear-2.6.2+dfsg/plugins/themeEditor/_define.php000066400000000000000000000011161230033266200222650ustar00rootroot00000000000000registerModule( /* Name */ "themeEditor", /* Description*/ "Theme Editor", /* Author */ "Olivier Meunier", /* Version */ '1.0', array( 'type' => 'plugin' ) ); dotclear-2.6.2+dfsg/plugins/themeEditor/class.themeEditor.php000066400000000000000000000150441230033266200242560ustar00rootroot00000000000000core =& $core; $this->default_theme = path::real($this->core->blog->themes_path.'/default'); $this->user_theme = path::real($this->core->blog->themes_path.'/'.$this->core->blog->settings->system->theme); if (null !== $this->core->themes) { $parent_theme = $this->core->themes->moduleInfo($this->core->blog->settings->system->theme,'parent'); if ($parent_theme) { $this->parent_theme = path::real($this->core->blog->themes_path.'/'.$parent_theme); } } $this->findTemplates(); $this->findStyles(); $this->findScripts(); $this->findLocales(); } public function filesList($type,$item='%1$s') { $files = $this->getFilesFromType($type); if (empty($files)) { return '

          '.__('No file').'

          '; } $list = ''; foreach ($files as $k => $v) { if (strpos($v,$this->user_theme) === 0) { $li = sprintf('
        • %s
        • ',$item); } elseif ($this->parent_theme && strpos($v,$this->parent_theme) === 0) { $li = sprintf('
        • %s
        • ',$item); } else { $li = sprintf('
        • %s
        • ',$item); } $list .= sprintf($li,$k,html::escapeHTML($k)); } return sprintf('
            %s
          ',$list); } public function getFileContent($type,$f) { $files = $this->getFilesFromType($type); if (!isset($files[$f])) { throw new Exception(__('File does not exist.')); } $F = $files[$f]; if (!is_readable($F)) { throw new Exception(sprintf(__('File %s is not readable'),$f)); } return array( 'c' => file_get_contents($F), 'w' => $this->getDestinationFile($type,$f) !== false, 'type' => $type, 'f' => $f ); } public function writeFile($type,$f,$content) { $files = $this->getFilesFromType($type); if (!isset($files[$f])) { throw new Exception(__('File does not exist.')); } try { $dest = $this->getDestinationFile($type,$f); if ($dest == false) { throw new Exception(); } if ($type == 'tpl' && !is_dir(dirname($dest))) { files::makeDir(dirname($dest)); } if ($type == 'po' && !is_dir(dirname($dest))) { files::makeDir(dirname($dest)); } $fp = @fopen($dest,'wb'); if (!$fp) { throw new Exception('tocatch'); } $content = preg_replace('/(\r?\n)/m',"\n",$content); $content = preg_replace('/\r/m',"\n",$content); fwrite($fp,$content); fclose($fp); # Updating inner files list $this->updateFileInList($type,$f,$dest); } catch (Exception $e) { throw new Exception(sprintf(__('Unable to write file %s. Please check your theme files and folders permissions.'),$f)); } } protected function getDestinationFile($type,$f) { if ($type == 'tpl') { $dest = $this->user_theme.'/tpl/'.$f; } elseif ($type == 'po') { $dest = $this->user_theme.'/locales/'.$f; } else { $dest = $this->user_theme.'/'.$f; } if (file_exists($dest) && is_writable($dest)) { return $dest; } if ($type == 'tpl' && !is_dir(dirname($dest))) { if (is_writable($this->user_theme)) { return $dest; } } if ($type == 'po' && !is_dir(dirname($dest))) { if (is_writable($this->user_theme)) { return $dest; } } if (is_writable(dirname($dest))) { return $dest; } return false; } protected function getFilesFromType($type) { switch ($type) { case 'tpl': return $this->tpl; case 'css': return $this->css; case 'js': return $this->js; case 'po': return $this->po; default: return array(); } } protected function updateFileInList($type,$f,$file) { switch ($type) { case 'tpl': $list =& $this->tpl; break; case 'css': $list =& $this->css; break; case 'js': $list =& $this->js; break; case 'po': $list =& $this->po; break; default: return; } $list[$f] = $file; } protected function findTemplates() { # First, we look in template paths $this->default_tpl = $this->getFilesInDir($this->default_theme.'/tpl'); $this->tpl = array_merge( $this->default_tpl, $this->getFilesInDir($this->parent_theme.'/tpl'), $this->getFilesInDir($this->user_theme.'/tpl') ); $this->tpl = array_merge($this->getFilesInDir(DC_ROOT.'/inc/public/default-templates'),$this->tpl); # Then we look in 'default-templates' plugins directory $plugins = $this->core->plugins->getModules(); foreach ($plugins as $p) { $this->tpl = array_merge($this->getFilesInDir($p['root'].'/default-templates'),$this->tpl); } uksort($this->tpl,array($this,'sortFilesHelper')); } protected function findStyles() { $this->css = $this->getFilesInDir($this->user_theme,'css'); $this->css= array_merge($this->css,$this->getFilesInDir($this->user_theme.'/style','css','style/')); } protected function findScripts() { $this->js = $this->getFilesInDir($this->user_theme,'js'); $this->js = array_merge($this->js,$this->getFilesInDir($this->user_theme.'/js','js','js/')); } protected function findLocales() { $langs = l10n::getISOcodes(1,1); foreach ($langs as $k => $v) { if ($this->parent_theme) { $this->po = array_merge($this->po,$this->getFilesInDir($this->parent_theme.'/locales/'.$v,'po',$v.'/')); } $this->po = array_merge($this->po,$this->getFilesInDir($this->user_theme.'/locales/'.$v,'po',$v.'/')); } } protected function getFilesInDir($dir,$ext=null,$prefix='',$model=null) { $dir = path::real($dir); if (!$dir || !is_dir($dir) || !is_readable($dir)) { return array(); } $d = dir($dir); $res = array(); while (($f = $d->read()) !== false) { if (is_file($dir.'/'.$f) && !preg_match('/^\./',$f) && (!$ext || preg_match('/\.'.preg_quote($ext).'$/i',$f))) { if (!$model || preg_match('/^'.preg_quote($model).'$/i', $f)) { $res[$prefix.$f] = $dir.'/'.$f; } } } return $res; } protected function sortFilesHelper($a,$b) { if ($a == $b) { return 0; } $ext_a = files::getExtension($a); $ext_b = files::getExtension($b); return strcmp($ext_a.'.'.$a,$ext_b.'.'.$b); } } dotclear-2.6.2+dfsg/plugins/themeEditor/codemirror.css000066400000000000000000000002061230033266200230410ustar00rootroot00000000000000.CodeMirror { font-size: 1.2em; background: #fff; } .CodeMirror .CodeMirror-wrap, .CodeMirror .CodeMirror-scroll { height: 30em; } dotclear-2.6.2+dfsg/plugins/themeEditor/codemirror/000077500000000000000000000000001230033266200223315ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/themeEditor/codemirror/LICENSE000066400000000000000000000023141230033266200233360ustar00rootroot00000000000000Copyright (C) 2012 by Marijn Haverbeke Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Please note that some subdirectories of the CodeMirror distribution include their own LICENSE files, and are released under different licences. dotclear-2.6.2+dfsg/plugins/themeEditor/codemirror/codemirror.css000066400000000000000000000107651230033266200252210ustar00rootroot00000000000000.CodeMirror { line-height: 1em; font-family: monospace; /* Necessary so the scrollbar can be absolutely positioned within the wrapper on Lion. */ position: relative; /* This prevents unwanted scrollbars from showing up on the body and wrapper in IE. */ overflow: hidden; } .CodeMirror-scroll { overflow: auto; height: 300px; /* This is needed to prevent an IE[67] bug where the scrolled content is visible outside of the scrolling box. */ position: relative; outline: none; } /* Vertical scrollbar */ .CodeMirror-scrollbar { position: absolute; right: 0; top: 0; overflow-x: hidden; overflow-y: scroll; z-index: 5; } .CodeMirror-scrollbar-inner { /* This needs to have a nonzero width in order for the scrollbar to appear in Firefox and IE9. */ width: 1px; } .CodeMirror-scrollbar.cm-sb-overlap { /* Ensure that the scrollbar appears in Lion, and that it overlaps the content rather than sitting to the right of it. */ position: absolute; z-index: 1; float: none; right: 0; min-width: 12px; } .CodeMirror-scrollbar.cm-sb-nonoverlap { min-width: 12px; } .CodeMirror-scrollbar.cm-sb-ie7 { min-width: 18px; } .CodeMirror-gutter { position: absolute; left: 0; top: 0; z-index: 10; background-color: #f7f7f7; border-right: 1px solid #eee; min-width: 2em; height: 100%; } .CodeMirror-gutter-text { color: #aaa; text-align: right; padding: .4em .2em .4em .4em; white-space: pre !important; cursor: default; } .CodeMirror-lines { padding: .4em; white-space: pre; cursor: text; } .CodeMirror pre { -moz-border-radius: 0; -webkit-border-radius: 0; -o-border-radius: 0; border-radius: 0; border-width: 0; margin: 0; padding: 0; background: transparent; font-family: inherit; font-size: inherit; padding: 0; margin: 0; white-space: pre; word-wrap: normal; line-height: inherit; color: inherit; overflow: visible; } .CodeMirror-wrap pre { word-wrap: break-word; white-space: pre-wrap; word-break: normal; } .CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; } .CodeMirror textarea { outline: none !important; } .CodeMirror pre.CodeMirror-cursor { z-index: 10; position: absolute; visibility: hidden; border-left: 1px solid black; border-right: none; width: 0; } .cm-keymap-fat-cursor pre.CodeMirror-cursor { width: auto; border: 0; background: transparent; background: rgba(0, 200, 0, .4); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#6600c800, endColorstr=#4c00c800); } /* Kludge to turn off filter in ie9+, which also accepts rgba */ .cm-keymap-fat-cursor pre.CodeMirror-cursor:not(#nonsense_id) { filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); } .CodeMirror pre.CodeMirror-cursor.CodeMirror-overwrite {} .CodeMirror-focused pre.CodeMirror-cursor { visibility: visible; } div.CodeMirror-selected { background: #d9d9d9; } .CodeMirror-focused div.CodeMirror-selected { background: #d7d4f0; } .CodeMirror-searching { background: #ffa; background: rgba(255, 255, 0, .4); } /* Default theme */ .cm-s-default span.cm-keyword {color: #708;} .cm-s-default span.cm-atom {color: #219;} .cm-s-default span.cm-number {color: #164;} .cm-s-default span.cm-def {color: #00f;} .cm-s-default span.cm-variable {color: black;} .cm-s-default span.cm-variable-2 {color: #05a;} .cm-s-default span.cm-variable-3 {color: #085;} .cm-s-default span.cm-property {color: black;} .cm-s-default span.cm-operator {color: black;} .cm-s-default span.cm-comment {color: #a50;} .cm-s-default span.cm-string {color: #a11;} .cm-s-default span.cm-string-2 {color: #f50;} .cm-s-default span.cm-meta {color: #555;} .cm-s-default span.cm-error {color: #f00;} .cm-s-default span.cm-qualifier {color: #555;} .cm-s-default span.cm-builtin {color: #30a;} .cm-s-default span.cm-bracket {color: #997;} .cm-s-default span.cm-tag {color: #170;} .cm-s-default span.cm-attribute {color: #00c;} .cm-s-default span.cm-header {color: blue;} .cm-s-default span.cm-quote {color: #090;} .cm-s-default span.cm-hr {color: #999;} .cm-s-default span.cm-link {color: #00c;} span.cm-header, span.cm-strong {font-weight: bold;} span.cm-em {font-style: italic;} span.cm-emstrong {font-style: italic; font-weight: bold;} span.cm-link {text-decoration: underline;} span.cm-invalidchar {color: #f00;} div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;} div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} @media print { /* Hide the cursor when printing */ .CodeMirror pre.CodeMirror-cursor { visibility: hidden; } } dotclear-2.6.2+dfsg/plugins/themeEditor/codemirror/codemirror.js000066400000000000000000003767051230033266200250560ustar00rootroot00000000000000// CodeMirror version 2.35 // // All functions that need access to the editor's state live inside // the CodeMirror function. Below that, at the bottom of the file, // some utilities are defined. // CodeMirror is the only global var we claim window.CodeMirror = (function() { "use strict"; // This is the function that produces an editor instance. Its // closure is used to store the editor state. function CodeMirror(place, givenOptions) { // Determine effective options based on given values and defaults. var options = {}, defaults = CodeMirror.defaults; for (var opt in defaults) if (defaults.hasOwnProperty(opt)) options[opt] = (givenOptions && givenOptions.hasOwnProperty(opt) ? givenOptions : defaults)[opt]; var input = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em"); input.setAttribute("wrap", "off"); input.setAttribute("autocorrect", "off"); input.setAttribute("autocapitalize", "off"); // Wraps and hides input textarea var inputDiv = elt("div", [input], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); // The empty scrollbar content, used solely for managing the scrollbar thumb. var scrollbarInner = elt("div", null, "CodeMirror-scrollbar-inner"); // The vertical scrollbar. Horizontal scrolling is handled by the scroller itself. var scrollbar = elt("div", [scrollbarInner], "CodeMirror-scrollbar"); // DIVs containing the selection and the actual code var lineDiv = elt("div"), selectionDiv = elt("div", null, null, "position: relative; z-index: -1"); // Blinky cursor, and element used to ensure cursor fits at the end of a line var cursor = elt("pre", "\u00a0", "CodeMirror-cursor"), widthForcer = elt("pre", "\u00a0", "CodeMirror-cursor", "visibility: hidden"); // Used to measure text size var measure = elt("div", null, null, "position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden;"); var lineSpace = elt("div", [measure, cursor, widthForcer, selectionDiv, lineDiv], null, "position: relative; z-index: 0"); var gutterText = elt("div", null, "CodeMirror-gutter-text"), gutter = elt("div", [gutterText], "CodeMirror-gutter"); // Moved around its parent to cover visible view var mover = elt("div", [gutter, elt("div", [lineSpace], "CodeMirror-lines")], null, "position: relative"); // Set to the height of the text, causes scrolling var sizer = elt("div", [mover], null, "position: relative"); // Provides scrolling var scroller = elt("div", [sizer], "CodeMirror-scroll"); scroller.setAttribute("tabIndex", "-1"); // The element in which the editor lives. var wrapper = elt("div", [inputDiv, scrollbar, scroller], "CodeMirror" + (options.lineWrapping ? " CodeMirror-wrap" : "")); if (place.appendChild) place.appendChild(wrapper); else place(wrapper); themeChanged(); keyMapChanged(); // Needed to hide big blue blinking cursor on Mobile Safari if (ios) input.style.width = "0px"; if (!webkit) scroller.draggable = true; lineSpace.style.outline = "none"; if (options.tabindex != null) input.tabIndex = options.tabindex; if (options.autofocus) focusInput(); if (!options.gutter && !options.lineNumbers) gutter.style.display = "none"; // Needed to handle Tab key in KHTML if (khtml) inputDiv.style.height = "1px", inputDiv.style.position = "absolute"; // Check for OS X >= 10.7. This has transparent scrollbars, so the // overlaying of one scrollbar with another won't work. This is a // temporary hack to simply turn off the overlay scrollbar. See // issue #727. if (mac_geLion) { scrollbar.style.zIndex = -2; scrollbar.style.visibility = "hidden"; } // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8). else if (ie_lt8) scrollbar.style.minWidth = "18px"; // Delayed object wrap timeouts, making sure only one is active. blinker holds an interval. var poll = new Delayed(), highlight = new Delayed(), blinker; // mode holds a mode API object. doc is the tree of Line objects, // frontier is the point up to which the content has been parsed, // and history the undo history (instance of History constructor). var mode, doc = new BranchChunk([new LeafChunk([new Line("")])]), frontier = 0, focused; loadMode(); // The selection. These are always maintained to point at valid // positions. Inverted is used to remember that the user is // selecting bottom-to-top. var sel = {from: {line: 0, ch: 0}, to: {line: 0, ch: 0}, inverted: false}; // Selection-related flags. shiftSelecting obviously tracks // whether the user is holding shift. var shiftSelecting, lastClick, lastDoubleClick, lastScrollTop = 0, draggingText, overwrite = false, suppressEdits = false, pasteIncoming = false; // Variables used by startOperation/endOperation to track what // happened during the operation. var updateInput, userSelChange, changes, textChanged, selectionChanged, gutterDirty, callbacks; // Current visible range (may be bigger than the view window). var displayOffset = 0, showingFrom = 0, showingTo = 0, lastSizeC = 0; // bracketHighlighted is used to remember that a bracket has been // marked. var bracketHighlighted; // Tracks the maximum line length so that the horizontal scrollbar // can be kept static when scrolling. var maxLine = getLine(0), updateMaxLine = false, maxLineChanged = true; var pollingFast = false; // Ensures slowPoll doesn't cancel fastPoll var goalColumn = null; // Initialize the content. operation(function(){setValue(options.value || ""); updateInput = false;})(); var history = new History(); // Register our event handlers. connect(scroller, "mousedown", operation(onMouseDown)); connect(scroller, "dblclick", operation(onDoubleClick)); connect(lineSpace, "selectstart", e_preventDefault); // Gecko browsers fire contextmenu *after* opening the menu, at // which point we can't mess with it anymore. Context menu is // handled in onMouseDown for Gecko. if (!gecko) connect(scroller, "contextmenu", onContextMenu); connect(scroller, "scroll", onScrollMain); connect(scrollbar, "scroll", onScrollBar); connect(scrollbar, "mousedown", function() {if (focused) setTimeout(focusInput, 0);}); var resizeHandler = connect(window, "resize", function() { if (wrapper.parentNode) updateDisplay(true); else resizeHandler(); }, true); connect(input, "keyup", operation(onKeyUp)); connect(input, "input", fastPoll); connect(input, "keydown", operation(onKeyDown)); connect(input, "keypress", operation(onKeyPress)); connect(input, "focus", onFocus); connect(input, "blur", onBlur); function drag_(e) { if (options.onDragEvent && options.onDragEvent(instance, addStop(e))) return; e_stop(e); } if (options.dragDrop) { connect(scroller, "dragstart", onDragStart); connect(scroller, "dragenter", drag_); connect(scroller, "dragover", drag_); connect(scroller, "drop", operation(onDrop)); } connect(scroller, "paste", function(){focusInput(); fastPoll();}); connect(input, "paste", function(){pasteIncoming = true; fastPoll();}); connect(input, "cut", operation(function(){ if (!options.readOnly) replaceSelection(""); })); // Needed to handle Tab key in KHTML if (khtml) connect(sizer, "mouseup", function() { if (document.activeElement == input) input.blur(); focusInput(); }); // IE throws unspecified error in certain cases, when // trying to access activeElement before onload var hasFocus; try { hasFocus = (document.activeElement == input); } catch(e) { } if (hasFocus || options.autofocus) setTimeout(onFocus, 20); else onBlur(); function isLine(l) {return l >= 0 && l < doc.size;} // The instance object that we'll return. Mostly calls out to // local functions in the CodeMirror function. Some do some extra // range checking and/or clipping. operation is used to wrap the // call so that changes it makes are tracked, and the display is // updated afterwards. var instance = wrapper.CodeMirror = { getValue: getValue, setValue: operation(setValue), getSelection: getSelection, replaceSelection: operation(replaceSelection), focus: function(){window.focus(); focusInput(); onFocus(); fastPoll();}, setOption: function(option, value) { var oldVal = options[option]; options[option] = value; if (option == "mode" || option == "indentUnit") loadMode(); else if (option == "readOnly" && value == "nocursor") {onBlur(); input.blur();} else if (option == "readOnly" && !value) {resetInput(true);} else if (option == "theme") themeChanged(); else if (option == "lineWrapping" && oldVal != value) operation(wrappingChanged)(); else if (option == "tabSize") updateDisplay(true); else if (option == "keyMap") keyMapChanged(); else if (option == "tabindex") input.tabIndex = value; if (option == "lineNumbers" || option == "gutter" || option == "firstLineNumber" || option == "theme" || option == "lineNumberFormatter") { gutterChanged(); updateDisplay(true); } }, getOption: function(option) {return options[option];}, getMode: function() {return mode;}, undo: operation(undo), redo: operation(redo), indentLine: operation(function(n, dir) { if (typeof dir != "string") { if (dir == null) dir = options.smartIndent ? "smart" : "prev"; else dir = dir ? "add" : "subtract"; } if (isLine(n)) indentLine(n, dir); }), indentSelection: operation(indentSelected), historySize: function() {return {undo: history.done.length, redo: history.undone.length};}, clearHistory: function() {history = new History();}, setHistory: function(histData) { history = new History(); history.done = histData.done; history.undone = histData.undone; }, getHistory: function() { function cp(arr) { for (var i = 0, nw = [], nwelt; i < arr.length; ++i) { nw.push(nwelt = []); for (var j = 0, elt = arr[i]; j < elt.length; ++j) { var old = [], cur = elt[j]; nwelt.push({start: cur.start, added: cur.added, old: old}); for (var k = 0; k < cur.old.length; ++k) old.push(hlText(cur.old[k])); } } return nw; } return {done: cp(history.done), undone: cp(history.undone)}; }, matchBrackets: operation(function(){matchBrackets(true);}), getTokenAt: operation(function(pos) { pos = clipPos(pos); return getLine(pos.line).getTokenAt(mode, getStateBefore(pos.line), options.tabSize, pos.ch); }), getStateAfter: function(line) { line = clipLine(line == null ? doc.size - 1: line); return getStateBefore(line + 1); }, cursorCoords: function(start, mode) { if (start == null) start = sel.inverted; return this.charCoords(start ? sel.from : sel.to, mode); }, charCoords: function(pos, mode) { pos = clipPos(pos); if (mode == "local") return localCoords(pos, false); if (mode == "div") return localCoords(pos, true); return pageCoords(pos); }, coordsChar: function(coords) { var off = eltOffset(lineSpace); return coordsChar(coords.x - off.left, coords.y - off.top); }, markText: operation(markText), setBookmark: setBookmark, findMarksAt: findMarksAt, setMarker: operation(addGutterMarker), clearMarker: operation(removeGutterMarker), setLineClass: operation(setLineClass), hideLine: operation(function(h) {return setLineHidden(h, true);}), showLine: operation(function(h) {return setLineHidden(h, false);}), onDeleteLine: function(line, f) { if (typeof line == "number") { if (!isLine(line)) return null; line = getLine(line); } (line.handlers || (line.handlers = [])).push(f); return line; }, lineInfo: lineInfo, getViewport: function() { return {from: showingFrom, to: showingTo};}, addWidget: function(pos, node, scroll, vert, horiz) { pos = localCoords(clipPos(pos)); var top = pos.yBot, left = pos.x; node.style.position = "absolute"; sizer.appendChild(node); if (vert == "over") top = pos.y; else if (vert == "near") { var vspace = Math.max(scroller.offsetHeight, doc.height * textHeight()), hspace = Math.max(sizer.clientWidth, lineSpace.clientWidth) - paddingLeft(); if (pos.yBot + node.offsetHeight > vspace && pos.y > node.offsetHeight) top = pos.y - node.offsetHeight; if (left + node.offsetWidth > hspace) left = hspace - node.offsetWidth; } node.style.top = (top + paddingTop()) + "px"; node.style.left = node.style.right = ""; if (horiz == "right") { left = sizer.clientWidth - node.offsetWidth; node.style.right = "0px"; } else { if (horiz == "left") left = 0; else if (horiz == "middle") left = (sizer.clientWidth - node.offsetWidth) / 2; node.style.left = (left + paddingLeft()) + "px"; } if (scroll) scrollIntoView(left, top, left + node.offsetWidth, top + node.offsetHeight); }, lineCount: function() {return doc.size;}, clipPos: clipPos, getCursor: function(start) { if (start == null) start = sel.inverted; return copyPos(start ? sel.from : sel.to); }, somethingSelected: function() {return !posEq(sel.from, sel.to);}, setCursor: operation(function(line, ch, user) { if (ch == null && typeof line.line == "number") setCursor(line.line, line.ch, user); else setCursor(line, ch, user); }), setSelection: operation(function(from, to, user) { (user ? setSelectionUser : setSelection)(clipPos(from), clipPos(to || from)); }), getLine: function(line) {if (isLine(line)) return getLine(line).text;}, getLineHandle: function(line) {if (isLine(line)) return getLine(line);}, setLine: operation(function(line, text) { if (isLine(line)) replaceRange(text, {line: line, ch: 0}, {line: line, ch: getLine(line).text.length}); }), removeLine: operation(function(line) { if (isLine(line)) replaceRange("", {line: line, ch: 0}, clipPos({line: line+1, ch: 0})); }), replaceRange: operation(replaceRange), getRange: function(from, to, lineSep) {return getRange(clipPos(from), clipPos(to), lineSep);}, triggerOnKeyDown: operation(onKeyDown), execCommand: function(cmd) {return commands[cmd](instance);}, // Stuff used by commands, probably not much use to outside code. moveH: operation(moveH), deleteH: operation(deleteH), moveV: operation(moveV), toggleOverwrite: function() { if(overwrite){ overwrite = false; cursor.className = cursor.className.replace(" CodeMirror-overwrite", ""); } else { overwrite = true; cursor.className += " CodeMirror-overwrite"; } }, posFromIndex: function(off) { var lineNo = 0, ch; doc.iter(0, doc.size, function(line) { var sz = line.text.length + 1; if (sz > off) { ch = off; return true; } off -= sz; ++lineNo; }); return clipPos({line: lineNo, ch: ch}); }, indexFromPos: function (coords) { if (coords.line < 0 || coords.ch < 0) return 0; var index = coords.ch; doc.iter(0, coords.line, function (line) { index += line.text.length + 1; }); return index; }, scrollTo: function(x, y) { if (x != null) scroller.scrollLeft = x; if (y != null) scrollbar.scrollTop = scroller.scrollTop = y; updateDisplay([]); }, getScrollInfo: function() { return {x: scroller.scrollLeft, y: scrollbar.scrollTop, height: scrollbar.scrollHeight, width: scroller.scrollWidth}; }, setSize: function(width, height) { function interpret(val) { val = String(val); return /^\d+$/.test(val) ? val + "px" : val; } if (width != null) wrapper.style.width = interpret(width); if (height != null) scroller.style.height = interpret(height); instance.refresh(); }, operation: function(f){return operation(f)();}, compoundChange: function(f){return compoundChange(f);}, refresh: function(){ updateDisplay(true, null, lastScrollTop); if (scrollbar.scrollHeight > lastScrollTop) scrollbar.scrollTop = lastScrollTop; }, getInputField: function(){return input;}, getWrapperElement: function(){return wrapper;}, getScrollerElement: function(){return scroller;}, getGutterElement: function(){return gutter;} }; function getLine(n) { return getLineAt(doc, n); } function updateLineHeight(line, height) { gutterDirty = true; var diff = height - line.height; for (var n = line; n; n = n.parent) n.height += diff; } function lineContent(line, wrapAt) { if (!line.styles) line.highlight(mode, line.stateAfter = getStateBefore(lineNo(line)), options.tabSize); return line.getContent(options.tabSize, wrapAt, options.lineWrapping); } function setValue(code) { var top = {line: 0, ch: 0}; updateLines(top, {line: doc.size - 1, ch: getLine(doc.size-1).text.length}, splitLines(code), top, top); updateInput = true; } function getValue(lineSep) { var text = []; doc.iter(0, doc.size, function(line) { text.push(line.text); }); return text.join(lineSep || "\n"); } function onScrollBar(e) { if (scrollbar.scrollTop != lastScrollTop) { lastScrollTop = scroller.scrollTop = scrollbar.scrollTop; updateDisplay([]); } } function onScrollMain(e) { if (options.fixedGutter && gutter.style.left != scroller.scrollLeft + "px") gutter.style.left = scroller.scrollLeft + "px"; if (scroller.scrollTop != lastScrollTop) { lastScrollTop = scroller.scrollTop; if (scrollbar.scrollTop != lastScrollTop) scrollbar.scrollTop = lastScrollTop; updateDisplay([]); } if (options.onScroll) options.onScroll(instance); } function onMouseDown(e) { setShift(e_prop(e, "shiftKey")); // Check whether this is a click in a widget for (var n = e_target(e); n != wrapper; n = n.parentNode) if (n.parentNode == sizer && n != mover) return; // See if this is a click in the gutter for (var n = e_target(e); n != wrapper; n = n.parentNode) if (n.parentNode == gutterText) { if (options.onGutterClick) options.onGutterClick(instance, indexOf(gutterText.childNodes, n) + showingFrom, e); return e_preventDefault(e); } var start = posFromMouse(e); switch (e_button(e)) { case 3: if (gecko) onContextMenu(e); return; case 2: if (start) setCursor(start.line, start.ch, true); setTimeout(focusInput, 20); e_preventDefault(e); return; } // For button 1, if it was clicked inside the editor // (posFromMouse returning non-null), we have to adjust the // selection. if (!start) {if (e_target(e) == scroller) e_preventDefault(e); return;} if (!focused) onFocus(); var now = +new Date, type = "single"; if (lastDoubleClick && lastDoubleClick.time > now - 400 && posEq(lastDoubleClick.pos, start)) { type = "triple"; e_preventDefault(e); setTimeout(focusInput, 20); selectLine(start.line); } else if (lastClick && lastClick.time > now - 400 && posEq(lastClick.pos, start)) { type = "double"; lastDoubleClick = {time: now, pos: start}; e_preventDefault(e); var word = findWordAt(start); setSelectionUser(word.from, word.to); } else { lastClick = {time: now, pos: start}; } function dragEnd(e2) { if (webkit) scroller.draggable = false; draggingText = false; up(); drop(); if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) { e_preventDefault(e2); setCursor(start.line, start.ch, true); focusInput(); } } var last = start, going; if (options.dragDrop && dragAndDrop && !options.readOnly && !posEq(sel.from, sel.to) && !posLess(start, sel.from) && !posLess(sel.to, start) && type == "single") { // Let the drag handler handle this. if (webkit) scroller.draggable = true; var up = connect(document, "mouseup", operation(dragEnd), true); var drop = connect(scroller, "drop", operation(dragEnd), true); draggingText = true; // IE's approach to draggable if (scroller.dragDrop) scroller.dragDrop(); return; } e_preventDefault(e); if (type == "single") setCursor(start.line, start.ch, true); var startstart = sel.from, startend = sel.to; function doSelect(cur) { if (type == "single") { setSelectionUser(start, cur); } else if (type == "double") { var word = findWordAt(cur); if (posLess(cur, startstart)) setSelectionUser(word.from, startend); else setSelectionUser(startstart, word.to); } else if (type == "triple") { if (posLess(cur, startstart)) setSelectionUser(startend, clipPos({line: cur.line, ch: 0})); else setSelectionUser(startstart, clipPos({line: cur.line + 1, ch: 0})); } } function extend(e) { var cur = posFromMouse(e, true); if (cur && !posEq(cur, last)) { if (!focused) onFocus(); last = cur; doSelect(cur); updateInput = false; var visible = visibleLines(); if (cur.line >= visible.to || cur.line < visible.from) going = setTimeout(operation(function(){extend(e);}), 150); } } function done(e) { clearTimeout(going); var cur = posFromMouse(e); if (cur) doSelect(cur); e_preventDefault(e); focusInput(); updateInput = true; move(); up(); } var move = connect(document, "mousemove", operation(function(e) { clearTimeout(going); e_preventDefault(e); if (!ie && !e_button(e)) done(e); else extend(e); }), true); var up = connect(document, "mouseup", operation(done), true); } function onDoubleClick(e) { for (var n = e_target(e); n != wrapper; n = n.parentNode) if (n.parentNode == gutterText) return e_preventDefault(e); e_preventDefault(e); } function onDrop(e) { if (options.onDragEvent && options.onDragEvent(instance, addStop(e))) return; e_preventDefault(e); var pos = posFromMouse(e, true), files = e.dataTransfer.files; if (!pos || options.readOnly) return; if (files && files.length && window.FileReader && window.File) { var n = files.length, text = Array(n), read = 0; var loadFile = function(file, i) { var reader = new FileReader; reader.onload = function() { text[i] = reader.result; if (++read == n) { pos = clipPos(pos); operation(function() { var end = replaceRange(text.join(""), pos, pos); setSelectionUser(pos, end); })(); } }; reader.readAsText(file); }; for (var i = 0; i < n; ++i) loadFile(files[i], i); } else { // Don't do a replace if the drop happened inside of the selected text. if (draggingText && !(posLess(pos, sel.from) || posLess(sel.to, pos))) return; try { var text = e.dataTransfer.getData("Text"); if (text) { compoundChange(function() { var curFrom = sel.from, curTo = sel.to; setSelectionUser(pos, pos); if (draggingText) replaceRange("", curFrom, curTo); replaceSelection(text); focusInput(); }); } } catch(e){} } } function onDragStart(e) { var txt = getSelection(); e.dataTransfer.setData("Text", txt); // Use dummy image instead of default browsers image. if (e.dataTransfer.setDragImage) e.dataTransfer.setDragImage(elt('img'), 0, 0); } function doHandleBinding(bound, dropShift) { if (typeof bound == "string") { bound = commands[bound]; if (!bound) return false; } var prevShift = shiftSelecting; try { if (options.readOnly) suppressEdits = true; if (dropShift) shiftSelecting = null; bound(instance); } catch(e) { if (e != Pass) throw e; return false; } finally { shiftSelecting = prevShift; suppressEdits = false; } return true; } var maybeTransition; function handleKeyBinding(e) { // Handle auto keymap transitions var startMap = getKeyMap(options.keyMap), next = startMap.auto; clearTimeout(maybeTransition); if (next && !isModifierKey(e)) maybeTransition = setTimeout(function() { if (getKeyMap(options.keyMap) == startMap) { options.keyMap = (next.call ? next.call(null, instance) : next); } }, 50); var name = keyNames[e_prop(e, "keyCode")], handled = false; var flipCtrlCmd = opera && mac; if (name == null || e.altGraphKey) return false; if (e_prop(e, "altKey")) name = "Alt-" + name; if (e_prop(e, flipCtrlCmd ? "metaKey" : "ctrlKey")) name = "Ctrl-" + name; if (e_prop(e, flipCtrlCmd ? "ctrlKey" : "metaKey")) name = "Cmd-" + name; var stopped = false; function stop() { stopped = true; } if (e_prop(e, "shiftKey")) { handled = lookupKey("Shift-" + name, options.extraKeys, options.keyMap, function(b) {return doHandleBinding(b, true);}, stop) || lookupKey(name, options.extraKeys, options.keyMap, function(b) { if (typeof b == "string" && /^go[A-Z]/.test(b)) return doHandleBinding(b); }, stop); } else { handled = lookupKey(name, options.extraKeys, options.keyMap, doHandleBinding, stop); } if (stopped) handled = false; if (handled) { e_preventDefault(e); restartBlink(); if (ie) { e.oldKeyCode = e.keyCode; e.keyCode = 0; } } return handled; } function handleCharBinding(e, ch) { var handled = lookupKey("'" + ch + "'", options.extraKeys, options.keyMap, function(b) { return doHandleBinding(b, true); }); if (handled) { e_preventDefault(e); restartBlink(); } return handled; } var lastStoppedKey = null; function onKeyDown(e) { if (!focused) onFocus(); if (ie && e.keyCode == 27) { e.returnValue = false; } if (pollingFast) { if (readInput()) pollingFast = false; } if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return; var code = e_prop(e, "keyCode"); // IE does strange things with escape. setShift(code == 16 || e_prop(e, "shiftKey")); // First give onKeyEvent option a chance to handle this. var handled = handleKeyBinding(e); if (opera) { lastStoppedKey = handled ? code : null; // Opera has no cut event... we try to at least catch the key combo if (!handled && code == 88 && e_prop(e, mac ? "metaKey" : "ctrlKey")) replaceSelection(""); } } function onKeyPress(e) { if (pollingFast) readInput(); if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return; var keyCode = e_prop(e, "keyCode"), charCode = e_prop(e, "charCode"); if (opera && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;} if (((opera && (!e.which || e.which < 10)) || khtml) && handleKeyBinding(e)) return; var ch = String.fromCharCode(charCode == null ? keyCode : charCode); if (options.electricChars && mode.electricChars && options.smartIndent && !options.readOnly) { if (mode.electricChars.indexOf(ch) > -1) setTimeout(operation(function() {indentLine(sel.to.line, "smart");}), 75); } if (handleCharBinding(e, ch)) return; fastPoll(); } function onKeyUp(e) { if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return; if (e_prop(e, "keyCode") == 16) shiftSelecting = null; } function onFocus() { if (options.readOnly == "nocursor") return; if (!focused) { if (options.onFocus) options.onFocus(instance); focused = true; if (scroller.className.search(/\bCodeMirror-focused\b/) == -1) scroller.className += " CodeMirror-focused"; } slowPoll(); restartBlink(); } function onBlur() { if (focused) { if (options.onBlur) options.onBlur(instance); focused = false; if (bracketHighlighted) operation(function(){ if (bracketHighlighted) { bracketHighlighted(); bracketHighlighted = null; } })(); scroller.className = scroller.className.replace(" CodeMirror-focused", ""); } clearInterval(blinker); setTimeout(function() {if (!focused) shiftSelecting = null;}, 150); } // Replace the range from from to to by the strings in newText. // Afterwards, set the selection to selFrom, selTo. function updateLines(from, to, newText, selFrom, selTo) { if (suppressEdits) return; var old = []; doc.iter(from.line, to.line + 1, function(line) { old.push(newHL(line.text, line.markedSpans)); }); if (history) { history.addChange(from.line, newText.length, old); while (history.done.length > options.undoDepth) history.done.shift(); } var lines = updateMarkedSpans(hlSpans(old[0]), hlSpans(lst(old)), from.ch, to.ch, newText); updateLinesNoUndo(from, to, lines, selFrom, selTo); } function unredoHelper(from, to) { if (!from.length) return; var set = from.pop(), out = []; for (var i = set.length - 1; i >= 0; i -= 1) { var change = set[i]; var replaced = [], end = change.start + change.added; doc.iter(change.start, end, function(line) { replaced.push(newHL(line.text, line.markedSpans)); }); out.push({start: change.start, added: change.old.length, old: replaced}); var pos = {line: change.start + change.old.length - 1, ch: editEnd(hlText(lst(replaced)), hlText(lst(change.old)))}; updateLinesNoUndo({line: change.start, ch: 0}, {line: end - 1, ch: getLine(end-1).text.length}, change.old, pos, pos); } updateInput = true; to.push(out); } function undo() {unredoHelper(history.done, history.undone);} function redo() {unredoHelper(history.undone, history.done);} function updateLinesNoUndo(from, to, lines, selFrom, selTo) { if (suppressEdits) return; var recomputeMaxLength = false, maxLineLength = maxLine.text.length; if (!options.lineWrapping) doc.iter(from.line, to.line + 1, function(line) { if (!line.hidden && line.text.length == maxLineLength) {recomputeMaxLength = true; return true;} }); if (from.line != to.line || lines.length > 1) gutterDirty = true; var nlines = to.line - from.line, firstLine = getLine(from.line), lastLine = getLine(to.line); var lastHL = lst(lines); // First adjust the line structure if (from.ch == 0 && to.ch == 0 && hlText(lastHL) == "") { // This is a whole-line replace. Treated specially to make // sure line objects move the way they are supposed to. var added = [], prevLine = null; for (var i = 0, e = lines.length - 1; i < e; ++i) added.push(new Line(hlText(lines[i]), hlSpans(lines[i]))); lastLine.update(lastLine.text, hlSpans(lastHL)); if (nlines) doc.remove(from.line, nlines, callbacks); if (added.length) doc.insert(from.line, added); } else if (firstLine == lastLine) { if (lines.length == 1) { firstLine.update(firstLine.text.slice(0, from.ch) + hlText(lines[0]) + firstLine.text.slice(to.ch), hlSpans(lines[0])); } else { for (var added = [], i = 1, e = lines.length - 1; i < e; ++i) added.push(new Line(hlText(lines[i]), hlSpans(lines[i]))); added.push(new Line(hlText(lastHL) + firstLine.text.slice(to.ch), hlSpans(lastHL))); firstLine.update(firstLine.text.slice(0, from.ch) + hlText(lines[0]), hlSpans(lines[0])); doc.insert(from.line + 1, added); } } else if (lines.length == 1) { firstLine.update(firstLine.text.slice(0, from.ch) + hlText(lines[0]) + lastLine.text.slice(to.ch), hlSpans(lines[0])); doc.remove(from.line + 1, nlines, callbacks); } else { var added = []; firstLine.update(firstLine.text.slice(0, from.ch) + hlText(lines[0]), hlSpans(lines[0])); lastLine.update(hlText(lastHL) + lastLine.text.slice(to.ch), hlSpans(lastHL)); for (var i = 1, e = lines.length - 1; i < e; ++i) added.push(new Line(hlText(lines[i]), hlSpans(lines[i]))); if (nlines > 1) doc.remove(from.line + 1, nlines - 1, callbacks); doc.insert(from.line + 1, added); } if (options.lineWrapping) { var perLine = Math.max(5, scroller.clientWidth / charWidth() - 3); doc.iter(from.line, from.line + lines.length, function(line) { if (line.hidden) return; var guess = Math.ceil(line.text.length / perLine) || 1; if (guess != line.height) updateLineHeight(line, guess); }); } else { doc.iter(from.line, from.line + lines.length, function(line) { var l = line.text; if (!line.hidden && l.length > maxLineLength) { maxLine = line; maxLineLength = l.length; maxLineChanged = true; recomputeMaxLength = false; } }); if (recomputeMaxLength) updateMaxLine = true; } // Adjust frontier, schedule worker frontier = Math.min(frontier, from.line); startWorker(400); var lendiff = lines.length - nlines - 1; // Remember that these lines changed, for updating the display changes.push({from: from.line, to: to.line + 1, diff: lendiff}); if (options.onChange) { // Normalize lines to contain only strings, since that's what // the change event handler expects for (var i = 0; i < lines.length; ++i) if (typeof lines[i] != "string") lines[i] = lines[i].text; var changeObj = {from: from, to: to, text: lines}; if (textChanged) { for (var cur = textChanged; cur.next; cur = cur.next) {} cur.next = changeObj; } else textChanged = changeObj; } // Update the selection function updateLine(n) {return n <= Math.min(to.line, to.line + lendiff) ? n : n + lendiff;} setSelection(clipPos(selFrom), clipPos(selTo), updateLine(sel.from.line), updateLine(sel.to.line)); } function needsScrollbar() { var realHeight = doc.height * textHeight() + 2 * paddingTop(); return realHeight * .99 > scroller.offsetHeight ? realHeight : false; } function updateVerticalScroll(scrollTop) { var scrollHeight = needsScrollbar(); scrollbar.style.display = scrollHeight ? "block" : "none"; if (scrollHeight) { scrollbarInner.style.height = sizer.style.minHeight = scrollHeight + "px"; scrollbar.style.height = scroller.clientHeight + "px"; if (scrollTop != null) { scrollbar.scrollTop = scroller.scrollTop = scrollTop; // 'Nudge' the scrollbar to work around a Webkit bug where, // in some situations, we'd end up with a scrollbar that // reported its scrollTop (and looked) as expected, but // *behaved* as if it was still in a previous state (i.e. // couldn't scroll up, even though it appeared to be at the // bottom). if (webkit) setTimeout(function() { if (scrollbar.scrollTop != scrollTop) return; scrollbar.scrollTop = scrollTop + (scrollTop ? -1 : 1); scrollbar.scrollTop = scrollTop; }, 0); } } else { sizer.style.minHeight = ""; } // Position the mover div to align with the current virtual scroll position mover.style.top = displayOffset * textHeight() + "px"; } function computeMaxLength() { maxLine = getLine(0); maxLineChanged = true; var maxLineLength = maxLine.text.length; doc.iter(1, doc.size, function(line) { var l = line.text; if (!line.hidden && l.length > maxLineLength) { maxLineLength = l.length; maxLine = line; } }); updateMaxLine = false; } function replaceRange(code, from, to) { from = clipPos(from); if (!to) to = from; else to = clipPos(to); code = splitLines(code); function adjustPos(pos) { if (posLess(pos, from)) return pos; if (!posLess(to, pos)) return end; var line = pos.line + code.length - (to.line - from.line) - 1; var ch = pos.ch; if (pos.line == to.line) ch += lst(code).length - (to.ch - (to.line == from.line ? from.ch : 0)); return {line: line, ch: ch}; } var end; replaceRange1(code, from, to, function(end1) { end = end1; return {from: adjustPos(sel.from), to: adjustPos(sel.to)}; }); return end; } function replaceSelection(code, collapse) { replaceRange1(splitLines(code), sel.from, sel.to, function(end) { if (collapse == "end") return {from: end, to: end}; else if (collapse == "start") return {from: sel.from, to: sel.from}; else return {from: sel.from, to: end}; }); } function replaceRange1(code, from, to, computeSel) { var endch = code.length == 1 ? code[0].length + from.ch : lst(code).length; var newSel = computeSel({line: from.line + code.length - 1, ch: endch}); updateLines(from, to, code, newSel.from, newSel.to); } function getRange(from, to, lineSep) { var l1 = from.line, l2 = to.line; if (l1 == l2) return getLine(l1).text.slice(from.ch, to.ch); var code = [getLine(l1).text.slice(from.ch)]; doc.iter(l1 + 1, l2, function(line) { code.push(line.text); }); code.push(getLine(l2).text.slice(0, to.ch)); return code.join(lineSep || "\n"); } function getSelection(lineSep) { return getRange(sel.from, sel.to, lineSep); } function slowPoll() { if (pollingFast) return; poll.set(options.pollInterval, function() { readInput(); if (focused) slowPoll(); }); } function fastPoll() { var missed = false; pollingFast = true; function p() { var changed = readInput(); if (!changed && !missed) {missed = true; poll.set(60, p);} else {pollingFast = false; slowPoll();} } poll.set(20, p); } // Previnput is a hack to work with IME. If we reset the textarea // on every change, that breaks IME. So we look for changes // compared to the previous content instead. (Modern browsers have // events that indicate IME taking place, but these are not widely // supported or compatible enough yet to rely on.) var prevInput = ""; function readInput() { if (!focused || hasSelection(input) || options.readOnly) return false; var text = input.value; if (text == prevInput) return false; if (!nestedOperation) startOperation(); shiftSelecting = null; var same = 0, l = Math.min(prevInput.length, text.length); while (same < l && prevInput[same] == text[same]) ++same; if (same < prevInput.length) sel.from = {line: sel.from.line, ch: sel.from.ch - (prevInput.length - same)}; else if (overwrite && posEq(sel.from, sel.to) && !pasteIncoming) sel.to = {line: sel.to.line, ch: Math.min(getLine(sel.to.line).text.length, sel.to.ch + (text.length - same))}; replaceSelection(text.slice(same), "end"); if (text.length > 1000) { input.value = prevInput = ""; } else prevInput = text; if (!nestedOperation) endOperation(); pasteIncoming = false; return true; } function resetInput(user) { if (!posEq(sel.from, sel.to)) { prevInput = ""; input.value = getSelection(); if (focused) selectInput(input); } else if (user) prevInput = input.value = ""; } function focusInput() { if (options.readOnly != "nocursor") input.focus(); } function scrollCursorIntoView() { var coords = calculateCursorCoords(); scrollIntoView(coords.x, coords.y, coords.x, coords.yBot); if (!focused) return; var box = sizer.getBoundingClientRect(), doScroll = null; if (coords.y + box.top < 0) doScroll = true; else if (coords.y + box.top + textHeight() > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false; if (doScroll != null) { var hidden = cursor.style.display == "none"; if (hidden) { cursor.style.display = ""; cursor.style.left = coords.x + "px"; cursor.style.top = (coords.y - displayOffset) + "px"; } cursor.scrollIntoView(doScroll); if (hidden) cursor.style.display = "none"; } } function calculateCursorCoords() { var cursor = localCoords(sel.inverted ? sel.from : sel.to); var x = options.lineWrapping ? Math.min(cursor.x, lineSpace.offsetWidth) : cursor.x; return {x: x, y: cursor.y, yBot: cursor.yBot}; } function scrollIntoView(x1, y1, x2, y2) { var scrollPos = calculateScrollPos(x1, y1, x2, y2); if (scrollPos.scrollLeft != null) {scroller.scrollLeft = scrollPos.scrollLeft;} if (scrollPos.scrollTop != null) {scrollbar.scrollTop = scroller.scrollTop = scrollPos.scrollTop;} } function calculateScrollPos(x1, y1, x2, y2) { var pl = paddingLeft(), pt = paddingTop(); y1 += pt; y2 += pt; x1 += pl; x2 += pl; var screen = scroller.clientHeight, screentop = scrollbar.scrollTop, result = {}; var docBottom = needsScrollbar() || Infinity; var atTop = y1 < pt + 10, atBottom = y2 + pt > docBottom - 10; if (y1 < screentop) result.scrollTop = atTop ? 0 : Math.max(0, y1); else if (y2 > screentop + screen) result.scrollTop = (atBottom ? docBottom : y2) - screen; var screenw = scroller.clientWidth, screenleft = scroller.scrollLeft; var gutterw = options.fixedGutter ? gutter.clientWidth : 0; var atLeft = x1 < gutterw + pl + 10; if (x1 < screenleft + gutterw || atLeft) { if (atLeft) x1 = 0; result.scrollLeft = Math.max(0, x1 - 10 - gutterw); } else if (x2 > screenw + screenleft - 3) { result.scrollLeft = x2 + 10 - screenw; } return result; } function visibleLines(scrollTop) { var lh = textHeight(), top = (scrollTop != null ? scrollTop : scrollbar.scrollTop) - paddingTop(); var fromHeight = Math.max(0, Math.floor(top / lh)); var toHeight = Math.ceil((top + scroller.clientHeight) / lh); return {from: lineAtHeight(doc, fromHeight), to: lineAtHeight(doc, toHeight)}; } // Uses a set of changes plus the current scroll position to // determine which DOM updates have to be made, and makes the // updates. function updateDisplay(changes, suppressCallback, scrollTop) { if (!scroller.clientWidth) { showingFrom = showingTo = displayOffset = 0; return; } // Compute the new visible window // If scrollTop is specified, use that to determine which lines // to render instead of the current scrollbar position. var visible = visibleLines(scrollTop); // Bail out if the visible area is already rendered and nothing changed. if (changes !== true && changes.length == 0 && visible.from > showingFrom && visible.to < showingTo) { updateVerticalScroll(scrollTop); return; } var from = Math.max(visible.from - 100, 0), to = Math.min(doc.size, visible.to + 100); if (showingFrom < from && from - showingFrom < 20) from = showingFrom; if (showingTo > to && showingTo - to < 20) to = Math.min(doc.size, showingTo); // Create a range of theoretically intact lines, and punch holes // in that using the change info. var intact = changes === true ? [] : computeIntact([{from: showingFrom, to: showingTo, domStart: 0}], changes); // Clip off the parts that won't be visible var intactLines = 0; for (var i = 0; i < intact.length; ++i) { var range = intact[i]; if (range.from < from) {range.domStart += (from - range.from); range.from = from;} if (range.to > to) range.to = to; if (range.from >= range.to) intact.splice(i--, 1); else intactLines += range.to - range.from; } if (intactLines == to - from && from == showingFrom && to == showingTo) { updateVerticalScroll(scrollTop); return; } intact.sort(function(a, b) {return a.domStart - b.domStart;}); var th = textHeight(), gutterDisplay = gutter.style.display; lineDiv.style.display = "none"; patchDisplay(from, to, intact); lineDiv.style.display = gutter.style.display = ""; var different = from != showingFrom || to != showingTo || lastSizeC != scroller.clientHeight + th; // This is just a bogus formula that detects when the editor is // resized or the font size changes. if (different) lastSizeC = scroller.clientHeight + th; if (from != showingFrom || to != showingTo && options.onViewportChange) setTimeout(function(){ if (options.onViewportChange) options.onViewportChange(instance, from, to); }); showingFrom = from; showingTo = to; displayOffset = heightAtLine(doc, from); startWorker(100); // Since this is all rather error prone, it is honoured with the // only assertion in the whole file. if (lineDiv.childNodes.length != showingTo - showingFrom) throw new Error("BAD PATCH! " + JSON.stringify(intact) + " size=" + (showingTo - showingFrom) + " nodes=" + lineDiv.childNodes.length); function checkHeights() { var curNode = lineDiv.firstChild, heightChanged = false; doc.iter(showingFrom, showingTo, function(line) { // Work around bizarro IE7 bug where, sometimes, our curNode // is magically replaced with a new node in the DOM, leaving // us with a reference to an orphan (nextSibling-less) node. if (!curNode) return; if (!line.hidden) { var height = Math.round(curNode.offsetHeight / th) || 1; if (line.height != height) { updateLineHeight(line, height); gutterDirty = heightChanged = true; } } curNode = curNode.nextSibling; }); return heightChanged; } if (options.lineWrapping) checkHeights(); gutter.style.display = gutterDisplay; if (different || gutterDirty) { // If the gutter grew in size, re-check heights. If those changed, re-draw gutter. updateGutter() && options.lineWrapping && checkHeights() && updateGutter(); } updateVerticalScroll(scrollTop); updateSelection(); if (!suppressCallback && options.onUpdate) options.onUpdate(instance); return true; } function computeIntact(intact, changes) { for (var i = 0, l = changes.length || 0; i < l; ++i) { var change = changes[i], intact2 = [], diff = change.diff || 0; for (var j = 0, l2 = intact.length; j < l2; ++j) { var range = intact[j]; if (change.to <= range.from && change.diff) intact2.push({from: range.from + diff, to: range.to + diff, domStart: range.domStart}); else if (change.to <= range.from || change.from >= range.to) intact2.push(range); else { if (change.from > range.from) intact2.push({from: range.from, to: change.from, domStart: range.domStart}); if (change.to < range.to) intact2.push({from: change.to + diff, to: range.to + diff, domStart: range.domStart + (change.to - range.from)}); } } intact = intact2; } return intact; } function patchDisplay(from, to, intact) { function killNode(node) { var tmp = node.nextSibling; node.parentNode.removeChild(node); return tmp; } // The first pass removes the DOM nodes that aren't intact. if (!intact.length) removeChildren(lineDiv); else { var domPos = 0, curNode = lineDiv.firstChild, n; for (var i = 0; i < intact.length; ++i) { var cur = intact[i]; while (cur.domStart > domPos) {curNode = killNode(curNode); domPos++;} for (var j = 0, e = cur.to - cur.from; j < e; ++j) {curNode = curNode.nextSibling; domPos++;} } while (curNode) curNode = killNode(curNode); } // This pass fills in the lines that actually changed. var nextIntact = intact.shift(), curNode = lineDiv.firstChild, j = from; doc.iter(from, to, function(line) { if (nextIntact && nextIntact.to == j) nextIntact = intact.shift(); if (!nextIntact || nextIntact.from > j) { if (line.hidden) var lineElement = elt("pre"); else { var lineElement = lineContent(line); if (line.className) lineElement.className = line.className; // Kludge to make sure the styled element lies behind the selection (by z-index) if (line.bgClassName) { var pre = elt("pre", "\u00a0", line.bgClassName, "position: absolute; left: 0; right: 0; top: 0; bottom: 0; z-index: -2"); lineElement = elt("div", [pre, lineElement], null, "position: relative"); } } lineDiv.insertBefore(lineElement, curNode); } else { curNode = curNode.nextSibling; } ++j; }); } function updateGutter() { if (!options.gutter && !options.lineNumbers) return; var hText = mover.offsetHeight, hEditor = scroller.clientHeight; gutter.style.height = (hText - hEditor < 2 ? hEditor : hText) + "px"; var fragment = document.createDocumentFragment(), i = showingFrom, normalNode; doc.iter(showingFrom, Math.max(showingTo, showingFrom + 1), function(line) { if (line.hidden) { fragment.appendChild(elt("pre")); } else { var marker = line.gutterMarker; var text = options.lineNumbers ? options.lineNumberFormatter(i + options.firstLineNumber) : null; if (marker && marker.text) text = marker.text.replace("%N%", text != null ? text : ""); else if (text == null) text = "\u00a0"; var markerElement = fragment.appendChild(elt("pre", null, marker && marker.style)); markerElement.innerHTML = text; for (var j = 1; j < line.height; ++j) { markerElement.appendChild(elt("br")); markerElement.appendChild(document.createTextNode("\u00a0")); } if (!marker) normalNode = i; } ++i; }); gutter.style.display = "none"; removeChildrenAndAdd(gutterText, fragment); // Make sure scrolling doesn't cause number gutter size to pop if (normalNode != null && options.lineNumbers) { var node = gutterText.childNodes[normalNode - showingFrom]; var minwidth = String(doc.size).length, val = eltText(node.firstChild), pad = ""; while (val.length + pad.length < minwidth) pad += "\u00a0"; if (pad) node.insertBefore(document.createTextNode(pad), node.firstChild); } gutter.style.display = ""; var resized = Math.abs((parseInt(lineSpace.style.marginLeft) || 0) - gutter.offsetWidth) > 2; lineSpace.style.marginLeft = gutter.offsetWidth + "px"; gutterDirty = false; return resized; } function updateSelection() { var collapsed = posEq(sel.from, sel.to); var fromPos = localCoords(sel.from, true); var toPos = collapsed ? fromPos : localCoords(sel.to, true); var headPos = sel.inverted ? fromPos : toPos, th = textHeight(); var wrapOff = eltOffset(wrapper), lineOff = eltOffset(lineDiv); inputDiv.style.top = Math.max(0, Math.min(scroller.offsetHeight, headPos.y + lineOff.top - wrapOff.top)) + "px"; inputDiv.style.left = Math.max(0, Math.min(scroller.offsetWidth, headPos.x + lineOff.left - wrapOff.left)) + "px"; if (collapsed) { cursor.style.top = headPos.y + "px"; cursor.style.left = (options.lineWrapping ? Math.min(headPos.x, lineSpace.offsetWidth) : headPos.x) + "px"; cursor.style.display = ""; selectionDiv.style.display = "none"; } else { var sameLine = fromPos.y == toPos.y, fragment = document.createDocumentFragment(); var clientWidth = lineSpace.clientWidth || lineSpace.offsetWidth; var clientHeight = lineSpace.clientHeight || lineSpace.offsetHeight; var add = function(left, top, right, height) { var rstyle = quirksMode ? "width: " + (!right ? clientWidth : clientWidth - right - left) + "px" : "right: " + right + "px"; fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left + "px; top: " + top + "px; " + rstyle + "; height: " + height + "px")); }; if (sel.from.ch && fromPos.y >= 0) { var right = sameLine ? clientWidth - toPos.x : 0; add(fromPos.x, fromPos.y, right, th); } var middleStart = Math.max(0, fromPos.y + (sel.from.ch ? th : 0)); var middleHeight = Math.min(toPos.y, clientHeight) - middleStart; if (middleHeight > 0.2 * th) add(0, middleStart, 0, middleHeight); if ((!sameLine || !sel.from.ch) && toPos.y < clientHeight - .5 * th) add(0, toPos.y, clientWidth - toPos.x, th); removeChildrenAndAdd(selectionDiv, fragment); cursor.style.display = "none"; selectionDiv.style.display = ""; } } function setShift(val) { if (val) shiftSelecting = shiftSelecting || (sel.inverted ? sel.to : sel.from); else shiftSelecting = null; } function setSelectionUser(from, to) { var sh = shiftSelecting && clipPos(shiftSelecting); if (sh) { if (posLess(sh, from)) from = sh; else if (posLess(to, sh)) to = sh; } setSelection(from, to); userSelChange = true; } // Update the selection. Last two args are only used by // updateLines, since they have to be expressed in the line // numbers before the update. function setSelection(from, to, oldFrom, oldTo) { goalColumn = null; if (oldFrom == null) {oldFrom = sel.from.line; oldTo = sel.to.line;} if (posEq(sel.from, from) && posEq(sel.to, to)) return; if (posLess(to, from)) {var tmp = to; to = from; from = tmp;} // Skip over hidden lines. if (from.line != oldFrom) { var from1 = skipHidden(from, oldFrom, sel.from.ch); // If there is no non-hidden line left, force visibility on current line if (!from1) setLineHidden(from.line, false); else from = from1; } if (to.line != oldTo) to = skipHidden(to, oldTo, sel.to.ch); if (posEq(from, to)) sel.inverted = false; else if (posEq(from, sel.to)) sel.inverted = false; else if (posEq(to, sel.from)) sel.inverted = true; if (options.autoClearEmptyLines && posEq(sel.from, sel.to)) { var head = sel.inverted ? from : to; if (head.line != sel.from.line && sel.from.line < doc.size) { var oldLine = getLine(sel.from.line); if (/^\s+$/.test(oldLine.text)) setTimeout(operation(function() { if (oldLine.parent && /^\s+$/.test(oldLine.text)) { var no = lineNo(oldLine); replaceRange("", {line: no, ch: 0}, {line: no, ch: oldLine.text.length}); } }, 10)); } } sel.from = from; sel.to = to; selectionChanged = true; } function skipHidden(pos, oldLine, oldCh) { function getNonHidden(dir) { var lNo = pos.line + dir, end = dir == 1 ? doc.size : -1; while (lNo != end) { var line = getLine(lNo); if (!line.hidden) { var ch = pos.ch; if (toEnd || ch > oldCh || ch > line.text.length) ch = line.text.length; return {line: lNo, ch: ch}; } lNo += dir; } } var line = getLine(pos.line); var toEnd = pos.ch == line.text.length && pos.ch != oldCh; if (!line.hidden) return pos; if (pos.line >= oldLine) return getNonHidden(1) || getNonHidden(-1); else return getNonHidden(-1) || getNonHidden(1); } function setCursor(line, ch, user) { var pos = clipPos({line: line, ch: ch || 0}); (user ? setSelectionUser : setSelection)(pos, pos); } function clipLine(n) {return Math.max(0, Math.min(n, doc.size-1));} function clipPos(pos) { if (pos.line < 0) return {line: 0, ch: 0}; if (pos.line >= doc.size) return {line: doc.size-1, ch: getLine(doc.size-1).text.length}; var ch = pos.ch, linelen = getLine(pos.line).text.length; if (ch == null || ch > linelen) return {line: pos.line, ch: linelen}; else if (ch < 0) return {line: pos.line, ch: 0}; else return pos; } function findPosH(dir, unit) { var end = sel.inverted ? sel.from : sel.to, line = end.line, ch = end.ch; var lineObj = getLine(line); function findNextLine() { for (var l = line + dir, e = dir < 0 ? -1 : doc.size; l != e; l += dir) { var lo = getLine(l); if (!lo.hidden) { line = l; lineObj = lo; return true; } } } function moveOnce(boundToLine) { if (ch == (dir < 0 ? 0 : lineObj.text.length)) { if (!boundToLine && findNextLine()) ch = dir < 0 ? lineObj.text.length : 0; else return false; } else ch += dir; return true; } if (unit == "char") moveOnce(); else if (unit == "column") moveOnce(true); else if (unit == "word") { var sawWord = false; for (;;) { if (dir < 0) if (!moveOnce()) break; if (isWordChar(lineObj.text.charAt(ch))) sawWord = true; else if (sawWord) {if (dir < 0) {dir = 1; moveOnce();} break;} if (dir > 0) if (!moveOnce()) break; } } return {line: line, ch: ch}; } function moveH(dir, unit) { var pos = dir < 0 ? sel.from : sel.to; if (shiftSelecting || posEq(sel.from, sel.to)) pos = findPosH(dir, unit); setCursor(pos.line, pos.ch, true); } function deleteH(dir, unit) { if (!posEq(sel.from, sel.to)) replaceRange("", sel.from, sel.to); else if (dir < 0) replaceRange("", findPosH(dir, unit), sel.to); else replaceRange("", sel.from, findPosH(dir, unit)); userSelChange = true; } function moveV(dir, unit) { var dist = 0, pos = localCoords(sel.inverted ? sel.from : sel.to, true); if (goalColumn != null) pos.x = goalColumn; if (unit == "page") { var screen = Math.min(scroller.clientHeight, window.innerHeight || document.documentElement.clientHeight); var target = coordsChar(pos.x, pos.y + screen * dir); } else if (unit == "line") { var th = textHeight(); var target = coordsChar(pos.x, pos.y + .5 * th + dir * th); } if (unit == "page") scrollbar.scrollTop += localCoords(target, true).y - pos.y; setCursor(target.line, target.ch, true); goalColumn = pos.x; } function findWordAt(pos) { var line = getLine(pos.line).text; var start = pos.ch, end = pos.ch; if (line) { if (pos.after === false || end == line.length) --start; else ++end; var startChar = line.charAt(start); var check = isWordChar(startChar) ? isWordChar : /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);} : function(ch) {return !/\s/.test(ch) && isWordChar(ch);}; while (start > 0 && check(line.charAt(start - 1))) --start; while (end < line.length && check(line.charAt(end))) ++end; } return {from: {line: pos.line, ch: start}, to: {line: pos.line, ch: end}}; } function selectLine(line) { setSelectionUser({line: line, ch: 0}, clipPos({line: line + 1, ch: 0})); } function indentSelected(mode) { if (posEq(sel.from, sel.to)) return indentLine(sel.from.line, mode); var e = sel.to.line - (sel.to.ch ? 0 : 1); for (var i = sel.from.line; i <= e; ++i) indentLine(i, mode); } function indentLine(n, how) { if (!how) how = "add"; if (how == "smart") { if (!mode.indent) how = "prev"; else var state = getStateBefore(n); } var line = getLine(n), curSpace = line.indentation(options.tabSize), curSpaceString = line.text.match(/^\s*/)[0], indentation; if (how == "smart") { indentation = mode.indent(state, line.text.slice(curSpaceString.length), line.text); if (indentation == Pass) how = "prev"; } if (how == "prev") { if (n) indentation = getLine(n-1).indentation(options.tabSize); else indentation = 0; } else if (how == "add") indentation = curSpace + options.indentUnit; else if (how == "subtract") indentation = curSpace - options.indentUnit; indentation = Math.max(0, indentation); var diff = indentation - curSpace; var indentString = "", pos = 0; if (options.indentWithTabs) for (var i = Math.floor(indentation / options.tabSize); i; --i) {pos += options.tabSize; indentString += "\t";} if (pos < indentation) indentString += spaceStr(indentation - pos); if (indentString != curSpaceString) replaceRange(indentString, {line: n, ch: 0}, {line: n, ch: curSpaceString.length}); line.stateAfter = null; } function loadMode() { mode = CodeMirror.getMode(options, options.mode); doc.iter(0, doc.size, function(line) { line.stateAfter = null; }); frontier = 0; startWorker(100); } function gutterChanged() { var visible = options.gutter || options.lineNumbers; gutter.style.display = visible ? "" : "none"; if (visible) gutterDirty = true; else lineDiv.parentNode.style.marginLeft = 0; } function wrappingChanged(from, to) { if (options.lineWrapping) { wrapper.className += " CodeMirror-wrap"; var perLine = scroller.clientWidth / charWidth() - 3; doc.iter(0, doc.size, function(line) { if (line.hidden) return; var guess = Math.ceil(line.text.length / perLine) || 1; if (guess != 1) updateLineHeight(line, guess); }); lineSpace.style.minWidth = widthForcer.style.left = ""; } else { wrapper.className = wrapper.className.replace(" CodeMirror-wrap", ""); computeMaxLength(); doc.iter(0, doc.size, function(line) { if (line.height != 1 && !line.hidden) updateLineHeight(line, 1); }); } changes.push({from: 0, to: doc.size}); } function themeChanged() { scroller.className = scroller.className.replace(/\s*cm-s-\S+/g, "") + options.theme.replace(/(^|\s)\s*/g, " cm-s-"); } function keyMapChanged() { var style = keyMap[options.keyMap].style; wrapper.className = wrapper.className.replace(/\s*cm-keymap-\S+/g, "") + (style ? " cm-keymap-" + style : ""); } function TextMarker(type, style) { this.lines = []; this.type = type; if (style) this.style = style; } TextMarker.prototype.clear = operation(function() { var min, max; for (var i = 0; i < this.lines.length; ++i) { var line = this.lines[i]; var span = getMarkedSpanFor(line.markedSpans, this); if (span.from != null) min = lineNo(line); if (span.to != null) max = lineNo(line); line.markedSpans = removeMarkedSpan(line.markedSpans, span); } if (min != null) changes.push({from: min, to: max + 1}); this.lines.length = 0; this.explicitlyCleared = true; }); TextMarker.prototype.find = function() { var from, to; for (var i = 0; i < this.lines.length; ++i) { var line = this.lines[i]; var span = getMarkedSpanFor(line.markedSpans, this); if (span.from != null || span.to != null) { var found = lineNo(line); if (span.from != null) from = {line: found, ch: span.from}; if (span.to != null) to = {line: found, ch: span.to}; } } if (this.type == "bookmark") return from; return from && {from: from, to: to}; }; function markText(from, to, className, options) { from = clipPos(from); to = clipPos(to); var marker = new TextMarker("range", className); if (options) for (var opt in options) if (options.hasOwnProperty(opt)) marker[opt] = options[opt]; var curLine = from.line; doc.iter(curLine, to.line + 1, function(line) { var span = {from: curLine == from.line ? from.ch : null, to: curLine == to.line ? to.ch : null, marker: marker}; line.markedSpans = (line.markedSpans || []).concat([span]); marker.lines.push(line); ++curLine; }); changes.push({from: from.line, to: to.line + 1}); return marker; } function setBookmark(pos) { pos = clipPos(pos); var marker = new TextMarker("bookmark"), line = getLine(pos.line); history.addChange(pos.line, 1, [newHL(line.text, line.markedSpans)], true); var span = {from: pos.ch, to: pos.ch, marker: marker}; line.markedSpans = (line.markedSpans || []).concat([span]); marker.lines.push(line); return marker; } function findMarksAt(pos) { pos = clipPos(pos); var markers = [], spans = getLine(pos.line).markedSpans; if (spans) for (var i = 0; i < spans.length; ++i) { var span = spans[i]; if ((span.from == null || span.from <= pos.ch) && (span.to == null || span.to >= pos.ch)) markers.push(span.marker); } return markers; } function addGutterMarker(line, text, className) { if (typeof line == "number") line = getLine(clipLine(line)); line.gutterMarker = {text: text, style: className}; gutterDirty = true; return line; } function removeGutterMarker(line) { if (typeof line == "number") line = getLine(clipLine(line)); line.gutterMarker = null; gutterDirty = true; } function changeLine(handle, op) { var no = handle, line = handle; if (typeof handle == "number") line = getLine(clipLine(handle)); else no = lineNo(handle); if (no == null) return null; if (op(line, no)) changes.push({from: no, to: no + 1}); else return null; return line; } function setLineClass(handle, className, bgClassName) { return changeLine(handle, function(line) { if (line.className != className || line.bgClassName != bgClassName) { line.className = className; line.bgClassName = bgClassName; return true; } }); } function setLineHidden(handle, hidden) { return changeLine(handle, function(line, no) { if (line.hidden != hidden) { line.hidden = hidden; if (!options.lineWrapping) { if (hidden && line.text.length == maxLine.text.length) { updateMaxLine = true; } else if (!hidden && line.text.length > maxLine.text.length) { maxLine = line; updateMaxLine = false; } } updateLineHeight(line, hidden ? 0 : 1); var fline = sel.from.line, tline = sel.to.line; if (hidden && (fline == no || tline == no)) { var from = fline == no ? skipHidden({line: fline, ch: 0}, fline, 0) : sel.from; var to = tline == no ? skipHidden({line: tline, ch: 0}, tline, 0) : sel.to; // Can't hide the last visible line, we'd have no place to put the cursor if (!to) return; setSelection(from, to); } return (gutterDirty = true); } }); } function lineInfo(line) { if (typeof line == "number") { if (!isLine(line)) return null; var n = line; line = getLine(line); if (!line) return null; } else { var n = lineNo(line); if (n == null) return null; } var marker = line.gutterMarker; return {line: n, handle: line, text: line.text, markerText: marker && marker.text, markerClass: marker && marker.style, lineClass: line.className, bgClass: line.bgClassName}; } function measureLine(line, ch) { if (ch == 0) return {top: 0, left: 0}; var pre = lineContent(line, ch); removeChildrenAndAdd(measure, pre); var anchor = pre.anchor; var top = anchor.offsetTop, left = anchor.offsetLeft; // Older IEs report zero offsets for spans directly after a wrap if (ie && top == 0 && left == 0) { var backup = elt("span", "x"); anchor.parentNode.insertBefore(backup, anchor.nextSibling); top = backup.offsetTop; } return {top: top, left: left}; } function localCoords(pos, inLineWrap) { var x, lh = textHeight(), y = lh * (heightAtLine(doc, pos.line) - (inLineWrap ? displayOffset : 0)); if (pos.ch == 0) x = 0; else { var sp = measureLine(getLine(pos.line), pos.ch); x = sp.left; if (options.lineWrapping) y += Math.max(0, sp.top); } return {x: x, y: y, yBot: y + lh}; } // Coords must be lineSpace-local function coordsChar(x, y) { var th = textHeight(), cw = charWidth(), heightPos = displayOffset + Math.floor(y / th); if (heightPos < 0) return {line: 0, ch: 0}; var lineNo = lineAtHeight(doc, heightPos); if (lineNo >= doc.size) return {line: doc.size - 1, ch: getLine(doc.size - 1).text.length}; var lineObj = getLine(lineNo), text = lineObj.text; var tw = options.lineWrapping, innerOff = tw ? heightPos - heightAtLine(doc, lineNo) : 0; if (x <= 0 && innerOff == 0) return {line: lineNo, ch: 0}; var wrongLine = false; function getX(len) { var sp = measureLine(lineObj, len); if (tw) { var off = Math.round(sp.top / th); wrongLine = off != innerOff; return Math.max(0, sp.left + (off - innerOff) * scroller.clientWidth); } return sp.left; } var from = 0, fromX = 0, to = text.length, toX; // Guess a suitable upper bound for our search. var estimated = Math.min(to, Math.ceil((x + innerOff * scroller.clientWidth * .9) / cw)); for (;;) { var estX = getX(estimated); if (estX <= x && estimated < to) estimated = Math.min(to, Math.ceil(estimated * 1.2)); else {toX = estX; to = estimated; break;} } if (x > toX) return {line: lineNo, ch: to}; // Try to guess a suitable lower bound as well. estimated = Math.floor(to * 0.8); estX = getX(estimated); if (estX < x) {from = estimated; fromX = estX;} // Do a binary search between these bounds. for (;;) { if (to - from <= 1) { var after = x - fromX < toX - x; return {line: lineNo, ch: after ? from : to, after: after}; } var middle = Math.ceil((from + to) / 2), middleX = getX(middle); if (middleX > x) {to = middle; toX = middleX; if (wrongLine) toX += 1000; } else {from = middle; fromX = middleX;} } } function pageCoords(pos) { var local = localCoords(pos, true), off = eltOffset(lineSpace); return {x: off.left + local.x, y: off.top + local.y, yBot: off.top + local.yBot}; } var cachedHeight, cachedHeightFor, measurePre; function textHeight() { if (measurePre == null) { measurePre = elt("pre"); for (var i = 0; i < 49; ++i) { measurePre.appendChild(document.createTextNode("x")); measurePre.appendChild(elt("br")); } measurePre.appendChild(document.createTextNode("x")); } var offsetHeight = lineDiv.clientHeight; if (offsetHeight == cachedHeightFor) return cachedHeight; cachedHeightFor = offsetHeight; removeChildrenAndAdd(measure, measurePre.cloneNode(true)); cachedHeight = measure.firstChild.offsetHeight / 50 || 1; removeChildren(measure); return cachedHeight; } var cachedWidth, cachedWidthFor = 0; function charWidth() { if (scroller.clientWidth == cachedWidthFor) return cachedWidth; cachedWidthFor = scroller.clientWidth; var anchor = elt("span", "x"); var pre = elt("pre", [anchor]); removeChildrenAndAdd(measure, pre); return (cachedWidth = anchor.offsetWidth || 10); } function paddingTop() {return lineSpace.offsetTop;} function paddingLeft() {return lineSpace.offsetLeft;} function posFromMouse(e, liberal) { var offW = eltOffset(scroller, true), x, y; // Fails unpredictably on IE[67] when mouse is dragged around quickly. try { x = e.clientX; y = e.clientY; } catch (e) { return null; } // This is a mess of a heuristic to try and determine whether a // scroll-bar was clicked or not, and to return null if one was // (and !liberal). if (!liberal && (x - offW.left > scroller.clientWidth || y - offW.top > scroller.clientHeight)) return null; var offL = eltOffset(lineSpace, true); return coordsChar(x - offL.left, y - offL.top); } var detectingSelectAll; function onContextMenu(e) { var pos = posFromMouse(e), scrollPos = scrollbar.scrollTop; if (!pos || opera) return; // Opera is difficult. if (posEq(sel.from, sel.to) || posLess(pos, sel.from) || !posLess(pos, sel.to)) operation(setCursor)(pos.line, pos.ch); var oldCSS = input.style.cssText; inputDiv.style.position = "absolute"; input.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.clientY - 5) + "px; left: " + (e.clientX - 5) + "px; z-index: 1000; background: white; " + "border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);"; focusInput(); resetInput(true); // Adds "Select all" to context menu in FF if (posEq(sel.from, sel.to)) input.value = prevInput = " "; function rehide() { inputDiv.style.position = "relative"; input.style.cssText = oldCSS; if (ie_lt9) scrollbar.scrollTop = scrollPos; slowPoll(); // Try to detect the user choosing select-all if (input.selectionStart != null) { clearTimeout(detectingSelectAll); var extval = input.value = " " + (posEq(sel.from, sel.to) ? "" : input.value), i = 0; prevInput = " "; input.selectionStart = 1; input.selectionEnd = extval.length; detectingSelectAll = setTimeout(function poll(){ if (prevInput == " " && input.selectionStart == 0) operation(commands.selectAll)(instance); else if (i++ < 10) detectingSelectAll = setTimeout(poll, 500); else resetInput(); }, 200); } } if (gecko) { e_stop(e); var mouseup = connect(window, "mouseup", function() { mouseup(); setTimeout(rehide, 20); }, true); } else { setTimeout(rehide, 50); } } // Cursor-blinking function restartBlink() { clearInterval(blinker); var on = true; cursor.style.visibility = ""; blinker = setInterval(function() { cursor.style.visibility = (on = !on) ? "" : "hidden"; }, options.cursorBlinkRate); } var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<"}; function matchBrackets(autoclear) { var head = sel.inverted ? sel.from : sel.to, line = getLine(head.line), pos = head.ch - 1; var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)]; if (!match) return; var ch = match.charAt(0), forward = match.charAt(1) == ">", d = forward ? 1 : -1, st = line.styles; for (var off = pos + 1, i = 0, e = st.length; i < e; i+=2) if ((off -= st[i].length) <= 0) {var style = st[i+1]; break;} var stack = [line.text.charAt(pos)], re = /[(){}[\]]/; function scan(line, from, to) { if (!line.text) return; var st = line.styles, pos = forward ? 0 : line.text.length - 1, cur; for (var i = forward ? 0 : st.length - 2, e = forward ? st.length : -2; i != e; i += 2*d) { var text = st[i]; if (st[i+1] != style) {pos += d * text.length; continue;} for (var j = forward ? 0 : text.length - 1, te = forward ? text.length : -1; j != te; j += d, pos+=d) { if (pos >= from && pos < to && re.test(cur = text.charAt(j))) { var match = matching[cur]; if (match.charAt(1) == ">" == forward) stack.push(cur); else if (stack.pop() != match.charAt(0)) return {pos: pos, match: false}; else if (!stack.length) return {pos: pos, match: true}; } } } } for (var i = head.line, e = forward ? Math.min(i + 100, doc.size) : Math.max(-1, i - 100); i != e; i+=d) { var line = getLine(i), first = i == head.line; var found = scan(line, first && forward ? pos + 1 : 0, first && !forward ? pos : line.text.length); if (found) break; } if (!found) found = {pos: null, match: false}; var style = found.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket"; var one = markText({line: head.line, ch: pos}, {line: head.line, ch: pos+1}, style), two = found.pos != null && markText({line: i, ch: found.pos}, {line: i, ch: found.pos + 1}, style); var clear = operation(function(){one.clear(); two && two.clear();}); if (autoclear) setTimeout(clear, 800); else bracketHighlighted = clear; } // Finds the line to start with when starting a parse. Tries to // find a line with a stateAfter, so that it can start with a // valid state. If that fails, it returns the line with the // smallest indentation, which tends to need the least context to // parse correctly. function findStartLine(n) { var minindent, minline; for (var search = n, lim = n - 40; search > lim; --search) { if (search == 0) return 0; var line = getLine(search-1); if (line.stateAfter) return search; var indented = line.indentation(options.tabSize); if (minline == null || minindent > indented) { minline = search - 1; minindent = indented; } } return minline; } function getStateBefore(n) { var pos = findStartLine(n), state = pos && getLine(pos-1).stateAfter; if (!state) state = startState(mode); else state = copyState(mode, state); doc.iter(pos, n, function(line) { line.process(mode, state, options.tabSize); line.stateAfter = (pos == n - 1 || pos % 5 == 0) ? copyState(mode, state) : null; }); return state; } function highlightWorker() { if (frontier >= showingTo) return; var end = +new Date + options.workTime, state = copyState(mode, getStateBefore(frontier)); var startFrontier = frontier; doc.iter(frontier, showingTo, function(line) { if (frontier >= showingFrom) { // Visible line.highlight(mode, state, options.tabSize); line.stateAfter = copyState(mode, state); } else { line.process(mode, state, options.tabSize); line.stateAfter = frontier % 5 == 0 ? copyState(mode, state) : null; } ++frontier; if (+new Date > end) { startWorker(options.workDelay); return true; } }); if (showingTo > startFrontier && frontier >= showingFrom) operation(function() {changes.push({from: startFrontier, to: frontier});})(); } function startWorker(time) { if (frontier < showingTo) highlight.set(time, highlightWorker); } // Operations are used to wrap changes in such a way that each // change won't have to update the cursor and display (which would // be awkward, slow, and error-prone), but instead updates are // batched and then all combined and executed at once. function startOperation() { updateInput = userSelChange = textChanged = null; changes = []; selectionChanged = false; callbacks = []; } function endOperation() { if (updateMaxLine) computeMaxLength(); if (maxLineChanged && !options.lineWrapping) { var cursorWidth = widthForcer.offsetWidth, left = measureLine(maxLine, maxLine.text.length).left; if (!ie_lt8) { widthForcer.style.left = left + "px"; lineSpace.style.minWidth = (left + cursorWidth) + "px"; } maxLineChanged = false; } var newScrollPos, updated; if (selectionChanged) { var coords = calculateCursorCoords(); newScrollPos = calculateScrollPos(coords.x, coords.y, coords.x, coords.yBot); } if (changes.length || newScrollPos && newScrollPos.scrollTop != null) updated = updateDisplay(changes, true, newScrollPos && newScrollPos.scrollTop); if (!updated) { if (selectionChanged) updateSelection(); if (gutterDirty) updateGutter(); } if (newScrollPos) scrollCursorIntoView(); if (selectionChanged) restartBlink(); if (focused && (updateInput === true || (updateInput !== false && selectionChanged))) resetInput(userSelChange); if (selectionChanged && options.matchBrackets) setTimeout(operation(function() { if (bracketHighlighted) {bracketHighlighted(); bracketHighlighted = null;} if (posEq(sel.from, sel.to)) matchBrackets(false); }), 20); var sc = selectionChanged, cbs = callbacks; // these can be reset by callbacks if (textChanged && options.onChange && instance) options.onChange(instance, textChanged); if (sc && options.onCursorActivity) options.onCursorActivity(instance); for (var i = 0; i < cbs.length; ++i) cbs[i](instance); if (updated && options.onUpdate) options.onUpdate(instance); } var nestedOperation = 0; function operation(f) { return function() { if (!nestedOperation++) startOperation(); try {var result = f.apply(this, arguments);} finally {if (!--nestedOperation) endOperation();} return result; }; } function compoundChange(f) { history.startCompound(); try { return f(); } finally { history.endCompound(); } } for (var ext in extensions) if (extensions.propertyIsEnumerable(ext) && !instance.propertyIsEnumerable(ext)) instance[ext] = extensions[ext]; for (var i = 0; i < initHooks.length; ++i) initHooks[i](instance); return instance; } // (end of function CodeMirror) // The default configuration options. CodeMirror.defaults = { value: "", mode: null, theme: "default", indentUnit: 2, indentWithTabs: false, smartIndent: true, tabSize: 4, keyMap: "default", extraKeys: null, electricChars: true, autoClearEmptyLines: false, onKeyEvent: null, onDragEvent: null, lineWrapping: false, lineNumbers: false, gutter: false, fixedGutter: false, firstLineNumber: 1, readOnly: false, dragDrop: true, onChange: null, onCursorActivity: null, onViewportChange: null, onGutterClick: null, onUpdate: null, onFocus: null, onBlur: null, onScroll: null, matchBrackets: false, cursorBlinkRate: 530, workTime: 100, workDelay: 200, pollInterval: 100, undoDepth: 40, tabindex: null, autofocus: null, lineNumberFormatter: function(integer) { return integer; } }; var ios = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent); var mac = ios || /Mac/.test(navigator.platform); var win = /Win/.test(navigator.platform); // Known modes, by name and by MIME var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {}; CodeMirror.defineMode = function(name, mode) { if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name; if (arguments.length > 2) { mode.dependencies = []; for (var i = 2; i < arguments.length; ++i) mode.dependencies.push(arguments[i]); } modes[name] = mode; }; CodeMirror.defineMIME = function(mime, spec) { mimeModes[mime] = spec; }; CodeMirror.resolveMode = function(spec) { if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) spec = mimeModes[spec]; else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) return CodeMirror.resolveMode("application/xml"); if (typeof spec == "string") return {name: spec}; else return spec || {name: "null"}; }; CodeMirror.getMode = function(options, spec) { var spec = CodeMirror.resolveMode(spec); var mfactory = modes[spec.name]; if (!mfactory) return CodeMirror.getMode(options, "text/plain"); var modeObj = mfactory(options, spec); if (modeExtensions.hasOwnProperty(spec.name)) { var exts = modeExtensions[spec.name]; for (var prop in exts) if (exts.hasOwnProperty(prop)) modeObj[prop] = exts[prop]; } modeObj.name = spec.name; return modeObj; }; CodeMirror.listModes = function() { var list = []; for (var m in modes) if (modes.propertyIsEnumerable(m)) list.push(m); return list; }; CodeMirror.listMIMEs = function() { var list = []; for (var m in mimeModes) if (mimeModes.propertyIsEnumerable(m)) list.push({mime: m, mode: mimeModes[m]}); return list; }; var extensions = CodeMirror.extensions = {}; CodeMirror.defineExtension = function(name, func) { extensions[name] = func; }; var initHooks = []; CodeMirror.defineInitHook = function(f) {initHooks.push(f);}; var modeExtensions = CodeMirror.modeExtensions = {}; CodeMirror.extendMode = function(mode, properties) { var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {}); for (var prop in properties) if (properties.hasOwnProperty(prop)) exts[prop] = properties[prop]; }; var commands = CodeMirror.commands = { selectAll: function(cm) {cm.setSelection({line: 0, ch: 0}, {line: cm.lineCount() - 1});}, killLine: function(cm) { var from = cm.getCursor(true), to = cm.getCursor(false), sel = !posEq(from, to); if (!sel && cm.getLine(from.line).length == from.ch) cm.replaceRange("", from, {line: from.line + 1, ch: 0}); else cm.replaceRange("", from, sel ? to : {line: from.line}); }, deleteLine: function(cm) {var l = cm.getCursor().line; cm.replaceRange("", {line: l, ch: 0}, {line: l});}, undo: function(cm) {cm.undo();}, redo: function(cm) {cm.redo();}, goDocStart: function(cm) {cm.setCursor(0, 0, true);}, goDocEnd: function(cm) {cm.setSelection({line: cm.lineCount() - 1}, null, true);}, goLineStart: function(cm) {cm.setCursor(cm.getCursor().line, 0, true);}, goLineStartSmart: function(cm) { var cur = cm.getCursor(); var text = cm.getLine(cur.line), firstNonWS = Math.max(0, text.search(/\S/)); cm.setCursor(cur.line, cur.ch <= firstNonWS && cur.ch ? 0 : firstNonWS, true); }, goLineEnd: function(cm) {cm.setSelection({line: cm.getCursor().line}, null, true);}, goLineUp: function(cm) {cm.moveV(-1, "line");}, goLineDown: function(cm) {cm.moveV(1, "line");}, goPageUp: function(cm) {cm.moveV(-1, "page");}, goPageDown: function(cm) {cm.moveV(1, "page");}, goCharLeft: function(cm) {cm.moveH(-1, "char");}, goCharRight: function(cm) {cm.moveH(1, "char");}, goColumnLeft: function(cm) {cm.moveH(-1, "column");}, goColumnRight: function(cm) {cm.moveH(1, "column");}, goWordLeft: function(cm) {cm.moveH(-1, "word");}, goWordRight: function(cm) {cm.moveH(1, "word");}, delCharLeft: function(cm) {cm.deleteH(-1, "char");}, delCharRight: function(cm) {cm.deleteH(1, "char");}, delWordLeft: function(cm) {cm.deleteH(-1, "word");}, delWordRight: function(cm) {cm.deleteH(1, "word");}, indentAuto: function(cm) {cm.indentSelection("smart");}, indentMore: function(cm) {cm.indentSelection("add");}, indentLess: function(cm) {cm.indentSelection("subtract");}, insertTab: function(cm) {cm.replaceSelection("\t", "end");}, defaultTab: function(cm) { if (cm.somethingSelected()) cm.indentSelection("add"); else cm.replaceSelection("\t", "end"); }, transposeChars: function(cm) { var cur = cm.getCursor(), line = cm.getLine(cur.line); if (cur.ch > 0 && cur.ch < line.length - 1) cm.replaceRange(line.charAt(cur.ch) + line.charAt(cur.ch - 1), {line: cur.line, ch: cur.ch - 1}, {line: cur.line, ch: cur.ch + 1}); }, newlineAndIndent: function(cm) { cm.replaceSelection("\n", "end"); cm.indentLine(cm.getCursor().line); }, toggleOverwrite: function(cm) {cm.toggleOverwrite();} }; var keyMap = CodeMirror.keyMap = {}; keyMap.basic = { "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown", "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown", "Delete": "delCharRight", "Backspace": "delCharLeft", "Tab": "defaultTab", "Shift-Tab": "indentAuto", "Enter": "newlineAndIndent", "Insert": "toggleOverwrite" }; // Note that the save and find-related commands aren't defined by // default. Unknown commands are simply ignored. keyMap.pcDefault = { "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo", "Ctrl-Home": "goDocStart", "Alt-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd", "Ctrl-Left": "goWordLeft", "Ctrl-Right": "goWordRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd", "Ctrl-Backspace": "delWordLeft", "Ctrl-Delete": "delWordRight", "Ctrl-S": "save", "Ctrl-F": "find", "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll", "Ctrl-[": "indentLess", "Ctrl-]": "indentMore", fallthrough: "basic" }; keyMap.macDefault = { "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goWordLeft", "Alt-Right": "goWordRight", "Cmd-Left": "goLineStart", "Cmd-Right": "goLineEnd", "Alt-Backspace": "delWordLeft", "Ctrl-Alt-Backspace": "delWordRight", "Alt-Delete": "delWordRight", "Cmd-S": "save", "Cmd-F": "find", "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", "Cmd-[": "indentLess", "Cmd-]": "indentMore", fallthrough: ["basic", "emacsy"] }; keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; keyMap.emacsy = { "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", "Ctrl-V": "goPageUp", "Shift-Ctrl-V": "goPageDown", "Ctrl-D": "delCharRight", "Ctrl-H": "delCharLeft", "Alt-D": "delWordRight", "Alt-Backspace": "delWordLeft", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars" }; function getKeyMap(val) { if (typeof val == "string") return keyMap[val]; else return val; } function lookupKey(name, extraMap, map, handle, stop) { function lookup(map) { map = getKeyMap(map); var found = map[name]; if (found === false) { if (stop) stop(); return true; } if (found != null && handle(found)) return true; if (map.nofallthrough) { if (stop) stop(); return true; } var fallthrough = map.fallthrough; if (fallthrough == null) return false; if (Object.prototype.toString.call(fallthrough) != "[object Array]") return lookup(fallthrough); for (var i = 0, e = fallthrough.length; i < e; ++i) { if (lookup(fallthrough[i])) return true; } return false; } if (extraMap && lookup(extraMap)) return true; return lookup(map); } function isModifierKey(event) { var name = keyNames[e_prop(event, "keyCode")]; return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod"; } CodeMirror.isModifierKey = isModifierKey; CodeMirror.fromTextArea = function(textarea, options) { if (!options) options = {}; options.value = textarea.value; if (!options.tabindex && textarea.tabindex) options.tabindex = textarea.tabindex; // Set autofocus to true if this textarea is focused, or if it has // autofocus and no other element is focused. if (options.autofocus == null) { var hasFocus = document.body; // doc.activeElement occasionally throws on IE try { hasFocus = document.activeElement; } catch(e) {} options.autofocus = hasFocus == textarea || textarea.getAttribute("autofocus") != null && hasFocus == document.body; } function save() {textarea.value = instance.getValue();} if (textarea.form) { // Deplorable hack to make the submit method do the right thing. var rmSubmit = connect(textarea.form, "submit", save, true); if (typeof textarea.form.submit == "function") { var realSubmit = textarea.form.submit; textarea.form.submit = function wrappedSubmit() { save(); textarea.form.submit = realSubmit; textarea.form.submit(); textarea.form.submit = wrappedSubmit; }; } } textarea.style.display = "none"; var instance = CodeMirror(function(node) { textarea.parentNode.insertBefore(node, textarea.nextSibling); }, options); instance.save = save; instance.getTextArea = function() { return textarea; }; instance.toTextArea = function() { save(); textarea.parentNode.removeChild(instance.getWrapperElement()); textarea.style.display = ""; if (textarea.form) { rmSubmit(); if (typeof textarea.form.submit == "function") textarea.form.submit = realSubmit; } }; return instance; }; var gecko = /gecko\/\d{7}/i.test(navigator.userAgent); var ie = /MSIE \d/.test(navigator.userAgent); var ie_lt8 = /MSIE [1-7]\b/.test(navigator.userAgent); var ie_lt9 = /MSIE [1-8]\b/.test(navigator.userAgent); var quirksMode = ie && document.documentMode == 5; var webkit = /WebKit\//.test(navigator.userAgent); var chrome = /Chrome\//.test(navigator.userAgent); var opera = /Opera\//.test(navigator.userAgent); var safari = /Apple Computer/.test(navigator.vendor); var khtml = /KHTML\//.test(navigator.userAgent); var mac_geLion = /Mac OS X 10\D([7-9]|\d\d)\D/.test(navigator.userAgent); // Utility functions for working with state. Exported because modes // sometimes need to do this. function copyState(mode, state) { if (state === true) return state; if (mode.copyState) return mode.copyState(state); var nstate = {}; for (var n in state) { var val = state[n]; if (val instanceof Array) val = val.concat([]); nstate[n] = val; } return nstate; } CodeMirror.copyState = copyState; function startState(mode, a1, a2) { return mode.startState ? mode.startState(a1, a2) : true; } CodeMirror.startState = startState; CodeMirror.innerMode = function(mode, state) { while (mode.innerMode) { var info = mode.innerMode(state); state = info.state; mode = info.mode; } return info || {mode: mode, state: state}; }; // The character stream used by a mode's parser. function StringStream(string, tabSize) { this.pos = this.start = 0; this.string = string; this.tabSize = tabSize || 8; } StringStream.prototype = { eol: function() {return this.pos >= this.string.length;}, sol: function() {return this.pos == 0;}, peek: function() {return this.string.charAt(this.pos) || undefined;}, next: function() { if (this.pos < this.string.length) return this.string.charAt(this.pos++); }, eat: function(match) { var ch = this.string.charAt(this.pos); if (typeof match == "string") var ok = ch == match; else var ok = ch && (match.test ? match.test(ch) : match(ch)); if (ok) {++this.pos; return ch;} }, eatWhile: function(match) { var start = this.pos; while (this.eat(match)){} return this.pos > start; }, eatSpace: function() { var start = this.pos; while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos; return this.pos > start; }, skipToEnd: function() {this.pos = this.string.length;}, skipTo: function(ch) { var found = this.string.indexOf(ch, this.pos); if (found > -1) {this.pos = found; return true;} }, backUp: function(n) {this.pos -= n;}, column: function() {return countColumn(this.string, this.start, this.tabSize);}, indentation: function() {return countColumn(this.string, null, this.tabSize);}, match: function(pattern, consume, caseInsensitive) { if (typeof pattern == "string") { var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;}; if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) { if (consume !== false) this.pos += pattern.length; return true; } } else { var match = this.string.slice(this.pos).match(pattern); if (match && match.index > 0) return null; if (match && consume !== false) this.pos += match[0].length; return match; } }, current: function(){return this.string.slice(this.start, this.pos);} }; CodeMirror.StringStream = StringStream; function MarkedSpan(from, to, marker) { this.from = from; this.to = to; this.marker = marker; } function getMarkedSpanFor(spans, marker) { if (spans) for (var i = 0; i < spans.length; ++i) { var span = spans[i]; if (span.marker == marker) return span; } } function removeMarkedSpan(spans, span) { var r; for (var i = 0; i < spans.length; ++i) if (spans[i] != span) (r || (r = [])).push(spans[i]); return r; } function markedSpansBefore(old, startCh, endCh) { if (old) for (var i = 0, nw; i < old.length; ++i) { var span = old[i], marker = span.marker; var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); if (startsBefore || marker.type == "bookmark" && span.from == startCh && span.from != endCh) { var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh); (nw || (nw = [])).push({from: span.from, to: endsAfter ? null : span.to, marker: marker}); } } return nw; } function markedSpansAfter(old, endCh) { if (old) for (var i = 0, nw; i < old.length; ++i) { var span = old[i], marker = span.marker; var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); if (endsAfter || marker.type == "bookmark" && span.from == endCh) { var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh); (nw || (nw = [])).push({from: startsBefore ? null : span.from - endCh, to: span.to == null ? null : span.to - endCh, marker: marker}); } } return nw; } function updateMarkedSpans(oldFirst, oldLast, startCh, endCh, newText) { if (!oldFirst && !oldLast) return newText; // Get the spans that 'stick out' on both sides var first = markedSpansBefore(oldFirst, startCh); var last = markedSpansAfter(oldLast, endCh); // Next, merge those two ends var sameLine = newText.length == 1, offset = lst(newText).length + (sameLine ? startCh : 0); if (first) { // Fix up .to properties of first for (var i = 0; i < first.length; ++i) { var span = first[i]; if (span.to == null) { var found = getMarkedSpanFor(last, span.marker); if (!found) span.to = startCh; else if (sameLine) span.to = found.to == null ? null : found.to + offset; } } } if (last) { // Fix up .from in last (or move them into first in case of sameLine) for (var i = 0; i < last.length; ++i) { var span = last[i]; if (span.to != null) span.to += offset; if (span.from == null) { var found = getMarkedSpanFor(first, span.marker); if (!found) { span.from = offset; if (sameLine) (first || (first = [])).push(span); } } else { span.from += offset; if (sameLine) (first || (first = [])).push(span); } } } var newMarkers = [newHL(newText[0], first)]; if (!sameLine) { // Fill gap with whole-line-spans var gap = newText.length - 2, gapMarkers; if (gap > 0 && first) for (var i = 0; i < first.length; ++i) if (first[i].to == null) (gapMarkers || (gapMarkers = [])).push({from: null, to: null, marker: first[i].marker}); for (var i = 0; i < gap; ++i) newMarkers.push(newHL(newText[i+1], gapMarkers)); newMarkers.push(newHL(lst(newText), last)); } return newMarkers; } // hl stands for history-line, a data structure that can be either a // string (line without markers) or a {text, markedSpans} object. function hlText(val) { return typeof val == "string" ? val : val.text; } function hlSpans(val) { if (typeof val == "string") return null; var spans = val.markedSpans, out = null; for (var i = 0; i < spans.length; ++i) { if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); } else if (out) out.push(spans[i]); } return !out ? spans : out.length ? out : null; } function newHL(text, spans) { return spans ? {text: text, markedSpans: spans} : text; } function detachMarkedSpans(line) { var spans = line.markedSpans; if (!spans) return; for (var i = 0; i < spans.length; ++i) { var lines = spans[i].marker.lines; var ix = indexOf(lines, line); lines.splice(ix, 1); } line.markedSpans = null; } function attachMarkedSpans(line, spans) { if (!spans) return; for (var i = 0; i < spans.length; ++i) var marker = spans[i].marker.lines.push(line); line.markedSpans = spans; } // When measuring the position of the end of a line, different // browsers require different approaches. If an empty span is added, // many browsers report bogus offsets. Of those, some (Webkit, // recent IE) will accept a space without moving the whole span to // the next line when wrapping it, others work with a zero-width // space. var eolSpanContent = " "; if (gecko || (ie && !ie_lt8)) eolSpanContent = "\u200b"; else if (opera) eolSpanContent = ""; // Line objects. These hold state related to a line, including // highlighting info (the styles array). function Line(text, markedSpans) { this.text = text; this.height = 1; attachMarkedSpans(this, markedSpans); } Line.prototype = { update: function(text, markedSpans) { this.text = text; this.stateAfter = this.styles = null; detachMarkedSpans(this); attachMarkedSpans(this, markedSpans); }, // Run the given mode's parser over a line, update the styles // array, which contains alternating fragments of text and CSS // classes. highlight: function(mode, state, tabSize) { var stream = new StringStream(this.text, tabSize), st = this.styles || (this.styles = []); var pos = st.length = 0; if (this.text == "" && mode.blankLine) mode.blankLine(state); while (!stream.eol()) { var style = mode.token(stream, state), substr = stream.current(); stream.start = stream.pos; if (pos && st[pos-1] == style) { st[pos-2] += substr; } else if (substr) { st[pos++] = substr; st[pos++] = style; } // Give up when line is ridiculously long if (stream.pos > 5000) { st[pos++] = this.text.slice(stream.pos); st[pos++] = null; break; } } }, process: function(mode, state, tabSize) { var stream = new StringStream(this.text, tabSize); if (this.text == "" && mode.blankLine) mode.blankLine(state); while (!stream.eol() && stream.pos <= 5000) { mode.token(stream, state); stream.start = stream.pos; } }, // Fetch the parser token for a given character. Useful for hacks // that want to inspect the mode state (say, for completion). getTokenAt: function(mode, state, tabSize, ch) { var txt = this.text, stream = new StringStream(txt, tabSize); while (stream.pos < ch && !stream.eol()) { stream.start = stream.pos; var style = mode.token(stream, state); } return {start: stream.start, end: stream.pos, string: stream.current(), className: style || null, state: state}; }, indentation: function(tabSize) {return countColumn(this.text, null, tabSize);}, // Produces an HTML fragment for the line, taking selection, // marking, and highlighting into account. getContent: function(tabSize, wrapAt, compensateForWrapping) { var first = true, col = 0, specials = /[\t\u0000-\u0019\u200b\u2028\u2029\uFEFF]/g; var pre = elt("pre"); function span_(html, text, style) { if (!text) return; // Work around a bug where, in some compat modes, IE ignores leading spaces if (first && ie && text.charAt(0) == " ") text = "\u00a0" + text.slice(1); first = false; if (!specials.test(text)) { col += text.length; var content = document.createTextNode(text); } else { var content = document.createDocumentFragment(), pos = 0; while (true) { specials.lastIndex = pos; var m = specials.exec(text); var skipped = m ? m.index - pos : text.length - pos; if (skipped) { content.appendChild(document.createTextNode(text.slice(pos, pos + skipped))); col += skipped; } if (!m) break; pos += skipped + 1; if (m[0] == "\t") { var tabWidth = tabSize - col % tabSize; content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); col += tabWidth; } else { var token = elt("span", "\u2022", "cm-invalidchar"); token.title = "\\u" + m[0].charCodeAt(0).toString(16); content.appendChild(token); col += 1; } } } if (style) html.appendChild(elt("span", [content], style)); else html.appendChild(content); } var span = span_; if (wrapAt != null) { var outPos = 0, anchor = pre.anchor = elt("span"); span = function(html, text, style) { var l = text.length; if (wrapAt >= outPos && wrapAt < outPos + l) { var cut = wrapAt - outPos; if (cut) { span_(html, text.slice(0, cut), style); // See comment at the definition of spanAffectsWrapping if (compensateForWrapping) { var view = text.slice(cut - 1, cut + 1); if (spanAffectsWrapping.test(view)) html.appendChild(elt("wbr")); else if (!ie_lt8 && /\w\w/.test(view)) html.appendChild(document.createTextNode("\u200d")); } } html.appendChild(anchor); span_(anchor, opera ? text.slice(cut, cut + 1) : text.slice(cut), style); if (opera) span_(html, text.slice(cut + 1), style); wrapAt--; outPos += l; } else { outPos += l; span_(html, text, style); if (outPos == wrapAt && outPos == len) { setTextContent(anchor, eolSpanContent); html.appendChild(anchor); } // Stop outputting HTML when gone sufficiently far beyond measure else if (outPos > wrapAt + 10 && /\s/.test(text)) span = function(){}; } }; } var st = this.styles, allText = this.text, marked = this.markedSpans; var len = allText.length; function styleToClass(style) { if (!style) return null; return "cm-" + style.replace(/ +/g, " cm-"); } if (!allText && wrapAt == null) { span(pre, " "); } else if (!marked || !marked.length) { for (var i = 0, ch = 0; ch < len; i+=2) { var str = st[i], style = st[i+1], l = str.length; if (ch + l > len) str = str.slice(0, len - ch); ch += l; span(pre, str, styleToClass(style)); } } else { marked.sort(function(a, b) { return a.from - b.from; }); var pos = 0, i = 0, text = "", style, sg = 0; var nextChange = marked[0].from || 0, marks = [], markpos = 0; var advanceMarks = function() { var m; while (markpos < marked.length && ((m = marked[markpos]).from == pos || m.from == null)) { if (m.marker.type == "range") marks.push(m); ++markpos; } nextChange = markpos < marked.length ? marked[markpos].from : Infinity; for (var i = 0; i < marks.length; ++i) { var to = marks[i].to; if (to == null) to = Infinity; if (to == pos) marks.splice(i--, 1); else nextChange = Math.min(to, nextChange); } }; var m = 0; while (pos < len) { if (nextChange == pos) advanceMarks(); var upto = Math.min(len, nextChange); while (true) { if (text) { var end = pos + text.length; var appliedStyle = style; for (var j = 0; j < marks.length; ++j) { var mark = marks[j]; appliedStyle = (appliedStyle ? appliedStyle + " " : "") + mark.marker.style; if (mark.marker.endStyle && mark.to === Math.min(end, upto)) appliedStyle += " " + mark.marker.endStyle; if (mark.marker.startStyle && mark.from === pos) appliedStyle += " " + mark.marker.startStyle; } span(pre, end > upto ? text.slice(0, upto - pos) : text, appliedStyle); if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;} pos = end; } text = st[i++]; style = styleToClass(st[i++]); } } } return pre; }, cleanUp: function() { this.parent = null; detachMarkedSpans(this); } }; // Data structure that holds the sequence of lines. function LeafChunk(lines) { this.lines = lines; this.parent = null; for (var i = 0, e = lines.length, height = 0; i < e; ++i) { lines[i].parent = this; height += lines[i].height; } this.height = height; } LeafChunk.prototype = { chunkSize: function() { return this.lines.length; }, remove: function(at, n, callbacks) { for (var i = at, e = at + n; i < e; ++i) { var line = this.lines[i]; this.height -= line.height; line.cleanUp(); if (line.handlers) for (var j = 0; j < line.handlers.length; ++j) callbacks.push(line.handlers[j]); } this.lines.splice(at, n); }, collapse: function(lines) { lines.splice.apply(lines, [lines.length, 0].concat(this.lines)); }, insertHeight: function(at, lines, height) { this.height += height; this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); for (var i = 0, e = lines.length; i < e; ++i) lines[i].parent = this; }, iterN: function(at, n, op) { for (var e = at + n; at < e; ++at) if (op(this.lines[at])) return true; } }; function BranchChunk(children) { this.children = children; var size = 0, height = 0; for (var i = 0, e = children.length; i < e; ++i) { var ch = children[i]; size += ch.chunkSize(); height += ch.height; ch.parent = this; } this.size = size; this.height = height; this.parent = null; } BranchChunk.prototype = { chunkSize: function() { return this.size; }, remove: function(at, n, callbacks) { this.size -= n; for (var i = 0; i < this.children.length; ++i) { var child = this.children[i], sz = child.chunkSize(); if (at < sz) { var rm = Math.min(n, sz - at), oldHeight = child.height; child.remove(at, rm, callbacks); this.height -= oldHeight - child.height; if (sz == rm) { this.children.splice(i--, 1); child.parent = null; } if ((n -= rm) == 0) break; at = 0; } else at -= sz; } if (this.size - n < 25) { var lines = []; this.collapse(lines); this.children = [new LeafChunk(lines)]; this.children[0].parent = this; } }, collapse: function(lines) { for (var i = 0, e = this.children.length; i < e; ++i) this.children[i].collapse(lines); }, insert: function(at, lines) { var height = 0; for (var i = 0, e = lines.length; i < e; ++i) height += lines[i].height; this.insertHeight(at, lines, height); }, insertHeight: function(at, lines, height) { this.size += lines.length; this.height += height; for (var i = 0, e = this.children.length; i < e; ++i) { var child = this.children[i], sz = child.chunkSize(); if (at <= sz) { child.insertHeight(at, lines, height); if (child.lines && child.lines.length > 50) { while (child.lines.length > 50) { var spilled = child.lines.splice(child.lines.length - 25, 25); var newleaf = new LeafChunk(spilled); child.height -= newleaf.height; this.children.splice(i + 1, 0, newleaf); newleaf.parent = this; } this.maybeSpill(); } break; } at -= sz; } }, maybeSpill: function() { if (this.children.length <= 10) return; var me = this; do { var spilled = me.children.splice(me.children.length - 5, 5); var sibling = new BranchChunk(spilled); if (!me.parent) { // Become the parent node var copy = new BranchChunk(me.children); copy.parent = me; me.children = [copy, sibling]; me = copy; } else { me.size -= sibling.size; me.height -= sibling.height; var myIndex = indexOf(me.parent.children, me); me.parent.children.splice(myIndex + 1, 0, sibling); } sibling.parent = me.parent; } while (me.children.length > 10); me.parent.maybeSpill(); }, iter: function(from, to, op) { this.iterN(from, to - from, op); }, iterN: function(at, n, op) { for (var i = 0, e = this.children.length; i < e; ++i) { var child = this.children[i], sz = child.chunkSize(); if (at < sz) { var used = Math.min(n, sz - at); if (child.iterN(at, used, op)) return true; if ((n -= used) == 0) break; at = 0; } else at -= sz; } } }; function getLineAt(chunk, n) { while (!chunk.lines) { for (var i = 0;; ++i) { var child = chunk.children[i], sz = child.chunkSize(); if (n < sz) { chunk = child; break; } n -= sz; } } return chunk.lines[n]; } function lineNo(line) { if (line.parent == null) return null; var cur = line.parent, no = indexOf(cur.lines, line); for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { for (var i = 0, e = chunk.children.length; ; ++i) { if (chunk.children[i] == cur) break; no += chunk.children[i].chunkSize(); } } return no; } function lineAtHeight(chunk, h) { var n = 0; outer: do { for (var i = 0, e = chunk.children.length; i < e; ++i) { var child = chunk.children[i], ch = child.height; if (h < ch) { chunk = child; continue outer; } h -= ch; n += child.chunkSize(); } return n; } while (!chunk.lines); for (var i = 0, e = chunk.lines.length; i < e; ++i) { var line = chunk.lines[i], lh = line.height; if (h < lh) break; h -= lh; } return n + i; } function heightAtLine(chunk, n) { var h = 0; outer: do { for (var i = 0, e = chunk.children.length; i < e; ++i) { var child = chunk.children[i], sz = child.chunkSize(); if (n < sz) { chunk = child; continue outer; } n -= sz; h += child.height; } return h; } while (!chunk.lines); for (var i = 0; i < n; ++i) h += chunk.lines[i].height; return h; } // The history object 'chunks' changes that are made close together // and at almost the same time into bigger undoable units. function History() { this.time = 0; this.done = []; this.undone = []; this.compound = 0; this.closed = false; } History.prototype = { addChange: function(start, added, old) { this.undone.length = 0; var time = +new Date, cur = lst(this.done), last = cur && lst(cur); var dtime = time - this.time; if (cur && !this.closed && this.compound) { cur.push({start: start, added: added, old: old}); } else if (dtime > 400 || !last || this.closed || last.start > start + old.length || last.start + last.added < start) { this.done.push([{start: start, added: added, old: old}]); this.closed = false; } else { var startBefore = Math.max(0, last.start - start), endAfter = Math.max(0, (start + old.length) - (last.start + last.added)); for (var i = startBefore; i > 0; --i) last.old.unshift(old[i - 1]); for (var i = endAfter; i > 0; --i) last.old.push(old[old.length - i]); if (startBefore) last.start = start; last.added += added - (old.length - startBefore - endAfter); } this.time = time; }, startCompound: function() { if (!this.compound++) this.closed = true; }, endCompound: function() { if (!--this.compound) this.closed = true; } }; function stopMethod() {e_stop(this);} // Ensure an event has a stop method. function addStop(event) { if (!event.stop) event.stop = stopMethod; return event; } function e_preventDefault(e) { if (e.preventDefault) e.preventDefault(); else e.returnValue = false; } function e_stopPropagation(e) { if (e.stopPropagation) e.stopPropagation(); else e.cancelBubble = true; } function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);} CodeMirror.e_stop = e_stop; CodeMirror.e_preventDefault = e_preventDefault; CodeMirror.e_stopPropagation = e_stopPropagation; function e_target(e) {return e.target || e.srcElement;} function e_button(e) { var b = e.which; if (b == null) { if (e.button & 1) b = 1; else if (e.button & 2) b = 3; else if (e.button & 4) b = 2; } if (mac && e.ctrlKey && b == 1) b = 3; return b; } // Allow 3rd-party code to override event properties by adding an override // object to an event object. function e_prop(e, prop) { var overridden = e.override && e.override.hasOwnProperty(prop); return overridden ? e.override[prop] : e[prop]; } // Event handler registration. If disconnect is true, it'll return a // function that unregisters the handler. function connect(node, type, handler, disconnect) { if (typeof node.addEventListener == "function") { node.addEventListener(type, handler, false); if (disconnect) return function() {node.removeEventListener(type, handler, false);}; } else { var wrapHandler = function(event) {handler(event || window.event);}; node.attachEvent("on" + type, wrapHandler); if (disconnect) return function() {node.detachEvent("on" + type, wrapHandler);}; } } CodeMirror.connect = connect; function Delayed() {this.id = null;} Delayed.prototype = {set: function(ms, f) {clearTimeout(this.id); this.id = setTimeout(f, ms);}}; var Pass = CodeMirror.Pass = {toString: function(){return "CodeMirror.Pass";}}; // Detect drag-and-drop var dragAndDrop = function() { // There is *some* kind of drag-and-drop support in IE6-8, but I // couldn't get it to work yet. if (ie_lt9) return false; var div = elt('div'); return "draggable" in div || "dragDrop" in div; }(); // Feature-detect whether newlines in textareas are converted to \r\n var lineSep = function () { var te = elt("textarea"); te.value = "foo\nbar"; if (te.value.indexOf("\r") > -1) return "\r\n"; return "\n"; }(); // For a reason I have yet to figure out, some browsers disallow // word wrapping between certain characters *only* if a new inline // element is started between them. This makes it hard to reliably // measure the position of things, since that requires inserting an // extra span. This terribly fragile set of regexps matches the // character combinations that suffer from this phenomenon on the // various browsers. var spanAffectsWrapping = /^$/; // Won't match any two-character string if (gecko) spanAffectsWrapping = /$'/; else if (safari) spanAffectsWrapping = /\-[^ \-?]|\?[^ !'\"\),.\-\/:;\?\]\}]/; else if (chrome) spanAffectsWrapping = /\-[^ \-\.?]|\?[^ \-\.?\]\}:;!'\"\),\/]|[\.!\"#&%\)*+,:;=>\]|\}~][\(\{\[<]|\$'/; // Counts the column offset in a string, taking tabs into account. // Used mostly to find indentation. function countColumn(string, end, tabSize) { if (end == null) { end = string.search(/[^\s\u00a0]/); if (end == -1) end = string.length; } for (var i = 0, n = 0; i < end; ++i) { if (string.charAt(i) == "\t") n += tabSize - (n % tabSize); else ++n; } return n; } function eltOffset(node, screen) { // Take the parts of bounding client rect that we are interested in so we are able to edit if need be, // since the returned value cannot be changed externally (they are kept in sync as the element moves within the page) try { var box = node.getBoundingClientRect(); box = { top: box.top, left: box.left }; } catch(e) { box = {top: 0, left: 0}; } if (!screen) { // Get the toplevel scroll, working around browser differences. if (window.pageYOffset == null) { var t = document.documentElement || document.body.parentNode; if (t.scrollTop == null) t = document.body; box.top += t.scrollTop; box.left += t.scrollLeft; } else { box.top += window.pageYOffset; box.left += window.pageXOffset; } } return box; } function eltText(node) { return node.textContent || node.innerText || node.nodeValue || ""; } var spaceStrs = [""]; function spaceStr(n) { while (spaceStrs.length <= n) spaceStrs.push(lst(spaceStrs) + " "); return spaceStrs[n]; } function lst(arr) { return arr[arr.length-1]; } function selectInput(node) { if (ios) { // Mobile Safari apparently has a bug where select() is broken. node.selectionStart = 0; node.selectionEnd = node.value.length; } else node.select(); } // Operations on {line, ch} objects. function posEq(a, b) {return a.line == b.line && a.ch == b.ch;} function posLess(a, b) {return a.line < b.line || (a.line == b.line && a.ch < b.ch);} function copyPos(x) {return {line: x.line, ch: x.ch};} function elt(tag, content, className, style) { var e = document.createElement(tag); if (className) e.className = className; if (style) e.style.cssText = style; if (typeof content == "string") setTextContent(e, content); else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]); return e; } function removeChildren(e) { e.innerHTML = ""; return e; } function removeChildrenAndAdd(parent, e) { removeChildren(parent).appendChild(e); } function setTextContent(e, str) { if (ie_lt9) { e.innerHTML = ""; e.appendChild(document.createTextNode(str)); } else e.textContent = str; } // Used to position the cursor after an undo/redo by finding the // last edited character. function editEnd(from, to) { if (!to) return 0; if (!from) return to.length; for (var i = from.length, j = to.length; i >= 0 && j >= 0; --i, --j) if (from.charAt(i) != to.charAt(j)) break; return j + 1; } function indexOf(collection, elt) { if (collection.indexOf) return collection.indexOf(elt); for (var i = 0, e = collection.length; i < e; ++i) if (collection[i] == elt) return i; return -1; } function isWordChar(ch) { return /\w/.test(ch) || ch.toUpperCase() != ch.toLowerCase() || /[\u4E00-\u9FA5]/.test(ch); } // See if "".split is the broken IE version, if so, provide an // alternative way to split lines. var splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) { var pos = 0, result = [], l = string.length; while (pos <= l) { var nl = string.indexOf("\n", pos); if (nl == -1) nl = string.length; var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); var rt = line.indexOf("\r"); if (rt != -1) { result.push(line.slice(0, rt)); pos += rt + 1; } else { result.push(line); pos = nl + 1; } } return result; } : function(string){return string.split(/\r\n?|\n/);}; CodeMirror.splitLines = splitLines; var hasSelection = window.getSelection ? function(te) { try { return te.selectionStart != te.selectionEnd; } catch(e) { return false; } } : function(te) { try {var range = te.ownerDocument.selection.createRange();} catch(e) {} if (!range || range.parentElement() != te) return false; return range.compareEndPoints("StartToEnd", range) != 0; }; CodeMirror.defineMode("null", function() { return {token: function(stream) {stream.skipToEnd();}}; }); CodeMirror.defineMIME("text/plain", "null"); var keyNames = {3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", 46: "Delete", 59: ";", 91: "Mod", 92: "Mod", 93: "Mod", 109: "-", 107: "=", 127: "Delete", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", 221: "]", 222: "'", 63276: "PageUp", 63277: "PageDown", 63275: "End", 63273: "Home", 63234: "Left", 63232: "Up", 63235: "Right", 63233: "Down", 63302: "Insert", 63272: "Delete"}; CodeMirror.keyNames = keyNames; (function() { // Number keys for (var i = 0; i < 10; i++) keyNames[i + 48] = String(i); // Alphabetic keys for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i); // Function keys for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i; })(); CodeMirror.version = "2.35"; return CodeMirror; })(); dotclear-2.6.2+dfsg/plugins/themeEditor/codemirror/css.js000066400000000000000000000521631230033266200234660ustar00rootroot00000000000000CodeMirror.defineMode("css", function(config) { var indentUnit = config.indentUnit, type; var atMediaTypes = keySet([ "all", "aural", "braille", "handheld", "print", "projection", "screen", "tty", "tv", "embossed" ]); var atMediaFeatures = keySet([ "width", "min-width", "max-width", "height", "min-height", "max-height", "device-width", "min-device-width", "max-device-width", "device-height", "min-device-height", "max-device-height", "aspect-ratio", "min-aspect-ratio", "max-aspect-ratio", "device-aspect-ratio", "min-device-aspect-ratio", "max-device-aspect-ratio", "color", "min-color", "max-color", "color-index", "min-color-index", "max-color-index", "monochrome", "min-monochrome", "max-monochrome", "resolution", "min-resolution", "max-resolution", "scan", "grid" ]); var propertyKeywords = keySet([ "align-content", "align-items", "align-self", "alignment-adjust", "alignment-baseline", "anchor-point", "animation", "animation-delay", "animation-direction", "animation-duration", "animation-iteration-count", "animation-name", "animation-play-state", "animation-timing-function", "appearance", "azimuth", "backface-visibility", "background", "background-attachment", "background-clip", "background-color", "background-image", "background-origin", "background-position", "background-repeat", "background-size", "baseline-shift", "binding", "bleed", "bookmark-label", "bookmark-level", "bookmark-state", "bookmark-target", "border", "border-bottom", "border-bottom-color", "border-bottom-left-radius", "border-bottom-right-radius", "border-bottom-style", "border-bottom-width", "border-collapse", "border-color", "border-image", "border-image-outset", "border-image-repeat", "border-image-slice", "border-image-source", "border-image-width", "border-left", "border-left-color", "border-left-style", "border-left-width", "border-radius", "border-right", "border-right-color", "border-right-style", "border-right-width", "border-spacing", "border-style", "border-top", "border-top-color", "border-top-left-radius", "border-top-right-radius", "border-top-style", "border-top-width", "border-width", "bottom", "box-decoration-break", "box-shadow", "box-sizing", "break-after", "break-before", "break-inside", "caption-side", "clear", "clip", "color", "color-profile", "column-count", "column-fill", "column-gap", "column-rule", "column-rule-color", "column-rule-style", "column-rule-width", "column-span", "column-width", "columns", "content", "counter-increment", "counter-reset", "crop", "cue", "cue-after", "cue-before", "cursor", "direction", "display", "dominant-baseline", "drop-initial-after-adjust", "drop-initial-after-align", "drop-initial-before-adjust", "drop-initial-before-align", "drop-initial-size", "drop-initial-value", "elevation", "empty-cells", "fit", "fit-position", "flex", "flex-basis", "flex-direction", "flex-flow", "flex-grow", "flex-shrink", "flex-wrap", "float", "float-offset", "font", "font-feature-settings", "font-family", "font-kerning", "font-language-override", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-synthesis", "font-variant", "font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position", "font-weight", "grid-cell", "grid-column", "grid-column-align", "grid-column-sizing", "grid-column-span", "grid-columns", "grid-flow", "grid-row", "grid-row-align", "grid-row-sizing", "grid-row-span", "grid-rows", "grid-template", "hanging-punctuation", "height", "hyphens", "icon", "image-orientation", "image-rendering", "image-resolution", "inline-box-align", "justify-content", "left", "letter-spacing", "line-break", "line-height", "line-stacking", "line-stacking-ruby", "line-stacking-shift", "line-stacking-strategy", "list-style", "list-style-image", "list-style-position", "list-style-type", "margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "marker-offset", "marks", "marquee-direction", "marquee-loop", "marquee-play-count", "marquee-speed", "marquee-style", "max-height", "max-width", "min-height", "min-width", "move-to", "nav-down", "nav-index", "nav-left", "nav-right", "nav-up", "opacity", "order", "orphans", "outline", "outline-color", "outline-offset", "outline-style", "outline-width", "overflow", "overflow-style", "overflow-wrap", "overflow-x", "overflow-y", "padding", "padding-bottom", "padding-left", "padding-right", "padding-top", "page", "page-break-after", "page-break-before", "page-break-inside", "page-policy", "pause", "pause-after", "pause-before", "perspective", "perspective-origin", "pitch", "pitch-range", "play-during", "position", "presentation-level", "punctuation-trim", "quotes", "rendering-intent", "resize", "rest", "rest-after", "rest-before", "richness", "right", "rotation", "rotation-point", "ruby-align", "ruby-overhang", "ruby-position", "ruby-span", "size", "speak", "speak-as", "speak-header", "speak-numeral", "speak-punctuation", "speech-rate", "stress", "string-set", "tab-size", "table-layout", "target", "target-name", "target-new", "target-position", "text-align", "text-align-last", "text-decoration", "text-decoration-color", "text-decoration-line", "text-decoration-skip", "text-decoration-style", "text-emphasis", "text-emphasis-color", "text-emphasis-position", "text-emphasis-style", "text-height", "text-indent", "text-justify", "text-outline", "text-shadow", "text-space-collapse", "text-transform", "text-underline-position", "text-wrap", "top", "transform", "transform-origin", "transform-style", "transition", "transition-delay", "transition-duration", "transition-property", "transition-timing-function", "unicode-bidi", "vertical-align", "visibility", "voice-balance", "voice-duration", "voice-family", "voice-pitch", "voice-range", "voice-rate", "voice-stress", "voice-volume", "volume", "white-space", "widows", "width", "word-break", "word-spacing", "word-wrap", "z-index" ]); var colorKeywords = keySet([ "black", "silver", "gray", "white", "maroon", "red", "purple", "fuchsia", "green", "lime", "olive", "yellow", "navy", "blue", "teal", "aqua" ]); var valueKeywords = keySet([ "above", "absolute", "activeborder", "activecaption", "afar", "after-white-space", "ahead", "alias", "all", "all-scroll", "alternate", "always", "amharic", "amharic-abegede", "antialiased", "appworkspace", "arabic-indic", "armenian", "asterisks", "auto", "avoid", "background", "backwards", "baseline", "below", "bidi-override", "binary", "bengali", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box", "both", "bottom", "break-all", "break-word", "button", "button-bevel", "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "cambodian", "capitalize", "caps-lock-indicator", "caption", "captiontext", "caret", "cell", "center", "checkbox", "circle", "cjk-earthly-branch", "cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote", "col-resize", "collapse", "compact", "condensed", "contain", "content", "content-box", "context-menu", "continuous", "copy", "cover", "crop", "cross", "crosshair", "currentcolor", "cursive", "dashed", "decimal", "decimal-leading-zero", "default", "default-button", "destination-atop", "destination-in", "destination-out", "destination-over", "devanagari", "disc", "discard", "document", "dot-dash", "dot-dot-dash", "dotted", "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out", "element", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede", "ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er", "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er", "ethiopic-halehame-aa-et", "ethiopic-halehame-am-et", "ethiopic-halehame-gez", "ethiopic-halehame-om-et", "ethiopic-halehame-sid-et", "ethiopic-halehame-so-et", "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig", "ew-resize", "expanded", "extra-condensed", "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "footnotes", "forwards", "from", "geometricPrecision", "georgian", "graytext", "groove", "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hebrew", "help", "hidden", "hide", "higher", "highlight", "highlighttext", "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "icon", "ignore", "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite", "infobackground", "infotext", "inherit", "initial", "inline", "inline-axis", "inline-block", "inline-table", "inset", "inside", "intrinsic", "invert", "italic", "justify", "kannada", "katakana", "katakana-iroha", "khmer", "landscape", "lao", "large", "larger", "left", "level", "lighter", "line-through", "linear", "lines", "list-item", "listbox", "listitem", "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian", "lower-greek", "lower-hexadecimal", "lower-latin", "lower-norwegian", "lower-roman", "lowercase", "ltr", "malayalam", "match", "media-controls-background", "media-current-time-display", "media-fullscreen-button", "media-mute-button", "media-play-button", "media-return-to-realtime-button", "media-rewind-button", "media-seek-back-button", "media-seek-forward-button", "media-slider", "media-sliderthumb", "media-time-remaining-display", "media-volume-slider", "media-volume-slider-container", "media-volume-sliderthumb", "medium", "menu", "menulist", "menulist-button", "menulist-text", "menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic", "mix", "mongolian", "monospace", "move", "multiple", "myanmar", "n-resize", "narrower", "navy", "ne-resize", "nesw-resize", "no-close-quote", "no-drop", "no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap", "ns-resize", "nw-resize", "nwse-resize", "oblique", "octal", "open-quote", "optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset", "outside", "overlay", "overline", "padding", "padding-box", "painted", "paused", "persian", "plus-darker", "plus-lighter", "pointer", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", "progress", "push-button", "radio", "read-only", "read-write", "read-write-plaintext-only", "relative", "repeat", "repeat-x", "repeat-y", "reset", "reverse", "rgb", "rgba", "ridge", "right", "round", "row-resize", "rtl", "run-in", "running", "s-resize", "sans-serif", "scroll", "scrollbar", "se-resize", "searchfield", "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button", "searchfield-results-decoration", "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama", "single", "skip-white-space", "slide", "slider-horizontal", "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow", "small", "small-caps", "small-caption", "smaller", "solid", "somali", "source-atop", "source-in", "source-out", "source-over", "space", "square", "square-button", "start", "static", "status-bar", "stretch", "stroke", "sub", "subpixel-antialiased", "super", "sw-resize", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", "table-row-group", "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai", "thick", "thin", "threeddarkshadow", "threedface", "threedhighlight", "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er", "tigrinya-er-abegede", "tigrinya-et", "tigrinya-et-abegede", "to", "top", "transparent", "ultra-condensed", "ultra-expanded", "underline", "up", "upper-alpha", "upper-armenian", "upper-greek", "upper-hexadecimal", "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url", "vertical", "vertical-text", "visible", "visibleFill", "visiblePainted", "visibleStroke", "visual", "w-resize", "wait", "wave", "white", "wider", "window", "windowframe", "windowtext", "x-large", "x-small", "xor", "xx-large", "xx-small", "yellow" ]); function keySet(array) { var keys = {}; for (var i = 0; i < array.length; ++i) keys[array[i]] = true; return keys; } function ret(style, tp) {type = tp; return style;} function tokenBase(stream, state) { var ch = stream.next(); if (ch == "@") {stream.eatWhile(/[\w\\\-]/); return ret("def", stream.current());} else if (ch == "/" && stream.eat("*")) { state.tokenize = tokenCComment; return tokenCComment(stream, state); } else if (ch == "<" && stream.eat("!")) { state.tokenize = tokenSGMLComment; return tokenSGMLComment(stream, state); } else if (ch == "=") ret(null, "compare"); else if ((ch == "~" || ch == "|") && stream.eat("=")) return ret(null, "compare"); else if (ch == "\"" || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } else if (ch == "#") { stream.eatWhile(/[\w\\\-]/); return ret("atom", "hash"); } else if (ch == "!") { stream.match(/^\s*\w*/); return ret("keyword", "important"); } else if (/\d/.test(ch)) { stream.eatWhile(/[\w.%]/); return ret("number", "unit"); } else if (ch === "-") { if (/\d/.test(stream.peek())) { stream.eatWhile(/[\w.%]/); return ret("number", "unit"); } else if (stream.match(/^[^-]+-/)) { return ret("meta", type); } } else if (/[,+>*\/]/.test(ch)) { return ret(null, "select-op"); } else if (ch == "." && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) { return ret("qualifier", type); } else if (ch == ":") { return ret("operator", ch); } else if (/[;{}\[\]\(\)]/.test(ch)) { return ret(null, ch); } else { stream.eatWhile(/[\w\\\-]/); return ret("property", "variable"); } } function tokenCComment(stream, state) { var maybeEnd = false, ch; while ((ch = stream.next()) != null) { if (maybeEnd && ch == "/") { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return ret("comment", "comment"); } function tokenSGMLComment(stream, state) { var dashes = 0, ch; while ((ch = stream.next()) != null) { if (dashes >= 2 && ch == ">") { state.tokenize = tokenBase; break; } dashes = (ch == "-") ? dashes + 1 : 0; } return ret("comment", "comment"); } function tokenString(quote) { return function(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == quote && !escaped) break; escaped = !escaped && ch == "\\"; } if (!escaped) state.tokenize = tokenBase; return ret("string", "string"); }; } return { startState: function(base) { return {tokenize: tokenBase, baseIndent: base || 0, stack: []}; }, token: function(stream, state) { // Use these terms when applicable (see http://www.xanthir.com/blog/b4E50) // // rule** or **ruleset: // A selector + braces combo, or an at-rule. // // declaration block: // A sequence of declarations. // // declaration: // A property + colon + value combo. // // property value: // The entire value of a property. // // component value: // A single piece of a property value. Like the 5px in // text-shadow: 0 0 5px blue;. Can also refer to things that are // multiple terms, like the 1-4 terms that make up the background-size // portion of the background shorthand. // // term: // The basic unit of author-facing CSS, like a single number (5), // dimension (5px), string ("foo"), or function. Officially defined // by the CSS 2.1 grammar (look for the 'term' production) // // // simple selector: // A single atomic selector, like a type selector, an attr selector, a // class selector, etc. // // compound selector: // One or more simple selectors without a combinator. div.example is // compound, div > .example is not. // // complex selector: // One or more compound selectors chained with combinators. // // combinator: // The parts of selectors that express relationships. There are four // currently - the space (descendant combinator), the greater-than // bracket (child combinator), the plus sign (next sibling combinator), // and the tilda (following sibling combinator). // // sequence of selectors: // One or more of the named type of selector chained with commas. if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); // Changing style returned based on context var context = state.stack[state.stack.length-1]; if (style == "property") { if (context == "propertyValue"){ if (valueKeywords[stream.current()]) { style = "string-2"; } else if (colorKeywords[stream.current()]) { style = "keyword"; } else { style = "variable-2"; } } else if (context == "rule") { if (!propertyKeywords[stream.current()]) { style += " error"; } } else if (!context || context == "@media{") { style = "tag"; } else if (context == "@media") { if (atMediaTypes[stream.current()]) { style = "attribute"; // Known attribute } else if (/^(only|not)$/i.test(stream.current())) { style = "keyword"; } else if (stream.current().toLowerCase() == "and") { style = "error"; // "and" is only allowed in @mediaType } else if (atMediaFeatures[stream.current()]) { style = "error"; // Known property, should be in @mediaType( } else { // Unknown, expecting keyword or attribute, assuming attribute style = "attribute error"; } } else if (context == "@mediaType") { if (atMediaTypes[stream.current()]) { style = "attribute"; } else if (stream.current().toLowerCase() == "and") { style = "operator"; } else if (/^(only|not)$/i.test(stream.current())) { style = "error"; // Only allowed in @media } else if (atMediaFeatures[stream.current()]) { style = "error"; // Known property, should be in parentheses } else { // Unknown attribute or property, but expecting property (preceded // by "and"). Should be in parentheses style = "error"; } } else if (context == "@mediaType(") { if (propertyKeywords[stream.current()]) { // do nothing, remains "property" } else if (atMediaTypes[stream.current()]) { style = "error"; // Known property, should be in parentheses } else if (stream.current().toLowerCase() == "and") { style = "operator"; } else if (/^(only|not)$/i.test(stream.current())) { style = "error"; // Only allowed in @media } else { style += " error"; } } else { style = "error"; } } else if (style == "atom") { if(!context || context == "@media{") { style = "builtin"; } else if (context == "propertyValue") { if (!/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(stream.current())) { style += " error"; } } else { style = "error"; } } else if (context == "@media" && type == "{") { style = "error"; } // Push/pop context stack if (type == "{") { if (context == "@media" || context == "@mediaType") { state.stack.pop(); state.stack[state.stack.length-1] = "@media{"; } else state.stack.push("rule"); } else if (type == "}") { state.stack.pop(); if (context == "propertyValue") state.stack.pop(); } else if (type == "@media") state.stack.push("@media"); else if (context == "@media" && /\b(keyword|attribute)\b/.test(style)) state.stack.push("@mediaType"); else if (context == "@mediaType" && stream.current() == ",") state.stack.pop(); else if (context == "@mediaType" && type == "(") state.stack.push("@mediaType("); else if (context == "@mediaType(" && type == ")") state.stack.pop(); else if (context == "rule" && type == ":") state.stack.push("propertyValue"); else if (context == "propertyValue" && type == ";") state.stack.pop(); return style; }, indent: function(state, textAfter) { var n = state.stack.length; if (/^\}/.test(textAfter)) n -= state.stack[state.stack.length-1] == "propertyValue" ? 2 : 1; return state.baseIndent + n * indentUnit; }, electricChars: "}" }; }); CodeMirror.defineMIME("text/css", "css"); dotclear-2.6.2+dfsg/plugins/themeEditor/codemirror/htmlmixed.js000066400000000000000000000056451230033266200246740ustar00rootroot00000000000000CodeMirror.defineMode("htmlmixed", function(config) { var htmlMode = CodeMirror.getMode(config, {name: "xml", htmlMode: true}); var jsMode = CodeMirror.getMode(config, "javascript"); var cssMode = CodeMirror.getMode(config, "css"); function html(stream, state) { var style = htmlMode.token(stream, state.htmlState); if (style == "tag" && stream.current() == ">" && state.htmlState.context) { if (/^script$/i.test(state.htmlState.context.tagName)) { state.token = javascript; state.localState = jsMode.startState(htmlMode.indent(state.htmlState, "")); } else if (/^style$/i.test(state.htmlState.context.tagName)) { state.token = css; state.localState = cssMode.startState(htmlMode.indent(state.htmlState, "")); } } return style; } function maybeBackup(stream, pat, style) { var cur = stream.current(); var close = cur.search(pat), m; if (close > -1) stream.backUp(cur.length - close); else if (m = cur.match(/<\/?$/)) { stream.backUp(cur[0].length); if (!stream.match(pat, false)) stream.match(cur[0]); } return style; } function javascript(stream, state) { if (stream.match(/^<\/\s*script\s*>/i, false)) { state.token = html; state.localState = null; return html(stream, state); } return maybeBackup(stream, /<\/\s*script\s*>/, jsMode.token(stream, state.localState)); } function css(stream, state) { if (stream.match(/^<\/\s*style\s*>/i, false)) { state.token = html; state.localState = null; return html(stream, state); } return maybeBackup(stream, /<\/\s*style\s*>/, cssMode.token(stream, state.localState)); } return { startState: function() { var state = htmlMode.startState(); return {token: html, localState: null, mode: "html", htmlState: state}; }, copyState: function(state) { if (state.localState) var local = CodeMirror.copyState(state.token == css ? cssMode : jsMode, state.localState); return {token: state.token, localState: local, mode: state.mode, htmlState: CodeMirror.copyState(htmlMode, state.htmlState)}; }, token: function(stream, state) { return state.token(stream, state); }, indent: function(state, textAfter) { if (state.token == html || /^\s*<\//.test(textAfter)) return htmlMode.indent(state.htmlState, textAfter); else if (state.token == javascript) return jsMode.indent(state.localState, textAfter); else return cssMode.indent(state.localState, textAfter); }, electricChars: "/{}:", innerMode: function(state) { var mode = state.token == html ? htmlMode : state.token == javascript ? jsMode : cssMode; return {state: state.localState || state.htmlState, mode: mode}; } }; }, "xml", "javascript", "css"); CodeMirror.defineMIME("text/html", "htmlmixed"); dotclear-2.6.2+dfsg/plugins/themeEditor/codemirror/javascript.js000066400000000000000000000340761230033266200250470ustar00rootroot00000000000000// TODO actually recognize syntax of TypeScript constructs CodeMirror.defineMode("javascript", function(config, parserConfig) { var indentUnit = config.indentUnit; var jsonMode = parserConfig.json; var isTS = parserConfig.typescript; // Tokenizer var keywords = function(){ function kw(type) {return {type: type, style: "keyword"};} var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"); var operator = kw("operator"), atom = {type: "atom", style: "atom"}; var jsKeywords = { "if": A, "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B, "return": C, "break": C, "continue": C, "new": C, "delete": C, "throw": C, "var": kw("var"), "const": kw("var"), "let": kw("var"), "function": kw("function"), "catch": kw("catch"), "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), "in": operator, "typeof": operator, "instanceof": operator, "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom }; // Extend the 'normal' keywords with the TypeScript language extensions if (isTS) { var type = {type: "variable", style: "variable-3"}; var tsKeywords = { // object-like things "interface": kw("interface"), "class": kw("class"), "extends": kw("extends"), "constructor": kw("constructor"), // scope modifiers "public": kw("public"), "private": kw("private"), "protected": kw("protected"), "static": kw("static"), "super": kw("super"), // types "string": type, "number": type, "bool": type, "any": type }; for (var attr in tsKeywords) { jsKeywords[attr] = tsKeywords[attr]; } } return jsKeywords; }(); var isOperatorChar = /[+\-*&%=<>!?|]/; function chain(stream, state, f) { state.tokenize = f; return f(stream, state); } function nextUntilUnescaped(stream, end) { var escaped = false, next; while ((next = stream.next()) != null) { if (next == end && !escaped) return false; escaped = !escaped && next == "\\"; } return escaped; } // Used as scratch variables to communicate multiple values without // consing up tons of objects. var type, content; function ret(tp, style, cont) { type = tp; content = cont; return style; } function jsTokenBase(stream, state) { var ch = stream.next(); if (ch == '"' || ch == "'") return chain(stream, state, jsTokenString(ch)); else if (/[\[\]{}\(\),;\:\.]/.test(ch)) return ret(ch); else if (ch == "0" && stream.eat(/x/i)) { stream.eatWhile(/[\da-f]/i); return ret("number", "number"); } else if (/\d/.test(ch) || ch == "-" && stream.eat(/\d/)) { stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/); return ret("number", "number"); } else if (ch == "/") { if (stream.eat("*")) { return chain(stream, state, jsTokenComment); } else if (stream.eat("/")) { stream.skipToEnd(); return ret("comment", "comment"); } else if (state.lastType == "operator" || state.lastType == "keyword c" || /^[\[{}\(,;:]$/.test(state.lastType)) { nextUntilUnescaped(stream, "/"); stream.eatWhile(/[gimy]/); // 'y' is "sticky" option in Mozilla return ret("regexp", "string-2"); } else { stream.eatWhile(isOperatorChar); return ret("operator", null, stream.current()); } } else if (ch == "#") { stream.skipToEnd(); return ret("error", "error"); } else if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return ret("operator", null, stream.current()); } else { stream.eatWhile(/[\w\$_]/); var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word]; return (known && state.lastType != ".") ? ret(known.type, known.style, word) : ret("variable", "variable", word); } } function jsTokenString(quote) { return function(stream, state) { if (!nextUntilUnescaped(stream, quote)) state.tokenize = jsTokenBase; return ret("string", "string"); }; } function jsTokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = jsTokenBase; break; } maybeEnd = (ch == "*"); } return ret("comment", "comment"); } // Parser var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true}; function JSLexical(indented, column, type, align, prev, info) { this.indented = indented; this.column = column; this.type = type; this.prev = prev; this.info = info; if (align != null) this.align = align; } function inScope(state, varname) { for (var v = state.localVars; v; v = v.next) if (v.name == varname) return true; } function parseJS(state, style, type, content, stream) { var cc = state.cc; // Communicate our context to the combinators. // (Less wasteful than consing up a hundred closures on every call.) cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; if (!state.lexical.hasOwnProperty("align")) state.lexical.align = true; while(true) { var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement; if (combinator(type, content)) { while(cc.length && cc[cc.length - 1].lex) cc.pop()(); if (cx.marked) return cx.marked; if (type == "variable" && inScope(state, content)) return "variable-2"; return style; } } } // Combinator utils var cx = {state: null, column: null, marked: null, cc: null}; function pass() { for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); } function cont() { pass.apply(null, arguments); return true; } function register(varname) { var state = cx.state; if (state.context) { cx.marked = "def"; for (var v = state.localVars; v; v = v.next) if (v.name == varname) return; state.localVars = {name: varname, next: state.localVars}; } } // Combinators var defaultVars = {name: "this", next: {name: "arguments"}}; function pushcontext() { cx.state.context = {prev: cx.state.context, vars: cx.state.localVars}; cx.state.localVars = defaultVars; } function popcontext() { cx.state.localVars = cx.state.context.vars; cx.state.context = cx.state.context.prev; } function pushlex(type, info) { var result = function() { var state = cx.state; state.lexical = new JSLexical(state.indented, cx.stream.column(), type, null, state.lexical, info); }; result.lex = true; return result; } function poplex() { var state = cx.state; if (state.lexical.prev) { if (state.lexical.type == ")") state.indented = state.lexical.indented; state.lexical = state.lexical.prev; } } poplex.lex = true; function expect(wanted) { return function expecting(type) { if (type == wanted) return cont(); else if (wanted == ";") return pass(); else return cont(arguments.callee); }; } function statement(type) { if (type == "var") return cont(pushlex("vardef"), vardef1, expect(";"), poplex); if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex); if (type == "keyword b") return cont(pushlex("form"), statement, poplex); if (type == "{") return cont(pushlex("}"), block, poplex); if (type == ";") return cont(); if (type == "function") return cont(functiondef); if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"), poplex, statement, poplex); if (type == "variable") return cont(pushlex("stat"), maybelabel); if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"), block, poplex, poplex); if (type == "case") return cont(expression, expect(":")); if (type == "default") return cont(expect(":")); if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"), statement, poplex, popcontext); return pass(pushlex("stat"), expression, expect(";"), poplex); } function expression(type) { if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator); if (type == "function") return cont(functiondef); if (type == "keyword c") return cont(maybeexpression); if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeoperator); if (type == "operator") return cont(expression); if (type == "[") return cont(pushlex("]"), commasep(expression, "]"), poplex, maybeoperator); if (type == "{") return cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeoperator); return cont(); } function maybeexpression(type) { if (type.match(/[;\}\)\],]/)) return pass(); return pass(expression); } function maybeoperator(type, value) { if (type == "operator" && /\+\+|--/.test(value)) return cont(maybeoperator); if (type == "operator" && value == "?") return cont(expression, expect(":"), expression); if (type == ";") return; if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator); if (type == ".") return cont(property, maybeoperator); if (type == "[") return cont(pushlex("]"), expression, expect("]"), poplex, maybeoperator); } function maybelabel(type) { if (type == ":") return cont(poplex, statement); return pass(maybeoperator, expect(";"), poplex); } function property(type) { if (type == "variable") {cx.marked = "property"; return cont();} } function objprop(type) { if (type == "variable") cx.marked = "property"; if (atomicTypes.hasOwnProperty(type)) return cont(expect(":"), expression); } function commasep(what, end) { function proceed(type) { if (type == ",") return cont(what, proceed); if (type == end) return cont(); return cont(expect(end)); } return function commaSeparated(type) { if (type == end) return cont(); else return pass(what, proceed); }; } function block(type) { if (type == "}") return cont(); return pass(statement, block); } function maybetype(type) { if (type == ":") return cont(typedef); return pass(); } function typedef(type) { if (type == "variable"){cx.marked = "variable-3"; return cont();} return pass(); } function vardef1(type, value) { if (type == "variable") { register(value); return isTS ? cont(maybetype, vardef2) : cont(vardef2); } return pass(); } function vardef2(type, value) { if (value == "=") return cont(expression, vardef2); if (type == ",") return cont(vardef1); } function forspec1(type) { if (type == "var") return cont(vardef1, expect(";"), forspec2); if (type == ";") return cont(forspec2); if (type == "variable") return cont(formaybein); return cont(forspec2); } function formaybein(type, value) { if (value == "in") return cont(expression); return cont(maybeoperator, forspec2); } function forspec2(type, value) { if (type == ";") return cont(forspec3); if (value == "in") return cont(expression); return cont(expression, expect(";"), forspec3); } function forspec3(type) { if (type != ")") cont(expression); } function functiondef(type, value) { if (type == "variable") {register(value); return cont(functiondef);} if (type == "(") return cont(pushlex(")"), pushcontext, commasep(funarg, ")"), poplex, statement, popcontext); } function funarg(type, value) { if (type == "variable") {register(value); return isTS ? cont(maybetype) : cont();} } // Interface return { startState: function(basecolumn) { return { tokenize: jsTokenBase, lastType: null, cc: [], lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false), localVars: parserConfig.localVars, context: parserConfig.localVars && {vars: parserConfig.localVars}, indented: 0 }; }, token: function(stream, state) { if (stream.sol()) { if (!state.lexical.hasOwnProperty("align")) state.lexical.align = false; state.indented = stream.indentation(); } if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); if (type == "comment") return style; state.lastType = type; return parseJS(state, style, type, content, stream); }, indent: function(state, textAfter) { if (state.tokenize == jsTokenComment) return CodeMirror.Pass; if (state.tokenize != jsTokenBase) return 0; var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical; if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev; var type = lexical.type, closing = firstChar == type; if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? 4 : 0); else if (type == "form" && firstChar == "{") return lexical.indented; else if (type == "form") return lexical.indented + indentUnit; else if (type == "stat") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? indentUnit : 0); else if (lexical.info == "switch" && !closing) return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); else if (lexical.align) return lexical.column + (closing ? 0 : 1); else return lexical.indented + (closing ? 0 : indentUnit); }, electricChars: ":{}" }; }); CodeMirror.defineMIME("text/javascript", "javascript"); CodeMirror.defineMIME("application/json", {name: "javascript", json: true}); CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true }); CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true }); dotclear-2.6.2+dfsg/plugins/themeEditor/codemirror/multiplex.js000066400000000000000000000054621230033266200247210ustar00rootroot00000000000000CodeMirror.multiplexingMode = function(outer /*, others */) { // Others should be {open, close, mode [, delimStyle]} objects var others = Array.prototype.slice.call(arguments, 1); var n_others = others.length; function indexOf(string, pattern, from) { if (typeof pattern == "string") return string.indexOf(pattern, from); var m = pattern.exec(from ? string.slice(from) : string); return m ? m.index + from : -1; } return { startState: function() { return { outer: CodeMirror.startState(outer), innerActive: null, inner: null }; }, copyState: function(state) { return { outer: CodeMirror.copyState(outer, state.outer), innerActive: state.innerActive, inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner) }; }, token: function(stream, state) { if (!state.innerActive) { var cutOff = Infinity, oldContent = stream.string; for (var i = 0; i < n_others; ++i) { var other = others[i]; var found = indexOf(oldContent, other.open, stream.pos); if (found == stream.pos) { stream.match(other.open); state.innerActive = other; state.inner = CodeMirror.startState(other.mode, outer.indent ? outer.indent(state.outer, "") : 0); return other.delimStyle; } else if (found != -1 && found < cutOff) { cutOff = found; } } if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff); var outerToken = outer.token(stream, state.outer); if (cutOff != Infinity) stream.string = oldContent; return outerToken; } else { var curInner = state.innerActive, oldContent = stream.string; var found = indexOf(oldContent, curInner.close, stream.pos); if (found == stream.pos) { stream.match(curInner.close); state.innerActive = state.inner = null; return curInner.delimStyle; } if (found > -1) stream.string = oldContent.slice(0, found); var innerToken = curInner.mode.token(stream, state.inner); if (found > -1) stream.string = oldContent; var cur = stream.current(), found = cur.indexOf(curInner.close); if (found > -1) stream.backUp(cur.length - found); return innerToken; } }, indent: function(state, textAfter) { var mode = state.innerActive ? state.innerActive.mode : outer; if (!mode.indent) return CodeMirror.Pass; return mode.indent(state.innerActive ? state.inner : state.outer, textAfter); }, electricChars: outer.electricChars, innerMode: function(state) { return state.inner ? {state: state.inner, mode: state.innerActive.mode} : {state: state.outer, mode: outer}; } }; }; dotclear-2.6.2+dfsg/plugins/themeEditor/codemirror/php.js000066400000000000000000000137301230033266200234620ustar00rootroot00000000000000(function() { function keywords(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } function heredoc(delim) { return function(stream, state) { if (stream.match(delim)) state.tokenize = null; else stream.skipToEnd(); return "string"; }; } var phpConfig = { name: "clike", keywords: keywords("abstract and array as break case catch class clone const continue declare default " + "do else elseif enddeclare endfor endforeach endif endswitch endwhile extends final " + "for foreach function global goto if implements interface instanceof namespace " + "new or private protected public static switch throw trait try use var while xor " + "die echo empty exit eval include include_once isset list require require_once return " + "print unset __halt_compiler self static parent"), blockKeywords: keywords("catch do else elseif for foreach if switch try while"), atoms: keywords("true false null TRUE FALSE NULL"), multiLineStrings: true, hooks: { "$": function(stream, state) { stream.eatWhile(/[\w\$_]/); return "variable-2"; }, "<": function(stream, state) { if (stream.match(/<", false)) stream.next(); return "comment"; }, "/": function(stream, state) { if (stream.eat("/")) { while (!stream.eol() && !stream.match("?>", false)) stream.next(); return "comment"; } return false; } } }; CodeMirror.defineMode("php", function(config, parserConfig) { var htmlMode = CodeMirror.getMode(config, {name: "xml", htmlMode: true}); var jsMode = CodeMirror.getMode(config, "javascript"); var cssMode = CodeMirror.getMode(config, "css"); var phpMode = CodeMirror.getMode(config, phpConfig); function dispatch(stream, state) { // TODO open PHP inside text/css var isPHP = state.curMode == phpMode; if (stream.sol() && state.pending != '"') state.pending = null; if (state.curMode == htmlMode) { if (stream.match(/^<\?\w*/)) { state.curMode = phpMode; state.curState = state.php; state.curClose = "?>"; return "meta"; } if (state.pending == '"') { while (!stream.eol() && stream.next() != '"') {} var style = "string"; } else if (state.pending && stream.pos < state.pending.end) { stream.pos = state.pending.end; var style = state.pending.style; } else { var style = htmlMode.token(stream, state.curState); } state.pending = null; var cur = stream.current(), openPHP = cur.search(/<\?/); if (openPHP != -1) { if (style == "string" && /\"$/.test(cur) && !/\?>/.test(cur)) state.pending = '"'; else state.pending = {end: stream.pos, style: style}; stream.backUp(cur.length - openPHP); } else if (style == "tag" && stream.current() == ">" && state.curState.context) { if (/^script$/i.test(state.curState.context.tagName)) { state.curMode = jsMode; state.curState = jsMode.startState(htmlMode.indent(state.curState, "")); state.curClose = /^<\/\s*script\s*>/i; } else if (/^style$/i.test(state.curState.context.tagName)) { state.curMode = cssMode; state.curState = cssMode.startState(htmlMode.indent(state.curState, "")); state.curClose = /^<\/\s*style\s*>/i; } } return style; } else if ((!isPHP || state.php.tokenize == null) && stream.match(state.curClose, isPHP)) { state.curMode = htmlMode; state.curState = state.html; state.curClose = null; if (isPHP) return "meta"; else return dispatch(stream, state); } else { return state.curMode.token(stream, state.curState); } } return { startState: function() { var html = htmlMode.startState(); return {html: html, php: phpMode.startState(), curMode: parserConfig.startOpen ? phpMode : htmlMode, curState: parserConfig.startOpen ? phpMode.startState() : html, curClose: parserConfig.startOpen ? /^\?>/ : null, mode: parserConfig.startOpen ? "php" : "html", pending: null}; }, copyState: function(state) { var html = state.html, htmlNew = CodeMirror.copyState(htmlMode, html), php = state.php, phpNew = CodeMirror.copyState(phpMode, php), cur; if (state.curState == html) cur = htmlNew; else if (state.curState == php) cur = phpNew; else cur = CodeMirror.copyState(state.curMode, state.curState); return {html: htmlNew, php: phpNew, curMode: state.curMode, curState: cur, curClose: state.curClose, mode: state.mode, pending: state.pending}; }, token: dispatch, indent: function(state, textAfter) { if ((state.curMode != phpMode && /^\s*<\//.test(textAfter)) || (state.curMode == phpMode && /^\?>/.test(textAfter))) return htmlMode.indent(state.html, textAfter); return state.curMode.indent(state.curState, textAfter); }, electricChars: "/{}:", innerMode: function(state) { return {state: state.curState, mode: state.curMode}; } }; }, "xml", "clike", "javascript", "css"); CodeMirror.defineMIME("application/x-httpd-php", "php"); CodeMirror.defineMIME("application/x-httpd-php-open", {name: "php", startOpen: true}); CodeMirror.defineMIME("text/x-php", phpConfig); })(); dotclear-2.6.2+dfsg/plugins/themeEditor/codemirror/xml.js000066400000000000000000000232661230033266200235000ustar00rootroot00000000000000CodeMirror.defineMode("xml", function(config, parserConfig) { var indentUnit = config.indentUnit; var Kludges = parserConfig.htmlMode ? { autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true, 'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true, 'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true, 'track': true, 'wbr': true}, implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true, 'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true, 'th': true, 'tr': true}, contextGrabbers: { 'dd': {'dd': true, 'dt': true}, 'dt': {'dd': true, 'dt': true}, 'li': {'li': true}, 'option': {'option': true, 'optgroup': true}, 'optgroup': {'optgroup': true}, 'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true, 'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true, 'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true, 'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true, 'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true}, 'rp': {'rp': true, 'rt': true}, 'rt': {'rp': true, 'rt': true}, 'tbody': {'tbody': true, 'tfoot': true}, 'td': {'td': true, 'th': true}, 'tfoot': {'tbody': true}, 'th': {'td': true, 'th': true}, 'thead': {'tbody': true, 'tfoot': true}, 'tr': {'tr': true} }, doNotIndent: {"pre": true}, allowUnquoted: true, allowMissing: true } : { autoSelfClosers: {}, implicitlyClosed: {}, contextGrabbers: {}, doNotIndent: {}, allowUnquoted: false, allowMissing: false }; var alignCDATA = parserConfig.alignCDATA; // Return variables for tokenizers var tagName, type; function inText(stream, state) { function chain(parser) { state.tokenize = parser; return parser(stream, state); } var ch = stream.next(); if (ch == "<") { if (stream.eat("!")) { if (stream.eat("[")) { if (stream.match("CDATA[")) return chain(inBlock("atom", "]]>")); else return null; } else if (stream.match("--")) return chain(inBlock("comment", "-->")); else if (stream.match("DOCTYPE", true, true)) { stream.eatWhile(/[\w\._\-]/); return chain(doctype(1)); } else return null; } else if (stream.eat("?")) { stream.eatWhile(/[\w\._\-]/); state.tokenize = inBlock("meta", "?>"); return "meta"; } else { type = stream.eat("/") ? "closeTag" : "openTag"; stream.eatSpace(); tagName = ""; var c; while ((c = stream.eat(/[^\s\u00a0=<>\"\'\/?]/))) tagName += c; state.tokenize = inTag; return "tag"; } } else if (ch == "&") { var ok; if (stream.eat("#")) { if (stream.eat("x")) { ok = stream.eatWhile(/[a-fA-F\d]/) && stream.eat(";"); } else { ok = stream.eatWhile(/[\d]/) && stream.eat(";"); } } else { ok = stream.eatWhile(/[\w\.\-:]/) && stream.eat(";"); } return ok ? "atom" : "error"; } else { stream.eatWhile(/[^&<]/); return null; } } function inTag(stream, state) { var ch = stream.next(); if (ch == ">" || (ch == "/" && stream.eat(">"))) { state.tokenize = inText; type = ch == ">" ? "endTag" : "selfcloseTag"; return "tag"; } else if (ch == "=") { type = "equals"; return null; } else if (/[\'\"]/.test(ch)) { state.tokenize = inAttribute(ch); return state.tokenize(stream, state); } else { stream.eatWhile(/[^\s\u00a0=<>\"\'\/?]/); return "word"; } } function inAttribute(quote) { return function(stream, state) { while (!stream.eol()) { if (stream.next() == quote) { state.tokenize = inTag; break; } } return "string"; }; } function inBlock(style, terminator) { return function(stream, state) { while (!stream.eol()) { if (stream.match(terminator)) { state.tokenize = inText; break; } stream.next(); } return style; }; } function doctype(depth) { return function(stream, state) { var ch; while ((ch = stream.next()) != null) { if (ch == "<") { state.tokenize = doctype(depth + 1); return state.tokenize(stream, state); } else if (ch == ">") { if (depth == 1) { state.tokenize = inText; break; } else { state.tokenize = doctype(depth - 1); return state.tokenize(stream, state); } } } return "meta"; }; } var curState, setStyle; function pass() { for (var i = arguments.length - 1; i >= 0; i--) curState.cc.push(arguments[i]); } function cont() { pass.apply(null, arguments); return true; } function pushContext(tagName, startOfLine) { var noIndent = Kludges.doNotIndent.hasOwnProperty(tagName) || (curState.context && curState.context.noIndent); curState.context = { prev: curState.context, tagName: tagName, indent: curState.indented, startOfLine: startOfLine, noIndent: noIndent }; } function popContext() { if (curState.context) curState.context = curState.context.prev; } function element(type) { if (type == "openTag") { curState.tagName = tagName; return cont(attributes, endtag(curState.startOfLine)); } else if (type == "closeTag") { var err = false; if (curState.context) { if (curState.context.tagName != tagName) { if (Kludges.implicitlyClosed.hasOwnProperty(curState.context.tagName.toLowerCase())) { popContext(); } err = !curState.context || curState.context.tagName != tagName; } } else { err = true; } if (err) setStyle = "error"; return cont(endclosetag(err)); } return cont(); } function endtag(startOfLine) { return function(type) { if (type == "selfcloseTag" || (type == "endTag" && Kludges.autoSelfClosers.hasOwnProperty(curState.tagName.toLowerCase()))) { maybePopContext(curState.tagName.toLowerCase()); return cont(); } if (type == "endTag") { maybePopContext(curState.tagName.toLowerCase()); pushContext(curState.tagName, startOfLine); return cont(); } return cont(); }; } function endclosetag(err) { return function(type) { if (err) setStyle = "error"; if (type == "endTag") { popContext(); return cont(); } setStyle = "error"; return cont(arguments.callee); }; } function maybePopContext(nextTagName) { var parentTagName; while (true) { if (!curState.context) { return; } parentTagName = curState.context.tagName.toLowerCase(); if (!Kludges.contextGrabbers.hasOwnProperty(parentTagName) || !Kludges.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)) { return; } popContext(); } } function attributes(type) { if (type == "word") {setStyle = "attribute"; return cont(attribute, attributes);} if (type == "endTag" || type == "selfcloseTag") return pass(); setStyle = "error"; return cont(attributes); } function attribute(type) { if (type == "equals") return cont(attvalue, attributes); if (!Kludges.allowMissing) setStyle = "error"; return (type == "endTag" || type == "selfcloseTag") ? pass() : cont(); } function attvalue(type) { if (type == "string") return cont(attvaluemaybe); if (type == "word" && Kludges.allowUnquoted) {setStyle = "string"; return cont();} setStyle = "error"; return (type == "endTag" || type == "selfCloseTag") ? pass() : cont(); } function attvaluemaybe(type) { if (type == "string") return cont(attvaluemaybe); else return pass(); } return { startState: function() { return {tokenize: inText, cc: [], indented: 0, startOfLine: true, tagName: null, context: null}; }, token: function(stream, state) { if (stream.sol()) { state.startOfLine = true; state.indented = stream.indentation(); } if (stream.eatSpace()) return null; setStyle = type = tagName = null; var style = state.tokenize(stream, state); state.type = type; if ((style || type) && style != "comment") { curState = state; while (true) { var comb = state.cc.pop() || element; if (comb(type || style)) break; } } state.startOfLine = false; return setStyle || style; }, indent: function(state, textAfter, fullLine) { var context = state.context; if ((state.tokenize != inTag && state.tokenize != inText) || context && context.noIndent) return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0; if (alignCDATA && /null, 'w'=>false, 'type'=>null, 'f'=>null, 'default_file'=>false); # Get interface setting $core->auth->user_prefs->addWorkspace('interface'); $user_ui_colorsyntax = $core->auth->user_prefs->interface->colorsyntax; # Loading themes $core->themes = new dcThemes($core); $core->themes->loadModules($core->blog->themes_path,null); $T = $core->themes->getModules($core->blog->settings->system->theme); $o = new dcThemeEditor($core); try { try { if (!empty($_REQUEST['tpl'])) { $file = $o->getFileContent('tpl',$_REQUEST['tpl']); } elseif (!empty($_REQUEST['css'])) { $file = $o->getFileContent('css',$_REQUEST['css']); } elseif (!empty($_REQUEST['js'])) { $file = $o->getFileContent('js',$_REQUEST['js']); } elseif (!empty($_REQUEST['po'])) { $file = $o->getFileContent('po',$_REQUEST['po']); } } catch (Exception $e) { $file = $file_default; throw $e; } # Write file if (!empty($_POST['write'])) { $file['c'] = $_POST['file_content']; $o->writeFile($file['type'],$file['f'],$file['c']); } } catch (Exception $e) { $core->error->add($e->getMessage()); } ?> <?php echo __('Edit theme files'); ?> blog->name) => '', __('Blog appearance') => 'blog_theme.php', __('Edit theme files') => '' )). dcPage::notices(); ?>

          blog->settings->system->theme == 'default') { ?>

          '.__('Please select a file to edit.').'

          '; } else { echo '
          '. '
          '.__('File editor').''. '

          '. '

          '.form::textarea('file_content',72,25,html::escapeHTML($file['c']),'maximal','',!$file['w']).'

          '; if ($file['w']) { echo '

          '. $core->formNonce(). ($file['type'] ? form::hidden(array($file['type']),$file['f']) : ''). '

          '; } else { echo '

          '.__('This file is not writable. Please check your theme files permissions.').'

          '; } echo '
          '; if ($user_ui_colorsyntax) { $editorMode = (!empty($_REQUEST['css']) ? "css" : (!empty($_REQUEST['js']) ? "javascript" : (!empty($_REQUEST['po']) ? "text/plain" : "text/html"))); echo ''; } } ?>

          filesList('tpl','%1$s'); ?>

          filesList('css','%1$s'); ?>

          filesList('js','%1$s'); ?>

          filesList('po','%1$s'); ?>
          dotclear-2.6.2+dfsg/plugins/themeEditor/locales/000077500000000000000000000000001230033266200216065ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/themeEditor/locales/en/000077500000000000000000000000001230033266200222105ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/themeEditor/locales/en/help/000077500000000000000000000000001230033266200231405ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/themeEditor/locales/en/help/help.html000066400000000000000000000030601230033266200247550ustar00rootroot00000000000000 Theme Editor

          Theme Editor

          The Theme Editor allows you to modify the template files, the stylesheets and the Javascript files of the theme you are currently using.

          The file list on the right is divided in four sections:

          • Template files
          • CSS files (stylesheets)
          • Javascript files
          • Locales files (files used for translation)

          The bullet in front of each file can have three different colors:

          • Black means it is in the default theme.
          • Yellow means it belongs to the current theme.
          • Red means it belongs to a parent theme.

          File mofidication

          To modify a file, click on its name. Its content will be displayed in the editor. If the file can be overwritten you will be able to save it by pressing the Save (s) button.

          Be careful: Modifications are applied immediately after saving.

          If you modify a file that comes from the default theme, the file will be copied into your current theme.

          Syntax highlighting

          You can activate the syntax highlighting in your preferences (in My options tab).

          Further reading

          To edit your template files, please check the list of template tags.

          dotclear-2.6.2+dfsg/plugins/themeEditor/locales/en/resources.php000066400000000000000000000007601230033266200247360ustar00rootroot00000000000000 Éditeur de thème

          Éditeur de thème

          L'éditeur de thème vous permet de modifier les différents fichiers du thème actif.

          La colonne de droite listent les fichiers, ils sont groupés en quatre types :

          • fichiers du thème : les templates,
          • fichiers CSS : les feuilles de style,
          • fichiers JavaScript.
          • fichiers de traduction.

          A la gauche de chaque fichier, chaque puce se voit attribuée une couleur :

          • noire indique qu'il se trouve dans le thème "default".
          • jaune indique qu'il fait partie du thème actif.
          • rouge indique qu'il fait partie d'un thème parent.

          Modification des fichiers

          Pour modifier un fichier, cliquez sur son nom, le contenu s'affichera alors dans la zone d'édition. Si le fichier peut-être écrit vous pourrez sauvegarder celui-ci en cliquant sur le bouton "Enregistrer".

          Les modifications sont immédiatement appliquées lors de la sauvegarde, soyez vigilants.

          A noter que si vous modifiez un fichier se trouvant dans le thème "default", celui-ci sera copié dans votre thème en cours d'utilisation.

          Coloration syntaxique

          Notez que vous pouvez activer la coloration syntaxique dans vos préférences (onglet « Mes options »).

          Allez plus loin…

          Pour éditer vos templates, n'hésitez pas à consultez la liste des marqueurs de template.

          dotclear-2.6.2+dfsg/plugins/themeEditor/locales/fr/resources.php000066400000000000000000000007601230033266200247430ustar00rootroot00000000000000

          '); $('#file_content').parent().after(msg); } msg.text(dotclear.msg.saving_document); $.post(document.location.href,data,function(res,status) { var err = $(res).find('div.error li:first'); if (err.length > 0) { msg.text(dotclear.msg.error_occurred + ' ' + err.text()); return; } else { msg.text(dotclear.msg.document_saved); $('#file-chooser').empty(); $(res).find('#file-chooser').children().appendTo('#file-chooser'); } }); return false; }); }); dotclear-2.6.2+dfsg/plugins/themeEditor/style.css000066400000000000000000000006201230033266200220340ustar00rootroot00000000000000#file-box { width: 100%; float: left; margin-right: -180px; } #file-editor { margin-right: 180px; } #file-chooser { float: right; width: 170px; } #file-chooser ul { padding-left: 0; } #file-chooser li { list-style: square inside; } #file-chooser li.default-file { color: #f90; } #file-chooser li.parent-file { color:#c00; } textarea { font: 1em Monaco,"Courier New",Courier,monospace; } dotclear-2.6.2+dfsg/plugins/widgets/000077500000000000000000000000001230033266200173615ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/widgets/_admin.php000066400000000000000000000017431230033266200213260ustar00rootroot00000000000000addBehavior('adminDashboardFavorites','widgets_dashboard_favorites'); function widgets_dashboard_favorites($core,$favs) { $favs->register('widgets', array( 'title' => __('Presentation widgets'), 'url' => 'plugin.php?p=widgets', 'small-icon' => 'index.php?pf=widgets/icon.png', 'large-icon' => 'index.php?pf=widgets/icon-big.png', )); } $_menu['Blog']->addItem(__('Presentation widgets'),'plugin.php?p=widgets','index.php?pf=widgets/icon.png', preg_match('/plugin.php\?p=widgets(&.*)?$/',$_SERVER['REQUEST_URI']), $core->auth->check('admin',$core->blog->id)); dotclear-2.6.2+dfsg/plugins/widgets/_default_widgets.php000066400000000000000000000164211230033266200234070ustar00rootroot00000000000000create('search',__('Search engine'),array('defaultWidgets','search'),null,'Search engine form'); $__widgets->search->setting('title',__('Title (optional)').' :',__('Search')); $__widgets->search->setting('homeonly',__('Display on:'),0,'combo', array(__('All pages') => 0, __('Home page only') => 1, __('Except on home page') => 2)); $__widgets->search->setting('content_only',__('Content only'),0,'check'); $__widgets->search->setting('class',__('CSS class:'),''); $__widgets->create('navigation',__('Navigation links'),array('defaultWidgets','navigation'),null,'List of navigation links'); $__widgets->navigation->setting('title',__('Title (optional)').' :',''); $__widgets->navigation->setting('homeonly',__('Display on:'),0,'combo', array(__('All pages') => 0, __('Home page only') => 1, __('Except on home page') => 2)); $__widgets->navigation->setting('content_only',__('Content only'),0,'check'); $__widgets->navigation->setting('class',__('CSS class:'),''); $__widgets->create('bestof',__('Selected entries'),array('defaultWidgets','bestof'),null,'List of selected entries'); $__widgets->bestof->setting('title',__('Title (optional)').' :',__('Best of me')); $__widgets->bestof->setting('orderby',__('Sort:'),'asc','combo',array(__('Ascending') => 'asc', __('Descending') => 'desc')); $__widgets->bestof->setting('homeonly',__('Display on:'),1,'combo', array(__('All pages') => 0, __('Home page only') => 1, __('Except on home page') => 2)); $__widgets->bestof->setting('content_only',__('Content only'),0,'check'); $__widgets->bestof->setting('class',__('CSS class:'),''); $__widgets->create('langs',__('Blog languages'),array('defaultWidgets','langs'),null,'List of available languages'); $__widgets->langs->setting('title',__('Title (optional)').' :',__('Languages')); $__widgets->langs->setting('homeonly',__('Display on:'),1,'combo', array(__('All pages') => 0, __('Home page only') => 1, __('Except on home page') => 2)); $__widgets->langs->setting('content_only',__('Content only'),0,'check'); $__widgets->langs->setting('class',__('CSS class:'),''); $__widgets->create('categories',__('List of categories'),array('defaultWidgets','categories'),null,'List of categories'); $__widgets->categories->setting('title',__('Title (optional)').' :',__('Categories')); $__widgets->categories->setting('postcount',__('With entries counts'),0,'check'); $__widgets->categories->setting('subcatscount', __('Include sub cats in count'), false, 'check'); $__widgets->categories->setting('with_empty',__('Include empty categories'),0,'check'); $__widgets->categories->setting('homeonly',__('Display on:'),0,'combo', array(__('All pages') => 0, __('Home page only') => 1, __('Except on home page') => 2)); $__widgets->categories->setting('content_only',__('Content only'),0,'check'); $__widgets->categories->setting('class',__('CSS class:'),''); $__widgets->create('subscribe',__('Subscribe links'),array('defaultWidgets','subscribe'),null,'Feed subscription links (RSS or Atom)'); $__widgets->subscribe->setting('title',__('Title (optional)').' :',__('Subscribe')); $__widgets->subscribe->setting('type',__('Feeds type:'),'atom','combo',array('Atom' => 'atom', 'RSS' => 'rss2')); $__widgets->subscribe->setting('homeonly',__('Display on:'),1,'combo', array(__('All pages') => 0, __('Home page only') => 1, __('Except on home page') => 2)); $__widgets->subscribe->setting('content_only',__('Content only'),0,'check'); $__widgets->subscribe->setting('class',__('CSS class:'),''); $__widgets->create('feed',__('Feed reader'),array('defaultWidgets','feed'),null,'List of last entries from feed (RSS or Atom)'); $__widgets->feed->setting('title',__('Title (optional)').' :',__('Somewhere else')); $__widgets->feed->setting('url',__('Feed URL:'),''); $__widgets->feed->setting('limit',__('Entries limit:'),10); $__widgets->feed->setting('homeonly',__('Display on:'),1,'combo', array(__('All pages') => 0, __('Home page only') => 1, __('Except on home page') => 2)); $__widgets->feed->setting('content_only',__('Content only'),0,'check'); $__widgets->feed->setting('class',__('CSS class:'),''); $__widgets->create('text',__('Text'),array('defaultWidgets','text'),null,'Simple text'); $__widgets->text->setting('title',__('Title (optional)').' :',''); $__widgets->text->setting('text',__('Text:'),'','textarea'); $__widgets->text->setting('homeonly',__('Display on:'),0,'combo', array(__('All pages') => 0, __('Home page only') => 1, __('Except on home page') => 2)); $__widgets->text->setting('content_only',__('Content only'),0,'check'); $__widgets->text->setting('class',__('CSS class:'),''); $__widgets->create('lastposts',__('Last entries'),array('defaultWidgets','lastposts'),null,'List of last entries published'); $__widgets->lastposts->setting('title',__('Title (optional)').' :',__('Last entries')); $rs = $core->blog->getCategories(array('post_type'=>'post')); $categories = array('' => '', __('Uncategorized') => 'null'); while ($rs->fetch()) { $categories[str_repeat('  ',$rs->level-1).($rs->level-1 == 0 ? '' : '• ').html::escapeHTML($rs->cat_title)] = $rs->cat_id; } $__widgets->lastposts->setting('category',__('Category:'),'','combo',$categories); unset($rs,$categories); if ($core->plugins->moduleExists('tags')) { $__widgets->lastposts->setting('tag',__('Tag:'),''); } $__widgets->lastposts->setting('limit',__('Entries limit:'),10); $__widgets->lastposts->setting('homeonly',__('Display on:'),1,'combo', array(__('All pages') => 0, __('Home page only') => 1, __('Except on home page') => 2)); $__widgets->lastposts->setting('content_only',__('Content only'),0,'check'); $__widgets->lastposts->setting('class',__('CSS class:'),''); $__widgets->create('lastcomments',__('Last comments'),array('defaultWidgets','lastcomments'),null,'List of last comments published'); $__widgets->lastcomments->setting('title',__('Title (optional)').' :',__('Last comments')); $__widgets->lastcomments->setting('limit',__('Comments limit:'),10); $__widgets->lastcomments->setting('homeonly',__('Display on:'),1,'combo', array(__('All pages') => 0, __('Home page only') => 1, __('Except on home page') => 2)); $__widgets->lastcomments->setting('content_only',__('Content only'),0,'check'); $__widgets->lastcomments->setting('class',__('CSS class:'),''); # --BEHAVIOR-- initWidgets $core->callBehavior('initWidgets',$__widgets); # Default widgets global $__default_widgets; $__default_widgets = array('nav'=> new dcWidgets(), 'extra'=> new dcWidgets(), 'custom'=> new dcWidgets()); $__default_widgets['nav']->append($__widgets->search); $__default_widgets['nav']->append($__widgets->navigation); $__default_widgets['nav']->append($__widgets->bestof); $__default_widgets['nav']->append($__widgets->categories); $__default_widgets['extra']->append($__widgets->subscribe); # --BEHAVIOR-- initDefaultWidgets $core->callBehavior('initDefaultWidgets',$__widgets,$__default_widgets); dotclear-2.6.2+dfsg/plugins/widgets/_define.php000066400000000000000000000012451230033266200214650ustar00rootroot00000000000000registerModule( /* Name */ "Widgets", /* Description*/ "Widgets for your blog sidebars", /* Author */ "Olivier Meunier & Dotclear Team", /* Version */ '3.1', array( 'permissions' => 'admin', 'priority' => 1000000000, 'type' => 'plugin' ) ); dotclear-2.6.2+dfsg/plugins/widgets/_install.php000066400000000000000000000027001230033266200216760ustar00rootroot00000000000000plugins->moduleInfo('widgets','version'); if (version_compare($core->getVersion('widgets'),$version,'>=')) { return; } require dirname(__FILE__).'/_default_widgets.php'; $settings =& $core->blog->settings; $settings->addNamespace('widgets'); if ($settings->widgets->widgets_nav != null) { $settings->widgets->put('widgets_nav',dcWidgets::load($settings->widgets->widgets_nav)->store()); } else { $settings->widgets->put('widgets_nav','','string','Navigation widgets',false); } if ($settings->widgets->widgets_extra != null) { $settings->widgets->put('widgets_extra',dcWidgets::load($settings->widgets->widgets_extra)->store()); } else { $settings->widgets->put('widgets_extra','','string','Extra widgets',false); } if ($settings->widgets->widgets_custom != null) { $settings->widgets->put('widgets_custom',dcWidgets::load($settings->widgets->widgets_custom)->store()); } else { $settings->widgets->put('widgets_custom','','string','Custom widgets',false); } $core->setVersion('widgets',$version); return true; dotclear-2.6.2+dfsg/plugins/widgets/_public.php000066400000000000000000000072061230033266200215140ustar00rootroot00000000000000tpl->addValue('Widgets',array('publicWidgets','tplWidgets')); $core->tpl->addBlock('Widget',array('publicWidgets','tplWidget')); class publicWidgets { public static function tplWidgets($attr) { $type = isset($attr['type']) ? $attr['type'] : ''; # widgets to disable $disable = isset($attr['disable']) ? trim($attr['disable']) : ''; if ($type == '') { $res = "publicWidgets::widgetsHandler('nav','".addslashes($disable)."');"."\n". " publicWidgets::widgetsHandler('extra','".addslashes($disable)."');"."\n". " publicWidgets::widgetsHandler('custom','".addslashes($disable)."');"."\n"; } else { if (!in_array($type, array('nav','extra','custom'))) { $type = 'nav'; } $res = "publicWidgets::widgetsHandler('".addslashes($type)."','".addslashes($disable)."');"; } return ''; } public static function widgetsHandler($type,$disable='') { $wtype = 'widgets_'.$type; $GLOBALS['core']->blog->settings->addNameSpace('widgets'); $widgets = $GLOBALS['core']->blog->settings->widgets->{$wtype}; if (!$widgets) { // If widgets value is empty, get defaults $widgets = self::defaultWidgets($type); } else { // Otherwise, load widgets $widgets = dcWidgets::load($widgets); } if ($widgets->isEmpty()) { // Widgets are empty, don't show anything return; } $disable = preg_split('/\s*,\s*/',$disable,-1,PREG_SPLIT_NO_EMPTY); $disable = array_flip($disable); foreach ($widgets->elements() as $k => $w) { if (isset($disable[$w->id()])) { continue; } echo $w->call($k); } } private static function defaultWidgets($type) { $widgets = new dcWidgets(); $w = new dcWidgets(); if (isset($GLOBALS['__default_widgets'][$type])) { $w = $GLOBALS['__default_widgets'][$type]; } return $w; } public static function tplWidget($attr,$content) { if (!isset($attr['id']) || !($GLOBALS['__widgets']->{$attr['id']} instanceof dcWidget)) { return; } # We change tpl:lang syntax, we need it $content = preg_replace('/\{\{tpl:lang\s+(.*?)\}\}/msu','{tpl:lang $1}',$content); # We remove every {{tpl: $content = preg_replace('/\{\{tpl:.*?\}\}/msu','',$content); return ""; } public static function widgetHandler($id,$xml) { $widgets =& $GLOBALS['__widgets']; if (!($widgets->{$id} instanceof dcWidget)) { return; } $xml = ''.$xml.''; $xml = @simplexml_load_string($xml); if (!($xml instanceof SimpleXMLElement)) { echo "Invalid widget XML fragment"; return; } $w = clone $widgets->{$id}; foreach ($xml->setting as $e) { if (empty($e['name'])) { continue; } $setting = (string) $e['name']; if (count($e->children())>0) { $text = preg_replace('#^]*>(.*)$#msu','\1', (string)$e->asXML()); } else { $text=$e; } $w->{$setting} = preg_replace_callback('/\{tpl:lang (.*?)\}/msu',array('self','widgetL10nHandler'),$text); } echo $w->call(0); } private static function widgetL10nHandler($m) { return __($m[1]); } } dotclear-2.6.2+dfsg/plugins/widgets/_widgets_functions.php000066400000000000000000000243021230033266200237700ustar00rootroot00000000000000homeonly == 1 && $core->url->type != 'default') || ($w->homeonly == 2 && $core->url->type == 'default')) { return; } $value = isset($GLOBALS['_search']) ? html::escapeHTML($GLOBALS['_search']) : ''; return ($w->content_only ? '' : ''); } public static function navigation($w) { global $core; if (($w->homeonly == 1 && $core->url->type != 'default') || ($w->homeonly == 2 && $core->url->type == 'default')) { return; } $res = ($w->content_only ? '' : '
          class ? ' class="'.html::escapeHTML($w->class).'"' : '').'>'). ($w->title ? '

          '.html::escapeHTML($w->title).'

          ' : ''). ''. ($w->content_only ? '' : '
          '); return $res; } public static function categories($w) { global $core, $_ctx; if (($w->homeonly == 1 && $core->url->type != 'default') || ($w->homeonly == 2 && $core->url->type == 'default')) { return; } $rs = $core->blog->getCategories(array('post_type'=>'post','without_empty'=> !$w->with_empty)); if ($rs->isEmpty()) { return; } $res = ($w->content_only ? '' : '
          '). ($w->title ? '

          '.html::escapeHTML($w->title).'

          ' : ''); $ref_level = $level = $rs->level-1; while ($rs->fetch()) { $class = ''; if (($core->url->type == 'category' && $_ctx->categories instanceof record && $_ctx->categories->cat_id == $rs->cat_id) || ($core->url->type == 'post' && $_ctx->posts instanceof record && $_ctx->posts->cat_id == $rs->cat_id)) { $class = ' class="category-current"'; } if ($rs->level > $level) { $res .= str_repeat('
            ',$rs->level - $level); } elseif ($rs->level < $level) { $res .= str_repeat('
          ',-($rs->level - $level)); } if ($rs->level <= $level) { $res .= ''; } $res .= ''. html::escapeHTML($rs->cat_title).''. ($w->postcount ? ' ('.($w->subcatscount ? $rs->nb_total : $rs->nb_post).')' : ''); $level = $rs->level; } if ($ref_level - $level < 0) { $res .= str_repeat('
        ',-($ref_level - $level)); } $res .= ($w->content_only ? '' : '
        '); return $res; } public static function bestof($w) { global $core; if (($w->homeonly == 1 && $core->url->type != 'default') || ($w->homeonly == 2 && $core->url->type == 'default')) { return; } $params = array( 'post_selected' => true, 'no_content' => true, 'order' => 'post_dt '.strtoupper($w->orderby) ); $rs = $core->blog->getPosts($params); if ($rs->isEmpty()) { return; } $res = ($w->content_only ? '' : '
        '). ($w->title ? '

        '.html::escapeHTML($w->title).'

        ' : ''). ''.($w->content_only ? '' : '
        '); return $res; } public static function langs($w) { global $core, $_ctx; if (($w->homeonly == 1 && $core->url->type != 'default' && $core->url->type != 'lang') || ($w->homeonly == 2 && ($core->url->type == 'default' || $core->url->type == 'lang'))) { return; } $rs = $core->blog->getLangs(); if ($rs->count() <= 1) { return; } $langs = l10n::getISOcodes(); $res = ($w->content_only ? '' : '
        '). ($w->title ? '

        '.html::escapeHTML($w->title).'

        ' : ''). '
          '; while ($rs->fetch()) { $l = ($_ctx->cur_lang == $rs->post_lang) ? '%s' : '%s'; $lang_name = isset($langs[$rs->post_lang]) ? $langs[$rs->post_lang] : $rs->post_lang; $res .= '
        • '. sprintf($l, ''. $lang_name.''). '
        • '; } $res .= '
        '.($w->content_only ? '' : '
        '); return $res; } public static function subscribe($w) { global $core; if (($w->homeonly == 1 && $core->url->type != 'default') || ($w->homeonly == 2 && $core->url->type == 'default')) { return; } $type = ($w->type == 'atom' || $w->type == 'rss2') ? $w->type : 'rss2'; $mime = $type == 'rss2' ? 'application/rss+xml' : 'application/atom+xml'; $p_title = __('This blog\'s entries %s feed'); $c_title = __('This blog\'s comments %s feed'); $res = ($w->content_only ? '' : '
        '). ($w->title ? '

        '.html::escapeHTML($w->title).'

        ' : ''). ''.($w->content_only ? '' : '
        '); return $res; } public static function feed($w) { if (!$w->url) { return; } global $core; if (($w->homeonly == 1 && $core->url->type != 'default') || ($w->homeonly == 2 && $core->url->type == 'default')) { return; } $limit = abs((integer) $w->limit); try { $feed = feedReader::quickParse($w->url,DC_TPL_CACHE); if ($feed == false || count($feed->items) == 0) { return; } } catch (Exception $e) { return; } $res = ($w->content_only ? '' : '
        '). ($w->title ? '

        '.html::escapeHTML($w->title).'

        ' : ''). '
          '; $i = 0; foreach ($feed->items as $item) { $title = isset($item->title) && strlen(trim($item->title)) ? $item->title : ''; $link = isset($item->link) && strlen(trim($item->link)) ? $item->link : ''; if (!$link && !$title) { continue; } if (!$title) { $title = substr($link,0,25).'...'; } $li = $link ? ''.$title.'' : $title; $res .= '
        • '.$li.'
        • '; $i++; if ($i >= $limit) { break; } } $res .= '
        '.($w->content_only ? '' : '
        '); return $res; } public static function text($w) { global $core; if (($w->homeonly == 1 && $core->url->type != 'default') || ($w->homeonly == 2 && $core->url->type == 'default')) { return; } $res = ($w->content_only ? '' : '
        '). ($w->title ? '

        '.html::escapeHTML($w->title).'

        ' : ''). $w->text. ($w->content_only ? '' : '
        '); return $res; } public static function lastposts($w) { global $core; if (($w->homeonly == 1 && $core->url->type != 'default') || ($w->homeonly == 2 && $core->url->type == 'default')) { return; } $params['limit'] = abs((integer) $w->limit); $params['order'] = 'post_dt desc'; $params['no_content'] = true; if ($w->category) { if ($w->category == 'null') { $params['sql'] = ' AND P.cat_id IS NULL '; } elseif (is_numeric($w->category)) { $params['cat_id'] = (integer) $w->category; } else { $params['cat_url'] = $w->category; } } if ($w->tag) { $params['meta_id'] = $w->tag; $rs = $core->meta->getPostsByMeta($params); } else { $rs = $core->blog->getPosts($params); } if ($rs->isEmpty()) { return; } $res = ($w->content_only ? '' : '
        '). ($w->title ? '

        '.html::escapeHTML($w->title).'

        ' : ''). ''.($w->content_only ? '' : '
        '); return $res; } public static function lastcomments($w) { global $core; if (($w->homeonly == 1 && $core->url->type != 'default') || ($w->homeonly == 2 && $core->url->type == 'default')) { return; } $params['limit'] = abs((integer) $w->limit); $params['order'] = 'comment_dt desc'; $rs = $core->blog->getComments($params); if ($rs->isEmpty()) { return; } $res = ($w->content_only ? '' : '
        '). ($w->title ? '

        '.html::escapeHTML($w->title).'

        ' : ''). ''.($w->content_only ? '' : '
        '); return $res; } } dotclear-2.6.2+dfsg/plugins/widgets/class.widgets.php000066400000000000000000000132761230033266200226550ustar00rootroot00000000000000__widgets as $pos=>$w) { $serialized[]=($w->serialize($pos)); } return base64_encode(serialize($serialized)); } public function create($id,$name,$callback,$append_callback=null,$desc='') { $this->__widgets[$id] = new dcWidget($id,$name,$callback,$desc); $this->__widgets[$id]->append_callback = $append_callback; } public function append($widget) { if ($widget instanceof dcWidget) { if (is_callable($widget->append_callback)) { call_user_func($widget->append_callback,$widget); } $this->__widgets[] = $widget; } } public function isEmpty() { return count($this->__widgets) == 0; } public function elements($sorted=false) { if ($sorted) { uasort($this->__widgets,array('self','sort')); } return $this->__widgets; } public function __get($id) { if (!isset($this->__widgets[$id])) { return null; } return $this->__widgets[$id]; } public function __wakeup() { foreach ($this->__widgets as $i => $w) { if (!($w instanceof dcWidget)) { unset($this->__widgets[$i]); } } } public static function loadArray($A,$widgets) { if (!($widgets instanceof self)) { return false; } uasort($A,array('self','arraySort')); $result = new self; foreach ($A as $v) { if ($widgets->{$v['id']} != null) { $w = clone $widgets->{$v['id']}; # Settings unset($v['id']); unset($v['order']); foreach ($v as $sid => $s) { $w->{$sid} = $s; } $result->append($w); } } return $result; } private static function arraySort($a, $b) { if ($a['order'] == $b['order']) { return 0; } return $a['order'] > $b['order'] ? 1 : -1; } private static function sort($a,$b) { $c = $a->name(); $d = $b->name(); if ($c == $d) { return 0; } return ($c < $d) ? -1 : 1; } } class dcWidget { private $id; private $name; private $desc; private $public_callback = null; public $append_callback = null; private $settings = array(); public function serialize($order) { $values = array(); foreach ($this->settings as $k=>$v) $values[$k]=$v['value']; $values['id']=$this->id; $values['order']=$order; return $values; } public function __construct($id,$name,$callback,$desc='') { $this->public_callback = $callback; $this->id = $id; $this->name = $name; $this->desc = $desc; } public function id() { return $this->id; } public function name() { return $this->name; } public function desc() { return $this->desc; } public function getCallback() { return $this->public_callback; } public function call($i=0) { if (is_callable($this->public_callback)) { return call_user_func($this->public_callback,$this,$i); } return '

        Callback not found for widget '.$this->id.'

        '; } /* Widget settings --------------------------------------------------- */ public function __get($n) { if (isset($this->settings[$n])) { return $this->settings[$n]['value']; } return null; } public function __set($n,$v) { if (isset($this->settings[$n])) { $this->settings[$n]['value'] = $v; } } public function setting($name,$title,$value,$type='text') { if ($type == 'combo') { $options = @func_get_arg(4); if (!is_array($options)) { return false; } } $this->settings[$name] = array( 'title' => $title, 'type' => $type, 'value' => $value ); if (isset($options)) { $this->settings[$name]['options'] = $options; } } public function settings() { return $this->settings; } public function formSettings($pr='',&$i=0) { $res = ''; foreach ($this->settings as $id => $s) { $res .= $this->formSetting($id,$s,$pr,$i); $i++; } return $res; } public function formSetting($id,$s,$pr='',&$i=0) { $res = ''; $wfid = "wf-".$i; $iname = $pr ? $pr.'['.$id.']' : $id; switch ($s['type']) { case 'text': $res .= '

        '. form::field(array($iname,$wfid),20,255,html::escapeHTML($s['value']),'maximal'). '

        '; break; case 'textarea': $res .= '

        '. form::textarea(array($iname,$wfid),30,5,html::escapeHTML($s['value']),'maximal'). '

        '; break; case 'check': $res .= '

        '.form::hidden(array($iname),'0'). '

        '; break; case 'radio': $res .= '

        '.($s['title'] ? '
        ' : ''); if(!empty($s['options'])) { foreach ($s['options'] as $k => $v) { $res .= $k > 0 ? '
        ' : ''; $res .= ''; } } $res .= '

        '; break; case 'combo': $res .= '

        '. form::combo(array($iname,$wfid),$s['options'],$s['value']). '

        '; break; } return $res; } } dotclear-2.6.2+dfsg/plugins/widgets/dragdrop.js000066400000000000000000000041041230033266200215200ustar00rootroot00000000000000/* # -- BEGIN LICENSE BLOCK --------------------------------------- # # This file is part of Dotclear 2. # # Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear # Licensed under the GPL version 2.0 license. # See LICENSE file or # http://www.gnu.org/licenses/old-licenses/gpl-2.0.html # # -- END LICENSE BLOCK ----------------------------------------- */ $(function() { // clean $('.remove-if-drag').remove(); $('.hidden-if-drag').hide(); $('.widgets, .sortable-delete').addClass('if-drag'); // move $( ".connected, .sortable-delete" ).sortable({ tolerance: "move", cursor: "move", axis: "y", dropOnEmpty: true, handle: ".widget-name", placeholder: "ui-sortable-placeholder", items: "li:not(.sortable-delete-placeholder,.empty-widgets)", connectWith: ".connected, .sortable-delete", start: function( event, ui ) { // petit décalage esthétique ui.item.css('left', ui.item.position().left + 20); }, update: function(event, ui) { ul = $(this); widget = ui.item; field = ul.parents('.widgets'); // met a zéro le décalage ui.item.css('left', 'auto'); // signale les zones vides if( ul.find('li:not(.empty-widgets)').length == 0 ) { ul.find('li.empty-widgets').show(); field.find('ul.sortable-delete').hide(); } else { ul.find('li.empty-widgets').hide(); field.find('ul.sortable-delete').show(); } // remove if( widget.parents('ul').is('.sortable-delete') ) { widget.hide('slow', function() { $(this).remove(); }); } // réordonne reorder(ul); // expand if(widget.find('img.expand').length == 0) { dotclear.postExpander(widget); dotclear.viewPostContent(widget, 'close'); } } }); // add $( "#widgets-ref > li" ).draggable({ tolerance: "move", cursor: "move", connectToSortable: ".connected", helper: "clone", revert: "invalid", start: function( event, ui ) { ui.helper.css({'width': $('#widgets-ref > li').css('width')}); } }); $("li.ui-draggable, ul.ui-sortable li") .not('ul.sortable-delete li, li.empty-widgets') .css({'cursor':'move'}); }); dotclear-2.6.2+dfsg/plugins/widgets/icon-big.png000066400000000000000000000011661230033266200215620ustar00rootroot00000000000000PNG  IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<IDATx1K@/^0] vs3]t .v(EtinB@!+<^/wőG?!ɟ.OƑ.Е3ox&?p-I:p6H-ֿ`#Kg. ] dY?ژ{>yg$'$=lÜ;ScrS^]}y~H7Ho^WAfA8Rhnc^?5 ]cYgq]kI5MoR-ЩF1`v@UߵY0v X23 :YĜTz[2RA "S|πs.9wx$[b«!;$Q`M)F*W BSA_ST@lI?)j _#ж34>2.Pw>cv(rc['zr!N3;? ^ԑ IENDB`dotclear-2.6.2+dfsg/plugins/widgets/icon.png000066400000000000000000000003511230033266200210160ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxbuP=yABč@lO:Qzv VyJ@  /'¢ze@<I D8H5h$$B%()J\ЏtD< &H \IENDB`dotclear-2.6.2+dfsg/plugins/widgets/index.php000066400000000000000000000271061230033266200212070ustar00rootroot00000000000000blog->settings->widgets->widgets_nav) { $widgets_nav = dcWidgets::load($core->blog->settings->widgets->widgets_nav); } $widgets_extra = null; if ($core->blog->settings->widgets->widgets_extra) { $widgets_extra = dcWidgets::load($core->blog->settings->widgets->widgets_extra); } $widgets_custom = null; if ($core->blog->settings->widgets->widgets_custom) { $widgets_custom = dcWidgets::load($core->blog->settings->widgets->widgets_custom); } $append_combo = array( '-' => 0, __('navigation') => 'nav', __('extra') => 'extra', __('custom') => 'custom' ); function literalNullString($v) { if ($v == '') { return '<'.__('empty string').'>'; } return $v; } # Adding widgets to sidebars if (!empty($_POST['append']) && is_array($_POST['addw'])) { # Filter selection $addw = array(); foreach ($_POST['addw'] as $k => $v) { if (($v == 'extra' || $v == 'nav' || $v == 'custom') && $__widgets->{$k} !== null ) { $addw[$k] = $v; } } # Append 1 widget $wid = false; if( gettype($_POST['append']) == 'array' && count($_POST['append']) == 1 ) { $wid = array_keys($_POST['append']); $wid = $wid[0]; } # Append widgets if (!empty($addw)) { if (!($widgets_nav instanceof dcWidgets)) { $widgets_nav = new dcWidgets; } if (!($widgets_extra instanceof dcWidgets)) { $widgets_extra = new dcWidgets(); } if (!($widgets_custom instanceof dcWidgets)) { $widgets_custom = new dcWidgets(); } foreach ($addw as $k => $v) { if( !$wid || $wid == $k ) { switch ($v) { case 'nav': $widgets_nav->append($__widgets->{$k}); break; case 'extra': $widgets_extra->append($__widgets->{$k}); break; case 'custom': $widgets_custom->append($__widgets->{$k}); break; } } } try { $core->blog->settings->addNamespace('widgets'); $core->blog->settings->widgets->put('widgets_nav',$widgets_nav->store()); $core->blog->settings->widgets->put('widgets_extra',$widgets_extra->store()); $core->blog->settings->widgets->put('widgets_custom',$widgets_custom->store()); $core->blog->triggerBlog(); http::redirect($p_url); } catch (Exception $e) { $core->error->add($e->getMessage()); } } } # Removing ? $removing = false; if ( isset($_POST['w']) && is_array($_POST['w']) ) { foreach ($_POST['w'] as $nsid => $nsw) { foreach ($nsw as $i => $v) { if (!empty($v['_rem'])) { $removing = true; break 2; } } } } # Move ? $move = false; if ( isset($_POST['w']) && is_array($_POST['w']) ) { foreach ($_POST['w'] as $nsid => $nsw) { foreach ($nsw as $i => $v) { if (!empty($v['_down'])) { $oldorder = $_POST['w'][$nsid][$i]['order']; $neworder = $oldorder + 1; if( isset($_POST['w'][$nsid][$neworder]) ) { $_POST['w'][$nsid][$i]['order'] = $neworder; $_POST['w'][$nsid][$neworder]['order'] = $oldorder; $move = true; } } if (!empty($v['_up'])) { $oldorder = $_POST['w'][$nsid][$i]['order']; $neworder = $oldorder - 1; if( isset($_POST['w'][$nsid][$neworder]) ) { $_POST['w'][$nsid][$i]['order'] = $neworder; $_POST['w'][$nsid][$neworder]['order'] = $oldorder; $move = true; } } } } } # Update sidebars if (!empty($_POST['wup']) || $removing || $move ) { if (!isset($_POST['w']) || !is_array($_POST['w'])) { $_POST['w'] = array(); } try { # Removing mark as _rem widgets foreach ($_POST['w'] as $nsid => $nsw) { foreach ($nsw as $i => $v) { if (!empty($v['_rem'])) { unset($_POST['w'][$nsid][$i]); continue; } } } if (!isset($_POST['w']['nav'])) { $_POST['w']['nav'] = array(); } if (!isset($_POST['w']['extra'])) { $_POST['w']['extra'] = array(); } if (!isset($_POST['w']['custom'])) { $_POST['w']['custom'] = array(); } $widgets_nav = dcWidgets::loadArray($_POST['w']['nav'],$__widgets); $widgets_extra = dcWidgets::loadArray($_POST['w']['extra'],$__widgets); $widgets_custom = dcWidgets::loadArray($_POST['w']['custom'],$__widgets); $core->blog->settings->addNamespace('widgets'); $core->blog->settings->widgets->put('widgets_nav',$widgets_nav->store()); $core->blog->settings->widgets->put('widgets_extra',$widgets_extra->store()); $core->blog->settings->widgets->put('widgets_custom',$widgets_custom->store()); $core->blog->triggerBlog(); dcPage::addSuccessNotice(__('Sidebars and their widgets have been saved.')); http::redirect($p_url); } catch (Exception $e) { $core->error->add($e->getMessage()); } } elseif (!empty($_POST['wreset'])) { try { $core->blog->settings->addNamespace('widgets'); $core->blog->settings->widgets->put('widgets_nav',''); $core->blog->settings->widgets->put('widgets_extra',''); $core->blog->settings->widgets->put('widgets_custom',''); $core->blog->triggerBlog(); dcPage::addSuccessNotice(__('Sidebars have been resetting.')); http::redirect($p_url); } catch (Exception $e) { $core->error->add($e->getMessage()); } } ?> <?php echo __('Widgets'); ?> auth->user_prefs->addWorkspace('accessibility'); $user_dm_nodragdrop = $core->auth->user_prefs->accessibility->nodragdrop; ?> blog->name) => '', __('Widgets') => '' )). dcPage::notices(); # All widgets echo '
        '. '

        '.__('Available widgets').'

        '. '

        '.__('Drag widgets from this list to one of the sidebars, for add.').'

        '. '
          '; $j = 0; foreach ($__widgets->elements(true) as $w) { echo '
        • '.form::hidden(array('w[void][0][id]'),html::escapeHTML($w->id())). '

          '.form::field(array('w[void][0][order]'),2,3,0,'hide','',0,'title="'.__('order').'"').' '.$w->name(). ($w->desc() != '' ? ' '.__($w->desc()).'' : '').'

          '. '

          '. form::combo(array('addw['.$w->id().']'),$append_combo). '

          '. '
          '.$w->formSettings('w[void][0]',$j).'
          '. '
        • '; $j++; } echo '
        '. '

        '.$core->formNonce().'

        '. '

        '. '
        '; echo '
        '; # Nav sidebar echo '
        '. sidebarWidgets('dndnav',__('Navigation sidebar'),$widgets_nav,'nav',$__default_widgets['nav'],$j); echo '
        '; # Extra sidebar echo '
        '. sidebarWidgets('dndextra',__('Extra sidebar'),$widgets_extra,'extra',$__default_widgets['extra'],$j); echo '
        '; # Custom sidebar echo '
        '. sidebarWidgets('dndcustom',__('Custom sidebar'),$widgets_custom,'custom',$__default_widgets['custom'],$j); echo '
        '; echo '

        '. $core->formNonce(). ' '. '

        '. '
        '; $widget_elements = new stdClass; $widget_elements->content = '
        '; foreach ($__widgets->elements() as $w) { $widget_elements->content .= '
        '.html::escapeHTML($w->name()).' ('. __('Widget ID:').' '.html::escapeHTML($w->id()).')'. ($w->desc() != '' ? ' '.__($w->desc()).'' : '').'
        '. '
        '; $w_settings = $w->settings(); if (empty($w_settings)) { $widget_elements->content .= '

        '.__('No setting for this widget').'

        '; } else { $widget_elements->content .= '
          '; foreach ($w->settings() as $n => $s) { switch ($s['type']) { case 'check': $s_type = __('boolean').", ".__('possible values:')." 0 ".__('or')." 1"; break; case 'combo': $s['options'] = array_map("literalNullString", $s['options']); $s_type = __('listitem').", ".__('possible values:')." ".implode(', ',$s['options']).""; break; case 'text': case 'textarea': default: $s_type = __('string'); break; } $widget_elements->content .= '
        • '. __('Setting name:').' '.html::escapeHTML($n).''. ' ('.$s_type.')'. '
        • '; } $widget_elements->content .= '
        '; } $widget_elements->content .= '
        '; } $widget_elements->content .= '
        '; dcPage::helpBlock('widgets',$widget_elements); function sidebarWidgets($id,$title,$widgets,$pr,$default_widgets,&$j) { $res = '

        '.$title.'

        '; if (!($widgets instanceof dcWidgets)) { $widgets = $default_widgets; } $res .= '
          '; $res .= '
        • isEmpty() ? 'style="display: none;"' : '').'>'.__('No widget as far.').'
        • '; $i = 0; foreach ($widgets->elements() as $w) { $upDisabled = $i == 0 ? ' disabled" src="images/disabled_' : '" src="images/'; $downDisabled = $i == count($widgets->elements())-1 ? ' disabled" src="images/disabled_' : '" src="images/'; $altUp = $i == 0 ? ' alt=""' : ' alt="'.__('Up the widget').'"'; $altDown = $i == count($widgets->elements())-1 ? ' alt=""' : ' alt="'.__('Down the widget').'"'; $iname = 'w['.$pr.']['.$i.']'; $res .= '
        • '.form::hidden(array($iname.'[id]'),html::escapeHTML($w->id())). '

          '.form::field(array($iname.'[order]'),2,3,(string) $i,'hidden','',0,'title="'.__('order').'"'). ' '.$w->name(). ($w->desc() != '' ? ' '.__($w->desc()).'' : ''). ''. ' '. ' '.' '. ''. ''. '

          '. '
          '.$w->formSettings($iname,$j).'
          '. '
        • '; $i++; $j++; } $res .= '
        '; $res .= '
          0 ? '':' style="display: none;"').'>
        • '. __('Drag widgets here to remove.').'
        '; return $res; } ?> dotclear-2.6.2+dfsg/plugins/widgets/locales/000077500000000000000000000000001230033266200210035ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/widgets/locales/en/000077500000000000000000000000001230033266200214055ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/widgets/locales/en/help/000077500000000000000000000000001230033266200223355ustar00rootroot00000000000000dotclear-2.6.2+dfsg/plugins/widgets/locales/en/help/help.html000066400000000000000000000030311230033266200241500ustar00rootroot00000000000000 Widgets

        Use of widgets

        Widgets may be used to add various blocks of content to be displayed on your public pages. To add a widget, drag it from the Available widgets list on the left to one of the sidebars on the right of this page. You can order your widgets in a sidebar by dragging them up or down. To apply your changes, press Update sidebars.

        Once included in a sidebar, widgets have configuration options that you can reach by clicking on the arrow next to their name.

        To remove a widget, simply drag it to one of the dedicated zones

        Remember to save your changes after any modification by pressing Update sidebars

        Use the Reset sidebars button to reset the sidebars as they were originally set in your system (a pop-up will ask you to confirm your choice).

        Widget Tags

        If you are allowed to edit your theme templates, you can directly add widgets as templates tags, with their own configuration.

        To add a widget in your template, you need to write code like this:

        <tpl:Widget id="Widget ID">
          <setting name="Setting name">Setting value</setting>
          ...
        </tpl:Widget>
        

        Here are the widgets available for your blog:

        dotclear-2.6.2+dfsg/plugins/widgets/locales/en/resources.php000066400000000000000000000007501230033266200241320ustar00rootroot00000000000000 Widgets

        Utilisation des widgets

        Les widgets sont utilisés pour ajouter des blocs de contenus divers dans vos pages publiques. Pour ajouter un widget, faites-le glisser depuis la liste des widgets disponibles à gauche jusqu'à l'un des volets sur la droite de la page. Vous pouvez ré-ordonner vos widgets dans un volet ou entre les volets en le faisant glisser vers le haut ou vers le bas.

        Une fois inclus dans un volet, les widgets ont généralement des options que vous pouvez configurer. Cliquez sur la flèche à côté de leur nom pour y accéder.

        Pour supprimer un widget, il suffit de le faire glisser dans une des zones prévues à cet effet.

        À chaque changement (ajout, paramétrage, déplacement, suppression), vous devez mettre à jour les volets pour enregistrer les modifications.

        Réinitialisez les volets pour retrouver les widgets par défaut de votre installation.

        Balises de widget

        Si vous êtes autorisé à modifier vos fichiers de thème, vous pouvez ajouter des widgets sous forme de balise, avec leur propre configuration.

        Pour ajouter un widget à votre thème, vous devez insérer un code similaire à :

        <tpl:Widget id="ID du widget">
          <setting name="Nom de l'élément de réglage">Valeur de l'élément de réglage</setting>
          ...
        </tpl:Widget>
        

        Voici les widgets disponibles pour votre blog :

        dotclear-2.6.2+dfsg/plugins/widgets/locales/fr/resources.php000066400000000000000000000007501230033266200241370ustar00rootroot00000000000000 li, #dndextra > li, #dndcustom > li { padding: 0; border: 1px solid #999; margin-bottom: 1em; list-style: none; } #dndnav > li.empty-widgets, #dndextra > li.empty-widgets, #dndcustom > li.empty-widgets { border: 0; } #dndnav > li.ui-sortable-placeholder, #dndextra > li.ui-sortable-placeholder, #dndcustom > li.ui-sortable-placeholder, .sortable-delete > li.ui-sortable-placeholder { border: 1px dashed #999; height: 2em; padding: .3em; } .sortable-delete > li.ui-sortable-placeholder { border-width: 2px; border-color: red; } .sortable-delete { display: none; } .sortable-delete.if-drag { border: 1px dotted #999; color: #000; font-weight: bold; list-style-type: none; margin: 0 0 1em; padding: .5em 1em; display: block; background: #fafafa; } .sortable-delete > li { margin-bottom: 3px; } .sortable-delete > li.sortable-delete-placeholder { border: 0 none; color: #aaa; font-size: 1em; font-weight: bold; text-align: center; } .widget-name { background: #eef; color: #000; padding: 4px 6px; margin: 0; font-weight: bold; } .widget-name img { cursor: pointer; margin-bottom: -1px; } .widget-name a.aexpand, .widget-name a.aexpand:link, .widget-name a.aexpand:visited { border: 0 none; color: #000; text-decoration: none; } #dndnav .form-note, #dndextra .form-note, #dndcustom .form-note { display: none; } .toolsWidget { float: right; } .widgetSettings { border-top: 1px solid #ddd; padding: 8px 6px; background: #f5f5f5; } #sidebarsControl { clear: left; } /* ------------------------------------------------------------- list Widgets ref */ #listWidgets { float: left; width: 49%; background: #eee; padding: 1.5em 1% 0; margin: 0 1% 0 0; } #listWidgets h3 { color: #333; } #widgets-ref { padding: 1em 0; margin: 1em 0 0; } #widgets-ref > li { border: 1px solid #ccc; margin-bottom: .5em; background: #fff; min-height: 3em; padding: 0 0 4px 0; list-style: none; } #widgets-ref .widget-name, #widgets-ref .manual-move { background: #fff; margin-bottom: 0; padding: 4px 8px 0; } #widgets-ref .widget-name { min-height: 3em; } #widgets-ref .widget-name .form-note { display: block; font-style: normal; font-size: 1.1rem; } #widgets-ref .widgetSettings { display: none; } .removeWidget { margin-left: 1em; } /* ------------------------------------------------------------- help */ #widgets-tpl dt { margin: 1em 0 0 0; } #widgets-tpl dd { margin: 0.2em 0 1em 0; } dotclear-2.6.2+dfsg/plugins/widgets/widgets.js000066400000000000000000000071731230033266200213750ustar00rootroot00000000000000/* # -- BEGIN LICENSE BLOCK --------------------------------------- # # This file is part of Dotclear 2. # # Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear # Licensed under the GPL version 2.0 license. # See LICENSE file or # http://www.gnu.org/licenses/old-licenses/gpl-2.0.html # # -- END LICENSE BLOCK ----------------------------------------- */ dotclear.postExpander = function(line) { var title = $(line).find('.widget-name'); title.find('.form-note').remove(); order = title.find('input[name*=order]'); link = $('').append(title.text()); tools = title.find('.toolsWidget'); br = title.find('br'); title.empty().append(order).append(link).append(tools).append(br); var img = document.createElement('img'); img.src = dotclear.img_plus_src; img.alt = dotclear.img_plus_alt; img.className = 'expand'; $(img).css('cursor','pointer'); img.onclick = function() { dotclear.viewPostContent($(this).parents('li')); }; link.click(function(e) { e.preventDefault(); dotclear.viewPostContent($(this).parents('li')); }); title.prepend(img); }; dotclear.viewPostContent = function(line,action) { var action = action || 'toogle'; var img = line.find('.expand'); var isopen = img.attr('alt') == dotclear.img_plus_alt; if( action == 'close' || ( action == 'toogle' && !isopen ) ) { line.find('.widgetSettings').hide(); img.attr('src', dotclear.img_plus_src); img.attr('alt', dotclear.img_plus_alt); } else if ( action == 'open' || ( action == 'toogle' && isopen ) ) { line.find('.widgetSettings').show(); img.attr('src', dotclear.img_minus_src); img.attr('alt', dotclear.img_minus_alt); } }; function reorder(ul) { // réordonne if( ul.attr('id') ) { $list = ul.find('li').not('.empty-widgets'); $list.each(function(i) { $this = $(this); // trouve la zone de réception var name = ul.attr('id').split('dnd').join(''); // modifie le name en conséquence $this.find('*[name^=w]').each(function(){ tab = $(this).attr('name').split(']['); tab[0] = "w["+name; tab[1] = i; $(this).attr('name', tab.join('][')); }); // ainsi que le champ d'ordre sans js (au cas ou) $this.find('input[name*=order]').val(i); // active ou désactive les fléches if( i == 0 ) { $this.find('input.upWidget').prop('disabled', true); $this.find('input.upWidget').prop('src', 'images/disabled_up.png' ); } else { $this.find('input.upWidget').removeAttr('disabled'); $this.find('input.upWidget').prop('src', 'images/up.png' ); } if( i == $list.length-1 ) { $this.find('input.downWidget').prop('disabled', true); $this.find('input.downWidget').prop('src', 'images/disabled_down.png' ); } else { $this.find('input.downWidget').removeAttr('disabled'); $this.find('input.downWidget').prop('src', 'images/down.png' ); } }); } } $(function() { // reset $('input[name="wreset"]').click(function() { return window.confirm(dotclear.msg.confirm_widgets_reset); }); // plier/déplier $('#dndnav > li, #dndextra > li, #dndcustom > li').each(function() { dotclear.postExpander(this); dotclear.viewPostContent($(this), 'close'); }); // remove $('input[name*=_rem]').click(function (e) { e.preventDefault(); $(this).parents('li').remove(); }); // move $('input[name*=_down]').click(function (e) { e.preventDefault(); $this = $(this); $li = $this.parents('li'); $li.next().after($li); reorder($this.parents('ul.connected')); }); $('input[name*=_up]').click(function (e) { e.preventDefault(); $this = $(this); $li = $this.parents('li'); $li.prev().before($li); reorder($this.parents('ul.connected')); }); }); dotclear-2.6.2+dfsg/themes/000077500000000000000000000000001230033266200155175ustar00rootroot00000000000000dotclear-2.6.2+dfsg/themes/blueSilence/000077500000000000000000000000001230033266200177515ustar00rootroot00000000000000dotclear-2.6.2+dfsg/themes/blueSilence/_define.php000066400000000000000000000011251230033266200220520ustar00rootroot00000000000000registerModule( /* Name */ "Blue Silence", /* Description*/ "Dotclear Theme", /* Author */ "Marco / marcarea.com", /* Version */ '1.0', array( 'type' => 'theme' ) ); dotclear-2.6.2+dfsg/themes/blueSilence/img/000077500000000000000000000000001230033266200205255ustar00rootroot00000000000000dotclear-2.6.2+dfsg/themes/blueSilence/img/attach.png000066400000000000000000000005011230033266200224730ustar00rootroot00000000000000PNG  IHDR asBITO3PLTE333fffQQQIIIfffzzz]]]rrrޯDmtRNSܘ pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time01/08/04zs"-йB1IENDB`dotclear-2.6.2+dfsg/themes/blueSilence/img/commentaire.png000066400000000000000000000005051230033266200235360ustar00rootroot00000000000000PNG  IHDR x[LPsBITO`PLTEWs钰kʬ\zǴߜ^|ȧ tEXtSoftwareMacromedia Fireworks MX*$eIDAT[M@0 clb8iz7Y csN3s ڨ ߆Jgرo+cį(mh%~Fce\ֆ oIENDB`dotclear-2.6.2+dfsg/themes/blueSilence/img/commentaire_bulle.png000066400000000000000000000004701230033266200247220ustar00rootroot00000000000000PNG  IHDR?gsBITO PLTE^ tEXtSoftwareMacromedia Fireworks MX*$IDATW]=0F'Kw=1(ހM&8 O/y#A1:&6e oB E6rBAx8*@;56h343=ZYh'  g n4\!PQ/ pTIENDB`dotclear-2.6.2+dfsg/themes/blueSilence/img/footer.png000066400000000000000000000014731230033266200225360ustar00rootroot00000000000000PNG  IHDRp$Z'sBITO tEXtSoftwareMacromedia Fireworks MX*$IDATxQn0Pì3KaGS,s>Ea{IN0t4?LӔ8tnq Zzz>9]OS9=XgK@R>ecNqKj/#P%:tseQ?yr u`w _ ](7[ ; Uhqk2MS~?q  |n -r|UMr V }Y͑=5_b:@u]Lҿy z?~Ԁ(t0OW,+pf̏HPRW.v7ǖ:eW[ -T{r?@cX|+` D2m@9pk@~P~8P[,ɻ)gi@6P"̂8ZkcAcu Z:j JJz_U1>> Rs Atm2ym;O abVwiߓ ^|1IENDB`dotclear-2.6.2+dfsg/themes/blueSilence/img/rss.png000066400000000000000000000010451230033266200220420ustar00rootroot00000000000000PNG  IHDR(-SsBITOPLTEBśHTp2{mpfWծ}?NyYRltfHջȃz7DУcrf̅J@J;߾sT\pfzSpQȏ̙ljb|EέT tEXtSoftwareMacromedia Fireworks MX*$IDAT-s0 խ:`,a1D_8Ny.@e8`^5n[{:9A쀫3"Y;*}LET p!tbdf}uGE, Ež wȬqX0ۮ1 5A7a? -4|APoH$I|ifkֿIENDB`dotclear-2.6.2+dfsg/themes/blueSilence/img/sidebar_li.png000066400000000000000000000001631230033266200233300ustar00rootroot00000000000000PNG  IHDRFPLTEUFsz, pHYsHHFk>IDATcn` fHifIENDB`dotclear-2.6.2+dfsg/themes/blueSilence/img/tag.png000066400000000000000000000004641230033266200220120ustar00rootroot00000000000000PNG  IHDR6sBITOEPLTEׅ̙ޕČ[~ tEXtSoftwareMacromedia Fireworks MX*$oIDAT[EQ0EQDgKV!5csE Pۦ-w[Xu##<[þ '\n҂~?C$#XrNn7^>IENDB`dotclear-2.6.2+dfsg/themes/blueSilence/img/tags.png000066400000000000000000000005011230033266200221650ustar00rootroot00000000000000PNG  IHDR(-SsBITONPLTEVq[bejrb[`yjhvh]S pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$^IDATWK PJPAQ_"KfeQXD@`^ `a4`v5m.xOCj8CdGtA[aV~}]IENDB`dotclear-2.6.2+dfsg/themes/blueSilence/img/top.jpg000066400000000000000000000254361230033266200220430ustar00rootroot00000000000000JFIFddDuckyFAdobed      1RUa3C!AQb#ÄEb ?|4١neXeWi1@e~ zJT*2ѓ-ht9gr2HiC;nʯcJ * ˜y$UeEde'5}[fZ.rωdf%wa^Ɣ@UA9/ *PHʊFOj̴]C90! Kpk-*#I(,.s_U2UohC9>&HsaCM[uUxFPYT \W$e@!"*+#-?٫2vHs|M($41-ý &4 ~XIWʀ BEVTVFZ2Wտe,!QI 6hb[{YmULiAdP$s^1@df,E!Y4:C lķ۬24҂ H2?a%^c* YQYh_VY:Cht9F$4١neXeWi1@e~ zJT*2ѓ-ht9gr2HiC;nʯcJ * ˜y$UeEde'5}[fZ.rωdf%wa^Ɣ@UA9/ *PHʊFOj̴]C90! Kpk-*#I(,.s_U2UohC9>&HsaCM[uUxFPYT \W$e@!"*+#-?٫2vHs|M($41-ý &4 ~XIWʀ BEVTVFZ2Wտe,!QI 6hb[{YmULiAdP$s^1@df,E!Y4:C lķ۬24҂ H2?a%^c* YQYh_VY:Cht9F$4١neXeWi1@e~ zJT*2ѓ-ht9gr2HiC;nʯcJ * ˜y$UeEde'5}[fZ.rωdf%wa^Ɣ@UA9/ *PHʊFOj̴]C90! Kpk-*#I(,.s_U2UohC9>&HsaCM[uUxFPYT \W$e@!"*+#-?٫2vHs|M($41-ý &4 ~XIWʀ BEVTVFZ2Wտe,!QI 6hb[{YmULiAdP$s^1@df,E!Y4:C lķ۬24҂ H2?a%^c* YQYh_VY:Cht9F$4١neXeWi1@e~ zJT*2ѓ-ht9gr2HiC;nʯcJ * ˜y$UeEde'5}[fZ.rωdf%wa^Ɣ@UA9/ *PHʊFOj̴]C90! Kpk-*#I(,.s_U2UohC9>&HsaCM[uUxFPYT \W$e@!"*+#-?٫2vHs|M($41-ý &4 ~XIWʀ BEVTVFZ2Wտe,!QI 6hb[{YmULiAdP$s^1@df,E!Y4:C lķ۬24҂ H2?a%^c* YQYh_VY:Cht9F$4١neXeWi1@e~ zJT*2ѓ-ht9gr2HiC;nʯcJ * ˜y$UeEde'5}[fZ.rωdf%wa^Ɣ@UA9/ *PHʊFOj̴]C90! Kpk-*#I(,.s_U2UohC9>&HsaCM[uUxFPYT \W$e@!"*+#-?٫2vHs|M($41-ý &4 ~XIWʀ BEVTVFZ2Wտe,!QI 6hb[{YmULiAdP$s^1@df,E!Y4:C lķ۬24҂ H2?a%^c* YQYh_VY:Cht9F$4١neXeWi1@e~ zJT*2ѓ-ht9gr2HiC;nʯcJ * ˜y$UeEde'5}[fZ.rωdf%wa^Ɣ@UA9/ *PHʊFOj̴]C90! Kpk-*#I(,.s_U2UohC9>&HsaCM[uUxFPYT \W$e@!"*+#-?٫2vHs|M(ÒHineXeWi0 H2?a%^c*"TVFZ2Wտe.!XfZpiq.0ݺۈ5n{4\*@$PH2ڽaWLr7[؍S6Ʀո>wX)|LgH9 q(NQ.bXj%f&hZ,0KSVn#4պEKkȩEZP(@(@ vVZy@(@T &AYR77L۝؋InWbLۍD32`RnR82~$D12+Jn#4ջ[Q.c10Kfw]fau[t[^.ELJ U D((!AJP AJ@(()A @()@(!AJ&7n ΢)@(P @(P @(P @(*TQp IjN"[؍S6v+Tv*6v+q ̹]3ikvOsmXrVeJ"h^.E^W[q(պۊVn+3 [L7n3MDۊ-ۊպF'Śj׋Җ֋Z.jJ( @&QQQ@(@E4@((D0w6V'L vB+/|b}?w_p?w_p?w_p?w_p?w_p?w_p?w_p?w_p?w_p?w_p?w_pG )}}}}}}}}})};/NNN};/N#(VrsNZi-IN}v~Y9]79];&,_N7aɯ?;{ӔN)Vpg{俖g"ȤiQEYhh٥tD[qYTfiu[uj-J[tTxf׋)mhh"E P hJ@(@PP66l` 6` 6` 6` 6>l6مCf0 L-"BfIjjд Ins|-3nszRܮj;jܮfܮir橛sZKRZ&YQ l"M[#eJ( P@D\\"Rۤb%-[5nn34պ[J[tfimxJj׌T)mhJ[^/J-1yJ^**k($ (QE &R)@ )@"P  EAP#hEvDPiKVqRqVԜU'ⴖ%ݍj;fZKsE9j&E&EfUQR@(PBd)ed(d( 6BRA J*t Jb%-Kk*SVb-KnbKk)Kk*RъZъbBRшRvҋ[lNP;IJ6;@TQJPMP*@j@A*@"T "Tm6(FЉVq -YZKDZ┖%8IjN3T8IjN*Zͩ8U&VnTVeEfDBR( FQ@6K 6Aed 6BFQ@d(Rh$ EZ.L\EB񈔶b%-Kk*RъZRыJ[Z1R֌T֌R֌dE-1RORшQi!)m1Qi=‹ORٶQi Ͳ=ĢӶYYQfYmYQfEl͸Z, ѶQgQh {EQh 8%Z-Y)-hJKVqVVq՜bVqV՜egi-Y('i-YZKRq՜EfRoZ7Ҩ!QT)R@6D6B(!E!Nel&Q@(Q@P@ 'jQS EBb;rbIEKiT֌R֌TJ-ot2Qi~%-J->E)m>Qi,->EE)l,~)EĢwQg(Z-EĤ({{x8Ih,~%Z=Ғ┖yhN)Ij*hR՜E$N"jHYi +P*"@ E ()Rh!@( ( PJ^@((!@(PRQAJP @()@(4) TPMQSP6;Bhe JR/{Ki$YZ}ҋ=Ģ|J[=ҋ=ωEĢpppwQg(YZ=ZKGQgQh -EkIhےmZ6֋6Dm#jTF#hB*T@(PRQAJP @(P F@("P@(P @(P @(P P* @&m)vh 6hDmT **@  @(P (4P @(P @(T P*@ *@T >qpu7,帧X[H"T# U4pt Vbnxk )J g:'JBT84v$b^4IwF툎?<ThX| tUm~}a'…;H9|2߭18'\!^N)΋tJkJ&i/5uI)#[#Z֦90z릟750fXR?hùoCǕzb@ 9fѼgg3gk? F^ ͸VLbui&YkKt׋'5VI)HSuل!]b+1+=q^iVQ;`= 7\2`i fQHD'$odO#9+_4{!0fhD )4:#%GR}8XO=<*a#bEx]e7G45fAzlcIݏ~o?=i)32EbV7XWv#$WH~S2^muL@ 2JsJGg3hжNǘr^qޔz.:. `ڻ}KVyOYilckQI-o ~u;* Pmnxfyr>z:鲞;ƥ'83 6jOs.@mK)A-$(l./p#8b"8ybϬr.hEOfg>]'zɰS,?5SQ3s2qCRI!aH} b-X>|n\~gܴ"f&gǗxy0rXR)ٓRO*MyMȩJBTR/`x u[q;Y[-5t)t'r٦6CG25,ZmfuJYHH#v|eh/`x8g3?svUbs1_ M=6Im䨱* ZQRRBOI ؋ސiE#m1ˬg)ƶ቞&3t9U-3N!FeqS?)Jmt'&g3rg6E"}جLD4' UP8pUV+z+{ \I؟Vq5s=YƶOGڪ=qnVm++pŢiuŸa81nH[RJDưɇ#vC(L: sO =WY6@4KR䞟IMfbzҺ:]:s@1şGj}y/vɆ,9?0=vvɆ,Óx~'Ɏ,P_xϻr(pBO/k ^@z 8A<. (Hvo;Z@7{ ֽ k^Cd}!ײkK+PJwd`-6[2) ޝp@ 30@uWuOCN}w.0 w.0 w.0 w.0 w.0 w.0 w.0 w.0 w.0 w.0 w.02Ssn2Ïɺe}xc|gYf+8z&&c,T58NL!Iܮ]yЋ9Y3'^V_eNtlI9H0&v@rz*2KT7 Ԥ\]@^4paS,e-[~~qk8浽p].+XROրd(C^$t@ y6IX "DsdGg?ODsdGg?ODsnY[YU*T%;fޕd_ NQY2ԙ'cǧRg@ ?OD0Q^{7/=4HW)SaIIQ6)qvAfI9qى)Fݠ %IBIHIׄJٛ&^kr逐8l"E9%N7wyR-K*p|BB A76X fZBSeX@Z:vJHuB]S9rU-ybU$$4c`hNlԧԭVrJxV!#cdlbV''_/p҂a)M~4L2Kw %-䲉g*3gUOD7ꀌ0%$Zt&7[_i.nR.}&z2FTMzͬ5"AT]fx8gLΤeRe87θnV[(%aقH/ۘZh|gww@3; hw{4l.f@s-zu)zp@ 30@tVn<ݥ5E'J-f1|%0iiXJerA עF[4“?)LQݜKnPMxS"[Z1kmZtX*EЪ%$]:טp&q(+:e\O]E,YH NGLp3(s!c:`vuvuv]Wio`v]Wi(H SfX);F]Z@GMτ=fwhgݣݟjwvv| =fwhgݣݟ T9Y5@rͬzu)zp@ 31@l3t”BF97B6ZRͯRBKE, !G΄.[d\)koX%.?5yftǔ6 |LtO3S3, wfpm" vɄXfmU I2xJJrj:@@m*s3/N6ÖZq (JIin$@IwmxJ^C:ʩW |P kmB^eU<8dR+*`q퀇5h\ &RxRS(J|l.{nX::}.YJC"ָVnyJۖ H>q˒nA) V\@^`␹ƍQyUBVPV298@zM 4 _R6ێ&i9X)@}@KolXnfRʪjepru4oȂ[sV52ЗzYi$)Glj  7$-tGk(jfjJ6~MIJ Hh߂XK׎15V~uɔ@Vw-D"\zFb1L?FMRiK917QZ Z &F7jW1i_>1EM1+'ɦ;~d94t̟&ҿ2|`*i e@.s'OcөOُ֠w?^dzT%av"㆗TY=<ꤰ Vfܪndե)Xm Bzeu@Yz50ҚØyolY3VT_C/g[Umj\s ѹ~-&| Y͖H75H+QYILڜi@B@7 6Wh ;/ioI:S qB{+7g:Q7S*$\;Csy*2::JMiA[E5fnjN̎"ؗ QD&i6J;6g0۫@dܐs$\4rCu: 0YR&ִ~Y$Xeʛuey;DUW24.%V`x Tȥ5/&ҩryrJZY.y!,zB$@eLO9/zE vY:{(n la0(S&~KXS LKCd6 (vjOToHK'ef%]x8 ݅,_0*@oee [}s2U%I\ *imBsӵ\ԧf:̹Z)(%&R*:p뀅H]M W&a)'6eXerg!, :;BGq9iL9)fп$s مA$%@.?PK0ͨ8&@RڰFkV3D`iFtť:$f@WKkzlUM"Zmye V3u F".qu+@Q3* .3%3sYdj[h,̭24%% \[G Ѝ %5?9Ʉ*H2$2YZ\I!;ҐAXp,.̋9(tnV,,BIKQbEfjAKIN ʼ]F[ s Cf@qͬzu)zp@ 30@g E=RzTÏlK@RPOsLeٓ]r,-"\ ))%V#KdM8LF4\޻dI)#(d$^3n%;3 "6qIԑ@Xъ[h7S 6r"6S~QP E#*S/1W',lˢROq0RVBJotêS3.VEǐkuSk9 Ȑ8$$|59CP}_RqNl%p - Y6]́`V02z:ʕt*$g:N 6[X@, c+Y U9֬VMu:Fc|cB9Ù"NQUTziƕ(ytcv$8_4_lKӸq|.At[JjlAIu ̡bRbS;Vg:J&geMIBQԩ9Z3/3*o4X_ 6ԧEkP;l{b~saCsȭK[JZ,.mZ+i,rW3=?x٤̌iSmCT\(ݭeϪTkpsEVnX/᭝R$HȅMi̵U(^fnyCT`14Gg$WTܚJXV/ k5Uy&4V̴R Gis̻l!wT =KfgK @naHPIAX è~艈RqP¦ 6W~y Io=)Zji-7HKi@l$I&#P<.Ch]&MhB7hJBSrrArMf#,e Y-JR=@ jڼ jڼ jڼ jڼ 2at(mcөO֠هwѥf߼\w)Fc~[^ mZ#'136K7[ۦD!)zt`r=4+*}GO}ec Tѥfl( u+NT]''7f 9rJEjz{XT| '&&T+$ܓcCَS3mHP ͸7z\qn=p ǮVLOFv( ?1+gY@+7"-9TxM76*”ctu7:ӌuOJ?˗_R/E*E@L;^ԙgʛ[ zTc}Z޸D|SNk9L.K1+'0nrY_>0K1+'f;~d9,p̟%S,>PK*stszu)zp@ 30@uwCJV_rَ?'f;~Ow->0[1#|`cG9lxrَ?'5ʰμ4J֢bm=!8-yQm*f a`ߪިc<VQIIʄ᚛*w*ZP̐Ăt wy᭹JvK KϦf%.tRﶶFB߆?F'Lm>,N9:B^IR-*pP=[ot+3=)DR<7_jr]ڷenQfuiIi[E0RL&Los35)"dzԷ=+)Jaa zTm ̒b.KHcftBTP7s@NȰZr[%RkNWP䒂Vw &dhT[/SCZ:nDYbMM* ʬm‰ 6XS"5@gaSQqIsb;}h]6#w< ֎hsZ;}h]5w< ֎hsZ;}h]5w< <斾{ɷMzj8xDbxxD45{] I uWkP<-ful^^1rr-Z{e35 &0P|Z%5U_h4.LPW6n&DdiӺ+ -)OKkm#Jě5Ej'+2j r]6nfR[h 'SC*OKA[ywBJR6t̴Z6iRHJBd$,OJΰ HYYMP2m%i:$\mohq\@{@ 57* Mt 9s BsVوZtL"5/XqZPE쒱W$jlDYeu*yPpwb *N>,?Dq)ʉg^db͹/DEr!!.'f#x( .椋~YKuT"w9)p(gRH ( -U-E*&ݢ״SgNvReUmL ANX1UOu)1VQd(ݥ)!C紝`=^ UẢyF)庬IGc[Tlˣiu9)%+/JQBsR.,\XbeCX*+=p2 miZO>M\(So%') . 1 ?:{{ּ 96M[21qs1ٚMѝ\vQeЇWd?8۲Ѫ줽/g#%NԺb^wi>Q"`k@g)<29y1-~qLR󀶠:}p@ 8=:=?ȸ j@ z b͗qhV)CS^I3! l:%'.m/np[eӳQrtZuI4B%t _EMJ*r.)7S@]_QqđVɪ)U٘X`:M!pRftH s 1:'zU ya)/U=M͖-NWWYVR*hbhm` U%7ǪBCfT)5Iй\j^e]nnn3 }-v N bV(A.jbiN$cnnEo32U*Ӓ+os4n n:\ 5:.iӌWA8A/˳4!*Dc۪䫻+A0%oy+4,#8&0ʫe8]44zuͥ9#HI쀎6_Spb%iL%Љ(_S)΢ͩ9uSG.>p>ؘqM- :J $рڰ~/j-Pbm.* Cg"*ֵ KmZu:Jmua\)S"d]$ C0 t{+33MjqXp6L䲘*6V꽆e)$Io it)~2tE̾I;T)-),d6^ 2uRgWJك3HpƓV`2Lj=F*IkϤ;QH@SaVQp؃qoj 7]meѭ& @ 8=:=?ȸ j@ z 6ym2xpH%NwfxɅ$h P| }.6ˉh,-pt%{{[`7J\ʪMOӿC *l.,EkNX@, \i[qmN7r. /X@, dNrrX?Lv%Rssm.{`+X@{0+q,J%*qiQ *PHPl.F\Z熽U!R1;:tʌEm$-i&Gů}?YkK)/|ƽ3hs1is1is1is1is1is1iRlL-ǧRg@ ?OD^wc%Tdr8*qnԐFtͬ/awa5rm+vS))j]z͔b a'M{^ d=RZV)W5Xp zBO z Z=Oho =Oho A\ "O>eSdXh &&c"c=XvLuEn%Ќ&6*֕&bUlW͊@9]6+Cio3)Bnuɰy }9]S67A+ǧRg@ ?ODM蟨&s|.46!*\ \i3Dۉ19m\G0K}:@u$jxp/Nfvq-,jQ 2!$t{ gceSo#*q'mY h$6ofbSgh:MOMLRT :0 ^ɟR$$mzYMo C*I7M=gL4:tᵦߜJc9LfRʻqg\K搅 4@s_p=k@9}95| )ziKq6R}&b#2tYү[G:YdFꍥKn2K8km+hqVs D7T)Xbrf*p%EN%)Q 's!\g̋K>ɖ ]=%]^^t 1xI/^i(KJk(}&S"+(q&9MUdM 8"&fF96Im!JJeNdZ 03<Yot)[,OY>8@[Frh26*n Ԏ0N̰yשy]yn)wqEKH7]6ċjnJlJeE5QOu/˭)kK-TM#iXS"5@ganPu {d`);\0msO9>;\0msO9>;\0msOFԥ-?.SfǥHfĢb-|Iw|Ą.ا;rMэv֑ F#=!#$DH4F$+!2R^w( gb$Wj~hۭ :XeiTv t̺ D[/Rxi"#QVIs6P F {kƵ&pb&b2kDrwViJ/SHhR3{z-Ff0\1ĵ<U8d~rAUfMSخFqS0seهtXS"5@gcwI Y)vAm2O ,d<0Ӗ.6I.$(eYJ"'/ _b:ەnM-'9Ym* tmS{BPv\ScM%\o2u'zP j[1S3 TT(..\đJ:-.Ko6lEtq@ L㡩b5vPJEHzRړ^^fmc q)[nf(qwA1uXG^&yU):RQ(e}M(pҚԜRrɩ;;;;;_[Iؐ XS"5@gcݦ0(5Xa.H!f]\5W #8c96@@dT3BoKhBK.ӂ5ճs^An cSl5Nh:&M g!'Hbc0o"QKAB voc2noKr4%.0Na|]0g WV)2X@XGM1`@.;D@.;D@W*bm j(PzjjWF{"ӥmfez>v^m#xZ'+i9N<#= ֞m"q/+\L2h6QSk:XaSr<.,k' \wo޻kGz@9wo JmcөO֠هwԩnZ'0VijLLggjf&'!bV5{PޥE%kMsX&t8ŜWSƯ>Ccd=C`ad=C`ad=C`+dqm 1x2ʠN ܱGMM j-`}vNf+.ݏ=TD>} 4[\œpU@iĻo0N@5'*k PNcM#*V~=#;Kps%*)7йmA$njT['=3#=-SḌMK]eahU؂> PmcөOُ֠wjձVmeB,ToGMW$D˴]ۥ*ޠhn,z0A6sNuCRK*XZpTu.&ܤƧyRܹf.N[ft彵ar/m2(aIQj WϽ*U)QcblWC%NNdJv")OEȱ!rr&\L0ʞiK7q t<6+0%"T9< 6nX\/sӬaB+r}@eNFkՠ 4 ў^Jw̼u3fwri`OeSS\JF8h@5 &v[rZ ȑBó9 HPumMp4zCt2JʇyZX_XOX ۬m!$ׇVlODe aR&$9fR*pJBBJ{U5 qUP)͖(,$ 36 +POȨiMҧ6aP׍ u@O3)9(Se$5:zZѼjRq0*l2N4xuY'SEt6{z#3ojԞDraq8s !M.\pK6uͮoG ae6[4IAVA8u[^n8-$ eI#m 2JLeeIKL$!IjI?|ps~l%{` ZR &6ԧEkP;ֶZUE.]KQ"ȰMgf̳$bDi2쉱R$Ϫ͐8Qbt2gTJ ^_d_rsb']!s`|V=?L7n$mN1!qAm/*q9RHRu#ľfz^exΌe9lPp@ =@ @`1])̳2)[ĸ_ ,+FsqZ3Ww&ss sMnF$kijh{:x-==\Σv~qn0 ?87gSI; PXS"5dotclear-2.6.2+dfsg/themes/blueSilence/style.css000066400000000000000000000341711230033266200216310ustar00rootroot00000000000000/* ************************************************ Modern - design & code : Marco - icônes : http://www.famfamfam.com/ ************************************************ */ * { margin: 0; padding: 0; border: 0; } body { background: #CDCDCD; font: 0.7em Arial,sans-serif; } /* Common styles -------------------------------------------------------- */ ul, ul li { list-style: none; } a:link, a:visited { color: #000; text-decoration: underline; } a:hover { color: #000; text-decoration: none; } pre { overflow: auto; width: 100%; height: auto; } .left { float: left; } .right { float: right; } /* Page -------------------------------------------------------- */ #page { position: relative; width: 820px; margin: 0 auto; background: transparent url(img/background.png) repeat-y top center; } /* Header -------------------------------------------------------- */ #top { width: 732px; margin: 0 auto; padding: 54px 34px 46px; background: transparent url(img/top.jpg) no-repeat left bottom; } #top h1 { font-size: 3em; } #top a:link, #top a:visited, #top a:hover { color: #FFF; text-decoration: none; } /* Prelude -------------------------------------------------------- */ #prelude { position: absolute; top: 0; right: 18px; width: 366px; padding: 6px 0 0; color: #CAE4FC; text-align: center; } #prelude a:link, #prelude a:visited { font-size: 1em; font-weight: bold; color: #CAE4FC; text-decoration: none; } #prelude a:hover { text-decoration: underline; } #prelude a:focus, #prelude a:active { padding: 5px 8px; background: yellow; color: red; } /* Wrapper -------------------------------------------------------- */ #wrapper { width: 770px; margin: 0 auto 10px; } #main { width: 474px; float: left; } #sidebar { width: 272px; float: right; } /* Sidebar -------------------------------------------------------- */ #sidebar h2 { margin: 0 0 10px; padding: 5px 8px; background: #F5F5F5; border: 1px solid #CDCDCD; border-width: 1px 0; color: #005D99; font-size: 1em; font-weight: bold; } #sidebar h3 { padding: 4px 8px 0 8px; color: #005D99; font-size: 1em; } #sidebar a:link, #sidebar a:visited { text-decoration: none; } #sidebar a:hover { text-decoration: underline; } #sidebar ul { padding: 0 0 4px; } #sidebar li { padding: 3px 4px 3px 20px; background: transparent url(img/sidebar_li.png) no-repeat 10px 7px; } #sidebar p { padding: 0 0 4px 10px; } #search fieldset p { padding-left: 8px; } #search #q { width: 180px; padding: 1px 2px; border: 1px solid #CDCDCD; color: #005D99; font-size: 1em; } #search .submit { color: #005D99; background: #FFF; font-size: 1em; font-weight: bold; text-transform: uppercase; border: 1px solid #FFF; } #search .submit:hover { background: #005D99; border: 1px solid #005D99; color: #FFF; } #search, #sidebar .selected, #sidebar .categories, #sidebar .syndicate, #sidebar .langs, #sidebar .tags, #sidebar .links, #sidebar .text { padding: 0 0 10px; } #topnav { margin: 0 0 20px; padding: 5px 5px 5px 8px; background: #F5F5F5; border: 1px solid #CDCDCD; border-width: 1px 0; color: #005D99; font-size: 0.9em; font-weight: bold; text-transform: uppercase; } #sidebar #topnav ul { margin: 0; padding: 0; } #sidebar #topnav li { display: inline; margin: 0; padding: 0; background: none; } #sidebar .syndicate li { margin: 0 4px 0 11px; padding: 5px 4px 5px 22px; background: transparent url(img/rss.png) no-repeat 0% 50%; } #sidebar .tags ul { margin: 5px 5px 10px 10px; padding: 0; font-size: 110%; } #sidebar .tags ul li { display: inline; margin: 0; padding: 0; background: none; font-size: 0.9em; } #sidebar .tags ul li a:link, #sidebar .tags ul li a:visited { color: #333; } #sidebar .tags p strong a:link, #sidebar .tags p strong a:visited { padding: 0 0 0 18px; background: transparent url(img/tags.png) no-repeat 0 -2px; } .tag0 { font-size: 75%; } .tag10 { font-size: 80%; } .tag20 { font-size: 90%; } .tag30 { font-size: 100%; } .tag40 { font-size: 110%; } .tag50 { font-size: 120%; } .tag60 { font-size: 130%; } .tag70 { font-size: 140%; } .tag80 { font-size: 150%; } .tag90 { font-size: 160%; } .tag100 { font-size: 170%; } /* Post-content -------------------------------------------------------- */ .post-content, .post-excerpt { padding: 4px 0 0 0; line-height: 1.5em; font-size: 1.2em; } .post-content p, .post-excerpt p { padding: 4px 0; } .post-content strong, .post-excerpt strong { font-size: 0.9em; } .post-content acronym, .post-excerpt acronym { cursor: help; border-bottom: 1px dashed #666; } .post-content pre, .post-excerpt pre { padding: 10px 5px; margin: 6px 0; background: #F5F5F5; font: 1.1em 'courier new', courier, monospace; } .post-content h3, .post-excerpt h3 { padding: 4px 0; font-size: 1.2em; color: #666; } .post-content h4, .post-excerpt h4 { padding: 4px 0; font-size: 1.1em; color: #666; } .post-content h5, .post-excerpt h5 { padding: 4px 0; font-size: 1.0em; color: #666; } .post-content ul, .post-excerpt ul { margin: 0; padding: 4px 0; } .post-content ul li, .post-excerpt ul li { padding: 1px 0 1px 10px; background: transparent url(img/li.png) no-repeat 0 5px; } .post-content ol, .post-excerpt ol { margin: 0 0 0 28px; padding: 4px 0; } .post-content ol li, .post-excerpt ol li { padding: 1px 0; } .post-content blockquote, .post-excerpt blockquote { margin: 4px 0 4px 5px; padding: 0 5px; border-left: 4px solid #CDCDCD; } /* Classes -------------------------------------------------------- */ .day-date { clear: left; margin: 0 0 10px 0; padding: 5px 10px; background: #F5F5F5; border: 1px solid #CDCDCD; border-width: 1px 0; color: #5E9E14; font-weight: bold; text-align: right; } a.feed { } .post { color: #000; } .post-title { padding: 10px 0 4px 0; color: #666; font-size: 1.7em; } .post-title a:link, .post-title a:visited { color: #666; text-decoration: none; } .post-title a:hover { text-decoration: underline; } .post-info { font-style: italic; } .post-tags { position: relative; overflow: hidden; height: 1%; margin: 8px 0 0 0; padding: 5px; border: 0; background: #FBFBFB; } .post-tags:after { content: '[DO NOT LEAVE IT IS NOT REAL]'; display: block; height: 0; clear: both; visibility: hidden; } .post-tags li { display: inline; } .post-tags li a:link, .post-tags li a:visited { display: block; float: left; padding: 2px 8px 2px 18px; background: transparent url(img/tag.png) no-repeat 0 0; white-space: nowrap; color: #005D99; text-decoration: none; } .post-tags li a:hover { text-decoration: underline; } .post-info-co { clear: left; margin: 0 0 26px; padding: 5px; border: 0; background: #FBFBFB; } .post-info-co a:link, .post-info-co a:visited { padding: 2px 10px 2px 18px; text-decoration: none; } .post-info-co a:hover { text-decoration: underline; } .comment_count { background: transparent url(img/commentaire.png) no-repeat 0 50%; } .ping_count { background: transparent url(img/retrolien.png) no-repeat 0 50%; } .attach_count { background: transparent url(img/attach.png) no-repeat 0 50%; } .read-it { font-weight: bold; padding: 0 0 10px 0; clear: left; } #attachments { clear: left; margin: 4px 0 6px 0; padding: 5px; background: #FBFBFB; border: 1px solid #E8E8E8; border-width: 1px 0; } #attachments * { color: #3C8FD1; } #attachments h3 { font-size: 1.2em; } #attachments ul { padding: 4px 0; } #attachments li { margin: 0 0 0.6em; padding: 2px 10px 2px 18px; background: transparent url(img/attach.png) no-repeat 0 50%; } #attachments li object { display: inline; margin: 0; padding: 0; vertical-align: bottom; } .footnotes { margin: 6px 0 25px 0; padding: 5px 0; border: 1px solid #E8E8E8; } .footnotes h4 { margin: 0 0 6px; padding: 2px 10px 2px 25px; background: transparent url(img/report.png) no-repeat 4px 3px; border-bottom: 1px solid #E8E8E8; color: #005D99; font-style: italic; } .footnotes p { padding: 4px 10px; } /* Archives -------------------------------------------------------- */ #content-info { margin: 0 0 20px; padding: 5px 10px; background: #F5F5F5; border: 1px solid #CDCDCD; border-width: 1px 0; font-size: 1em; line-height: 1.4; } .content-inner { padding-bottom: 20px; } .content-inner h3 { margin: 10px 0; padding: 5px 10px; background: #F5F5F5; border: 1px solid #CDCDCD; border-width: 1px 0; font-size: 1em; color: #5E9E14; } #content-info h2 { font-size: 1.4em; } #content-info p { padding: 4px 0; font-size: 1em; } #content-info p a.feed:link, #content-info p a.feed:visited { padding: 4px 0 4px 22px; background: transparent url(img/rss.png) no-repeat 1px 3px; } .content-inner .day-date { text-align: left; } .content-inner .post-title { margin: 0 0 0 10px; padding: 4px 0; } .content-inner .post-info { margin: 4px 0 20px 10px; } .content-inner ul { margin: 0 0 0 10px; padding: 4px 0; } .content-inner ul li { padding: 1px 0 1px 10px; background: transparent url(img/li.png) no-repeat 0 5px; font-size: 1em; line-height: 1.3; } /* Tags - Page des tags -------------------------------------------------------- */ .content-inner ul.tags { position: relative; height: 1%; overflow: hidden; margin: 8px 0 20px; padding: 5px; background: #FBFBFB; border: 1px solid #E8E8E8; border-width: 1px 0; font-size: 120%; } .content-inner ul.tags:after { content: '[DO NOT LEAVE IT IS NOT REAL]'; display: block; height: 0; clear: both; visibility: hidden; } .content-inner ul.tags li { display: block; float: left; height: 18px; margin: 4px; background: transparent; line-height: 18px; } .content-inner ul.tags li a:link, .content-inner ul.tags li a:visited { color: #005D99; text-decoration: none; white-space: nowrap; } .content-inner ul.tags li a:hover { text-decoration: underline; } .content-inner ul.tags li a:focus, .content-inner ul.tags li a:active { background: #005D99; color: #FFF; } /* Commentaires -------------------------------------------------------- */ #comments, #pings { padding-top: 10px; } #comments h3, #pings h3, #comments-feed, #pr h3 { clear: left; margin: 20px 0 8px 0; padding: 5px; background: #FBFBFB; border: 1px solid #E8E8E8; border-width: 1px 0; font-size: 1.2em; } #pr h3 { margin: 30px 0 8px; color: #5E9E14; } #comments-feed { margin: 14px 0 8px; text-align: right; font-weight: bold; } #comments-feed a:link, #comments-feed a:visited { padding: 3px 0 3px 22px; background: transparent url(img/rss.png) no-repeat 0px 50%; font-size: 0.8em; text-decoration: none; } #comments-feed a:hover { text-decoration: underline; } #comments dl { } #comments dt, #pings dt { position: relative; top: 1px; display: block; padding: 10px 0 30px; background: transparent url(img/commentaire_bulle.png) no-repeat 50% 100%; } #comments dt a:link, #comments dt a:visited { color: #3C8FD1; text-decoration: none; } #comments dt a:hover { text-decoration: underline; } #pings dt a:link, #pings dt a:visited { color: #3C8FD1; text-decoration: none; } #pings dt a:hover { text-decoration: underline; } #comments dd, #pings dd, dd.comment-preview { margin: 0 0 8px; padding: 10px; border: 1px solid #E8E8E8; border-width: 1px 0; background: #F5F5F5; font-size: 1.1em; line-height: 1.4; } #comments dd *, #pings dd *, dd.comment-preview * { padding: 5px 0; font-size: 1em; } #comments dt.me a:link, #comments dt.me a:visited, #comments dt.me a:hover { color: #5E9E14; } #comments dd.me { border-left: 4px solid #5E9E14; } .comment-number, .ping-number { color: #3C8FD1; font-weight: bold; font-size: 1.4em; } #ping-url { margin: 30px 0; padding: 5px; background: #FBFBFB; border: 1px solid #E8E8E8; border-width: 1px 0; font-weight: bold; text-align: right; } .error { margin: 20px 0 0; padding: 10px 5px; background: #FFCCCC; border: 2px solid red; font-weight: bold; } .message { } /* navigations */ .pagination { clear: left; margin: 0 0 30px; padding: 5px; background: #F5F5F5; border: 1px solid #CDCDCD; border-width: 1px 0; text-align: center; color: #5E9E14; font-weight: bold; } .pagination a:link, .pagination a:visited { color: #5E9E14; text-decoration: none; } .pagination a:hover { text-decoration: underline; } #navlinks { margin: 0 0 20px; padding: 5px; background: #F5F5F5; border: 1px solid #CDCDCD; border-width: 1px 0; text-align: center; color: #5E9E14; font-weight: bold; } #navlinks a:link, #navlinks a:visited { color: #5E9E14; text-decoration: none; } #navlinks a:hover { text-decoration: underline; } /* Forms -------------------------------------------------------- */ #comment-form { padding-top: 10px; } #comment-form h3 { margin: 20px 0 8px 0; padding: 5px; background: #FBFBFB; border: 1px solid #E8E8E8; border-width: 1px 0; font-size: 1.2em; } #comment-form fieldset p { padding: 5px 0; } #comment-form fieldset p.field { clear: left; width: auto; margin: 0; padding: 5px 0; } #comment-form p.form-help { width: 60%; margin: 0 0 0 30%; font-style: italic; } #comment-form p label { width: auto; } #comment-form p.field label { display: block; float: left; width: 29%; padding: 0 4px 4px 0; text-align: right; font-weight: bold; } #comment-form input, #comment-form textarea { width: 60%; padding: 1px 2px; border: 1px solid #CDCDCD; font: 1em Arial,sans-serif; color: #005D99; } #comment-form input#c_remember { width: auto; margin: 0 5px 0 140px; border: 0; } #comment-form input.preview { margin-left: 134px; } #comment-form input.preview, #comment-form input.submit { width: auto; background: #FFF; border: 1px solid #FFF; color: #005D99; font-size: 1em; font-weight: bold; text-transform: uppercase; } #comment-form input.preview:hover, #comment-form input.submit:hover { background: #005D99; border: 1px solid #005D99; color: #FFF; } /* Footer -------------------------------------------------------- */ #footer { clear: both; width: 820px; padding: 0 0 14px; background: transparent url(img/footer.png) no-repeat center bottom; } #footer p { width: 784px; margin: 0 auto; padding: 6px 16px 6px 0; background: #606666; color: #FFF; text-align: right; font-weight: bold; } #footer p a:link, #footer p a:visited { color: #FFF; text-decoration: underline; } #footer p a:hover { text-decoration: none; }dotclear-2.6.2+dfsg/themes/customCSS/000077500000000000000000000000001230033266200174025ustar00rootroot00000000000000dotclear-2.6.2+dfsg/themes/customCSS/_config.php000066400000000000000000000021171230033266200215200ustar00rootroot00000000000000blog->public_path).'/custom_style.css'; if (!is_file($css_file) && !is_writable(dirname($css_file))) { throw new Exception( sprintf(__('File %s does not exist and directory %s is not writable.'), $css_file,dirname($css_file)) ); } if (isset($_POST['css'])) { @$fp = fopen($css_file,'wb'); fwrite($fp,$_POST['css']); fclose($fp); dcPage::message(__('Style sheet upgraded.'),true,true); } $css_content = is_file($css_file) ? file_get_contents($css_file) : ''; echo '

        '. form::textarea('css',60,20,html::escapeHTML($css_content)).'

        '; dotclear-2.6.2+dfsg/themes/customCSS/_define.php000066400000000000000000000011221230033266200215000ustar00rootroot00000000000000registerModule( /* Name */ "Custom theme", /* Description*/ "A CSS customizable theme", /* Author */ "Olivier", /* Version */ '1.1', array( 'type' => 'theme' ) ); dotclear-2.6.2+dfsg/themes/customCSS/_public.php000066400000000000000000000013151230033266200215300ustar00rootroot00000000000000addBehavior('publicHeadContent',array('tplCustomTheme','publicHeadContent')); class tplCustomTheme { public static function publicHeadContent($core) { echo '\n"; } } dotclear-2.6.2+dfsg/themes/customCSS/locales/000077500000000000000000000000001230033266200210245ustar00rootroot00000000000000dotclear-2.6.2+dfsg/themes/customCSS/locales/fr/000077500000000000000000000000001230033266200214335ustar00rootroot00000000000000dotclear-2.6.2+dfsg/themes/customCSS/locales/fr/main.lang.php000066400000000000000000000014201230033266200240050ustar00rootroot00000000000000registerModule( /* Name */ "Blowup", /* Description*/ "Default Dotclear theme, fully customizable", /* Author */ "Marco & Olivier", /* Version */ '1.0', array( 'type' => 'theme' ) ); dotclear-2.6.2+dfsg/themes/default/img/000077500000000000000000000000001230033266200177175ustar00rootroot00000000000000dotclear-2.6.2+dfsg/themes/default/img/attach.png000066400000000000000000000004231230033266200216700ustar00rootroot00000000000000PNG  IHDR Vu\tEXtSoftwareAdobe ImageReadyqe<IDATxԒ1 Eπ'#PHG ^*/vZPxY!+1l?!3?<"]!4@)m1Fe2g&LU)ܧ*MuM֖L,oU Ǿo'ú!ƈM0 }+q:\%9Zܿsmu B8Hx/tZ|IENDB`dotclear-2.6.2+dfsg/themes/default/img/body-bg.png000066400000000000000000000003231230033266200217460ustar00rootroot00000000000000PNG  IHDR2Y#IDATx @Aߩ5jX``{fju<,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,V-#ba TވXXX%XXXX[F-#ba t K t 0x,q,dIENDB`dotclear-2.6.2+dfsg/themes/default/img/comment-b.png000066400000000000000000000002571230033266200223120ustar00rootroot00000000000000PNG  IHDRq(vIDAThر 0 Q]V[ .+H8M ;GA fq5]4f.I;@<\D_܁Fո_qfQV^izvj0/)OIENDB`dotclear-2.6.2+dfsg/themes/default/img/comment-t.png000066400000000000000000000006461230033266200223360ustar00rootroot00000000000000PNG  IHDRHK5mIDATxj@ѼA%d.ՖVt1{.aH.jV1m##m?.*RjFN q?m2e9'}~iæ4 qH_gݲ46i}kS42۝=lZ#ܟGZy7q/0 ~񯳞HkP?G=n'=m @^/7 jx7Ƹ1e7s2?{ɑ1 _.IULCW }m$5W_=/KZߍ|HBʇd1;풴.!I˺y:$-wڬkIENDB`dotclear-2.6.2+dfsg/themes/default/img/comment.png000066400000000000000000000005571230033266200220760ustar00rootroot00000000000000PNG  IHDR ObtEXtSoftwareAdobe ImageReadyqe<IDATx|Qʃ@'"h'lbSgFA [=ymǁ0 AUUDL+RTeYbۜxt:~#Wa+I}E 4M@D²,q0 x>(8G*|w4McilG?e3 VUemwǑe\.<t]EQ`4wǔ)v]ӯh6wګض @c(u͕aϭIENDB`dotclear-2.6.2+dfsg/themes/default/img/commentmy-b.png000066400000000000000000000002721230033266200226550ustar00rootroot00000000000000PNG  IHDRq(IDATh1 0 DQ;7LD${S|{=`ݫy4x4ˌ*l(a8`]ItE`vؾU]҈ L؟q{0KӻW=Y?;QG&IENDB`dotclear-2.6.2+dfsg/themes/default/img/commentmy-t.png000066400000000000000000000006721230033266200227030ustar00rootroot00000000000000PNG  IHDRHK5IDATxj@@M&jD6Fb&|dt^0]wcW}u3`Ej6ױٕպV~mz~+{sNYۮ_;$)ue~zzX5{ ao냇@qL20k1Accf4v z ٲt_({,8H7 e I=F+wc}vqL@f#{Sb1R'I&:jx{ܢ$kߤ{I8wK>2_Ę4$4${x$#셧@L{5lIENDB`dotclear-2.6.2+dfsg/themes/default/img/feed.png000066400000000000000000000012211230033266200213240ustar00rootroot00000000000000PNG  IHDRaXIDATxUk\U}ijfif4EK4LQAЂѝ;;HA B, H7l/ R#-ܹws#s97Y"ձ*[WuY>g#$5(" e'RaB{/qLRI1":)?\y<6?B kLØQʝ\ޠ6gy+ш<## a,"SsJAKefE.~Ρnrq}Z v0Vx w!r;%P7C]NQP(5jS.ywW|oᅿ9}|=Tf+fLMFҽč zۊqU1β-9E`N0IENDB`dotclear-2.6.2+dfsg/themes/default/img/page-b.png000066400000000000000000000002751230033266200215640ustar00rootroot00000000000000PNG  IHDR  IDATx Q D,*@!d0\pot!}2s<xHDIU[UI:l3c[ћYdflb_*ۺEDfv̈ SspIENDB`dotclear-2.6.2+dfsg/themes/default/img/page-bg.png000066400000000000000000000023571230033266200217360ustar00rootroot00000000000000PNG  IHDR vasBITOPLTECv9 pHYs  ~tEXtXML:com.adobe.xmp Adobe Fireworks CS3 2007-07-30T11:04:51Z 2007-07-31T09:16:41Z image/png 8ĄtEXtSoftwareAdobe Fireworks CS3FtEXtCreation Time30/07/07MIDAT(c``!Z2j -)ZJ-IENDB`dotclear-2.6.2+dfsg/themes/default/img/page-t.png000066400000000000000000000617461230033266200216200ustar00rootroot00000000000000PNG  IHDR  cIDATxi$uy^̻ֆBE[Km161Y_zںۚ#Q )(6%(P73{G潷 Uuo.<ÇR(yEZkl&l&ٌ1i.4M? GGGqO5dM6dMeIc*>==UJM 4dM6dMìO> >j&l&, cÇgp&l&l%IS<~ƍSsL6dM6d'Ob>Om1dM6dM422L6dM6d2c HN 1dM6dM&l&l&+`Y><'"YRl`?QfdiЈ|K,}>>AnY/׍!z!.8+[\A=d&A%"(<`Q~Xp\ X0M1BĶ2V 6bՁ-cDe~7>^<& xdM6 MZ::Sk?լgXSzZN -e)bKXҚ};뾂AמHA~}e|/[[^+ֻqL5dMb+՝=~0PF20G!ɔaiqhi,( ç/ػdñ:(O0QdMv-GnJϹ & 10<X+~b?XaRo,rR|2]5;dM6dh6Wt`Y,wڜX3XC떒K(֧2c/Y L\}1}0P<8ú6AdM6Y"}լ?`Ñh,(tY2[%uhc1a#zD;fvi:&l2Q*HVE :h`QlZ.)iޱu֏cFSd*.[(1 ]M6ًaķV D%`%A@0%6c­Xt T}_$cbM6daz{:,bvW 1 g,ҒKѱj֝~:Voq_BIYc/rq 0…n'xl&#`X?u "G 𥢓Xտ5-]%ZԮ>rBو}.6k¾&셰!v@hXs@_ Ʋ D\ k?KuP'°&l:k6.wB:U Ja&.KƒY5=Gܥ`(=dMvxJ:XR :TX5veV.ѵ\}Y&Dl&8v}صuh$֔a&€KC@7cD+uDARHڅY5kcO_}W#8ڨr\X^!n!.YI0M6dvË&Z1Ha&12-.l(SYu .':Np"\{<Ev|{FNu 'l+Xr4J*00hH*â޴9d~oPcw]_2{;ߘ6%Ělɮ`|?`= XR{cK{=KcEZ!Y$ƞbAg7f5; k&p^=9p6.(lIti14ίCb(݈ҫaÑdM6٥oG)cm ZEE9D5f>+PIڅiOaCi.+(=:i֒(H8a()"Bҧ6"ݿbN6d`<:帋B+c1aD Tiu,fjqJAw=A0B996.hnʃYy& oXR֨*X(22f,"؅4EbZNPY涂2`2 D{_;#%ГdM6ٵ HT80V!ACGciU0oKVM>n+ԁ] ]8{es/݂ 5/!j@M650 t~O7ce(ټ%ia.GPϴ`=&)t1V.\GvffIk0,JYnbVˏ|;=Q31dW_\Û1!% ©'F}ǥb-}}M@A?:5}r|c&1va;!#Y%βMDw$BG)5Nek^d IFSYˍ}?1]~|^U EiU%R@ C0djxN.k1S;֍F_G`- =8bd34Qf_"c[5Lv= _u;u P# o]uBtK9$+e jróm Ysڭo6I*U1 νv@@8G#ԕhzewm:fiQ^1 en~^ е VG 3(ϻs pc"b]0kؘ/~sЌ 7HVaO 3h$=a+X!z% ( ?R;xRN\qs*LZ-ju`r|7W#߱MQwlYATqDcy Ybgm'5b( r;-ΪM V(r!"hi>"D-[ty 9W%(z?ep(27l͛!_~c`ᵛв:ƒwafU!KIZ/e wujKa%~Y}.̒^it6c!spY!ѤHEͪj.N>SIapìPSZ9D\%Ͳ\ج+YY*xOí-<(C_rB.W:e(tpT7TZFz\켤յдAD/qK[ݍ$>W(rS.MBΣoK /q-bYKc`˲k!ˏUOK2UmaѶ%tb 5گKBc51ybR WYf#oYJlw |-lV>={]jH/bM{M(.{ueHUPNO"ꗋe}Eer29Μٌ ך (œ(26LH OQ`+nE {foCLFaZ2l{pZ*&DӐE̎ ` ri9K؈Yݤ}dc`7س LA_^lBd]u6t6jyu[Ă,hK:c~ X^X3𬲕y .Ws#Eli :}z ((~-- C}h1:Q HAIQm7&?RCI)Tdk .gbc]xFu5mVxX.Hп\Qk޺7kQul/F%\%^rIK:<[珮YV@Zpكһ('낗KAʡD𥐬XU \ysabE)(Z|s~&\gKebLEFBLg[zXJ4)(A$HԡFUVR6DI\P+q泽֛[ DJL 6,%C:S>b(*Q`lq/&R9X(I3R-HsLH&"弦s#o?xM~bg/lj>8qYGT[C5NysrLS¬y"z;YExX_hs8grWnjJ{P,}<^0u9#Ī7Wm !DF%*L+DgHy &bDl*Ɉ-)q(^!mtFwmghLݧ5qW@'>W0gb. $b -jF>:}lfYuj;6zh-5EU\UGb# yqg͐a~.{4UWֱ;6!.J R3qZԜ K X[dsmp`|X<8z&f٭%]oϓ,Bj r,oY*;a(%%e% UL U{-\6f_-L^+':EiX!j^(VʂB*X!1Oab`*b&"QsC0}lfJR=*vQ wKAUݽդ@\?N`N6%\߂@!Rs'K'ٱ4ժ`@Įsk!x?EEWAQ/Lu1ԇgI"iiߖjxVFb ײpRS `}63l䩳2a.f5pCDbudOgϾҏo&G~v44{'_u9zP/k3t͒\YVjF5 p*2vi tpurO[ ;.^a2 Gw XhDHuǭ:Or ^L/?P3|SG뫸uwBS0+L_fTGo1egg|e9@ndžGI#H$.s)%ȶʏäoe!ڇ(6#I[ P ΀8_N]R,r)тr}+v:gpyD3z5=eY3pX7S9pUKuDg\ 74+HKkih7>N^v:]U.Rhy2gQɇ"Ư^7߱Jc"<!:ʇT fIMrN¼HNcss4flW7)7$hm@TҢiFXCzeX*dUJ !YLыFuA $,T$jFD3QTT7"QlUN c2dJb P#D' e<{<00.s`F5u,m/1z^mUVhgE:$<.o@kg졝Q VG$ b=7vY[@ 9RI]oŏ>>/lطzF7 Pn'mgR4_U y=,G }26.,j|TMVXE'B}Z~kGN_NB$Kp'_*V@QV@fD>˟gH?AiXj&*DͩOEQݰ T6MuSM^إlNT,ϕ L'*XsR[)rDQߠaf^b~,QYG3Hw(Dԇ:r:( jeB[}Jtsc_x|8'TXnzճ֨>᣽wog밪YQYu4JI%JY3 B&|&\ZEM[Hݔ6DiS׺[e[ XEF|:Ȟ*d |/N~ k,)9ձ6c ՉnS:ւM,S=O,EG;?Adq}EPGH?y ,rYhʌP F7M%ܢ@D6YEgPz?`Cp{%hZ!MʙC+sKc?Vt#,@ā''}qV߰C+j9`}kh4l1?QjP&-o(wX;][B T~PRRH'w`PLk خl`_9̈́M.!ݵ0 ybqZmIPhbl-[>!F1-֋!؛5T6zF/Y}>gȪѤd93.TUY BЀʾҐY*RI ҇zJ>*A>Vٓx&ggMmI%|s,6J;5t_(%JR11+Ʀ|?S!E3m_\W [Y+˧ހ5*W)+`Юbc+);-J Yskfۏ֑V)Diػf9a۽~bP3'aZhwdiW]D~{ᶜT'7ok&z/'<2lzl,8׊T(R)hxEi2RNy M+$jJ?H"}{&Lܙ&L}S 3{į٫6~$X"p9&z[~H]M>#oZx+eQ)R.)v!Ͼ=ߩc<˓a *^y"bI' ~= !7r̰lsurJ[y Z¬UJKZ2\XE}5vlE0  |u<2Qݗ|L4 |ѪM3Z1ŭ]8;$*Sꛌn5߷ϙ^v){K}\K'vPϹ(DHA#yXmCPhPJ'H Mݵ=bgY+g[5-/ )::~Аf:T!fZ ?] ']C MQd5?[ Jð٘ G e:f,t} j ۢـM Ti'vfP<9̢%S˄LHkY:l!-Co/^\B. SGF[+ZALF?.~c'E*bN}f_5mr/p(RU"TUQoCmX}WQ sa=YaC6|3Ć'}l}үE o{d~ذqIԲe#u(в{یEkyʆ8-b.gv94;a֖P\#JXDE/e|ne]I˥ k?oKm`[ ѷ{=w젫PE5@b/V%~h-72 fPKTl~FluFwBT$bUNb,z64Y6Hˡ"k]йQ/?{H|)$/I$ް&k6WuͮjV%g6pL=lk,n(<ՋEokh 9#M5Y-`K(w! D?WےV=;CS˱*B44H˵;$I)H͘"['>j$GQ_;^#[] bcFwKo'v;N(evpA(HeA )LH˚/ÉudUOu^\H?}> ! 7L(:)$}xi#CtmY] .1zXHPH1I2͖rRd " guЛCgv怙;&C5@5ORbe:O 1eKG jMII+״;gz7 mP\L48x,R}π-!{^&UGH>doHSn0e77 0KOթy"U-FwMV5zC{ !QVYSY]T/ыwOT!O0%9{}qɿU;+yG)B1=7v)5(! ֠;<('^5G ZV{ʂ2Қ bQLsҒUV.҂#m /C> X(Z>Ga70oC̓z ՜fM3\Uލ胳?@܋MbbUv Pĭhe)Z + \RoW{y>0gzNSE, 9qH}KSbVd{f&"|xy&l랇h]$׏bU^S|W/~SǰgEko2jM:VH9ԺˌURܻZ VÒ3E/bO": N\0\V15n982k*F ,\+G t4LwGWjn۝bc84)VufQm)F٧D?C yMMUM_4_0/<~YoHZ4*:Cҷn~hIҀVD%js%4BCkh^U壈C>TD\"u@uHuCSb-of sf0=q=[3H3`^A%:@-SɃ %TnjïGf->Y XLii7VZ.EHyd`\z%<ZW77 5M7ZM)z5<,V[~gP'Ȕ4 JMz>t"TFm}v8#ѷXh$kͽ?V~Vs0-Fw҃/Q'Ѫ8ҹљCwMGPjCd9HI\U$Ңl*VCJVsY~v̥ߢ1b \-J?w}{ա6zeՒKR>ٷN1E[& J_%{*}Pe*&[᯦G_YԇBrvi' f{i3;({aQe̦|ۚYlZkZLZ0Zi:{132l蚸Sfg@ r L`W3]5DNuX(.)>QtHy3mFwӃ̼Uh3 N|UTi@azYAUZ]L 肪D[nlkftou[:P% },1EӈטS:}D}*FNL2շ(Qj%K|:bέO!Q~}}c<}^]@̨Nߵ_H%9!\EU ZXaSRJ2V uJPV4vz5١rG:֒Hm&ZO]I>=Ljڎ\6#c!mtTǜJѥUnE y^A}(~aU#eAc/FOtH s 3iF(tָ5i`3*2l +t@ZYr 6.@9q3XOuU;/:l:!5E 6*~]ҏ`KgUf9sVzmx=yr3Dycfۡ| UH_r!*~6oHJZEHN#|X̳V4E(Dq1#6)O:(FOjU$œe't0<e<{.)38:f_(Csrg~^ttR͵LՙO9*a7O yP RTn9x+=9 %UZ'UJfz-XWuaURdfF΃pPjXFf<)ݠeZ29\JJ>PC|_gb3ƌ"ZT$ ":u ʕF7(se*Rb^Vb9?1X(v8;{07MAdrRR8T[=_L#?Y|&5 Jmgqv[VG Y^Gf5F7V۞0OeYV $kJ9)!" Dt=Yg; D2| T>UVu(YXRŐh`MtDÞ;\6hW,Ĩ*}|ҏ>y" r!v ٺ}MhSysu{&~^53KQs$ O)RW@Pg XgR9L^ӯ]f?@5n/զiMh [(ȷj'q}Ik 2"ݘ;zUK TMU!#6 ժV n3}=9ap( ^QlJ@/kIxUOAS-5TYfۉm8 )}&xhWul fG$DQ]ׁfj(nM+bA zC~̧g*y((4˿%\$MDRǗQTڕSEXU7O>}cZʾJ!V}k62RfX^e-e̮n?\:`Q( ’}K@ikCUCxnڥv!J^8vV@b'$췗:10 2VU6-PU-Hp1{whݳϧ_O~%bc5l GN,|ٸZyŕW2ʒ2F*-}`*l|!: [l#]|ˮY~)Yru"#s>IUX2gg"fvQj4&XĢ7g8QGVe9::cƯI8ظi>J bVϽfu|vA4\jR'.Z Ta:#+ˠdbt9?+<6`k, *[J G35 MꛚHMmf\g?Z9Zi HFJeF|s3tY X̬JY@\EUʒټY-AU0}b^]Y{ 9;;^w긪Wik^hg¤,좮nQ1 4k,C؝$[LPGPYi^vQ!dÀk>^;pws\?>Fj )*lXU_0׷yKڢnhąPgJ-_hLΊ"& h%2m$9Z[6g5=u3"󴄪` ]$U Q]f-T}i^u.όplyZg޼k{_;](4$Օ?֖7-YX .@tbg ҤpQ,V k `qE, GGiNSy2PVErM<8KUDF|1_6\ R+ F Si%!Itwُ<EsIo'c{Vb3JMnz׭XI"+/VkJލR#T<nO`>a3wZs=U;eԁT^pV-MEW5v%yYECG݈$-"+ +*V3Rr>uQ`ҬsWŒWQHqE/#׍UU] R|?ftC$ž -1ctӣoǿ)kds+e{W)KG=JUJnT 1o*p Y []Ve@ uN-A@Ŧ"RF25-3`/j֮{8pȺ7Z+T'zLմZ*V0p|u9/pr,=.zkϒDU琢unA?3莝Nr7LpiӦ:#+(+.ŧWXF;׀);Ch\:+FxQm1Qp{¨o_itO*/Ҧ؋RA]XwO~e`c){qz؛ @93ڀE`eq+2K\j<{,!k/j*%}ˮu1={Be]"zo`>;|V7)x;Zp6VDBIv 6xC-sQ}Bհ #z8lW>fׄMҡ9[R6p] UϠNf$湱I|5`=;8¨ث7=f{smՌD w l*D)E([%yJWb^\;VUX(͞A4͘mQ}E>!et?VBhvjzϓZ5tS ) :*dIZ+~yKE5K?Ux@F7wzF.-pEW<9P'sOB4G`0IsnVnȯ+{Cwe\ vq$.I j*iJDvnhR0Q'fb\;fZծ&ͪ:Dox GM:v2(ыw'~yV_M#=];_Mj[bZ-Zڃh)LҵRx"-Y*V9ƅKU-Pr<"4+(tqV2`sb5LVH޳-Z7j󏗆舃Ө35 {_h{SaưFj(XȥQ'Vkam0 )~n@gydQh>qHއ}&"T79Vz6,;\Z[TYXH4>JYjU/2=lԎU OzSw3hqӍ8ND%Wt~PruX y;~> _B|Pm;3t]?Jշ \u^ pg_Zܵ"0ה\CF`jMfFѳOH-F:f|}-ol*IFGf9'-~^6 ;SVJKZԒUyXBTëQ2}ؚJ*uKG -Ĝò?("/e`pOt~ۄx]3!5 :DUF. ec[$Ǻ  ꁦRl]鎠/!;ѣ~C+_كDEtiRU[>C@06ZaD_Rшj.f%Avt^-ZY͔ BHMͅJ k`2_l|P_z}~{EE W l-j j#>:.F~Fe];'b:b|}oxb. M+AlBX.DɁ }rڼ-Ga臋\ ,i{˺`yƶ%eб>RDi]܎tT\6<8 Fsw1޵gk;{%ͯf\XD*U LBװ<퉑X =.~SfOao=%Q3J}˱,C([=I'J2 tVI!Dɠ׏+!VhY qMZej.At=95 Gv?V}ʭL 䞎>ݒ]ICv$mUWlDR0۱w`R "=eo=-Q^huƢ@r!MUH҉xNNNPf9U*k5լ6VqEĜY&rZs_ivNwK/yw-m~ XV9.qOyPb/Bw bfaɷ$ F/K{St6ɪa%}k/"9/Ke3;l>>p_OPi3'mH_CQىHh5es>ї__^ K>0ϒLn@s-ZѬSP6򻮎˩ֿjmgsja-\Ͽ/Sѷxe{o:T+n\&Nl YIвin.QMP;tCbXT^颫u6G rW+6@R bNUJP=4UM}1@SA;ev@Wz]*O$~M1g6'[F*q l5fz 9r dKhl"5W*&s2m;cܺ*졟{jrGBl}Y*7o1|ho`5#7`4hHwӓߥEh_D 22U ^T/Ɯ :;?hmE|EYNWUcOaz:|16ױ1k5j&e{y ~gѳ +wU"tnٱB}Dj^ {n" HE$W--"uf:_{:-l00a0r;ms*Uɷv9-;{ F{l,NQqH>' &>DWVs2; wy,G ʁo PHAA @HffǮ&+fvhwW?NǮnW}ntˋ/,{l7%cGmVv`6Kظ4ǔE,s̥'n#xNd0{}(t,RD5߳z뫵'.sjZz/<" _*x2O/5UyO 8cx:@ʂuUJ)VHvcY2gS*OW2<-EanmV VuW/,5?= 2l$NS֙ߛR>#1=orؠs)?>%AZ#jg (")dQj\Bby4 X,fۂdGK"$ܛeB+WS?{c`nn!ˬ1;ܬ+ujT"s}݀}CcP]6C X6&lo_%P#uܦ|x6Tr0: RYk,sζE~+:qG>qыyhG;8}lFH#dM`ʱ>vxu.s_t Li޷cGB/t)|NR*Ʉ%-x]"Xzr[#Qm4yO{re]?qyW.f1Z;{jg V@l4Y>hv `UN7j MQeaR(Mn]u)6s+ 6~L+(qD X :0|$X$@-,Zo\k.Q(cPp Tz`}<%j? =" Р,"bp&PjRGD*b`)"˲&5vm^[IENDB`dotclear-2.6.2+dfsg/themes/default/img/tag.png000066400000000000000000000005671230033266200212100ustar00rootroot00000000000000PNG  IHDR $tEXtSoftwareAdobe ImageReadyqe<IDATxڔR;@ @,lDo"X88>L&esxVu( 8>)hoD.~?b$DU9u]I( (,"8 3ʲOag,kY%͏Aq ,70 u,P{8UU,} @4Ma6y7!" an r?5MumO_*`Nmۢ-q$4uMLjIENDB`dotclear-2.6.2+dfsg/themes/default/img/trackback.png000066400000000000000000000002551230033266200223540ustar00rootroot00000000000000PNG  IHDR w&tEXtSoftwareAdobe ImageReadyqe<OIDATxڔPI0,hOkK6 PW$`fXfZx@S("uF$czMq#$I!IENDB`dotclear-2.6.2+dfsg/themes/default/js/000077500000000000000000000000001230033266200175575ustar00rootroot00000000000000dotclear-2.6.2+dfsg/themes/default/js/jquery.cookie.js000066400000000000000000000102261230033266200227050ustar00rootroot00000000000000/** * Cookie plugin * * Copyright (c) 2006 Klaus Hartl (stilbuero.de) * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * */ /** * Create a cookie with the given name and value and other optional parameters. * * @example $.cookie('the_cookie', 'the_value'); * @desc Set the value of a cookie. * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true }); * @desc Create a cookie with all available options. * @example $.cookie('the_cookie', 'the_value'); * @desc Create a session cookie. * @example $.cookie('the_cookie', null); * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain * used when the cookie was set. * * @param String name The name of the cookie. * @param String value The value of the cookie. * @param Object options An object literal containing key/value pairs to provide optional cookie attributes. * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object. * If a negative value is specified (e.g. a date in the past), the cookie will be deleted. * If set to null or omitted, the cookie will be a session cookie and will not be retained * when the the browser exits. * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie). * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie). * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will * require a secure protocol (like HTTPS). * @type undefined * * @name $.cookie * @cat Plugins/Cookie * @author Klaus Hartl/klaus.hartl@stilbuero.de */ /** * Get the value of a cookie with the given name. * * @example $.cookie('the_cookie'); * @desc Get the value of a cookie. * * @param String name The name of the cookie. * @return The value of the cookie. * @type String * * @name $.cookie * @cat Plugins/Cookie * @author Klaus Hartl/klaus.hartl@stilbuero.de */ jQuery.cookie = function(name, value, options) { if (typeof value != 'undefined') { // name and value given, set cookie options = options || {}; if (value === null) { value = ''; options.expires = -1; } var expires = ''; if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) { var date; if (typeof options.expires == 'number') { date = new Date(); date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000)); } else { date = options.expires; } expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE } // CAUTION: Needed to parenthesize options.path and options.domain // in the following expressions, otherwise they evaluate to undefined // in the packed version for some reason... var path = options.path ? '; path=' + (options.path) : ''; var domain = options.domain ? '; domain=' + (options.domain) : ''; var secure = options.secure ? '; secure' : ''; document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join(''); } else { // only name given, get cookie var cookieValue = null; if (document.cookie && document.cookie != '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = jQuery.trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) == (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } };dotclear-2.6.2+dfsg/themes/default/js/jquery.js000066400000000000000000004774551230033266200214620ustar00rootroot00000000000000/*! * jQuery JavaScript Library v1.4.2 * http://jquery.com/ * * Copyright 2010, John Resig * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * Includes Sizzle.js * http://sizzlejs.com/ * Copyright 2010, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * * Date: Sat Feb 13 22:33:48 2010 -0500 */ (function( window, undefined ) { // Define a local copy of jQuery var jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' return new jQuery.fn.init( selector, context ); }, // Map over jQuery in case of overwrite _jQuery = window.jQuery, // Map over the $ in case of overwrite _$ = window.$, // Use the correct document accordingly with window argument (sandbox) document = window.document, // A central reference to the root jQuery(document) rootjQuery, // A simple way to check for HTML strings or ID strings // (both of which we optimize for) quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/, // Is it a simple selector isSimple = /^.[^:#\[\.,]*$/, // Check if a string has a non-whitespace character in it rnotwhite = /\S/, // Used for trimming whitespace rtrim = /^(\s|\u00A0)+|(\s|\u00A0)+$/g, // Match a standalone tag rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, // Keep a UserAgent string for use with jQuery.browser userAgent = navigator.userAgent, // For matching the engine and version of the browser browserMatch, // Has the ready events already been bound? readyBound = false, // The functions to execute on DOM ready readyList = [], // The ready event handler DOMContentLoaded, // Save a reference to some core methods toString = Object.prototype.toString, hasOwnProperty = Object.prototype.hasOwnProperty, push = Array.prototype.push, slice = Array.prototype.slice, indexOf = Array.prototype.indexOf; jQuery.fn = jQuery.prototype = { init: function( selector, context ) { var match, elem, ret, doc; // Handle $(""), $(null), or $(undefined) if ( !selector ) { return this; } // Handle $(DOMElement) if ( selector.nodeType ) { this.context = this[0] = selector; this.length = 1; return this; } // The body element only exists once, optimize finding it if ( selector === "body" && !context ) { this.context = document; this[0] = document.body; this.selector = "body"; this.length = 1; return this; } // Handle HTML strings if ( typeof selector === "string" ) { // Are we dealing with HTML string or an ID? match = quickExpr.exec( selector ); // Verify a match, and that no context was specified for #id if ( match && (match[1] || !context) ) { // HANDLE: $(html) -> $(array) if ( match[1] ) { doc = (context ? context.ownerDocument || context : document); // If a single string is passed in and it's a single tag // just do a createElement and skip the rest ret = rsingleTag.exec( selector ); if ( ret ) { if ( jQuery.isPlainObject( context ) ) { selector = [ document.createElement( ret[1] ) ]; jQuery.fn.attr.call( selector, context, true ); } else { selector = [ doc.createElement( ret[1] ) ]; } } else { ret = buildFragment( [ match[1] ], [ doc ] ); selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes; } return jQuery.merge( this, selector ); // HANDLE: $("#id") } else { elem = document.getElementById( match[2] ); if ( elem ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id !== match[2] ) { return rootjQuery.find( selector ); } // Otherwise, we inject the element directly into the jQuery object this.length = 1; this[0] = elem; } this.context = document; this.selector = selector; return this; } // HANDLE: $("TAG") } else if ( !context && /^\w+$/.test( selector ) ) { this.selector = selector; this.context = document; selector = document.getElementsByTagName( selector ); return jQuery.merge( this, selector ); // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return (context || rootjQuery).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return jQuery( context ).find( selector ); } // HANDLE: $(function) // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) { return rootjQuery.ready( selector ); } if (selector.selector !== undefined) { this.selector = selector.selector; this.context = selector.context; } return jQuery.makeArray( selector, this ); }, // Start with an empty selector selector: "", // The current version of jQuery being used jquery: "1.4.2", // The default length of a jQuery object is 0 length: 0, // The number of elements contained in the matched element set size: function() { return this.length; }, toArray: function() { return slice.call( this, 0 ); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { return num == null ? // Return a 'clean' array this.toArray() : // Return just the object ( num < 0 ? this.slice(num)[ 0 ] : this[ num ] ); }, // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems, name, selector ) { // Build a new jQuery matched element set var ret = jQuery(); if ( jQuery.isArray( elems ) ) { push.apply( ret, elems ); } else { jQuery.merge( ret, elems ); } // Add the old object onto the stack (as a reference) ret.prevObject = this; ret.context = this.context; if ( name === "find" ) { ret.selector = this.selector + (this.selector ? " " : "") + selector; } else if ( name ) { ret.selector = this.selector + "." + name + "(" + selector + ")"; } // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. // (You can seed the arguments with an array of args, but this is // only used internally.) each: function( callback, args ) { return jQuery.each( this, callback, args ); }, ready: function( fn ) { // Attach the listeners jQuery.bindReady(); // If the DOM is already ready if ( jQuery.isReady ) { // Execute the function immediately fn.call( document, jQuery ); // Otherwise, remember the function for later } else if ( readyList ) { // Add the function to the wait list readyList.push( fn ); } return this; }, eq: function( i ) { return i === -1 ? this.slice( i ) : this.slice( i, +i + 1 ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, slice: function() { return this.pushStack( slice.apply( this, arguments ), "slice", slice.call(arguments).join(",") ); }, map: function( callback ) { return this.pushStack( jQuery.map(this, function( elem, i ) { return callback.call( elem, i, elem ); })); }, end: function() { return this.prevObject || jQuery(null); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: [].sort, splice: [].splice }; // Give the init function the jQuery prototype for later instantiation jQuery.fn.init.prototype = jQuery.fn; jQuery.extend = jQuery.fn.extend = function() { // copy reference to target object var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; target = arguments[1] || {}; // skip the boolean and the target i = 2; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !jQuery.isFunction(target) ) { target = {}; } // extend jQuery itself if only one argument is passed if ( length === i ) { target = this; --i; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( (options = arguments[ i ]) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop if ( target === copy ) { continue; } // Recurse if we're merging object literal values or arrays if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) { var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src : jQuery.isArray(copy) ? [] : {}; // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend({ noConflict: function( deep ) { window.$ = _$; if ( deep ) { window.jQuery = _jQuery; } return jQuery; }, // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // Handle when the DOM is ready ready: function() { // Make sure that the DOM is not already loaded if ( !jQuery.isReady ) { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( !document.body ) { return setTimeout( jQuery.ready, 13 ); } // Remember that the DOM is ready jQuery.isReady = true; // If there are functions bound, to execute if ( readyList ) { // Execute all of them var fn, i = 0; while ( (fn = readyList[ i++ ]) ) { fn.call( document, jQuery ); } // Reset the list of functions readyList = null; } // Trigger any bound ready events if ( jQuery.fn.triggerHandler ) { jQuery( document ).triggerHandler( "ready" ); } } }, bindReady: function() { if ( readyBound ) { return; } readyBound = true; // Catch cases where $(document).ready() is called after the // browser event has already occurred. if ( document.readyState === "complete" ) { return jQuery.ready(); } // Mozilla, Opera and webkit nightlies currently support this event if ( document.addEventListener ) { // Use the handy event callback document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); // A fallback to window.onload, that will always work window.addEventListener( "load", jQuery.ready, false ); // If IE event model is used } else if ( document.attachEvent ) { // ensure firing before onload, // maybe late but safe also for iframes document.attachEvent("onreadystatechange", DOMContentLoaded); // A fallback to window.onload, that will always work window.attachEvent( "onload", jQuery.ready ); // If IE and not a frame // continually check to see if the document is ready var toplevel = false; try { toplevel = window.frameElement == null; } catch(e) {} if ( document.documentElement.doScroll && toplevel ) { doScrollCheck(); } } }, // See test/unit/core.js for details concerning isFunction. // Since version 1.3, DOM methods and functions like alert // aren't supported. They return false on IE (#2968). isFunction: function( obj ) { return toString.call(obj) === "[object Function]"; }, isArray: function( obj ) { return toString.call(obj) === "[object Array]"; }, isPlainObject: function( obj ) { // Must be an Object. // Because of IE, we also have to check the presence of the constructor property. // Make sure that DOM nodes and window objects don't pass through, as well if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) { return false; } // Not own constructor property must be Object if ( obj.constructor && !hasOwnProperty.call(obj, "constructor") && !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) { return false; } // Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. var key; for ( key in obj ) {} return key === undefined || hasOwnProperty.call( obj, key ); }, isEmptyObject: function( obj ) { for ( var name in obj ) { return false; } return true; }, error: function( msg ) { throw msg; }, parseJSON: function( data ) { if ( typeof data !== "string" || !data ) { return null; } // Make sure leading/trailing whitespace is removed (IE can't handle it) data = jQuery.trim( data ); // Make sure the incoming data is actual JSON // Logic borrowed from http://json.org/json2.js if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@") .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]") .replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) { // Try to use the native JSON parser first return window.JSON && window.JSON.parse ? window.JSON.parse( data ) : (new Function("return " + data))(); } else { jQuery.error( "Invalid JSON: " + data ); } }, noop: function() {}, // Evalulates a script in a global context globalEval: function( data ) { if ( data && rnotwhite.test(data) ) { // Inspired by code by Andrea Giammarchi // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html var head = document.getElementsByTagName("head")[0] || document.documentElement, script = document.createElement("script"); script.type = "text/javascript"; if ( jQuery.support.scriptEval ) { script.appendChild( document.createTextNode( data ) ); } else { script.text = data; } // Use insertBefore instead of appendChild to circumvent an IE6 bug. // This arises when a base node is used (#2709). head.insertBefore( script, head.firstChild ); head.removeChild( script ); } }, nodeName: function( elem, name ) { return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); }, // args is for internal usage only each: function( object, callback, args ) { var name, i = 0, length = object.length, isObj = length === undefined || jQuery.isFunction(object); if ( args ) { if ( isObj ) { for ( name in object ) { if ( callback.apply( object[ name ], args ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.apply( object[ i++ ], args ) === false ) { break; } } } // A special, fast, case for the most common use of each } else { if ( isObj ) { for ( name in object ) { if ( callback.call( object[ name ], name, object[ name ] ) === false ) { break; } } } else { for ( var value = object[0]; i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {} } } return object; }, trim: function( text ) { return (text || "").replace( rtrim, "" ); }, // results is for internal usage only makeArray: function( array, results ) { var ret = results || []; if ( array != null ) { // The window, strings (and functions) also have 'length' // The extra typeof function check is to prevent crashes // in Safari 2 (See: #3039) if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || (typeof array !== "function" && array.setInterval) ) { push.call( ret, array ); } else { jQuery.merge( ret, array ); } } return ret; }, inArray: function( elem, array ) { if ( array.indexOf ) { return array.indexOf( elem ); } for ( var i = 0, length = array.length; i < length; i++ ) { if ( array[ i ] === elem ) { return i; } } return -1; }, merge: function( first, second ) { var i = first.length, j = 0; if ( typeof second.length === "number" ) { for ( var l = second.length; j < l; j++ ) { first[ i++ ] = second[ j ]; } } else { while ( second[j] !== undefined ) { first[ i++ ] = second[ j++ ]; } } first.length = i; return first; }, grep: function( elems, callback, inv ) { var ret = []; // Go through the array, only saving the items // that pass the validator function for ( var i = 0, length = elems.length; i < length; i++ ) { if ( !inv !== !callback( elems[ i ], i ) ) { ret.push( elems[ i ] ); } } return ret; }, // arg is for internal usage only map: function( elems, callback, arg ) { var ret = [], value; // Go through the array, translating each of the items to their // new value (or values). for ( var i = 0, length = elems.length; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret[ ret.length ] = value; } } return ret.concat.apply( [], ret ); }, // A global GUID counter for objects guid: 1, proxy: function( fn, proxy, thisObject ) { if ( arguments.length === 2 ) { if ( typeof proxy === "string" ) { thisObject = fn; fn = thisObject[ proxy ]; proxy = undefined; } else if ( proxy && !jQuery.isFunction( proxy ) ) { thisObject = proxy; proxy = undefined; } } if ( !proxy && fn ) { proxy = function() { return fn.apply( thisObject || this, arguments ); }; } // Set the guid of unique handler to the same of original handler, so it can be removed if ( fn ) { proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; } // So proxy can be declared as an argument return proxy; }, // Use of jQuery.browser is frowned upon. // More details: http://docs.jquery.com/Utilities/jQuery.browser uaMatch: function( ua ) { ua = ua.toLowerCase(); var match = /(webkit)[ \/]([\w.]+)/.exec( ua ) || /(opera)(?:.*version)?[ \/]([\w.]+)/.exec( ua ) || /(msie) ([\w.]+)/.exec( ua ) || !/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec( ua ) || []; return { browser: match[1] || "", version: match[2] || "0" }; }, browser: {} }); browserMatch = jQuery.uaMatch( userAgent ); if ( browserMatch.browser ) { jQuery.browser[ browserMatch.browser ] = true; jQuery.browser.version = browserMatch.version; } // Deprecated, use jQuery.browser.webkit instead if ( jQuery.browser.webkit ) { jQuery.browser.safari = true; } if ( indexOf ) { jQuery.inArray = function( elem, array ) { return indexOf.call( array, elem ); }; } // All jQuery objects should point back to these rootjQuery = jQuery(document); // Cleanup functions for the document ready method if ( document.addEventListener ) { DOMContentLoaded = function() { document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); jQuery.ready(); }; } else if ( document.attachEvent ) { DOMContentLoaded = function() { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( document.readyState === "complete" ) { document.detachEvent( "onreadystatechange", DOMContentLoaded ); jQuery.ready(); } }; } // The DOM ready check for Internet Explorer function doScrollCheck() { if ( jQuery.isReady ) { return; } try { // If IE is used, use the trick by Diego Perini // http://javascript.nwbox.com/IEContentLoaded/ document.documentElement.doScroll("left"); } catch( error ) { setTimeout( doScrollCheck, 1 ); return; } // and execute any waiting functions jQuery.ready(); } function evalScript( i, elem ) { if ( elem.src ) { jQuery.ajax({ url: elem.src, async: false, dataType: "script" }); } else { jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); } if ( elem.parentNode ) { elem.parentNode.removeChild( elem ); } } // Mutifunctional method to get and set values to a collection // The value/s can be optionally by executed if its a function function access( elems, key, value, exec, fn, pass ) { var length = elems.length; // Setting many attributes if ( typeof key === "object" ) { for ( var k in key ) { access( elems, k, key[k], exec, fn, value ); } return elems; } // Setting one attribute if ( value !== undefined ) { // Optionally, function values get executed if exec is true exec = !pass && exec && jQuery.isFunction(value); for ( var i = 0; i < length; i++ ) { fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); } return elems; } // Getting an attribute return length ? fn( elems[0], key ) : undefined; } function now() { return (new Date).getTime(); } (function() { jQuery.support = {}; var root = document.documentElement, script = document.createElement("script"), div = document.createElement("div"), id = "script" + now(); div.style.display = "none"; div.innerHTML = "
        a"; var all = div.getElementsByTagName("*"), a = div.getElementsByTagName("a")[0]; // Can't get basic test support if ( !all || !all.length || !a ) { return; } jQuery.support = { // IE strips leading whitespace when .innerHTML is used leadingWhitespace: div.firstChild.nodeType === 3, // Make sure that tbody elements aren't automatically inserted // IE will insert them into empty tables tbody: !div.getElementsByTagName("tbody").length, // Make sure that link elements get serialized correctly by innerHTML // This requires a wrapper element in IE htmlSerialize: !!div.getElementsByTagName("link").length, // Get the style information from getAttribute // (IE uses .cssText insted) style: /red/.test( a.getAttribute("style") ), // Make sure that URLs aren't manipulated // (IE normalizes it by default) hrefNormalized: a.getAttribute("href") === "/a", // Make sure that element opacity exists // (IE uses filter instead) // Use a regex to work around a WebKit issue. See #5145 opacity: /^0.55$/.test( a.style.opacity ), // Verify style float existence // (IE uses styleFloat instead of cssFloat) cssFloat: !!a.style.cssFloat, // Make sure that if no value is specified for a checkbox // that it defaults to "on". // (WebKit defaults to "" instead) checkOn: div.getElementsByTagName("input")[0].value === "on", // Make sure that a selected-by-default option has a working selected property. // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) optSelected: document.createElement("select").appendChild( document.createElement("option") ).selected, parentNode: div.removeChild( div.appendChild( document.createElement("div") ) ).parentNode === null, // Will be defined later deleteExpando: true, checkClone: false, scriptEval: false, noCloneEvent: true, boxModel: null }; script.type = "text/javascript"; try { script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); } catch(e) {} root.insertBefore( script, root.firstChild ); // Make sure that the execution of code works by injecting a script // tag with appendChild/createTextNode // (IE doesn't support this, fails, and uses .text instead) if ( window[ id ] ) { jQuery.support.scriptEval = true; delete window[ id ]; } // Test to see if it's possible to delete an expando from an element // Fails in Internet Explorer try { delete script.test; } catch(e) { jQuery.support.deleteExpando = false; } root.removeChild( script ); if ( div.attachEvent && div.fireEvent ) { div.attachEvent("onclick", function click() { // Cloning a node shouldn't copy over any // bound event handlers (IE does this) jQuery.support.noCloneEvent = false; div.detachEvent("onclick", click); }); div.cloneNode(true).fireEvent("onclick"); } div = document.createElement("div"); div.innerHTML = ""; var fragment = document.createDocumentFragment(); fragment.appendChild( div.firstChild ); // WebKit doesn't clone checked state correctly in fragments jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; // Figure out if the W3C box model works as expected // document.body must exist before we can do this jQuery(function() { var div = document.createElement("div"); div.style.width = div.style.paddingLeft = "1px"; document.body.appendChild( div ); jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; document.body.removeChild( div ).style.display = 'none'; div = null; }); // Technique from Juriy Zaytsev // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ var eventSupported = function( eventName ) { var el = document.createElement("div"); eventName = "on" + eventName; var isSupported = (eventName in el); if ( !isSupported ) { el.setAttribute(eventName, "return;"); isSupported = typeof el[eventName] === "function"; } el = null; return isSupported; }; jQuery.support.submitBubbles = eventSupported("submit"); jQuery.support.changeBubbles = eventSupported("change"); // release memory in IE root = script = div = all = a = null; })(); jQuery.props = { "for": "htmlFor", "class": "className", readonly: "readOnly", maxlength: "maxLength", cellspacing: "cellSpacing", rowspan: "rowSpan", colspan: "colSpan", tabindex: "tabIndex", usemap: "useMap", frameborder: "frameBorder" }; var expando = "jQuery" + now(), uuid = 0, windowData = {}; jQuery.extend({ cache: {}, expando:expando, // The following elements throw uncatchable exceptions if you // attempt to add expando properties to them. noData: { "embed": true, "object": true, "applet": true }, data: function( elem, name, data ) { if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { return; } elem = elem == window ? windowData : elem; var id = elem[ expando ], cache = jQuery.cache, thisCache; if ( !id && typeof name === "string" && data === undefined ) { return null; } // Compute a unique ID for the element if ( !id ) { id = ++uuid; } // Avoid generating a new cache unless none exists and we // want to manipulate it. if ( typeof name === "object" ) { elem[ expando ] = id; thisCache = cache[ id ] = jQuery.extend(true, {}, name); } else if ( !cache[ id ] ) { elem[ expando ] = id; cache[ id ] = {}; } thisCache = cache[ id ]; // Prevent overriding the named cache with undefined values if ( data !== undefined ) { thisCache[ name ] = data; } return typeof name === "string" ? thisCache[ name ] : thisCache; }, removeData: function( elem, name ) { if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { return; } elem = elem == window ? windowData : elem; var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ]; // If we want to remove a specific section of the element's data if ( name ) { if ( thisCache ) { // Remove the section of cache data delete thisCache[ name ]; // If we've removed all the data, remove the element's cache if ( jQuery.isEmptyObject(thisCache) ) { jQuery.removeData( elem ); } } // Otherwise, we want to remove all of the element's data } else { if ( jQuery.support.deleteExpando ) { delete elem[ jQuery.expando ]; } else if ( elem.removeAttribute ) { elem.removeAttribute( jQuery.expando ); } // Completely remove the data cache delete cache[ id ]; } } }); jQuery.fn.extend({ data: function( key, value ) { if ( typeof key === "undefined" && this.length ) { return jQuery.data( this[0] ); } else if ( typeof key === "object" ) { return this.each(function() { jQuery.data( this, key ); }); } var parts = key.split("."); parts[1] = parts[1] ? "." + parts[1] : ""; if ( value === undefined ) { var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); if ( data === undefined && this.length ) { data = jQuery.data( this[0], key ); } return data === undefined && parts[1] ? this.data( parts[0] ) : data; } else { return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function() { jQuery.data( this, key, value ); }); } }, removeData: function( key ) { return this.each(function() { jQuery.removeData( this, key ); }); } }); jQuery.extend({ queue: function( elem, type, data ) { if ( !elem ) { return; } type = (type || "fx") + "queue"; var q = jQuery.data( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( !data ) { return q || []; } if ( !q || jQuery.isArray(data) ) { q = jQuery.data( elem, type, jQuery.makeArray(data) ); } else { q.push( data ); } return q; }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), fn = queue.shift(); // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift("inprogress"); } fn.call(elem, function() { jQuery.dequeue(elem, type); }); } } }); jQuery.fn.extend({ queue: function( type, data ) { if ( typeof type !== "string" ) { data = type; type = "fx"; } if ( data === undefined ) { return jQuery.queue( this[0], type ); } return this.each(function( i, elem ) { var queue = jQuery.queue( this, type, data ); if ( type === "fx" && queue[0] !== "inprogress" ) { jQuery.dequeue( this, type ); } }); }, dequeue: function( type ) { return this.each(function() { jQuery.dequeue( this, type ); }); }, // Based off of the plugin by Clint Helfers, with permission. // http://blindsignals.com/index.php/2009/07/jquery-delay/ delay: function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; type = type || "fx"; return this.queue( type, function() { var elem = this; setTimeout(function() { jQuery.dequeue( elem, type ); }, time ); }); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); } }); var rclass = /[\n\t]/g, rspace = /\s+/, rreturn = /\r/g, rspecialurl = /href|src|style/, rtype = /(button|input)/i, rfocusable = /(button|input|object|select|textarea)/i, rclickable = /^(a|area)$/i, rradiocheck = /radio|checkbox/; jQuery.fn.extend({ attr: function( name, value ) { return access( this, name, value, true, jQuery.attr ); }, removeAttr: function( name, fn ) { return this.each(function(){ jQuery.attr( this, name, "" ); if ( this.nodeType === 1 ) { this.removeAttribute( name ); } }); }, addClass: function( value ) { if ( jQuery.isFunction(value) ) { return this.each(function(i) { var self = jQuery(this); self.addClass( value.call(this, i, self.attr("class")) ); }); } if ( value && typeof value === "string" ) { var classNames = (value || "").split( rspace ); for ( var i = 0, l = this.length; i < l; i++ ) { var elem = this[i]; if ( elem.nodeType === 1 ) { if ( !elem.className ) { elem.className = value; } else { var className = " " + elem.className + " ", setClass = elem.className; for ( var c = 0, cl = classNames.length; c < cl; c++ ) { if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) { setClass += " " + classNames[c]; } } elem.className = jQuery.trim( setClass ); } } } } return this; }, removeClass: function( value ) { if ( jQuery.isFunction(value) ) { return this.each(function(i) { var self = jQuery(this); self.removeClass( value.call(this, i, self.attr("class")) ); }); } if ( (value && typeof value === "string") || value === undefined ) { var classNames = (value || "").split(rspace); for ( var i = 0, l = this.length; i < l; i++ ) { var elem = this[i]; if ( elem.nodeType === 1 && elem.className ) { if ( value ) { var className = (" " + elem.className + " ").replace(rclass, " "); for ( var c = 0, cl = classNames.length; c < cl; c++ ) { className = className.replace(" " + classNames[c] + " ", " "); } elem.className = jQuery.trim( className ); } else { elem.className = ""; } } } } return this; }, toggleClass: function( value, stateVal ) { var type = typeof value, isBool = typeof stateVal === "boolean"; if ( jQuery.isFunction( value ) ) { return this.each(function(i) { var self = jQuery(this); self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal ); }); } return this.each(function() { if ( type === "string" ) { // toggle individual class names var className, i = 0, self = jQuery(this), state = stateVal, classNames = value.split( rspace ); while ( (className = classNames[ i++ ]) ) { // check each className given, space seperated list state = isBool ? state : !self.hasClass( className ); self[ state ? "addClass" : "removeClass" ]( className ); } } else if ( type === "undefined" || type === "boolean" ) { if ( this.className ) { // store className if set jQuery.data( this, "__className__", this.className ); } // toggle whole className this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || ""; } }); }, hasClass: function( selector ) { var className = " " + selector + " "; for ( var i = 0, l = this.length; i < l; i++ ) { if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { return true; } } return false; }, val: function( value ) { if ( value === undefined ) { var elem = this[0]; if ( elem ) { if ( jQuery.nodeName( elem, "option" ) ) { return (elem.attributes.value || {}).specified ? elem.value : elem.text; } // We need to handle select boxes special if ( jQuery.nodeName( elem, "select" ) ) { var index = elem.selectedIndex, values = [], options = elem.options, one = elem.type === "select-one"; // Nothing was selected if ( index < 0 ) { return null; } // Loop through all the selected options for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { var option = options[ i ]; if ( option.selected ) { // Get the specifc value for the option value = jQuery(option).val(); // We don't need an array for one selects if ( one ) { return value; } // Multi-Selects return an array values.push( value ); } } return values; } // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) { return elem.getAttribute("value") === null ? "on" : elem.value; } // Everything else, we just grab the value return (elem.value || "").replace(rreturn, ""); } return undefined; } var isFunction = jQuery.isFunction(value); return this.each(function(i) { var self = jQuery(this), val = value; if ( this.nodeType !== 1 ) { return; } if ( isFunction ) { val = value.call(this, i, self.val()); } // Typecast each time if the value is a Function and the appended // value is therefore different each time. if ( typeof val === "number" ) { val += ""; } if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) { this.checked = jQuery.inArray( self.val(), val ) >= 0; } else if ( jQuery.nodeName( this, "select" ) ) { var values = jQuery.makeArray(val); jQuery( "option", this ).each(function() { this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; }); if ( !values.length ) { this.selectedIndex = -1; } } else { this.value = val; } }); } }); jQuery.extend({ attrFn: { val: true, css: true, html: true, text: true, data: true, width: true, height: true, offset: true }, attr: function( elem, name, value, pass ) { // don't set attributes on text and comment nodes if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { return undefined; } if ( pass && name in jQuery.attrFn ) { return jQuery(elem)[name](value); } var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ), // Whether we are setting (or getting) set = value !== undefined; // Try to normalize/fix the name name = notxml && jQuery.props[ name ] || name; // Only do all the following if this is a node (faster for style) if ( elem.nodeType === 1 ) { // These attributes require special treatment var special = rspecialurl.test( name ); // Safari mis-reports the default selected property of an option // Accessing the parent's selectedIndex property fixes it if ( name === "selected" && !jQuery.support.optSelected ) { var parent = elem.parentNode; if ( parent ) { parent.selectedIndex; // Make sure that it also works with optgroups, see #5701 if ( parent.parentNode ) { parent.parentNode.selectedIndex; } } } // If applicable, access the attribute via the DOM 0 way if ( name in elem && notxml && !special ) { if ( set ) { // We can't allow the type property to be changed (since it causes problems in IE) if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) { jQuery.error( "type property can't be changed" ); } elem[ name ] = value; } // browsers index elements by id/name on forms, give priority to attributes. if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) { return elem.getAttributeNode( name ).nodeValue; } // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ if ( name === "tabIndex" ) { var attributeNode = elem.getAttributeNode( "tabIndex" ); return attributeNode && attributeNode.specified ? attributeNode.value : rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? 0 : undefined; } return elem[ name ]; } if ( !jQuery.support.style && notxml && name === "style" ) { if ( set ) { elem.style.cssText = "" + value; } return elem.style.cssText; } if ( set ) { // convert the value to a string (all browsers do this but IE) see #1070 elem.setAttribute( name, "" + value ); } var attr = !jQuery.support.hrefNormalized && notxml && special ? // Some attributes require a special call on IE elem.getAttribute( name, 2 ) : elem.getAttribute( name ); // Non-existent attributes return null, we normalize to undefined return attr === null ? undefined : attr; } // elem is actually elem.style ... set the style // Using attr for specific style information is now deprecated. Use style instead. return jQuery.style( elem, name, value ); } }); var rnamespaces = /\.(.*)$/, fcleanup = function( nm ) { return nm.replace(/[^\w\s\.\|`]/g, function( ch ) { return "\\" + ch; }); }; /* * A number of helper functions used for managing events. * Many of the ideas behind this code originated from * Dean Edwards' addEvent library. */ jQuery.event = { // Bind an event to an element // Original by Dean Edwards add: function( elem, types, handler, data ) { if ( elem.nodeType === 3 || elem.nodeType === 8 ) { return; } // For whatever reason, IE has trouble passing the window object // around, causing it to be cloned in the process if ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) { elem = window; } var handleObjIn, handleObj; if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; } // Make sure that the function being executed has a unique ID if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure var elemData = jQuery.data( elem ); // If no elemData is found then we must be trying to bind to one of the // banned noData elements if ( !elemData ) { return; } var events = elemData.events = elemData.events || {}, eventHandle = elemData.handle, eventHandle; if ( !eventHandle ) { elemData.handle = eventHandle = function() { // Handle the second event of a trigger and when // an event is called after a page has unloaded return typeof jQuery !== "undefined" && !jQuery.event.triggered ? jQuery.event.handle.apply( eventHandle.elem, arguments ) : undefined; }; } // Add elem as a property of the handle function // This is to prevent a memory leak with non-native events in IE. eventHandle.elem = elem; // Handle multiple events separated by a space // jQuery(...).bind("mouseover mouseout", fn); types = types.split(" "); var type, i = 0, namespaces; while ( (type = types[ i++ ]) ) { handleObj = handleObjIn ? jQuery.extend({}, handleObjIn) : { handler: handler, data: data }; // Namespaced event handlers if ( type.indexOf(".") > -1 ) { namespaces = type.split("."); type = namespaces.shift(); handleObj.namespace = namespaces.slice(0).sort().join("."); } else { namespaces = []; handleObj.namespace = ""; } handleObj.type = type; handleObj.guid = handler.guid; // Get the current list of functions bound to this event var handlers = events[ type ], special = jQuery.event.special[ type ] || {}; // Init the event handler queue if ( !handlers ) { handlers = events[ type ] = []; // Check for a special event handler // Only use addEventListener/attachEvent if the special // events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { // Bind the global event handler to the element if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle, false ); } else if ( elem.attachEvent ) { elem.attachEvent( "on" + type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add the function to the element's handler list handlers.push( handleObj ); // Keep track of which events have been used, for global triggering jQuery.event.global[ type ] = true; } // Nullify elem to prevent memory leaks in IE elem = null; }, global: {}, // Detach an event or set of events from an element remove: function( elem, types, handler, pos ) { // don't do events on text and comment nodes if ( elem.nodeType === 3 || elem.nodeType === 8 ) { return; } var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, elemData = jQuery.data( elem ), events = elemData && elemData.events; if ( !elemData || !events ) { return; } // types is actually an event object here if ( types && types.type ) { handler = types.handler; types = types.type; } // Unbind all events for the element if ( !types || typeof types === "string" && types.charAt(0) === "." ) { types = types || ""; for ( type in events ) { jQuery.event.remove( elem, type + types ); } return; } // Handle multiple events separated by a space // jQuery(...).unbind("mouseover mouseout", fn); types = types.split(" "); while ( (type = types[ i++ ]) ) { origType = type; handleObj = null; all = type.indexOf(".") < 0; namespaces = []; if ( !all ) { // Namespaced event handlers namespaces = type.split("."); type = namespaces.shift(); namespace = new RegExp("(^|\\.)" + jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)") } eventType = events[ type ]; if ( !eventType ) { continue; } if ( !handler ) { for ( var j = 0; j < eventType.length; j++ ) { handleObj = eventType[ j ]; if ( all || namespace.test( handleObj.namespace ) ) { jQuery.event.remove( elem, origType, handleObj.handler, j ); eventType.splice( j--, 1 ); } } continue; } special = jQuery.event.special[ type ] || {}; for ( var j = pos || 0; j < eventType.length; j++ ) { handleObj = eventType[ j ]; if ( handler.guid === handleObj.guid ) { // remove the given handler for the given type if ( all || namespace.test( handleObj.namespace ) ) { if ( pos == null ) { eventType.splice( j--, 1 ); } if ( special.remove ) { special.remove.call( elem, handleObj ); } } if ( pos != null ) { break; } } } // remove generic event handler if no more handlers exist if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { removeEvent( elem, type, elemData.handle ); } ret = null; delete events[ type ]; } } // Remove the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { var handle = elemData.handle; if ( handle ) { handle.elem = null; } delete elemData.events; delete elemData.handle; if ( jQuery.isEmptyObject( elemData ) ) { jQuery.removeData( elem ); } } }, // bubbling is internal trigger: function( event, data, elem /*, bubbling */ ) { // Event object or event type var type = event.type || event, bubbling = arguments[3]; if ( !bubbling ) { event = typeof event === "object" ? // jQuery.Event object event[expando] ? event : // Object literal jQuery.extend( jQuery.Event(type), event ) : // Just the event type (string) jQuery.Event(type); if ( type.indexOf("!") >= 0 ) { event.type = type = type.slice(0, -1); event.exclusive = true; } // Handle a global trigger if ( !elem ) { // Don't bubble custom events when global (to avoid too much overhead) event.stopPropagation(); // Only trigger if we've ever bound an event for it if ( jQuery.event.global[ type ] ) { jQuery.each( jQuery.cache, function() { if ( this.events && this.events[type] ) { jQuery.event.trigger( event, data, this.handle.elem ); } }); } } // Handle triggering a single element // don't do events on text and comment nodes if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { return undefined; } // Clean up in case it is reused event.result = undefined; event.target = elem; // Clone the incoming data, if any data = jQuery.makeArray( data ); data.unshift( event ); } event.currentTarget = elem; // Trigger the event, it is assumed that "handle" is a function var handle = jQuery.data( elem, "handle" ); if ( handle ) { handle.apply( elem, data ); } var parent = elem.parentNode || elem.ownerDocument; // Trigger an inline bound script try { if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) { if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) { event.result = false; } } // prevent IE from throwing an error for some elements with some event types, see #3533 } catch (e) {} if ( !event.isPropagationStopped() && parent ) { jQuery.event.trigger( event, data, parent, true ); } else if ( !event.isDefaultPrevented() ) { var target = event.target, old, isClick = jQuery.nodeName(target, "a") && type === "click", special = jQuery.event.special[ type ] || {}; if ( (!special._default || special._default.call( elem, event ) === false) && !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) { try { if ( target[ type ] ) { // Make sure that we don't accidentally re-trigger the onFOO events old = target[ "on" + type ]; if ( old ) { target[ "on" + type ] = null; } jQuery.event.triggered = true; target[ type ](); } // prevent IE from throwing an error for some elements with some event types, see #3533 } catch (e) {} if ( old ) { target[ "on" + type ] = old; } jQuery.event.triggered = false; } } }, handle: function( event ) { var all, handlers, namespaces, namespace, events; event = arguments[0] = jQuery.event.fix( event || window.event ); event.currentTarget = this; // Namespaced event handlers all = event.type.indexOf(".") < 0 && !event.exclusive; if ( !all ) { namespaces = event.type.split("."); event.type = namespaces.shift(); namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)"); } var events = jQuery.data(this, "events"), handlers = events[ event.type ]; if ( events && handlers ) { // Clone the handlers to prevent manipulation handlers = handlers.slice(0); for ( var j = 0, l = handlers.length; j < l; j++ ) { var handleObj = handlers[ j ]; // Filter the functions by class if ( all || namespace.test( handleObj.namespace ) ) { // Pass in a reference to the handler function itself // So that we can later remove it event.handler = handleObj.handler; event.data = handleObj.data; event.handleObj = handleObj; var ret = handleObj.handler.apply( this, arguments ); if ( ret !== undefined ) { event.result = ret; if ( ret === false ) { event.preventDefault(); event.stopPropagation(); } } if ( event.isImmediatePropagationStopped() ) { break; } } } } return event.result; }, props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), fix: function( event ) { if ( event[ expando ] ) { return event; } // store a copy of the original event object // and "clone" to set read-only properties var originalEvent = event; event = jQuery.Event( originalEvent ); for ( var i = this.props.length, prop; i; ) { prop = this.props[ --i ]; event[ prop ] = originalEvent[ prop ]; } // Fix target property, if necessary if ( !event.target ) { event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either } // check if target is a textnode (safari) if ( event.target.nodeType === 3 ) { event.target = event.target.parentNode; } // Add relatedTarget, if necessary if ( !event.relatedTarget && event.fromElement ) { event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; } // Calculate pageX/Y if missing and clientX/Y available if ( event.pageX == null && event.clientX != null ) { var doc = document.documentElement, body = document.body; event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); } // Add which for key events if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) { event.which = event.charCode || event.keyCode; } // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) if ( !event.metaKey && event.ctrlKey ) { event.metaKey = event.ctrlKey; } // Add which for click: 1 === left; 2 === middle; 3 === right // Note: button is not normalized, so don't use it if ( !event.which && event.button !== undefined ) { event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); } return event; }, // Deprecated, use jQuery.guid instead guid: 1E8, // Deprecated, use jQuery.proxy instead proxy: jQuery.proxy, special: { ready: { // Make sure the ready event is setup setup: jQuery.bindReady, teardown: jQuery.noop }, live: { add: function( handleObj ) { jQuery.event.add( this, handleObj.origType, jQuery.extend({}, handleObj, {handler: liveHandler}) ); }, remove: function( handleObj ) { var remove = true, type = handleObj.origType.replace(rnamespaces, ""); jQuery.each( jQuery.data(this, "events").live || [], function() { if ( type === this.origType.replace(rnamespaces, "") ) { remove = false; return false; } }); if ( remove ) { jQuery.event.remove( this, handleObj.origType, liveHandler ); } } }, beforeunload: { setup: function( data, namespaces, eventHandle ) { // We only want to do this special case on windows if ( this.setInterval ) { this.onbeforeunload = eventHandle; } return false; }, teardown: function( namespaces, eventHandle ) { if ( this.onbeforeunload === eventHandle ) { this.onbeforeunload = null; } } } } }; var removeEvent = document.removeEventListener ? function( elem, type, handle ) { elem.removeEventListener( type, handle, false ); } : function( elem, type, handle ) { elem.detachEvent( "on" + type, handle ); }; jQuery.Event = function( src ) { // Allow instantiation without the 'new' keyword if ( !this.preventDefault ) { return new jQuery.Event( src ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Event type } else { this.type = src; } // timeStamp is buggy for some events on Firefox(#3843) // So we won't rely on the native value this.timeStamp = now(); // Mark it as fixed this[ expando ] = true; }; function returnFalse() { return false; } function returnTrue() { return true; } // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { preventDefault: function() { this.isDefaultPrevented = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if preventDefault exists run it on the original event if ( e.preventDefault ) { e.preventDefault(); } // otherwise set the returnValue property of the original event to false (IE) e.returnValue = false; }, stopPropagation: function() { this.isPropagationStopped = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if stopPropagation exists run it on the original event if ( e.stopPropagation ) { e.stopPropagation(); } // otherwise set the cancelBubble property of the original event to true (IE) e.cancelBubble = true; }, stopImmediatePropagation: function() { this.isImmediatePropagationStopped = returnTrue; this.stopPropagation(); }, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse }; // Checks if an event happened on an element within another element // Used in jQuery.event.special.mouseenter and mouseleave handlers var withinElement = function( event ) { // Check if mouse(over|out) are still within the same parent element var parent = event.relatedTarget; // Firefox sometimes assigns relatedTarget a XUL element // which we cannot access the parentNode property of try { // Traverse up the tree while ( parent && parent !== this ) { parent = parent.parentNode; } if ( parent !== this ) { // set the correct event type event.type = event.data; // handle event if we actually just moused on to a non sub-element jQuery.event.handle.apply( this, arguments ); } // assuming we've left the element since we most likely mousedover a xul element } catch(e) { } }, // In case of event delegation, we only need to rename the event.type, // liveHandler will take care of the rest. delegate = function( event ) { event.type = event.data; jQuery.event.handle.apply( this, arguments ); }; // Create mouseenter and mouseleave events jQuery.each({ mouseenter: "mouseover", mouseleave: "mouseout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { setup: function( data ) { jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); }, teardown: function( data ) { jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); } }; }); // submit delegation if ( !jQuery.support.submitBubbles ) { jQuery.event.special.submit = { setup: function( data, namespaces ) { if ( this.nodeName.toLowerCase() !== "form" ) { jQuery.event.add(this, "click.specialSubmit", function( e ) { var elem = e.target, type = elem.type; if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { return trigger( "submit", this, arguments ); } }); jQuery.event.add(this, "keypress.specialSubmit", function( e ) { var elem = e.target, type = elem.type; if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { return trigger( "submit", this, arguments ); } }); } else { return false; } }, teardown: function( namespaces ) { jQuery.event.remove( this, ".specialSubmit" ); } }; } // change delegation, happens here so we have bind. if ( !jQuery.support.changeBubbles ) { var formElems = /textarea|input|select/i, changeFilters, getVal = function( elem ) { var type = elem.type, val = elem.value; if ( type === "radio" || type === "checkbox" ) { val = elem.checked; } else if ( type === "select-multiple" ) { val = elem.selectedIndex > -1 ? jQuery.map( elem.options, function( elem ) { return elem.selected; }).join("-") : ""; } else if ( elem.nodeName.toLowerCase() === "select" ) { val = elem.selectedIndex; } return val; }, testChange = function testChange( e ) { var elem = e.target, data, val; if ( !formElems.test( elem.nodeName ) || elem.readOnly ) { return; } data = jQuery.data( elem, "_change_data" ); val = getVal(elem); // the current data will be also retrieved by beforeactivate if ( e.type !== "focusout" || elem.type !== "radio" ) { jQuery.data( elem, "_change_data", val ); } if ( data === undefined || val === data ) { return; } if ( data != null || val ) { e.type = "change"; return jQuery.event.trigger( e, arguments[1], elem ); } }; jQuery.event.special.change = { filters: { focusout: testChange, click: function( e ) { var elem = e.target, type = elem.type; if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) { return testChange.call( this, e ); } }, // Change has to be called before submit // Keydown will be called before keypress, which is used in submit-event delegation keydown: function( e ) { var elem = e.target, type = elem.type; if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") || (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || type === "select-multiple" ) { return testChange.call( this, e ); } }, // Beforeactivate happens also before the previous element is blurred // with this event you can't trigger a change event, but you can store // information/focus[in] is not needed anymore beforeactivate: function( e ) { var elem = e.target; jQuery.data( elem, "_change_data", getVal(elem) ); } }, setup: function( data, namespaces ) { if ( this.type === "file" ) { return false; } for ( var type in changeFilters ) { jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); } return formElems.test( this.nodeName ); }, teardown: function( namespaces ) { jQuery.event.remove( this, ".specialChange" ); return formElems.test( this.nodeName ); } }; changeFilters = jQuery.event.special.change.filters; } function trigger( type, elem, args ) { args[0].type = type; return jQuery.event.handle.apply( elem, args ); } // Create "bubbling" focus and blur events if ( document.addEventListener ) { jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { jQuery.event.special[ fix ] = { setup: function() { this.addEventListener( orig, handler, true ); }, teardown: function() { this.removeEventListener( orig, handler, true ); } }; function handler( e ) { e = jQuery.event.fix( e ); e.type = fix; return jQuery.event.handle.call( this, e ); } }); } jQuery.each(["bind", "one"], function( i, name ) { jQuery.fn[ name ] = function( type, data, fn ) { // Handle object literals if ( typeof type === "object" ) { for ( var key in type ) { this[ name ](key, data, type[key], fn); } return this; } if ( jQuery.isFunction( data ) ) { fn = data; data = undefined; } var handler = name === "one" ? jQuery.proxy( fn, function( event ) { jQuery( this ).unbind( event, handler ); return fn.apply( this, arguments ); }) : fn; if ( type === "unload" && name !== "one" ) { this.one( type, data, fn ); } else { for ( var i = 0, l = this.length; i < l; i++ ) { jQuery.event.add( this[i], type, handler, data ); } } return this; }; }); jQuery.fn.extend({ unbind: function( type, fn ) { // Handle object literals if ( typeof type === "object" && !type.preventDefault ) { for ( var key in type ) { this.unbind(key, type[key]); } } else { for ( var i = 0, l = this.length; i < l; i++ ) { jQuery.event.remove( this[i], type, fn ); } } return this; }, delegate: function( selector, types, data, fn ) { return this.live( types, data, fn, selector ); }, undelegate: function( selector, types, fn ) { if ( arguments.length === 0 ) { return this.unbind( "live" ); } else { return this.die( types, null, fn, selector ); } }, trigger: function( type, data ) { return this.each(function() { jQuery.event.trigger( type, data, this ); }); }, triggerHandler: function( type, data ) { if ( this[0] ) { var event = jQuery.Event( type ); event.preventDefault(); event.stopPropagation(); jQuery.event.trigger( event, data, this[0] ); return event.result; } }, toggle: function( fn ) { // Save reference to arguments for access in closure var args = arguments, i = 1; // link all the functions, so any of them can unbind this click handler while ( i < args.length ) { jQuery.proxy( fn, args[ i++ ] ); } return this.click( jQuery.proxy( fn, function( event ) { // Figure out which function to execute var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i; jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 ); // Make sure that clicks stop event.preventDefault(); // and execute the function return args[ lastToggle ].apply( this, arguments ) || false; })); }, hover: function( fnOver, fnOut ) { return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); } }); var liveMap = { focus: "focusin", blur: "focusout", mouseenter: "mouseover", mouseleave: "mouseout" }; jQuery.each(["live", "die"], function( i, name ) { jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { var type, i = 0, match, namespaces, preType, selector = origSelector || this.selector, context = origSelector ? this : jQuery( this.context ); if ( jQuery.isFunction( data ) ) { fn = data; data = undefined; } types = (types || "").split(" "); while ( (type = types[ i++ ]) != null ) { match = rnamespaces.exec( type ); namespaces = ""; if ( match ) { namespaces = match[0]; type = type.replace( rnamespaces, "" ); } if ( type === "hover" ) { types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); continue; } preType = type; if ( type === "focus" || type === "blur" ) { types.push( liveMap[ type ] + namespaces ); type = type + namespaces; } else { type = (liveMap[ type ] || type) + namespaces; } if ( name === "live" ) { // bind live handler context.each(function(){ jQuery.event.add( this, liveConvert( type, selector ), { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); }); } else { // unbind live handler context.unbind( liveConvert( type, selector ), fn ); } } return this; } }); function liveHandler( event ) { var stop, elems = [], selectors = [], args = arguments, related, match, handleObj, elem, j, i, l, data, events = jQuery.data( this, "events" ); // Make sure we avoid non-left-click bubbling in Firefox (#3861) if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) { return; } event.liveFired = this; var live = events.live.slice(0); for ( j = 0; j < live.length; j++ ) { handleObj = live[j]; if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { selectors.push( handleObj.selector ); } else { live.splice( j--, 1 ); } } match = jQuery( event.target ).closest( selectors, event.currentTarget ); for ( i = 0, l = match.length; i < l; i++ ) { for ( j = 0; j < live.length; j++ ) { handleObj = live[j]; if ( match[i].selector === handleObj.selector ) { elem = match[i].elem; related = null; // Those two events require additional checking if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; } if ( !related || related !== elem ) { elems.push({ elem: elem, handleObj: handleObj }); } } } } for ( i = 0, l = elems.length; i < l; i++ ) { match = elems[i]; event.currentTarget = match.elem; event.data = match.handleObj.data; event.handleObj = match.handleObj; if ( match.handleObj.origHandler.apply( match.elem, args ) === false ) { stop = false; break; } } return stop; } function liveConvert( type, selector ) { return "live." + (type && type !== "*" ? type + "." : "") + selector.replace(/\./g, "`").replace(/ /g, "&"); } jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup error").split(" "), function( i, name ) { // Handle event binding jQuery.fn[ name ] = function( fn ) { return fn ? this.bind( name, fn ) : this.trigger( name ); }; if ( jQuery.attrFn ) { jQuery.attrFn[ name ] = true; } }); // Prevent memory leaks in IE // Window isn't included so as not to unbind existing unload events // More info: // - http://isaacschlueter.com/2006/10/msie-memory-leaks/ if ( window.attachEvent && !window.addEventListener ) { window.attachEvent("onunload", function() { for ( var id in jQuery.cache ) { if ( jQuery.cache[ id ].handle ) { // Try/Catch is to handle iframes being unloaded, see #4280 try { jQuery.event.remove( jQuery.cache[ id ].handle.elem ); } catch(e) {} } } }); } /*! * Sizzle CSS Selector Engine - v1.0 * Copyright 2009, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * More information: http://sizzlejs.com/ */ (function(){ var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, done = 0, toString = Object.prototype.toString, hasDuplicate = false, baseHasDuplicate = true; // Here we check if the JavaScript engine is using some sort of // optimization where it does not always call our comparision // function. If that is the case, discard the hasDuplicate value. // Thus far that includes Google Chrome. [0, 0].sort(function(){ baseHasDuplicate = false; return 0; }); var Sizzle = function(selector, context, results, seed) { results = results || []; var origContext = context = context || document; if ( context.nodeType !== 1 && context.nodeType !== 9 ) { return []; } if ( !selector || typeof selector !== "string" ) { return results; } var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context), soFar = selector; // Reset the position of the chunker regexp (start from head) while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) { soFar = m[3]; parts.push( m[1] ); if ( m[2] ) { extra = m[3]; break; } } if ( parts.length > 1 && origPOS.exec( selector ) ) { if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { set = posProcess( parts[0] + parts[1], context ); } else { set = Expr.relative[ parts[0] ] ? [ context ] : Sizzle( parts.shift(), context ); while ( parts.length ) { selector = parts.shift(); if ( Expr.relative[ selector ] ) { selector += parts.shift(); } set = posProcess( selector, set ); } } } else { // Take a shortcut and set the context if the root selector is an ID // (but not if it'll be faster if the inner selector is an ID) if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { var ret = Sizzle.find( parts.shift(), context, contextXML ); context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; } if ( context ) { var ret = seed ? { expr: parts.pop(), set: makeArray(seed) } : Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; if ( parts.length > 0 ) { checkSet = makeArray(set); } else { prune = false; } while ( parts.length ) { var cur = parts.pop(), pop = cur; if ( !Expr.relative[ cur ] ) { cur = ""; } else { pop = parts.pop(); } if ( pop == null ) { pop = context; } Expr.relative[ cur ]( checkSet, pop, contextXML ); } } else { checkSet = parts = []; } } if ( !checkSet ) { checkSet = set; } if ( !checkSet ) { Sizzle.error( cur || selector ); } if ( toString.call(checkSet) === "[object Array]" ) { if ( !prune ) { results.push.apply( results, checkSet ); } else if ( context && context.nodeType === 1 ) { for ( var i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) { results.push( set[i] ); } } } else { for ( var i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && checkSet[i].nodeType === 1 ) { results.push( set[i] ); } } } } else { makeArray( checkSet, results ); } if ( extra ) { Sizzle( extra, origContext, results, seed ); Sizzle.uniqueSort( results ); } return results; }; Sizzle.uniqueSort = function(results){ if ( sortOrder ) { hasDuplicate = baseHasDuplicate; results.sort(sortOrder); if ( hasDuplicate ) { for ( var i = 1; i < results.length; i++ ) { if ( results[i] === results[i-1] ) { results.splice(i--, 1); } } } } return results; }; Sizzle.matches = function(expr, set){ return Sizzle(expr, null, null, set); }; Sizzle.find = function(expr, context, isXML){ var set, match; if ( !expr ) { return []; } for ( var i = 0, l = Expr.order.length; i < l; i++ ) { var type = Expr.order[i], match; if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { var left = match[1]; match.splice(1,1); if ( left.substr( left.length - 1 ) !== "\\" ) { match[1] = (match[1] || "").replace(/\\/g, ""); set = Expr.find[ type ]( match, context, isXML ); if ( set != null ) { expr = expr.replace( Expr.match[ type ], "" ); break; } } } } if ( !set ) { set = context.getElementsByTagName("*"); } return {set: set, expr: expr}; }; Sizzle.filter = function(expr, set, inplace, not){ var old = expr, result = [], curLoop = set, match, anyFound, isXMLFilter = set && set[0] && isXML(set[0]); while ( expr && set.length ) { for ( var type in Expr.filter ) { if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { var filter = Expr.filter[ type ], found, item, left = match[1]; anyFound = false; match.splice(1,1); if ( left.substr( left.length - 1 ) === "\\" ) { continue; } if ( curLoop === result ) { result = []; } if ( Expr.preFilter[ type ] ) { match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); if ( !match ) { anyFound = found = true; } else if ( match === true ) { continue; } } if ( match ) { for ( var i = 0; (item = curLoop[i]) != null; i++ ) { if ( item ) { found = filter( item, match, i, curLoop ); var pass = not ^ !!found; if ( inplace && found != null ) { if ( pass ) { anyFound = true; } else { curLoop[i] = false; } } else if ( pass ) { result.push( item ); anyFound = true; } } } } if ( found !== undefined ) { if ( !inplace ) { curLoop = result; } expr = expr.replace( Expr.match[ type ], "" ); if ( !anyFound ) { return []; } break; } } } // Improper expression if ( expr === old ) { if ( anyFound == null ) { Sizzle.error( expr ); } else { break; } } old = expr; } return curLoop; }; Sizzle.error = function( msg ) { throw "Syntax error, unrecognized expression: " + msg; }; var Expr = Sizzle.selectors = { order: [ "ID", "NAME", "TAG" ], match: { ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/, NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/, ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/, CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ }, leftMatch: {}, attrMap: { "class": "className", "for": "htmlFor" }, attrHandle: { href: function(elem){ return elem.getAttribute("href"); } }, relative: { "+": function(checkSet, part){ var isPartStr = typeof part === "string", isTag = isPartStr && !/\W/.test(part), isPartStrNotTag = isPartStr && !isTag; if ( isTag ) { part = part.toLowerCase(); } for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { if ( (elem = checkSet[i]) ) { while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? elem || false : elem === part; } } if ( isPartStrNotTag ) { Sizzle.filter( part, checkSet, true ); } }, ">": function(checkSet, part){ var isPartStr = typeof part === "string"; if ( isPartStr && !/\W/.test(part) ) { part = part.toLowerCase(); for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { var parent = elem.parentNode; checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; } } } else { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { checkSet[i] = isPartStr ? elem.parentNode : elem.parentNode === part; } } if ( isPartStr ) { Sizzle.filter( part, checkSet, true ); } } }, "": function(checkSet, part, isXML){ var doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !/\W/.test(part) ) { var nodeCheck = part = part.toLowerCase(); checkFn = dirNodeCheck; } checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); }, "~": function(checkSet, part, isXML){ var doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !/\W/.test(part) ) { var nodeCheck = part = part.toLowerCase(); checkFn = dirNodeCheck; } checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); } }, find: { ID: function(match, context, isXML){ if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); return m ? [m] : []; } }, NAME: function(match, context){ if ( typeof context.getElementsByName !== "undefined" ) { var ret = [], results = context.getElementsByName(match[1]); for ( var i = 0, l = results.length; i < l; i++ ) { if ( results[i].getAttribute("name") === match[1] ) { ret.push( results[i] ); } } return ret.length === 0 ? null : ret; } }, TAG: function(match, context){ return context.getElementsByTagName(match[1]); } }, preFilter: { CLASS: function(match, curLoop, inplace, result, not, isXML){ match = " " + match[1].replace(/\\/g, "") + " "; if ( isXML ) { return match; } for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { if ( elem ) { if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) { if ( !inplace ) { result.push( elem ); } } else if ( inplace ) { curLoop[i] = false; } } } return false; }, ID: function(match){ return match[1].replace(/\\/g, ""); }, TAG: function(match, curLoop){ return match[1].toLowerCase(); }, CHILD: function(match){ if ( match[1] === "nth" ) { // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); // calculate the numbers (first)n+(last) including if they are negative match[2] = (test[1] + (test[2] || 1)) - 0; match[3] = test[3] - 0; } // TODO: Move to normal caching system match[0] = done++; return match; }, ATTR: function(match, curLoop, inplace, result, not, isXML){ var name = match[1].replace(/\\/g, ""); if ( !isXML && Expr.attrMap[name] ) { match[1] = Expr.attrMap[name]; } if ( match[2] === "~=" ) { match[4] = " " + match[4] + " "; } return match; }, PSEUDO: function(match, curLoop, inplace, result, not){ if ( match[1] === "not" ) { // If we're dealing with a complex expression, or a simple one if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { match[3] = Sizzle(match[3], null, null, curLoop); } else { var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); if ( !inplace ) { result.push.apply( result, ret ); } return false; } } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { return true; } return match; }, POS: function(match){ match.unshift( true ); return match; } }, filters: { enabled: function(elem){ return elem.disabled === false && elem.type !== "hidden"; }, disabled: function(elem){ return elem.disabled === true; }, checked: function(elem){ return elem.checked === true; }, selected: function(elem){ // Accessing this property makes selected-by-default // options in Safari work properly elem.parentNode.selectedIndex; return elem.selected === true; }, parent: function(elem){ return !!elem.firstChild; }, empty: function(elem){ return !elem.firstChild; }, has: function(elem, i, match){ return !!Sizzle( match[3], elem ).length; }, header: function(elem){ return /h\d/i.test( elem.nodeName ); }, text: function(elem){ return "text" === elem.type; }, radio: function(elem){ return "radio" === elem.type; }, checkbox: function(elem){ return "checkbox" === elem.type; }, file: function(elem){ return "file" === elem.type; }, password: function(elem){ return "password" === elem.type; }, submit: function(elem){ return "submit" === elem.type; }, image: function(elem){ return "image" === elem.type; }, reset: function(elem){ return "reset" === elem.type; }, button: function(elem){ return "button" === elem.type || elem.nodeName.toLowerCase() === "button"; }, input: function(elem){ return /input|select|textarea|button/i.test(elem.nodeName); } }, setFilters: { first: function(elem, i){ return i === 0; }, last: function(elem, i, match, array){ return i === array.length - 1; }, even: function(elem, i){ return i % 2 === 0; }, odd: function(elem, i){ return i % 2 === 1; }, lt: function(elem, i, match){ return i < match[3] - 0; }, gt: function(elem, i, match){ return i > match[3] - 0; }, nth: function(elem, i, match){ return match[3] - 0 === i; }, eq: function(elem, i, match){ return match[3] - 0 === i; } }, filter: { PSEUDO: function(elem, match, i, array){ var name = match[1], filter = Expr.filters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } else if ( name === "contains" ) { return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; } else if ( name === "not" ) { var not = match[3]; for ( var i = 0, l = not.length; i < l; i++ ) { if ( not[i] === elem ) { return false; } } return true; } else { Sizzle.error( "Syntax error, unrecognized expression: " + name ); } }, CHILD: function(elem, match){ var type = match[1], node = elem; switch (type) { case 'only': case 'first': while ( (node = node.previousSibling) ) { if ( node.nodeType === 1 ) { return false; } } if ( type === "first" ) { return true; } node = elem; case 'last': while ( (node = node.nextSibling) ) { if ( node.nodeType === 1 ) { return false; } } return true; case 'nth': var first = match[2], last = match[3]; if ( first === 1 && last === 0 ) { return true; } var doneName = match[0], parent = elem.parentNode; if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { var count = 0; for ( node = parent.firstChild; node; node = node.nextSibling ) { if ( node.nodeType === 1 ) { node.nodeIndex = ++count; } } parent.sizcache = doneName; } var diff = elem.nodeIndex - last; if ( first === 0 ) { return diff === 0; } else { return ( diff % first === 0 && diff / first >= 0 ); } } }, ID: function(elem, match){ return elem.nodeType === 1 && elem.getAttribute("id") === match; }, TAG: function(elem, match){ return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; }, CLASS: function(elem, match){ return (" " + (elem.className || elem.getAttribute("class")) + " ") .indexOf( match ) > -1; }, ATTR: function(elem, match){ var name = match[1], result = Expr.attrHandle[ name ] ? Expr.attrHandle[ name ]( elem ) : elem[ name ] != null ? elem[ name ] : elem.getAttribute( name ), value = result + "", type = match[2], check = match[4]; return result == null ? type === "!=" : type === "=" ? value === check : type === "*=" ? value.indexOf(check) >= 0 : type === "~=" ? (" " + value + " ").indexOf(check) >= 0 : !check ? value && result !== false : type === "!=" ? value !== check : type === "^=" ? value.indexOf(check) === 0 : type === "$=" ? value.substr(value.length - check.length) === check : type === "|=" ? value === check || value.substr(0, check.length + 1) === check + "-" : false; }, POS: function(elem, match, i, array){ var name = match[2], filter = Expr.setFilters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } } } }; var origPOS = Expr.match.POS; for ( var type in Expr.match ) { Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source ); Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, function(all, num){ return "\\" + (num - 0 + 1); })); } var makeArray = function(array, results) { array = Array.prototype.slice.call( array, 0 ); if ( results ) { results.push.apply( results, array ); return results; } return array; }; // Perform a simple check to determine if the browser is capable of // converting a NodeList to an array using builtin methods. // Also verifies that the returned array holds DOM nodes // (which is not the case in the Blackberry browser) try { Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; // Provide a fallback method if it does not work } catch(e){ makeArray = function(array, results) { var ret = results || []; if ( toString.call(array) === "[object Array]" ) { Array.prototype.push.apply( ret, array ); } else { if ( typeof array.length === "number" ) { for ( var i = 0, l = array.length; i < l; i++ ) { ret.push( array[i] ); } } else { for ( var i = 0; array[i]; i++ ) { ret.push( array[i] ); } } } return ret; }; } var sortOrder; if ( document.documentElement.compareDocumentPosition ) { sortOrder = function( a, b ) { if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { if ( a == b ) { hasDuplicate = true; } return a.compareDocumentPosition ? -1 : 1; } var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; if ( ret === 0 ) { hasDuplicate = true; } return ret; }; } else if ( "sourceIndex" in document.documentElement ) { sortOrder = function( a, b ) { if ( !a.sourceIndex || !b.sourceIndex ) { if ( a == b ) { hasDuplicate = true; } return a.sourceIndex ? -1 : 1; } var ret = a.sourceIndex - b.sourceIndex; if ( ret === 0 ) { hasDuplicate = true; } return ret; }; } else if ( document.createRange ) { sortOrder = function( a, b ) { if ( !a.ownerDocument || !b.ownerDocument ) { if ( a == b ) { hasDuplicate = true; } return a.ownerDocument ? -1 : 1; } var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); aRange.setStart(a, 0); aRange.setEnd(a, 0); bRange.setStart(b, 0); bRange.setEnd(b, 0); var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); if ( ret === 0 ) { hasDuplicate = true; } return ret; }; } // Utility function for retreiving the text value of an array of DOM nodes function getText( elems ) { var ret = "", elem; for ( var i = 0; elems[i]; i++ ) { elem = elems[i]; // Get the text from text nodes and CDATA nodes if ( elem.nodeType === 3 || elem.nodeType === 4 ) { ret += elem.nodeValue; // Traverse everything else, except comment nodes } else if ( elem.nodeType !== 8 ) { ret += getText( elem.childNodes ); } } return ret; } // Check to see if the browser returns elements by name when // querying by getElementById (and provide a workaround) (function(){ // We're going to inject a fake input element with a specified name var form = document.createElement("div"), id = "script" + (new Date).getTime(); form.innerHTML = ""; // Inject it into the root element, check its status, and remove it quickly var root = document.documentElement; root.insertBefore( form, root.firstChild ); // The workaround has to do additional checks after a getElementById // Which slows things down for other browsers (hence the branching) if ( document.getElementById( id ) ) { Expr.find.ID = function(match, context, isXML){ if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; } }; Expr.filter.ID = function(elem, match){ var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); return elem.nodeType === 1 && node && node.nodeValue === match; }; } root.removeChild( form ); root = form = null; // release memory in IE })(); (function(){ // Check to see if the browser returns only elements // when doing getElementsByTagName("*") // Create a fake element var div = document.createElement("div"); div.appendChild( document.createComment("") ); // Make sure no comments are found if ( div.getElementsByTagName("*").length > 0 ) { Expr.find.TAG = function(match, context){ var results = context.getElementsByTagName(match[1]); // Filter out possible comments if ( match[1] === "*" ) { var tmp = []; for ( var i = 0; results[i]; i++ ) { if ( results[i].nodeType === 1 ) { tmp.push( results[i] ); } } results = tmp; } return results; }; } // Check to see if an attribute returns normalized href attributes div.innerHTML = ""; if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && div.firstChild.getAttribute("href") !== "#" ) { Expr.attrHandle.href = function(elem){ return elem.getAttribute("href", 2); }; } div = null; // release memory in IE })(); if ( document.querySelectorAll ) { (function(){ var oldSizzle = Sizzle, div = document.createElement("div"); div.innerHTML = "

        "; // Safari can't handle uppercase or unicode characters when // in quirks mode. if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { return; } Sizzle = function(query, context, extra, seed){ context = context || document; // Only use querySelectorAll on non-XML documents // (ID selectors don't work in non-HTML documents) if ( !seed && context.nodeType === 9 && !isXML(context) ) { try { return makeArray( context.querySelectorAll(query), extra ); } catch(e){} } return oldSizzle(query, context, extra, seed); }; for ( var prop in oldSizzle ) { Sizzle[ prop ] = oldSizzle[ prop ]; } div = null; // release memory in IE })(); } (function(){ var div = document.createElement("div"); div.innerHTML = "
        "; // Opera can't find a second classname (in 9.6) // Also, make sure that getElementsByClassName actually exists if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { return; } // Safari caches class attributes, doesn't catch changes (in 3.2) div.lastChild.className = "e"; if ( div.getElementsByClassName("e").length === 1 ) { return; } Expr.order.splice(1, 0, "CLASS"); Expr.find.CLASS = function(match, context, isXML) { if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { return context.getElementsByClassName(match[1]); } }; div = null; // release memory in IE })(); function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { elem = elem[dir]; var match = false; while ( elem ) { if ( elem.sizcache === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 && !isXML ){ elem.sizcache = doneName; elem.sizset = i; } if ( elem.nodeName.toLowerCase() === cur ) { match = elem; break; } elem = elem[dir]; } checkSet[i] = match; } } } function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { elem = elem[dir]; var match = false; while ( elem ) { if ( elem.sizcache === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 ) { if ( !isXML ) { elem.sizcache = doneName; elem.sizset = i; } if ( typeof cur !== "string" ) { if ( elem === cur ) { match = true; break; } } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { match = elem; break; } } elem = elem[dir]; } checkSet[i] = match; } } } var contains = document.compareDocumentPosition ? function(a, b){ return !!(a.compareDocumentPosition(b) & 16); } : function(a, b){ return a !== b && (a.contains ? a.contains(b) : true); }; var isXML = function(elem){ // documentElement is verified for cases where it doesn't yet exist // (such as loading iframes in IE - #4833) var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; return documentElement ? documentElement.nodeName !== "HTML" : false; }; var posProcess = function(selector, context){ var tmpSet = [], later = "", match, root = context.nodeType ? [context] : context; // Position selectors must be done after the filter // And so must :not(positional) so we move all PSEUDOs to the end while ( (match = Expr.match.PSEUDO.exec( selector )) ) { later += match[0]; selector = selector.replace( Expr.match.PSEUDO, "" ); } selector = Expr.relative[selector] ? selector + "*" : selector; for ( var i = 0, l = root.length; i < l; i++ ) { Sizzle( selector, root[i], tmpSet ); } return Sizzle.filter( later, tmpSet ); }; // EXPOSE jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; jQuery.expr[":"] = jQuery.expr.filters; jQuery.unique = Sizzle.uniqueSort; jQuery.text = getText; jQuery.isXMLDoc = isXML; jQuery.contains = contains; return; window.Sizzle = Sizzle; })(); var runtil = /Until$/, rparentsprev = /^(?:parents|prevUntil|prevAll)/, // Note: This RegExp should be improved, or likely pulled from Sizzle rmultiselector = /,/, slice = Array.prototype.slice; // Implement the identical functionality for filter and not var winnow = function( elements, qualifier, keep ) { if ( jQuery.isFunction( qualifier ) ) { return jQuery.grep(elements, function( elem, i ) { return !!qualifier.call( elem, i, elem ) === keep; }); } else if ( qualifier.nodeType ) { return jQuery.grep(elements, function( elem, i ) { return (elem === qualifier) === keep; }); } else if ( typeof qualifier === "string" ) { var filtered = jQuery.grep(elements, function( elem ) { return elem.nodeType === 1; }); if ( isSimple.test( qualifier ) ) { return jQuery.filter(qualifier, filtered, !keep); } else { qualifier = jQuery.filter( qualifier, filtered ); } } return jQuery.grep(elements, function( elem, i ) { return (jQuery.inArray( elem, qualifier ) >= 0) === keep; }); }; jQuery.fn.extend({ find: function( selector ) { var ret = this.pushStack( "", "find", selector ), length = 0; for ( var i = 0, l = this.length; i < l; i++ ) { length = ret.length; jQuery.find( selector, this[i], ret ); if ( i > 0 ) { // Make sure that the results are unique for ( var n = length; n < ret.length; n++ ) { for ( var r = 0; r < length; r++ ) { if ( ret[r] === ret[n] ) { ret.splice(n--, 1); break; } } } } } return ret; }, has: function( target ) { var targets = jQuery( target ); return this.filter(function() { for ( var i = 0, l = targets.length; i < l; i++ ) { if ( jQuery.contains( this, targets[i] ) ) { return true; } } }); }, not: function( selector ) { return this.pushStack( winnow(this, selector, false), "not", selector); }, filter: function( selector ) { return this.pushStack( winnow(this, selector, true), "filter", selector ); }, is: function( selector ) { return !!selector && jQuery.filter( selector, this ).length > 0; }, closest: function( selectors, context ) { if ( jQuery.isArray( selectors ) ) { var ret = [], cur = this[0], match, matches = {}, selector; if ( cur && selectors.length ) { for ( var i = 0, l = selectors.length; i < l; i++ ) { selector = selectors[i]; if ( !matches[selector] ) { matches[selector] = jQuery.expr.match.POS.test( selector ) ? jQuery( selector, context || this.context ) : selector; } } while ( cur && cur.ownerDocument && cur !== context ) { for ( selector in matches ) { match = matches[selector]; if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) { ret.push({ selector: selector, elem: cur }); delete matches[selector]; } } cur = cur.parentNode; } } return ret; } var pos = jQuery.expr.match.POS.test( selectors ) ? jQuery( selectors, context || this.context ) : null; return this.map(function( i, cur ) { while ( cur && cur.ownerDocument && cur !== context ) { if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) { return cur; } cur = cur.parentNode; } return null; }); }, // Determine the position of an element within // the matched set of elements index: function( elem ) { if ( !elem || typeof elem === "string" ) { return jQuery.inArray( this[0], // If it receives a string, the selector is used // If it receives nothing, the siblings are used elem ? jQuery( elem ) : this.parent().children() ); } // Locate the position of the desired element return jQuery.inArray( // If it receives a jQuery object, the first element is used elem.jquery ? elem[0] : elem, this ); }, add: function( selector, context ) { var set = typeof selector === "string" ? jQuery( selector, context || this.context ) : jQuery.makeArray( selector ), all = jQuery.merge( this.get(), set ); return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? all : jQuery.unique( all ) ); }, andSelf: function() { return this.add( this.prevObject ); } }); // A painfully simple check to see if an element is disconnected // from a document (should be improved, where feasible). function isDisconnected( node ) { return !node || !node.parentNode || node.parentNode.nodeType === 11; } jQuery.each({ parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return jQuery.dir( elem, "parentNode" ); }, parentsUntil: function( elem, i, until ) { return jQuery.dir( elem, "parentNode", until ); }, next: function( elem ) { return jQuery.nth( elem, 2, "nextSibling" ); }, prev: function( elem ) { return jQuery.nth( elem, 2, "previousSibling" ); }, nextAll: function( elem ) { return jQuery.dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return jQuery.dir( elem, "previousSibling" ); }, nextUntil: function( elem, i, until ) { return jQuery.dir( elem, "nextSibling", until ); }, prevUntil: function( elem, i, until ) { return jQuery.dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return jQuery.sibling( elem.parentNode.firstChild, elem ); }, children: function( elem ) { return jQuery.sibling( elem.firstChild ); }, contents: function( elem ) { return jQuery.nodeName( elem, "iframe" ) ? elem.contentDocument || elem.contentWindow.document : jQuery.makeArray( elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var ret = jQuery.map( this, fn, until ); if ( !runtil.test( name ) ) { selector = until; } if ( selector && typeof selector === "string" ) { ret = jQuery.filter( selector, ret ); } ret = this.length > 1 ? jQuery.unique( ret ) : ret; if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { ret = ret.reverse(); } return this.pushStack( ret, name, slice.call(arguments).join(",") ); }; }); jQuery.extend({ filter: function( expr, elems, not ) { if ( not ) { expr = ":not(" + expr + ")"; } return jQuery.find.matches(expr, elems); }, dir: function( elem, dir, until ) { var matched = [], cur = elem[dir]; while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { if ( cur.nodeType === 1 ) { matched.push( cur ); } cur = cur[dir]; } return matched; }, nth: function( cur, result, dir, elem ) { result = result || 1; var num = 0; for ( ; cur; cur = cur[dir] ) { if ( cur.nodeType === 1 && ++num === result ) { break; } } return cur; }, sibling: function( n, elem ) { var r = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { r.push( n ); } } return r; } }); var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, rleadingWhitespace = /^\s+/, rxhtmlTag = /(<([\w:]+)[^>]*?)\/>/g, rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i, rtagName = /<([\w:]+)/, rtbody = /"; }, wrapMap = { option: [ 1, "" ], legend: [ 1, "
        ", "
        " ], thead: [ 1, "", "
        " ], tr: [ 2, "", "
        " ], td: [ 3, "", "
        " ], col: [ 2, "", "
        " ], area: [ 1, "", "" ], _default: [ 0, "", "" ] }; wrapMap.optgroup = wrapMap.option; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; // IE can't serialize and EOT; } } } dotclear-2.6.2+dfsg/themes/ductile/_public.php000066400000000000000000000422171230033266200213040ustar00rootroot00000000000000addBehavior('publicHeadContent',array('tplDuctileTheme','publicHeadContent')); $core->addBehavior('publicInsideFooter',array('tplDuctileTheme','publicInsideFooter')); # Templates $core->tpl->addValue('ductileEntriesList',array('tplDuctileTheme','ductileEntriesList')); $core->tpl->addBlock('EntryIfContentIsCut',array('tplDuctileTheme','EntryIfContentIsCut')); $core->tpl->addValue('ductileNbEntryPerPage',array('tplDuctileTheme','ductileNbEntryPerPage')); $core->tpl->addValue('ductileLogoSrc',array('tplDuctileTheme','ductileLogoSrc')); $core->tpl->addBlock('IfPreviewIsNotMandatory',array('tplDuctileTheme','IfPreviewIsNotMandatory')); class tplDuctileTheme { public static function ductileNbEntryPerPage($attr) { return ''; } public static function ductileNbEntryPerPageHelper() { global $_ctx; $nb = 0; $s = $GLOBALS['core']->blog->settings->themes->get($GLOBALS['core']->blog->settings->system->theme.'_entries_counts'); if ($s !== null) { $s = @unserialize($s); if (is_array($s)) { if (isset($s[$GLOBALS['core']->url->type])) { // Nb de billets par page défini par la config du thème $nb = (integer) $s[$GLOBALS['core']->url->type]; } else { if (($GLOBALS['core']->url->type == 'default-page') && (isset($s['default']))) { // Les pages 2 et suivantes de la home ont le même nombre de billet que la première page $nb = (integer) $s['default']; } } } } if ($nb == 0) { if (!empty($attr['nb'])) { // Nb de billets par page défini par défaut dans le template $nb = (integer) $attr['nb']; } } if ($nb > 0) $_ctx->nb_entry_per_page = $nb; } public static function EntryIfContentIsCut($attr,$content) { global $core; if (empty($attr['cut_string']) || !empty($attr['full'])) { return ''; } $urls = '0'; if (!empty($attr['absolute_urls'])) { $urls = '1'; } $short = $core->tpl->getFilters($attr); $cut = $attr['cut_string']; $attr['cut_string'] = 0; $full = $core->tpl->getFilters($attr); $attr['cut_string'] = $cut; return 'posts->getContent('.$urls.')').') > '. 'strlen('.sprintf($short,'$_ctx->posts->getContent('.$urls.')').')) : ?>'. $content. ''; } public static function ductileEntriesList($attr) { global $core; $tpl_path = dirname(__FILE__).'/tpl/'; $list_types = array('title','short','full'); // Get all _entry-*.html in tpl folder of theme $list_types_templates = files::scandir($tpl_path); if (is_array($list_types_templates)) { foreach ($list_types_templates as $v) { if (preg_match('/^_entry\-(.*)\.html$/',$v,$m)) { if (isset($m[1])) { if (!in_array($m[1],$list_types)) { // template not already in full list $list_types[] = $m[1]; } } } } } $default = isset($attr['default']) ? trim($attr['default']) : 'short'; $ret = ''."\n". $core->tpl->includeFile(array('src' => '_entry-'.$v.'.html'))."\n". ''; return $ret; } public static function ductileEntriesListHelper($default) { $s = $GLOBALS['core']->blog->settings->themes->get($GLOBALS['core']->blog->settings->system->theme.'_entries_lists'); if ($s !== null) { $s = @unserialize($s); if (is_array($s)) { if (isset($s[$GLOBALS['core']->url->type])) { $model = $s[$GLOBALS['core']->url->type]; return $model; } } } return $default; } public static function ductileLogoSrc($attr) { return ''; } public static function ductileLogoSrcHelper() { $s = $GLOBALS['core']->blog->settings->themes->get($GLOBALS['core']->blog->settings->system->theme.'_style'); if ($s === null) { return; } $s = @unserialize($s); if (!is_array($s)) { return; } $img_url = $GLOBALS['core']->blog->settings->system->themes_url.'/'.$GLOBALS['core']->blog->settings->system->theme.'/img/logo.png'; if (isset($s['logo_src'])) { if ($s['logo_src'] !== null) { if ($s['logo_src'] != '') { if ((substr($s['logo_src'],0,1) == '/') || (parse_url($s['logo_src'],PHP_URL_SCHEME) != '')) { // absolute URL $img_url = $s['logo_src']; } else { // relative URL (base = img folder of ductile theme) $img_url = $GLOBALS['core']->blog->settings->system->themes_url.'/'.$GLOBALS['core']->blog->settings->system->theme.'/img/'.$s['logo_src']; } } } } return $img_url; } public static function IfPreviewIsNotMandatory($attr,$content) { $s = $GLOBALS['core']->blog->settings->themes->get($GLOBALS['core']->blog->settings->system->theme.'_style'); if ($s !== null) { $s = @unserialize($s); if (is_array($s)) { if (isset($s['preview_not_mandatory'])) { if ($s['preview_not_mandatory']) { return $content; } } } } return ''; } public static function publicInsideFooter($core) { $res = ''; $default = false; $img_url = $core->blog->settings->system->themes_url.'/'.$core->blog->settings->system->theme.'/img/'; $s = $core->blog->settings->themes->get($core->blog->settings->system->theme.'_stickers'); if ($s === null) { $default = true; } else { $s = @unserialize($s); if (!is_array($s)) { $default = true; } else { $s = array_filter($s,array('tplDuctileTheme', 'cleanStickers')); if (count($s) == 0) { $default = true; } else { $count = 1; foreach ($s as $sticker) { $res .= self::setSticker($count,($count == count($s)),$sticker['label'],$sticker['url'],$img_url.$sticker['image']); $count++; } } } } if ($default || $res == '') { $res = self::setSticker(1,true,__('Subscribe'),$core->blog->url. $core->url->getURLFor('feed','atom'),$img_url.'sticker-feed.png'); } if ($res != '') { $res = '
          '."\n".$res.'
        '."\n"; echo $res; } } protected static function cleanStickers($s) { if (is_array($s)) { if (isset($s['label']) && isset($s['url']) && isset($s['image'])) { if ($s['label'] != null && $s['url'] != null && $s['image'] != null) { return true; } } } return false; } protected static function setSticker($position,$last,$label,$url,$image) { return '
      • '."\n". ''."\n". ''."\n". ''.$label.''."\n". ''."\n". '
      • '."\n"; } public static function publicHeadContent($core) { echo '\n"; echo ''."\n"; echo self::ductileWebfontHelper(); } public static function ductileWebfontHelper() { $s = $GLOBALS['core']->blog->settings->themes->get($GLOBALS['core']->blog->settings->system->theme.'_style'); if ($s === null) { return; } $s = @unserialize($s); if (!is_array($s)) { return; } $ret = ''; $css = array(); $uri = array(); if (!isset($s['body_font']) || ($s['body_font'] == '')) { // See if webfont defined for main font if (isset($s['body_webfont_api']) && isset($s['body_webfont_family']) && isset($s['body_webfont_url'])) { $uri[] = $s['body_webfont_url']; switch ($s['body_webfont_api']) { case 'js': $ret .= sprintf('',$s['body_webfont_url'])."\n"; break; case 'css': $ret .= sprintf('',$s['body_webfont_url'])."\n"; break; } # Main font $selectors = 'body, .supranav li a span, #comments.me, a.comment-number'; self::prop($css,$selectors,'font-family',$s['body_webfont_family']); } } if (!isset($s['alternate_font']) || ($s['alternate_font'] == '')) { // See if webfont defined for secondary font if (isset($s['alternate_webfont_api']) && isset($s['alternate_webfont_family']) && isset($s['alternate_webfont_url'])) { if (!in_array($s['alternate_webfont_url'], $uri)) { switch ($s['alternate_webfont_api']) { case 'js': $ret .= sprintf('',$s['alternate_webfont_url'])."\n"; break; case 'css': $ret .= sprintf('',$s['alternate_webfont_url'])."\n"; break; } } # Secondary font $selectors = '#blogdesc, .supranav, #content-info, #subcategories, #comments-feed, #sidebar h2, #sidebar h3, #footer'; self::prop($css,$selectors,'font-family',$s['alternate_webfont_family']); } } # Style directives $res = ''; foreach ($css as $selector => $values) { $res .= $selector." {\n"; foreach ($values as $k => $v) { $res .= $k.':'.$v.";\n"; } $res .= "}\n"; } if ($res != '') { $ret .= ''."\n"; } return $ret; } public static function ductileStyleHelper() { $s = $GLOBALS['core']->blog->settings->themes->get($GLOBALS['core']->blog->settings->system->theme.'_style'); if ($s === null) { return; } $s = @unserialize($s); if (!is_array($s)) { return; } $css = array(); # Properties # Blog description $selectors = '#blogdesc'; if (isset($s['subtitle_hidden'])) self::prop($css,$selectors,'display',($s['subtitle_hidden'] ? 'none' : null)); # Main font $selectors = 'body, .supranav li a span, #comments.me, a.comment-number'; if (isset($s['body_font'])) self::prop($css,$selectors,'font-family',self::fontDef($s['body_font'])); # Secondary font $selectors = '#blogdesc, .supranav, #content-info, #subcategories, #comments-feed, #sidebar h2, #sidebar h3, #footer'; if (isset($s['alternate_font'])) self::prop($css,$selectors,'font-family',self::fontDef($s['alternate_font'])); # Inside posts links font weight $selectors = '.post-excerpt a, .post-content a'; if (isset($s['post_link_w'])) self::prop($css,$selectors,'font-weight',($s['post_link_w'] ? 'bold' : 'normal')); # Inside posts links colors (normal, visited) $selectors = '.post-excerpt a:link, .post-excerpt a:visited, .post-content a:link, .post-content a:visited'; if (isset($s['post_link_v_c'])) self::prop($css,$selectors,'color',$s['post_link_v_c']); # Inside posts links colors (hover, active, focus) $selectors = '.post-excerpt a:hover, .post-excerpt a:active, .post-excerpt a:focus, .post-content a:hover, .post-content a:active, .post-content a:focus'; if (isset($s['post_link_f_c'])) self::prop($css,$selectors,'color',$s['post_link_f_c']); # Style directives $res = ''; foreach ($css as $selector => $values) { $res .= $selector." {\n"; foreach ($values as $k => $v) { $res .= $k.':'.$v.";\n"; } $res .= "}\n"; } # Large screens $css_large = array(); # Blog title font weight $selectors = 'h1, h1 a:link, h1 a:visited, h1 a:hover, h1 a:visited, h1 a:focus'; if (isset($s['blog_title_w'])) self::prop($css_large,$selectors,'font-weight',($s['blog_title_w'] ? 'bold' : 'normal')); # Blog title font size $selectors = 'h1'; if (isset($s['blog_title_s'])) self::prop($css_large,$selectors,'font-size',$s['blog_title_s']); # Blog title color $selectors = 'h1 a:link, h1 a:visited, h1 a:hover, h1 a:visited, h1 a:focus'; if (isset($s['blog_title_c'])) self::prop($css_large,$selectors,'color',$s['blog_title_c']); # Post title font weight $selectors = 'h2.post-title, h2.post-title a:link, h2.post-title a:visited, h2.post-title a:hover, h2.post-title a:visited, h2.post-title a:focus'; if (isset($s['post_title_w'])) self::prop($css_large,$selectors,'font-weight',($s['post_title_w'] ? 'bold' : 'normal')); # Post title font size $selectors = 'h2.post-title'; if (isset($s['post_title_s'])) self::prop($css_large,$selectors,'font-size',$s['post_title_s']); # Post title color $selectors = 'h2.post-title a:link, h2.post-title a:visited, h2.post-title a:hover, h2.post-title a:visited, h2.post-title a:focus'; if (isset($s['post_title_c'])) self::prop($css_large,$selectors,'color',$s['post_title_c']); # Simple title color (title without link) $selectors = '#content-info h2, .post-title, .post h3, .post h4, .post h5, .post h6, .arch-block h3'; if (isset($s['post_simple_title_c'])) self::prop($css_large,$selectors,'color',$s['post_simple_title_c']); # Style directives for large screens if (count($css_large)) { $res .= '@media only screen and (min-width: 481px) {'."\n"; foreach ($css_large as $selector => $values) { $res .= $selector." {\n"; foreach ($values as $k => $v) { $res .= $k.':'.$v.";\n"; } $res .= "}\n"; } $res .= "}\n"; } # Small screens $css_small = array(); # Blog title font weight $selectors = 'h1, h1 a:link, h1 a:visited, h1 a:hover, h1 a:visited, h1 a:focus'; if (isset($s['blog_title_w_m'])) self::prop($css_small,$selectors,'font-weight',($s['blog_title_w_m'] ? 'bold' : 'normal')); # Blog title font size $selectors = 'h1'; if (isset($s['blog_title_s_m'])) self::prop($css_small,$selectors,'font-size',$s['blog_title_s_m']); # Blog title color $selectors = 'h1 a:link, h1 a:visited, h1 a:hover, h1 a:visited, h1 a:focus'; if (isset($s['blog_title_c_m'])) self::prop($css_small,$selectors,'color',$s['blog_title_c_m']); # Post title font weight $selectors = 'h2.post-title, h2.post-title a:link, h2.post-title a:visited, h2.post-title a:hover, h2.post-title a:visited, h2.post-title a:focus'; if (isset($s['post_title_w_m'])) self::prop($css_small,$selectors,'font-weight',($s['post_title_w_m'] ? 'bold' : 'normal')); # Post title font size $selectors = 'h2.post-title'; if (isset($s['post_title_s_m'])) self::prop($css_small,$selectors,'font-size',$s['post_title_s_m']); # Post title color $selectors = 'h2.post-title a:link, h2.post-title a:visited, h2.post-title a:hover, h2.post-title a:visited, h2.post-title a:focus'; if (isset($s['post_title_c_m'])) self::prop($css_small,$selectors,'color',$s['post_title_c_m']); # Style directives for small screens if (count($css_small)) { $res .= '@media only screen and (max-width: 480px) {'."\n"; foreach ($css_small as $selector => $values) { $res .= $selector." {\n"; foreach ($values as $k => $v) { $res .= $k.':'.$v.";\n"; } $res .= "}\n"; } $res .= "}\n"; } return $res; } protected static $fonts = array( // Theme standard 'Ductile body' => '"Century Schoolbook", "Century Schoolbook L", Georgia, serif', 'Ductile alternate' => '"Franklin gothic medium", "arial narrow", "DejaVu Sans Condensed", "helvetica neue", helvetica, sans-serif', // Serif families 'Times New Roman' => 'Cambria, "Hoefler Text", Utopia, "Liberation Serif", "Nimbus Roman No9 L Regular", Times, "Times New Roman", serif', 'Georgia' => 'Constantia, "Lucida Bright", Lucidabright, "Lucida Serif", Lucida, "DejaVu Serif", "Bitstream Vera Serif", "Liberation Serif", Georgia, serif', 'Garamond' => '"Palatino Linotype", Palatino, Palladio, "URW Palladio L", "Book Antiqua", Baskerville, "Bookman Old Style", "Bitstream Charter", "Nimbus Roman No9 L", Garamond, "Apple Garamond", "ITC Garamond Narrow", "New Century Schoolbook", "Century Schoolbook", "Century Schoolbook L", Georgia, serif', // Sans-serif families 'Helvetica/Arial' => 'Frutiger, "Frutiger Linotype", Univers, Calibri, "Gill Sans", "Gill Sans MT", "Myriad Pro", Myriad, "DejaVu Sans Condensed", "Liberation Sans", "Nimbus Sans L", Tahoma, Geneva, "Helvetica Neue", Helvetica, Arial, sans-serif', 'Verdana' => 'Corbel, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", "DejaVu Sans", "Bitstream Vera Sans", "Liberation Sans", Verdana, "Verdana Ref", sans-serif', 'Trebuchet MS' => '"Segoe UI", Candara, "Bitstream Vera Sans", "DejaVu Sans", "Bitstream Vera Sans", "Trebuchet MS", Verdana, "Verdana Ref", sans-serif', // Cursive families 'Impact' => 'Impact, Haettenschweiler, "Franklin Gothic Bold", Charcoal, "Helvetica Inserat", "Bitstream Vera Sans Bold", "Arial Black", sans-serif', // Monospace families 'Monospace' => 'Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace' ); protected static function fontDef($c) { return isset(self::$fonts[$c]) ? self::$fonts[$c] : null; } protected static function prop(&$css,$selector,$prop,$value) { if ($value) { $css[$selector][$prop] = $value; } } } dotclear-2.6.2+dfsg/themes/ductile/ductile.js000066400000000000000000000036741230033266200211510ustar00rootroot00000000000000$(function() { var create_name = function(text) { // Convert text to lower case. var name = text.toLowerCase(); // Remove leading and trailing spaces, and any non-alphanumeric // characters except for ampersands, spaces and dashes. name = name.replace(/^\s+|\s+$|[^a-z0-9&\s-]/g, ''); // Replace '&' with 'and'. name = name.replace(/&/g, 'and'); // Replaces spaces with dashes. name = name.replace(/\s/g, '-'); // Squash any duplicate dashes. name = name.replace(/(-)+\1/g, "$1"); return name; }; var add_link = function() { // Convert the h2 element text into a value that // is safe to use in a name attribute. var name = create_name($(this).text()); // Create a name attribute in the following sibling // to act as a fragment anchor. $(this).next().attr('name', name); // Replace the h2.toggle element with a link to the // fragment anchor. Use the h2 text to create the // link title attribute. $(this).html( '' + $(this).html() + ''); }; var toggle = function(event) { event.preventDefault(); // Toggle the 'expanded' class of the h2.toggle // element, then apply the slideToggle effect // to all siblings. $(this).toggleClass('expanded'). nextAll().slideToggle('fast'); }; var remove_focus = function() { // Use the blur() method to remove focus. $(this).blur(); }; $(document).ready (function () { if ($(window).width() < 1024) { // Set toggle class to each #sidebar h2 $("#sidebar div div h2").addClass('toggle'); // Hide all h2.toggle siblings $('#sidebar div div h2').nextAll().hide(); // Add a link to each h2.toggle element. $('h2.toggle').each(add_link); // Add a click event handler to all h2.toggle elements. $('h2.toggle').click(toggle); // Remove the focus from the link tag when accessed with a mouse. $('h2.toggle a').mouseup(remove_focus); } }) }); dotclear-2.6.2+dfsg/themes/ductile/ie.css000066400000000000000000000054151230033266200202640ustar00rootroot00000000000000/* -- BEGIN LICENSE BLOCK --------------------------------------- # This file is part of Ductile, a theme for Dotclear # # Copyright (c) 2011 - Association Dotclear # Licensed under the GPL version 2.0 license. # See LICENSE file or # http://www.gnu.org/licenses/old-licenses/gpl-2.0.html # # -- END LICENSE BLOCK ----------------------------------------- */ @charset "UTF-8"; /* special Internet Explorer, 8 and before */ .nobig { display: none; } #sn-bottom { display: none; } /* layout */ #wrapper { padding: 0 13%; } #stickers { padding-right: 13%; } #main { width : 100%; } #blognav, #blogextra { margin : 0; width: 48%; float:left; } /* header - prelude */ #prelude { position: absolute; margin: 0; top: 0; left: 3px; color: #fff; font-size: .875em; list-style-type: none; } #prelude li { display: inline; text-transform: none !important; } #prelude a, #prelude a:hover, #prelude a:visited { position:absolute; left:0; top:-500px; width:1px; height:1px; overflow:hidden; background-image: none !important; } #prelude a:active, #prelude a:focus { position:static; width:auto; height:auto; } /* header - top */ #top { padding-top: 24px; } #logo { float:left; margin:0 1.5em 0 1em; } #logo a { border: none; background: transparent; text-decoration: none; } h1 { font-size: 2em; padding-right: 240px; padding-bottom: 4px; margin-left: 32px; } /* header - menu */ .supranav { margin: 36px 0 0; border-bottom: 1px solid #ccc; } .supranav li { display: inline; padding: 8px 0; } .supranav li a { display: inline-block; padding: 8px 32px 8px 28px; border-right: 1px solid #ccc; min-height: 2.5em; } .supranav li a span { display: block; } /* post */ .post-title { font-size: 2.5em; font-weight: normal; } .post-title a { font-style: italic; font-weight: normal; } /* stickers */ #stickers { position: absolute; top: 0; right: 0; font-size: .75em; } #stickers li { display: block; float: left; text-align: center; width: 60px; padding: 0; } #stickers li span { display: block; text-align: center; } #stickers li a:hover, #stickers li a:active, #stickers li a:focus { background-color: #fff; } #stickers a:hover, #stickers a:focus { color: #666; background: #fff; } /* sidebar */ #blognav { margin-right: 4%; } #sidebar #blognav div:first-child { margin-top: 4.66em; } #sidebar div#search:first-child { background: none; margin-top: 0; margin-bottom: 2em; padding-bottom: 2px; font-size: 1em; border: 1px solid #ddd; border-top: none 0; } #sidebar div#search:first-child h2 { font-size: 1em; text-transform: uppercase; text-shadow: 0 1px 1px rgba(0,0,0,.2); vertical-align: top; color: #666; } #sidebar div#search:first-child p { margin: .33em 0; } /* special archive */ .dc-archive #content { margin: 0 17em 0 0; } dotclear-2.6.2+dfsg/themes/ductile/img/000077500000000000000000000000001230033266200177245ustar00rootroot00000000000000dotclear-2.6.2+dfsg/themes/ductile/img/404.png000066400000000000000000000307731230033266200207530ustar00rootroot00000000000000PNG  IHDRttEXtSoftwareAdobe ImageReadyqe<1IDATx tUAQdMP  " . Vܾ36ZUQP&a_&(" $$@¢3t33|sfڎTpo{-uwzO'}OI@o>l4Bʪg0t /cAtC(̆pꦷN($@׉DG,TQEjC `l jz s$uaSSRf-=EkJԳ}O/]It!a*(KDxNzf8+t8Iºvg2Y^ /|El Գ Iznj$Zڅ-45$TޞGEw7]*9N*IhtC:-TVMEniH,)zqF؁XʂzHop 8JJ]Epv)L4Aك jwE# D|7p$jFE 8"ZWe] Pf`AAsIg."yD{h' 2MS8!$xAjUMSAZa('nt0؟-Z^Fq\h !IuU3R`18M 0%хenGIJ-z=G_">?礷LM S];PR$ " XL7nJrftxi\&(a[LR4?8ui&G[*adAr㑨@Q_[>8}茊O(;QrPd3BGnq'iʾ`LIs2W,©F6@v쓧pSIP@xCԔOk;޹եΟ:S~i]8 NVh,;Sġ<~gП',]xy4[çSdՄm@y鳯VmBru!Ɵ?ٓ |ˏ}ceցA* PDRԜIԇԊֆjY}ч7'<7"gB]5'{F p}),SUՠUuiݎScg"@B\pws ՇjNO pyF^04ЊݎVIHu^>Υf',`(ݐWw? I ch>YU6wUwcby^\{y9*м&WM@;: )_\u5 ) T}eb PWHP_j'zw*6 魬ԩAe}@_Mj٠ PF}W[O ܌\KRfqԉRMgHb2Ie35`tښEk'QE5CїxJ *:rY:8Lጦ~pիi:֠hLBXHهM \~z?iAX!R@;[Xy,E@Mvj)g]m$9އ1W5_; CM/*zqciTTMYHaSuPV=ajvkp޵)u!!.PM`@q:?8@\y{\=}}֮Y6 Et7B5fvz<uN];7Bw5RZ30xaz~!SeK }-.;kQ<>HKՔ6 D=@U-؆\pZ3@&ep9Kzؾ 1|mTTd8T')4mSCCzBȼFZe0Ai>7s;qy*lձՕ7eu |"Hi-ڝio}@T{ԳK١#iW`ԉO>L=KC^ýyDM)/V&ս` zOoꉚBR[]8me*AIPoR<6QҔi]&,~rzˎUµahrIo⹧s% Xeդ9{c4L 4z1.9a@uϸЩ#csO13jQvxWRzjz oE>RHln7х*ʮM0'ZAH=mL!dJ^'~o7vu8]Zf0 #mѬϸ-Z9d#ţKʙp6Uk)zyR>@:FeS]rWm: (7%Okfg `1t5SU'֘!">C K2 '@iDQ^RQP +۽ks.:ҴbjP@~o)+ 8-AND4!1(mz궓ttE: WН%l ƀ:) % TS~)s apX0!ůsaᢟ94Ol#hHun&uP]Jg|pU"/-jiCm{hήX~WPq) @8E3ϿKƐƼǏ4h=001(G3./eF (h֞i'R[l 9-oj֣p>*h>vp-7Ju@bxm!p%PNS=F/:_4\}4)Nֲ֡:G//0`~]Ou;^Jy8DfHp8 )r5Q(eG/zOu-XLR\=T38e]vF/@=JG/@=ʎ^T%B6eճJݩА*56TYN T k}H+hY3ɍӆ!5@[^F/Twh-:hI@SNy'-wte$Ju i~=hu?-3$L_x..U)%MjS+ta( }A2^\F>m~11d)䑺6LKG/lKG/&:Mcig<=(խz2⥺8nw?5΃:AlӱU5lRIf[1Գ]]nTf22TVڄ70t 8.ե^{;'սOu\0.Iƀ6NI5@WV@1?ue7XS5Npb E^BQToPFk^\{ `mSx`6;;PKuol}t|fi'Thx(֤R]SC}ZBԃ jɈp6Yxbޣ٨*=;B]]F̏]y"0)US\W\B)m@kkl`KkRz5)7kR47jag]$+ORPK.!)j|㤺45);յɍkcᣧS<`Dp P^%1Ն˯:)h@]1"Qi(Y670^;UԡVTJq]'cɀ0*7nщ; .cj>a*⛵?wr F-ZN"ӱ/)mt6:Np6r_kh+IH64t3ـA{禅ݼ{Gywn*j(ݮmɬ`@>Īu=J/FHw`N4T<4k(Ja@6]4l/i֡q (Rڪ)رuNyŊ%w7 E](:ڦhSɥUч8Tm5/ԡ[Td*cG%PI҆OEw[Z[/:4ְpy;ITkםN]èFm[<:ԛq*N5UwS}Q>S].H:CVx NĨ(PeFY 3}k_E5-y: CIc pTt`7nΑ4^èLg[€>W5nQ(C) v9LELo!͍Is5L Tv=`Z}9ҬUn-kV:|9@#s]뉊N]|4NsYRO n!K6"w#=k^v2&*:&Pz&TKw&ԼU=bէ2E$m5^-5QQ\!止3QiΝ{iT6LcdAF{uK|抶VuB#}WA-*j7͍`j5bL@Ѻ#yQ֣ g. ;jZ⼹NMJ  TT.bUTT^TT{&"Yi9$Ї3MwzeªX l.ꫨL\CջֻTJ3jfѭ .VU_r.W,r1妷P ՞T%Ņs.TjΝ4{ [J *8-kQxi.o{]t=蛤\inbkfQis(E\CTIsr1,r ~-갳HKEĥ׭^3)i34ANd낯.'˞pi&jPQ)p;J?7ringwݺl=**g՛kPWh%N>y,'eOfnָЍ,tIhZ4Ο[W[1ٚ:, )J+@2-La\Y h dEKR9ƅdDcOz9L`Eo &z._ET4ƸTt\ !/M#t[vpNc ,:xΊwzck]ToN{k}}+: KDEh**?=&V F}]ߞm8shujQ::{i+/fN]ʜ69(1źPYB=fm 95gzXLsb-Z&cR\!uP6!Uw*$ Ӏ֣Јy>f2=w%dO.lʚ2͚&o ,ǡ-={ hƜ-1gk薹Bs}0[Ћ(Ba5^p6a'RɯT:-ˣ4}"+sra5eUh-Z*"D,(y*sΖ@ A==_l{*VPG sQOբ 55U֜EH"Z5mѬICYWwE;žHÑ(fIc)Tg.r*ꜳgPτ7ppI=w.A~wJ +耩Og[Un7Vg"8FbG(#؃in#p'=].pX:&P(W pX|hTA5,([3\i!<21= z(-#aPsTu^hG׮j8P?2AIF\k񐞈 CtrM{X,+CSW'teIL hF>Piw{@E_-$_SA*\=t<@=Z&mNyLuaa@~t%P(ʜ*4dQjg]E\­[J>D5Aډ|Vɜgձi}86o*Ӄ&Hpƪ~=N FczNZv%(€NtrsQ!9cZ@jZ3D0"mH慝;6ފ.$ZEY@=:L*X5)t8E&>5 `“.CZ ψ.*o.QQ(@P+1H*PWS;:7<$V< ddoAy&f#5h,Q& j (;osWq* @ANBcMT@= _[(5gN K ‰o>۽s"ƨOo=eo1ЩkBf%GA᥿(ks!@H> )tT@ u8v<@Wtn֚< !, |6$"~ܱc^n" hRW-#:lHd(:(6:NCj`LZQQ2{I8%2r^PR@*WPōυ\x@qb,=8"Ѩ[M#h(قvta G:<dEWl@*Lo?9W3f^~Y@18fNn1u(ˀvb~5!eOUL ,?I@Y5dR gd؈&4cFI(wfI qB1iG$R궏 F4xz`كcp`s`*;"nKin#,M܆d6awg5L=CۨY$mG6r זD'KCc8IkG3&I,~}|96Jݼ֠Z)Ah2qRvQ!JuYh©TApGNY1yPB0וỈN_t Nf$O CI &jϻ}N{zR@ 4,ƀr|w[+8nY*Np%EReːBC7T 7* B@#Vz۶|49'}™f%pR~^VIZgoKlԽ-Gn`cnWZ!zu*_0€ҵ.)%ǹ?`?{q a$f, ;Y(My3hGώ@ Nmk~ET?Ssg@Ep= =9͢(r 2" n7o'E@418mCQ_Ae$fu (]nނ^P@r$r8ӝ}`T`(,pJ%w_2yNxzN*GTY,vRfW#B7 Eh.#Tw-2(LU0!ǏѾc$1H +d̞;C\ʇh(<"t23rB%͙Y36$pvkN:ő]x˟s$zNWfճ`9$R2U"o  xء8f%e+#!,0 ? ,{5쭥ǀuդpf8$v"8#{qT?'i3Zvry+>P.h@tQܙ^m<6J (,m>,P bߣY/ [I>1*(vE-$" ™jMt扊O(PꨤHq?"g&yqnj KO$ p{/Ek#8N:V'.YP:R-mLr&7;5;qRtٗ/N |A fc)]#S?FWG;5AtopƁ o#%W{DBn\# qe#TNvtYEuk#̗9>u3I.ss娥(u5[KВ߹1(QBDG8 D,hu{q耩4¶8ў][Ɛ⦑&JgwETΦ;8&)@Z M]V^C6u:rp lx/> c6 E1 6ɋ[q6T6ql}2#cTnmGPᅪd3pqTu(ͽ\j,な569URdɛQg;.ys8Sc$ 2:`$hӞ nIOk̸T6uX3[P%76ɿb5MTMU%~ݢ5˿?+*Ip4.h/8Omdnɠʱשl 㒬@(I93Q5~߈T EM/qjp=ך@5e`cxǏH1OZZRUeT# #;&`Y8՚#ɩ\[iccƬLBzꯤmb jmM?ܻ}t9F:wrvdSXtH)l`HE ->Dc)Hnϑ~SQIPv1dY]R\8G24U,l4~D`ꪥ JY)dɁ-PS|YlҊxעؔx6ILT5y5&1U̎zIDp^*Atkb,)Do+F8Y7]$&ُ.tde`XZB:va:}edOPԑ\R-,ؒ7T3#Bn)tl0UH·,.&bA h9D>^oub3KJ1tv!Ny;~u/N= Ee`TSvri(]2pT,9;9k&yO<RR$ƀzQ{CtVFP/N:T1Ӈ\ I#o&*-?n pwq@֚: [uR- i'F7ff2&i?}_&/Ҹ$^w4RҎ$dAET7P־~my4AEϤ j`g M{)Drl*h{~+Lѽp;fi{T=dTY =M9ukcv:P;;Lu#<?)i[TZv!{3OVy'm駲 kW`W6?P;X!X9b޴' چ{#nG O#1T-ȹ`hPkL^V虷5z8iv fV>? а^ٰ}qk93V.7@[ Ӈ)5H)$8Hp JL u#ǃ a:@IENDB`dotclear-2.6.2+dfsg/themes/ductile/img/download.png000066400000000000000000000024561230033266200222500ustar00rootroot00000000000000PNG  IHDRW?tEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp @PLTEGGGDDD\\\hhh___}}}EEElll[[[iiicccsssZZZыzzzRRRHHH撒qqqUUUfff¨mmmaaa```???BBBCCCFFFQ?tRNS&|IDATxbHd3bdgU"((ng*o*mRY I*1%Gʚ@ӀCx9$yxlaAGNUΎ]F@u&z\\,Vp`ϏI'S6k3IENDB`dotclear-2.6.2+dfsg/themes/ductile/img/feed.png000066400000000000000000000012161230033266200213350ustar00rootroot00000000000000PNG  IHDRaUIDAT8K#A?3=1idI#*)GF{!m ZK@APùʸ3WxY9ᦛyo>}+W( | _ ,PLTEWYYEIDATxb`0 m"=nKrIENDB`dotclear-2.6.2+dfsg/themes/ductile/img/hline.png000066400000000000000000000016351230033266200215360ustar00rootroot00000000000000PNG  IHDR entEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp >jIDATxbLKKc  * 4#IENDB`dotclear-2.6.2+dfsg/themes/ductile/img/info-co.png000066400000000000000000000046531230033266200217740ustar00rootroot00000000000000PNG  IHDRBktEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp PLTEwww~}}qqqbbbmmmppptttjjjpqq}}}ddd~~~~~ccckkknnnllloooonn૫㇆rrqxxxSRR___džjkkxwuzzz߲tsr\\\vwvZYX”WUU蕕aabsqqOOOijjhhgzyyccb~nmmdcbvutedd{zzxuulki|||wxy_^^XVVbaa֫}||hiiYYXߍZYYgff|zz䢢ؤsqpSSRqppGEE隙```iiiZXX_^_yyyyxxςkjiqpouuusrrwvu⾿`a`||{yxydccprr~vuuhhhҿfff[ZZƋѮ5^tRNSwIDATxbgLf7(,1]`})!#&affafaUJ+W3|mb#00h/Z,B\\B@ޢnşǯ>Dhȝbbevx=)9 `K!@U U FFFh "9T_5miElB920|a`(;!Sf ` V"A^D _jߐ7d,xx`[ _jw>}S*Z_MX;l{C-g^j, qQ |/`.eӳr-\WCx7٣4j,`"~!`m勹\2Ҁ l{y TEF+PQ+-/<[\/Y5C)AP^EAQTt1/m`1asd IENDB`dotclear-2.6.2+dfsg/themes/ductile/img/last-hline.png000066400000000000000000000016631230033266200225000ustar00rootroot00000000000000PNG  IHDR $2LtEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp B 'IDATxbLKKc OP`TѨQE" \vo<=IENDB`dotclear-2.6.2+dfsg/themes/ductile/img/logo.png000066400000000000000000000056131230033266200213770ustar00rootroot00000000000000PNG  IHDRT@,PLtEXtSoftwareAdobe ImageReadyqe< -IDATxYlCQ+iɲE[Y۲"K,qTN-P#-yI>FHТ ҧ vxS8.K$ER3. q/pqG$Ν=7"$E;ժ֧Z, )bH@4!TL?WE,˗ ŻUcdԗꟍR>} jҩJ o,P '3"jFAP(mxӵ+`~ sF<+4>n9PWeUbxc#@ oB_SGڌ iG*abhc#TT%Dܙɘ6669F/Аdc},[_Je] R:;0 ypKɺX6ARU)S93;#Y{i3bnt^6ORIf &g|57 &_")f/ ~!<9>1FR- sF&o m)$Necum?7:hiNeR"P@p o:~,ey/{-]\ޤOSf UfkĽb 2᭛k#cs0]Sҕawn=6 X ctj7] [a#-r\eIpj7#Y;?bKa{85ql4I|XCה[K\n.Xk=`g\g$"P$>WɊ=e[`֠5앾U،I푌Stϊ5tGcc% 9w`Kͪ           FU(.ߋv[=7!R#%=NT,ENI=sO?ս#i]MuFG0c\aܭj5OuZ=S.\7z`! Q{eLu?!2TX:U]9;30&{_Sw9HuOFߣwLZսc 0*7OIENDB`dotclear-2.6.2+dfsg/themes/ductile/img/menumobile.png000066400000000000000000000007011230033266200225640ustar00rootroot00000000000000PNG  IHDRڋstEXtSoftwareAdobe ImageReadyqe<cIDATxm0}1:Bؠl 2B0InGA{FI:vζDdE$O>a' <<@,FY6nTR⢖J|>^ǾOo&`KI--&%Y:zj {r Y0*Yyn;Eʬ-2P%S-wDs q.v=C|| K;SpM]ľ;s@ vU)hH˒4x&Ci~JY&vU@{| '+- $%lFAQ&J)C*LYRJ e )~(0/|iIENDB`dotclear-2.6.2+dfsg/themes/ductile/img/minus-plus.png000066400000000000000000000021061230033266200225450ustar00rootroot00000000000000PNG  IHDR `tEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp j3PLTEԶ~}wxtRNS%b^IDATx9 @5"mJa <EQt* `z\ Idqq?gx݌ndlʒtY : 3qIENDB`dotclear-2.6.2+dfsg/themes/ductile/img/post-info.png000066400000000000000000000040771230033266200223600ustar00rootroot00000000000000PNG  IHDR tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp gSPLTEɴoooǻݗ񼼼ۡٯ뿿ԝ׮lllŒù|||ȃeee߀򰰰uuu؟ZZZttt–vvv{{{xxxfffrrrʽhhh󳳳覦nnnjjjkkkqqqбPw]tRNSOSIDATxv@aٮv# 2Nf憡<^ISrbkIߒI`J/ <`uX#o|(s0G>JK2X:X]-١$>Rx?2Ke1k~RL<_r;ʋ]eWw eFeĘh ZG|PLTE3tRNS0JIDATx!! ?M !6ǬHj/!5+2 ˗IQ|<ʵ!-y_*l/`C1x5u+ٗ/}knkZkIrf_-.M]&?ush#+%$9AڌOk_yO at GA&lpJxȧ` V!apo2|jq= )LdDZ=|1H6 0-x)IENDB`dotclear-2.6.2+dfsg/themes/ductile/img/sticker-contact.png000066400000000000000000000031101230033266200235220ustar00rootroot00000000000000PNG  IHDR,: tEXtSoftwareAdobe ImageReadyqe<IDATxKL[G A)D«J #l R*]E+M]J¢tEYG"HMkC!?1[0c$tb{0\.1f{q 0'& XBXe )= )#|ô.|yyYDN;.^lsss}p[ˬx<,RP Bzllp/_P$h:tv.]jqc8IGPML'a++R|L0]b|8 X~vm/}a~l4;;`\V/RTz$;S^? 7y7K@=(KۛH!J1?3&WUUɛPA6@ TKlBcffst55"nF%+ 677fLv4(aZsCggHBX'+e$m@ YCâP4MpP?\΁* pdR*j0BPdEyg&wN~---bԳWV8jȈxx-о̾`*//4ZhG]H$ʺ( hl%7l|>Bn ej`#VMEўXYOXS*p%6ӝ'dByCnC O|-ن-,,ԩx|_eʽ didk&Ϟ}c>/!XpvkJ zCC' ?---~H$eee$TPrM&}5) e$.mp:?Uþp8ܺU57fck>Drۼ;_80F0ګP yMQuU4L% & Ez}b&~(PB4';:p<=cRmǠW2M3gj~ * W@׷eƶ&x T@18 XlWtb1 SӴQI "o|G?#ZExQv]>[^ Bljjݺʳ,BtUFFF+ȇϭD 09FGGzD._bRa.[.",I@8sf*2wΙ]U>3t:-=Z'XbGp^݉C/:WQd4Jv>KMӕ+~ѓi;ZH=\`,..bfQۯp[l90Nj<I+++ڸa}i`ήuuuV+a ІǏ>^J索~Ϊ!lP].~[3]PmP`4^8Q 7B.>]P;0?JvK*[> l~~ lmtr ,T2VW'OC~occc4z G?#ʙ~t:5{Z**jA!6IdxZvuu67???N!ˋsAUh} /H(M$+I ӝ7Q4 leGҽ}㋋ &C l0O2p2%`E.kp]N?B1.qv#D*Q'(Qvll,+/l+$Sz J0i&WW!{a@Ei&-B KrPP8zJ]Ztp lN UJ$_u 0.{$Gm7 0 IENDB`dotclear-2.6.2+dfsg/themes/ductile/img/vline.png000066400000000000000000000016401230033266200215500ustar00rootroot00000000000000PNG  IHDR tEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ޞIDATxbHKKcb``  .E,IENDB`dotclear-2.6.2+dfsg/themes/ductile/locales/000077500000000000000000000000001230033266200205725ustar00rootroot00000000000000dotclear-2.6.2+dfsg/themes/ductile/locales/en/000077500000000000000000000000001230033266200211745ustar00rootroot00000000000000dotclear-2.6.2+dfsg/themes/ductile/locales/en/help/000077500000000000000000000000001230033266200221245ustar00rootroot00000000000000dotclear-2.6.2+dfsg/themes/ductile/locales/en/help/help.html000066400000000000000000000143211230033266200237430ustar00rootroot00000000000000 Ductile Configuration

        By modifying the configuration of the Ductile theme, you can personalise your theme very easily

        Personalisation of the content

        On this tab you can personalize the content of your blog.

        Header
        Check the box "Hide blog's description" in order not to display the blog's description usually displayed under the title.

        If the plugin "Simple menu" is installed and active, you can click on the designated link to configure the header's menu. (main menu?)

        Specify an URL of the logo to be used instead of default one. If the URL doesn't start with an / then it will be a relative URL from the img folder of the theme (put logo.png, for example, is similar to using the default logo). Clear this field to come back to the default configuration.

        Stickers
        The stickers will be displayed at the top of the screen as small images on large screens and at the bottom of the page on very small screens. All images which file name correspond to the sticker-*.png scheme and placed in the sub-folder img of the theme are listed. You can indicate for each a label and the corresponding url. (Leave on of both fields empty to not display it.)
        You can also modify the display order with a drag and drop if javascript is activated and if you have not disabled it in your preferences. If javascript is deactivated, a field allows you to indicate the order of display (1 to n).
        Types and limits for lists of posts
        Some of the display contexts of your blog present under the form of a list of posts. It's the case for example for the home page or for the monthly archives. For each of the context listed in the table, you can specify if the content of each displayed post should be as a title only, a short form (content of the extract field of first 300 characters) or their full form. NB. On the home page, the first post always displays in full.
        Moreover, for some of those contexts, you can also specify the number of posts displayed per page. If you leave this field empty, the value specified in the general settings of the blog that will be used.

        Personalisation of the presentation

        On this tab you can personalize some presentation elements of your blog.

        General parameters

        These parameters will be used on all display widths of the blog.

        Fonts
        You can choose here the principal font family which will be used for most of the texts. You can also specify a second font family (secondary) which will be used for some titles of the second level and comments. The option "default" allows to leave the original choice.
        Blog title
        You can specify here if the blog title must be displayed in bold, its size, (default is em, recognized units are %, pt, px, em and ex) as well as the color, using the format #rrggbb with rr, gg and bb chosen within 0 and ff.
        Empty one or all fields to cancel your choice and go back to the default.
        Post titles
        You can indicate here if the post titles should be displayed in bold, their size (default is em, recognized units are %, pt, px, em and ex) as well as their color using the Color Picker available by clicking on the picker icon or by specifying the color in the format #rrggbb with rr, gg, and bb chosen within 0 and ff.
        Empty one or all fields to cancel your choice and go back to your original one.
        Titles without a link
        You can specify here the color of titles without a link (essentially : the title of a post when it is displayed by itself, sub-titles within posts, the active item in the horizontal menu) by using the Color Picker available by clicking on the picker icon or by specifying the color in the format #rrggbb with rr, gg, and bb chosen within 0 and ff.
        Empty one or all fields to cancel your choice and go back to the default.
        Links within posts
        You can indicate here if the links contained in your posts should be displayed in bold or not and define their color at a normal state as well as a "visited" state, their color when active, or when they're hovered upon or take focus, by using the Color Picker available by clicking on the picker icon or by specifying the color in the format #rrggbb with rr, gg, and bb chosen within 0 and ff.
        Empty one or all fields to cancel your choice and go back to the default.

        Specific parameters for mobile phones

        These parameters are used only when the display width is less than 480 pixels (for example on mobile phones). If they are specified, they will replace, the equivalent parameters specified in the general parameters above.

        Blog title
        You can specify here if the blog title must be displayed in bold, its size, (default is em, recognized units are %, pt, px, em and ex) as well as the color, using the format #rrggbb with rr, gg and bb chosen within 0 and ff.
        Empty one or all fields to cancel your choice and go back to the default.
        Post titles
        You can indicate here if the post titles should be displayed in bold, their size (default is em, recognized units are %, pt, px, em and ex) as well as their color using the Color Picker available by clicking on the picker icon or by specifying the color in the format #rrggbb with rr, gg, and bb chosen within 0 and ff.
        Empty one or all fields to cancel your choice and go back to the default.

        Accessibility and contrast between colors

        After a color has been chosen, the contrast ratio will be displayed near the field and specified, when that is the case, that this contrast is in conformité with the recommandations of WCAG 2.0. In order to be valid, the contrast between the background color and the font color should have the following values:

        • At least 4,5:1 for text of a normal size for level AA ;
        • At least 7:1 for texts of a normal size for level AAA ;
        • At least 3:1 for texts of a magnified size (150 % or 120 % bold) for level AA ;
        • At least 4,5:1 for texts of a magnified size (150 % or 120 % bold) for level AAA.
        dotclear-2.6.2+dfsg/themes/ductile/locales/en/main.lang.php000066400000000000000000000007431230033266200235550ustar00rootroot00000000000000dotclear-2.6.2+dfsg/themes/ductile/locales/es/000077500000000000000000000000001230033266200212015ustar00rootroot00000000000000dotclear-2.6.2+dfsg/themes/ductile/locales/es/main.lang.php000066400000000000000000000022021230033266200235520ustar00rootroot00000000000000Simple Menu administration page.'] = 'Pour configurer le menu allez à la page d\'administration de Menu Simple.'; $GLOBALS['__l10n']['Stickers'] = 'Étiquettes'; $GLOBALS['__l10n']['Stickers (footer)'] = 'Étiquettes (pied de page)'; $GLOBALS['__l10n']['Entries list types and limits'] = 'Types et limites des listes de billets'; $GLOBALS['__l10n']['Entries lists'] = 'Listes de billets'; $GLOBALS['__l10n']['Context'] = 'Contexte'; $GLOBALS['__l10n']['Entries list type'] = 'Type de liste de billets'; $GLOBALS['__l10n']['Number of entries'] = 'Nombre de billets'; $GLOBALS['__l10n']['Home (first page)'] = 'Page d\'accueil (première page)'; $GLOBALS['__l10n']['Home (other pages)'] = 'Page d\'accueil (pages suivantes)'; $GLOBALS['__l10n']['Entries for a category'] = 'Billets d\'une catégorie'; $GLOBALS['__l10n']['Entries for a tag'] = 'Billets pour un mot-clé'; $GLOBALS['__l10n']['Search result entries'] = 'Billets résultant d\'une recherche'; $GLOBALS['__l10n']['Month archive entries'] = 'Billets d\'une archive mensuelle'; $GLOBALS['__l10n']['Title'] = 'Titre'; $GLOBALS['__l10n']['Short'] = 'Court'; $GLOBALS['__l10n']['Full'] = 'Complet'; $GLOBALS['__l10n']['Miscellaneous options'] = 'Options diverses'; $GLOBALS['__l10n']['Comment preview is not mandatory:'] = 'Prévisualisation du commentaire non obligatoire :'; $GLOBALS['__l10n']['Presentation'] = 'Présentation'; $GLOBALS['__l10n']['General settings'] = 'Paramètres généraux'; $GLOBALS['__l10n']['Mobile specific settings'] = 'Paramètres spécifiques pour les mobiles'; $GLOBALS['__l10n']['Blog title'] = 'Titre du blog'; $GLOBALS['__l10n']['In bold:'] = 'En gras :'; $GLOBALS['__l10n']['Font size (in em by default):'] = 'Taille du texte courant (en em par défaut) :'; $GLOBALS['__l10n']['Color:'] = 'Couleur :'; $GLOBALS['__l10n']['Post title'] = 'Titre des billets'; $GLOBALS['__l10n']['Titles without link'] = 'Titres sans lien'; $GLOBALS['__l10n']['Inside posts links'] = 'Liens dans les billets'; $GLOBALS['__l10n']['Normal and visited links color:'] = 'Couleur des liens normaux et visités :'; $GLOBALS['__l10n']['Active, hover and focus links color:'] = 'Couleur des liens actifs, survolés et ayant le focus :'; $GLOBALS['__l10n']['Fonts'] = 'Polices de caractère'; $GLOBALS['__l10n']['Main:'] = 'Principale :'; $GLOBALS['__l10n']['Secondary:'] = 'Secondaire :'; $GLOBALS['__l10n']['none'] = 'aucune'; $GLOBALS['__l10n']['javascript (Adobe)'] = 'javascript (Adobe)'; $GLOBALS['__l10n']['stylesheet (Google)'] = 'feuille de style (Google)'; $GLOBALS['__l10n']['Set main font to Default to use webfont below.'] = 'Mettre la police de caractère principale à Défaut pour utiliser la fonte web ci-dessous.'; $GLOBALS['__l10n']['Set secondary font to Default to use webfont below.'] = 'Mettre la police de caractère secondaire à Défaut pour utiliser la fonte web ci-dessous.'; $GLOBALS['__l10n']['Webfont family:'] = 'Famille'; $GLOBALS['__l10n']['Webfont URL:'] = 'URL de la fonte web'; $GLOBALS['__l10n']['Webfont API:'] = 'Type d\'API'; $GLOBALS['__l10n']['Ductile primary'] = 'Principale de Ductile'; $GLOBALS['__l10n']['Ductile secondary'] = 'Secondaire de Ductile'; $GLOBALS['__l10n']['Times New Roman'] = 'Times New Roman'; $GLOBALS['__l10n']['Georgia'] = 'Georgia'; $GLOBALS['__l10n']['Garamond'] = 'Garamond'; $GLOBALS['__l10n']['Helvetica/Arial'] = 'Helvetica/Arial'; $GLOBALS['__l10n']['Verdana'] = 'Verdana'; $GLOBALS['__l10n']['Trebuchet MS'] = 'Trebuchet MS'; $GLOBALS['__l10n']['Impact'] = 'Impact'; $GLOBALS['__l10n']['Monospace'] = 'Monospace'; $GLOBALS['__l10n']['ratio %.1f'] = 'ratio %.1f'; dotclear-2.6.2+dfsg/themes/ductile/locales/fr/admin.po000066400000000000000000000066411230033266200226400ustar00rootroot00000000000000msgid "Theme configuration upgraded." msgstr "La configuration du thème a été mise à jour." msgid "Content" msgstr "Contenu" msgid "Header" msgstr "Entête" msgid "Hide blog description:" msgstr "Cacher la description du blog :" msgid "Logo URL:" msgstr "URL du logo :" msgid "To configure the top menu go to the Simple Menu administration page." msgstr "Pour configurer le menu allez à la page d'administration de Menu Simple." msgid "Stickers" msgstr "Étiquettes" msgid "Stickers (footer)" msgstr "Étiquettes (pied de page)" msgid "Entries list types and limits" msgstr "Types et limites des listes de billets" msgid "Entries lists" msgstr "Listes de billets" msgid "Context" msgstr "Contexte" msgid "Entries list type" msgstr "Type de liste de billets" msgid "Number of entries" msgstr "Nombre de billets" msgid "Home (first page)" msgstr "Page d'accueil (première page)" msgid "Home (other pages)" msgstr "Page d'accueil (pages suivantes)" msgid "Entries for a category" msgstr "Billets d'une catégorie" msgid "Entries for a tag" msgstr "Billets pour un mot-clé" msgid "Search result entries" msgstr "Billets résultant d'une recherche" msgid "Month archive entries" msgstr "Billets d'une archive mensuelle" msgid "Title" msgstr "Titre" msgid "Short" msgstr "Court" msgid "Full" msgstr "Complet" msgid "Miscellaneous options" msgstr "Options diverses" msgid "Comment preview is not mandatory:" msgstr "Prévisualisation du commentaire non obligatoire :" msgid "Presentation" msgstr "Présentation" msgid "General settings" msgstr "Paramètres généraux" msgid "Mobile specific settings" msgstr "Paramètres spécifiques pour les mobiles" msgid "Blog title" msgstr "Titre du blog" msgid "In bold:" msgstr "En gras :" msgid "Font size (in em by default):" msgstr "Taille du texte courant (en em par défaut) :" msgid "Color:" msgstr "Couleur :" msgid "Post title" msgstr "Titre des billets" msgid "Titles without link" msgstr "Titres sans lien" msgid "Inside posts links" msgstr "Liens dans les billets" msgid "Normal and visited links color:" msgstr "Couleur des liens normaux et visités :" msgid "Active, hover and focus links color:" msgstr "Couleur des liens actifs, survolés et ayant le focus :" msgid "Fonts" msgstr "Polices de caractère" msgid "Main:" msgstr "Principale :" msgid "Secondary:" msgstr "Secondaire :" msgid "none" msgstr "aucune" msgid "javascript (Adobe)" msgstr "javascript (Adobe)" msgid "stylesheet (Google)" msgstr "feuille de style (Google)" msgid "Set main font to Default to use webfont below." msgstr "Mettre la police de caractère principale à Défaut pour utiliser la fonte web ci-dessous." msgid "Set secondary font to Default to use webfont below." msgstr "Mettre la police de caractère secondaire à Défaut pour utiliser la fonte web ci-dessous." msgid "Webfont family:" msgstr "Famille" msgid "Webfont URL:" msgstr "URL de la fonte web" msgid "Webfont API:" msgstr "Type d'API" msgid "Ductile primary" msgstr "Principale de Ductile" msgid "Ductile secondary" msgstr "Secondaire de Ductile" msgid "Times New Roman" msgstr "Times New Roman" msgid "Georgia" msgstr "Georgia" msgid "Garamond" msgstr "Garamond" msgid "Helvetica/Arial" msgstr "Helvetica/Arial" msgid "Verdana" msgstr "Verdana" msgid "Trebuchet MS" msgstr "Trebuchet MS" msgid "Impact" msgstr "Impact" msgid "Monospace" msgstr "Monospace" msgid "ratio %.1f" msgstr "ratio %.1f"dotclear-2.6.2+dfsg/themes/ductile/locales/fr/help/000077500000000000000000000000001230033266200221315ustar00rootroot00000000000000dotclear-2.6.2+dfsg/themes/ductile/locales/fr/help/help.html000066400000000000000000000167261230033266200237630ustar00rootroot00000000000000 Configuration du thème Ductile

        En modifiant la configuration du thème Ductile, vous pouvez personnaliser votre thème très facilement.

        Personnalisation du contenu

        Sur cet onglet vous pouvez personnaliser le contenu de votre blog.

        Entête

        Cochez la case qui suit « Cacher la description du blog » pour ne pas afficher la description du blog habituellement affichée sous le titre.

        Vous pouvez, si « Menu Simple » est installé et actif, cliquer sur le lien indiqué pour paramétrer le menu affiché en entête.

        Vous pouvez indiquer l'URL d'un logo à utiliser à la place du logo par défaut. Si l'URL ne débute pas par un / il s'agira d'une URL relative au dossier img du thème (mettre logo.png revient par exemple à utiliser le logo par défaut). Videz ce champ pour revenir à la configuration par défaut.

        Étiquettes (« stickers »)

        Les étiquettes s'afficheront en haut de l'écran sous forme d'imagettes sur les écrans larges et en bas de la page sous forme de boutons sur les tout petits écrans. Toutes les images dont le nom de fichier correspond au schéma sticker-*.png et se trouvant dans le sous-répertoire img du thème sont listées. Vous pourrez indiquer pour chacune un libellé et l'URL correspondante. (Laissez l'un de ces deux champs vide pour ne pas l'afficher.)

        Vous pouvez également modifier l'ordre d'affichage par tiré-lâché si javascript est actif et que vous ne l'avez pas interdit dans vos préférences. Si javascript est désactivé, un champ supplémentaire permet d'indiquer l'ordre d'affichage (de 1 à n).

        Types et limites des listes de billets

        Certains contextes d'affichage de votre blog se présentent sous la forme d'une liste de billets. C'est le cas par exemple pour la page d'accueil ou bien pour les archives mensuelles. Pour chacun des contextes listés dans le tableau vous pouvez préciser si le contenu de chacun des billets affichés doit l'être sous la forme d'un titre uniquement, d'une forme réduite (contenu du champ Extrait ou les 300 premiers caractères) ou sous leur forme complète. À noter : à l'accueil, le premier billet s'affiche systématiquement en entier.

        De plus, pour certains de ces contextes, vous pouvez également indiquer le nombre de billets affichés par page. Si vous laissez ce champ vide c'est la valeur précisée dans les paramètres du blog qui sera utilisée.

        Personnalisation de la présentation

        Sur cet onglet vous pouvez personnaliser quelques éléments de présentation de votre blog.

        Paramètres généraux

        Ces paramètres seront utilisés quelle que soit la largeur d'affichage du blog.

        Polices de caractères

        Vous pouvez ici choisir la famille principale de police de caractères qui sera utilisée pour l'essentiel des textes. Vous pouvez également sélectionner une seconde famille (secondaire) qui sera utilisée pour certains titres de second niveau et les commentaires. L'option « Par défaut » permet de laisser le choix prévu à l'origine.

        Titre du blog

        Vous pouvez indiquer ici si le titre du blog doit être affiché en gras ou pas, sa taille (en em par défaut, les unités reconnues sont %, pt, px, em et ex) ainsi que sa couleur en utilisant le Color Picker disponible en cliquant sur la pipette ou en précisant directement la couleur en utilisant le format #rrggbb avec rr, gg et bb compris entre 0 et ff.

        Videz un ou tous les champs pour annuler votre choix et revenir à celui défini à l'origine.

        Titre des billets

        Vous pouvez indiquer ici si les titres des billets doivent être affichés en gras ou pas, leur taille (en em par défaut, les unités reconnues sont %, pt, px, em et ex) ainsi que leur couleur en utilisant le Color Picker disponible en cliquant sur la pipette ou en précisant directement la couleur en utilisant le format #rrggbb avec rr, gg et bb compris entre 0 et ff.

        Videz un ou tous les champs pour annuler votre choix et revenir à celui défini à l'origine.

        Titres sans lien

        Vous pouvez indiquer ici la couleur des titres sans lien (essentiellement : le titre du billet lorsqu'il est affiché seul, les intertitres au sein des billets, l'item actif du menu horizontal) en utilisant le Color Picker disponible en cliquant sur la pipette ou en précisant directement la couleur en utilisant le format #rrggbb avec rr, gg et bb compris entre 0 et ff.

        Videz le champ pour annuler votre choix et revenir à celui défini à l'origine.

        Liens dans les billets

        Vous pouvez indiquer ici si les liens cités dans les billets doivent être affichés en gras ou non et définir leur couleur à l'état normal et déjà visités, leur couleur à l'état actif, ou lorsqu'ils sont survolés ou prennent le focus en utilisant le Color Picker disponible en cliquant sur la pipette ou en précisant directement la couleur en utilisant le format #rrggbb avec rr, gg et bb compris entre 0 et ff.

        Videz un ou tous les champs pour annuler votre choix et revenir à celui défini à l'origine.

        Paramètres spécifiques pour les mobiles

        Ces paramètres seront utilisés uniquement lorsque la largeur de l'affichage sera inférieure à 480 pixels (par exemple sur les mobiles). Ils viendront remplacer, s'il sont précisés, les paramètres de même nature décrits dans la partie générale ci-dessus.

        Titre du blog

        Vous pouvez indiquer ici si le titre du blog doit être affiché en gras ou pas, sa taille (en em par défaut, les unités reconnues sont %, pt, px, em et ex) ainsi que sa couleur en utilisant le Color Picker disponible en cliquant sur la pipette ou en précisant directement la couleur en utilisant le format #rrggbb avec rr, gg et bb compris entre 0 et ff.

        Videz un ou tous les champs pour annuler votre choix et revenir à celui défini à l'origine.

        Titres des billets

        Vous pouvez indiquer ici si les titres des billets doivent être affichés en gras ou pas, leur taille (en em par défaut, les unités reconnues sont %, pt, px, em et ex) ainsi que leur couleur en utilisant le Color Picker disponible en cliquant sur la pipette ou en précisant directement la couleur en utilisant le format #rrggbb avec rr, gg et bb compris entre 0 et ff.

        Videz un ou tous les champs pour annuler votre choix et revenir à celui défini à l'origine.

        Accessibilité des contrastes de couleurs

        Après l'enregistrement du choix d'une couleur, le ratio de contraste s'affiche à côté du champ et précise, quand c'est le cas, que ce contraste est conforme aux recommandations des WCAG 2.0. Pour être conforme, le contraste entre la couleur de fond et la couleur des caractères doit présenter les valeurs suivantes :

        • Au moins 4,5:1 pour les textes de taille courante pour le niveau AA ;
        • Au moins 7:1 pour les textes de taille courante pour le niveau AAA ;
        • Au moins 3:1 pour les textes de taille agrandie (150 % ou 120 % gras) pour le niveau AA ;
        • Au moins 4,5:1 pour les textes de taille agrandie (150 % ou 120 % gras) pour le niveau AAA.
        dotclear-2.6.2+dfsg/themes/ductile/locales/fr/main.lang.php000066400000000000000000000026311230033266200235600ustar00rootroot00000000000000dotclear-2.6.2+dfsg/themes/ductile/mediaqueries.css000066400000000000000000000200721230033266200223400ustar00rootroot00000000000000@charset "UTF-8"; /* -- BEGIN LICENSE BLOCK --------------------------------------- # This file is part of Ductile, a theme for Dotclear # # Copyright (c) 2011 - Association Dotclear # Licensed under the GPL version 2.0 license. # See LICENSE file or # http://www.gnu.org/licenses/old-licenses/gpl-2.0.html # # -- END LICENSE BLOCK ----------------------------------------- */ /* seuils retenus : < 480px: tout en une colonne, sidebar et stickers en bas > 480px: stickers en haut > 640px: sidebar toujours en bas mais divisé en deux colonnes > 1024px: passage à deux colonnes, sidebar à droite > 1280px: décalage du post-info vers la gauche > 1600px: marges plus grandes */ /* -------------------------------------------------------------------- Moins de 480px (téléphones) -------------------------------------------------------------------- */ @media only screen and (max-width:480px) { .nosmall { display: none !important; } h1 { font-size: 1.8em; } h1 a { display: block; padding: 6px 8px; background: #f4f4f5; background-image: -webkit-gradient(linear, left top, left bottom, from( #f4f4f5), to(#d7d7dC)); background: -webkit-linear-gradient(top, #f4f4f5, #d7d7dC); background: -moz-linear-gradient(top, #f4f4f5, #d7d7dC); background: -o-linear-gradient(top, #f4f4f5, #d7d7dC); background: -ms-linear-gradient(top, #f4f4f5, #d7d7dC); background: linear-gradient(top, #f4f4f5, #d7d7dC); border-right: 1px solid #aaa; border-bottom: 1px solid #ccc; } .supranav, #prelude { border: none; margin: 8px 0 0; background: #fff; padding-left: 0; } .supranav li a, #prelude li a { border-right: 0; display: block; padding: 4px 8px; border-bottom: 1px solid #ccc; text-decoration: none; white-space: nowrap; margin-bottom: 4px; } #gotop li { border-top: 1px solid #ccc; text-transform: none; padding-top: 6px; } #prelude { margin: .5em 0 !important; } #prelude li a { background: transparent url(img/menumobile.png) no-repeat right center; } #sn-bottom li a { background: transparent url(img/menumobile.png) no-repeat right top; } #gotop li a { background: transparent url(img/menumobile.png) no-repeat right -150px; } .post-title { font-size: 1.5em; font-weight: bold; font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif; } .post-title a { font-style: normal; font-weight: bold; } #other-criteria .arch-block, #more-criteria .arch-block { margin-left: 0 !important; } #stickers { margin: 0; padding: 0; border-bottom: 1px solid #fff; } #stickers li { position: relative; padding: .5em 0; margin-left: 0; border-style: solid; border-width: 1px 0 0 0; overflow: hidden; } #stickers img { position: absolute; top: -2px; clip: rect(0 32px 36px 0); clip: rect(0, 32px, 36px, 0); } #stickers span { margin-left: 40px; } #stickers a { text-decoration: none; } ul, ol, dd { padding: 0; } .post ul, .post ol, .post dd { margin-left: 1em !important; } } /* -------------------------------------------------------------------- Autres (plus de 480px) -------------------------------------------------------------------- */ @media only screen and (min-width: 481px) { .nobig { display: none; } #prelude { position: absolute; margin: 0; padding: 0 0 0 4px; top: 0; left: 3px; color: #fff; list-style-type: none; } #prelude li { display: inline; text-transform: none !important; } #prelude a, #prelude a:hover, #prelude a:visited { position:absolute; left:0; top:-500px; width:1px; height:1px; overflow:hidden; background-image: none !important; } #prelude a:active, #prelude a:focus { position:static; width:auto; height:auto; } #top { padding-top: 24px; } #logo { float:left; margin: 0 32px 0 24px; } #logo a { border: none; background: transparent; text-decoration: none; } h1 { font-size: 2em; padding-right: 240px; padding-bottom: 4px; margin-left: 32px; } #sn-bottom { display: none; } .supranav { margin: 36px 0 0; border-bottom: 1px solid #ccc; padding: 0 0 0 4px; } .supranav li { display: inline; padding: 8px 0; padding-left: 4px; } .supranav li a { display: inline-block; vertical-align: top; padding: 8px 32px 8px 28px; border-right: 1px solid #ccc; min-height: 2.5em; border-radius: 0 0 0 4px; } .supranav li a span { display: block; } .post-title { font-size: 2.5em; font-weight: normal; } .post-title a { font-style: italic; font-weight: normal; } #blogcustom { padding: 0 1em; } #stickers { position: absolute; top: 0; right: 0; padding-right: 3%; font-size: .75em; } #stickers li { display: block; float: left; text-align: center; width: 60px; padding: 0; } #stickers span { display: block; text-align: center; position: absolute; top: -500px; } #stickers a:hover, #stickers a:focus { background: #fff !important; } #stickers a:hover span, #stickers a:focus span { color: #686867; position: static; top: 0; } .comment-info { clear: left; float: left; width: 10em; } .comment-content { margin-left: 11.5em; } } /* ------------------------------------------------------ special redimensionnement paysage */ @media screen and (max-width:640px) and (orientation: landscape) { body { -webkit-text-size-adjust: 70%; } } /* ------------------------------------------------------ règles communes < 640px */ @media only screen and (max-width:639px) { body { -webkit-text-size-adjust: none; } #wrapper { padding: 0 2%; } img { max-width: 97%; height: auto; width: auto\9; /* pour ie8 */ } } /* ------------------------------------------------------ spécifique 640px à 1024px */ @media only screen and (min-width: 640px) and (max-width: 1023px) { #wrapper { padding: 0 10%; } #blognav, #blogextra { width: 48%; float:left; } #blognav { margin-right: 4%; } #stickers { padding-right: 10%; } } /* ------------------------------------------------------ spécifique 840px à 1024px */ @media only screen and (min-width: 840px) and (max-width: 1023px) { #wrapper { padding: 0 13%; } #stickers { padding-right: 13%; } } /* ------------------------------------------------------ au-delà de 1024px on passe à deux colonnes ------------------------------------------------------ */ @media only screen and (min-width: 1024px) { #wrapper { padding: 0 7%; } #main { width : 100%; margin : 0 -17em 0 0; float : left; display: inline; } #content { margin : 0 20em 0 0; padding : 0 0 2em 0; } #sidebar { width : 17em; float : right; } #blognav, #blogextra { margin : 0; } #stickers { padding-right: 7%; } #sidebar #blognav div:first-child { margin-top: 4.66em; } #sidebar div#search:first-child { background: none; margin-top: 0; margin-bottom: 2em; padding-bottom: 2px; font-size: 1em; border: 1px solid #ddd; border-top: none 0; } #sidebar div#search:first-child h2 { font-size: 1em; text-transform: uppercase; text-shadow: 0 1px 1px rgba(0,0,0,.2); vertical-align: top; color: #666; } #sidebar div#search:first-child p { margin: .33em 0; } .dc-archive #content { margin: 0 17em 0 0; } } /* ------------------------------------------------------ au-delà de 1280px on décale le post-info à gauche ------------------------------------------------------- */ @media only screen and (min-width: 1280px) { #content { margin : 0 20em 0 220px; } .full .post-attr, .simple .post-attr { margin-left: -220px; margin-top: 0; float: left; width: 180px; text-align: right; } .post-attr a, .post-info, .post-tags { padding-right: 0 !important; } #content-info, .navlinks, .pagination { margin-left: -220px !important; } .dc-archive #content-info { margin-left: 0 !important; } #content-info a.feed { white-space: nowrap; } } /* ------------------------------------------------------ au-delà de 1600px */ @media only screen and (min-width: 1600px) { #wrapper { padding: 0 10%; } #stickers { padding-right: 10%; } } dotclear-2.6.2+dfsg/themes/ductile/rebase.css000066400000000000000000000030201230033266200211160ustar00rootroot00000000000000@charset "UTF-8"; /* -- BEGIN LICENSE BLOCK --------------------------------------- # # Copyright (c) 2007-2011 - Kozlika http://www.kozlika.org # Licensed under the GPL version 2.0 license. # See LICENSE file or # http://www.gnu.org/licenses/old-licenses/gpl-2.0.html # # -- END LICENSE BLOCK ----------------------------------------- */ html, body { margin: 0; padding: 0; font-size: 100.1%; line-height: 1.5; } div, form, fieldset { margin: 0; padding: 0; border: none; } h2, h3, h4, h5, h6 { line-height: 1.2; font-weight: bold; margin: 1em 0 .5em 0; } h1 { margin: 0; font-weight: normal; } h2 { font-size: 1.6em; } h3 { font-size: 1.33em; } h4 { font-size: 1.2em; } h5 { font-size: 1.1em; } h6 { font-size: 1.5em; } p { margin: 1em 0 .5em 0; } img a { border: none; } sup, sub { font-size: .7em; line-height: .7em; } abbr, acronym { border-bottom: 1px dotted; cursor: help; } strong { font-size: .94em; } blockquote, q { font-style: italic; } blockquote em, q em { font-style: normal; } cite { font-size: .9em; } ul, ol, dd { margin: 1em 0 .5em 1.5em; } ul ul, ol ol { margin-top: .5em; } code, pre { font-family: "Andale mono","Courier New", Courier, mono; font-size: .875em; } code { padding: 0 2px; } pre { margin: 1em; overflow: auto; padding: 1px .5em; line-height: 1.2; } hr { height: 1px; border: 0; border-top: 1px solid #aaa; width: 60%; height: 1px; } input, button, select { vertical-align: middle; } em, i { font-style: italic; } strong, b { font-weight: bold; } dotclear-2.6.2+dfsg/themes/ductile/screenshot.jpg000066400000000000000000000415021230033266200220310ustar00rootroot00000000000000ExifII*Ducky<+http://ns.adobe.com/xap/1.0/ Adobed       !1"AQa2qRB#3S$4bcr%T5&CstU6!1AQ"aq2B# ?PAe ԓN,I'q%r}f|>,m a*O!'{nvIz@=Z||DwPFMַ\Z\/.UQX }Kr8cK wb"_unYɟm,ԒzG&I6<ǟ%3N&6mҫ׹'@h>ӅǗxF<17mq}A}2)mAAMVu ͨhԟ{(: @P( y|02;|n.8HSIk4GUwx̜sC'uknփ+<&f23w*Bƒ<#pS if?H@: :P~u@%9@*<\٘dqAp\fFKIcr~&|s1"i (2!+#=MgL-0"@T|ZGY8d p CpA8XoX<8c6IMuXk-qp,"fجA7m>41XnRRAuگO+9T&[wYHޡF43 i}mm,:hP( @P( ^ֽJ '㼁 oDmkCr > Sv ,̑F>{$?'fŸw@v[\AGW.Ln*ef]e@${zPg/ p{[oIoЪwE3zmfPOˌ|ٻ ŶQvſ I&$'hA @U@@(8P{ _n{{h2$=I˫1@H/G RT$㩠D~ڈ3,-jf1ˈ!d,GJ#*\f72W4):uh?UNR>BH\%\.)>m;G6!K%F$4rĥvhoh-lN/hڶ{͵6ғ6Pu@P( @P(9Gʁۏ*n?>T|(P;qQv@Gʁۏ*n?>T|(P;qQv@Gʁۏ*n?>T|(P;qQv@Gʃ3h!n6An@6smkz{Js]WN4Xńev$"E~f?UcI$ żc&,A&;${?_({gNN:MƤ/ƃ?ܴxRcO$[nC k}6K{=/ 7qL4آn䐆 n }O@P(2~3xCQg4;Լl!Հ*zj:Tn{bqY~^)3go3ܓ$퐉n֦L}DTGRx,(1]fg.L宦]*hn}YWAfƛ4K< ZœF]Cgps>ZZ$ZŏlQG>shpxYwW Al2:֦ވ2 <eǒ)GfiD1 {HT+k:qUDx><Ӥ솉b%v;eJvc&ۯZib=WsxAşIW(bR+KE3N$Es;\ݨ.~TLDU)f"\Q$iknc'`?+TO_Hӑ9|a#;y}~ ΗWDy> ( r swu[8ڒYPrzJǻMGѻq&Ks<;B2tTU_ZwvrT?*AP>ʃ-EǺjAKG$OC񪱚)[afUkt,ooe922 & a+1w 7FBgcP*PA Nޗ29G`$z{kAipѵ?qpT_ޫOƒї-C6 H>A -InhewiV<({]RpA^^bLMbnf7K5{/I3H$co,F5?: sI"K2'Q ژP@yO&$y2/K~> "伀fn7qnM<+g.vILwV X 6=᯳JFf!6{mèPs.~ N.Dh} mm頞l?I5@x`hH#vM%4U/cIYfHSbebJа=(|yʝ1vQX_ӥ\y`7 ~?mArx"4hdAԂFcm=Z @P( @P( J(d/`\cx793If*o{;1YT[փ64n"de bWEۭ-?;jxlдq2ly21)>܎-~A IA(aܲ;ʒOӠ~ A@P(*fv ŗ8/ im7ѯ@h=T̀D`z\@NWwؙ1t=q:{,:z*BYUQ"ܱSA|$&dˉS0MJCZ\/ "&Ŭ7&pS6{ &`Oƃع&Q)LBK!nM4r ͆7HSJ qCp@Z?/:Ppۭ(YYY°(H`Tjr&1:s` '[Xć2$2&V۵GrJ".&U@I!K 4O;BNV<]dRI=sDѸ-ǫ҂AqYT$)u6,E3A8E`dKXo/-4ݟKuP,]C.W -j t _+;'bһ]~A>;aPA #Yi:}616}票2?$?N4dve$_i&ţowƒ#?|.[ɏdcө βcHl$leQ5(VďMbFf''x,eX-b(#hrxʼn* OMy/҂!(o{nb)Q'M}֠$# Ys'0uoO$ 1A5kzGƂLy1fpIJGݽ.n~4c%oTI%rV[zT Mw1RX1]6-Pp%$'x!2oӡ<+ fNhP{,$S;Jd^bam_}(C#Ww'h[} iA18vH>7dGy_Pw#?Ac3?$Ƽ4DJ$x+IͥVCAÞed@=!,RN^%!'L圭@c,/q ^3A+3G䝓v$ wXރ|Huಜuܬ׺_QoipQa,otukA8RLȇ."%]Z ~RuhBFy!`Y9%)[_~gy{@KH~ރ|\ud.S$MÉ.v(;>K6R$wI@uycfC 1F4ggr$}H,J@;pMoO'48, fF!TSq}7_A;^{f;Dմ{6p|Hgx >,.U# ?"h8LQbVK~kPd<q I3;֐[7ۺƒjvۍ־m!E 5:  Z ? l?I5@h!k]_ܠy`vChdff]-BNʘ0ڍ]}-$t>K1y+RJ@DU&V]߭|Hg)dH]FcPXٕOuPpo?V7'C.G 7$Ɩ e>waw%ւ(4cw栺 C^hPO'G`~k@OAPG;H"X´*Ӵ3v"zp:^ܒu7Prg\4\[@{{d$2g&KCJ@aA?A|0s͡n [\kA_jar^Gw)bU;'uoץWb5]g2IPۛX_A4Z5C`(-UόzxݰT;A{)3ͶkCn]A#_ a㼳yHZ%.7X #urd@]6?^Pb )l­WVܬAxY?r,mW,N$8QJ$d:K_όx#Y@u21.OrL [t OI'id;l;xA/%$$xI(,m‚J@Pgr?rC&lFG2 /2dɊZYd&uM^6_wfA{zB[ŭ*uoM:鯳Z19$u#픦w;ٗw?eFVMY7qNCcB* M=@uv4P( @P( @PatocD[ 2أ@QŁk/m`M;Aaf <,IO {Ag$j?E j *A cIH7(TK}[Yw1)'+5 ݯou!e0?Q3MB^^/9NڱۍؒXG I,sEeAfk9AY< gap{6؏U>O<#!}Qù}@7[9x㲓*% 4Qp -y qYݰK_{mc{Ag36cD0g+Dy1;T)QuUfJr| 1.GZ)~eZ@RQ;?28ErZ"{ttdtˁ19tL Yh. AXˏ4nLf`뱕P)f߻FhK8K0P,"L {s_ }\ =$/cAO"<0Pek#ׯƂV[yib(mKP#ӿ$1 'Fl$ABrKmsx?c<nb]Ie_rS,P"wV;ioUȹ@qVe!wz ? Pkӯۃ?k{vlX` h.( C8 ĆٽnхP[Яnp]UULɼj q XNj:kAPّX}o@4A7(nqIu:k q:Ac y%+G}p5:vۯUƟ7bMĶzJ؛xc Iw w鿷oiTu1޿ Loijr#H2cO#{ K$'_+h#P,HKBeC0!w#_η<Ƀ0aTimU_V6$봞nzh4uSK捗낸RMHA8Ox 7,:7QA̫[b:iݷ5ѷnoA^3m)ܸ \,, j4PHߎFQ/[uMɸ~'(a"Sk Ǫ ./o\ؤ1iIg>/`6~iPKJ(piP{ކ\AE׾Pu$z&tPiP(@lX/8|VľY9#LRAnlBP0hgvV% :4:/a~5G0x68r$:Zx.3%qg#?@Dݡ4rV~$ fI]d,e ]yrY!ΗLne7Pt3:E,mv`QāJtB<[&Ɠ͟*4cLGc!VrھΣaoab3QIh] աPO1a+7c .juւ/[:ffbEgP.om x|[ 'OrV6MnTۧZ Rq-&>!70E 铬vz(>I>űM2ծ ӲȤmM=V7LVmWשoA*D[2Eԯ 1ʚZfcdE(%Ǵz-ݭ4*>3iԹpӾ (Xm&)]@&{5L\sr2Yic9lnmP(GC*̻d]X_z@H>čh5ʨwq 18>3uȀ;zM&tPiP(漆Ls.sb+vBWv[Qj[ KF>ِ3_Ia17U7TMS>&bD0g12h}J/#d>ZKs>Kސ$rN>6IdNF}YI[.&G03=mX{4vT3FG}У8U&+-Z{iAP}Ɣ{ ܗ&`gڍEPaPi t{"ň\[z[AxGةdn[=\PzgąU56Q :P?q@wk}6kvQe=:863xaB4cPuu{hq,>AA2ݲnz>I!iqLX9h=cgر:tUp?_K?/ʖp?O,?*X !>TB|a7Rn 򥏍 3xxBT^Lzco{{һsϖQ5LO¸=P( @PdsF`u/tӐ۵k#5dȐ(;2+#RnoLcUoree.:AݡW}>=ܷΗ!&D+.Z/am. j J$_C`/ȚY"Lhw0փO~ A@Pg722#Hm {?d[SAOcô̑APwΐ^ !#ܷFo_TٯXPV͸[jgdoFA^sǽg@ pGٮۥ#dk$i0%RMXۥmo~'@?:߉|G^[8|r$ŅB兇M6kc3~klExQ)oZ]Q]}Xavd 107RXH .h"|#NwHvݽbGO}KysaC(UI:{-A -J)Rwkӯ‚n}\.59Y%PYJ~}@强#xdC LK> {5xC#~'d+c J:ߡ@ On7&L9)B z@;z҂๿q}uM:|i$b;,,^47} A@Px?3@>?3@>?3@>?3@>?3@>?3@>?3@>?3@>?3@>?3@>?3@>?3AQ\o;oViAq)@ψwkQUN WɁI2GY .G]R+uƇ%fe$I$f-enIS})ZFժAn4e yK#(gunR7APX1DHli%in+HLl/)KPo7-#2ubD0!H"nPZP(1c##8LRпiJ5h1Υg#[}T1&13W6e>BP>x O!A&6L:X(.(Ad͆tHNw1X:f%˝mrIc]zm-:;j{|LJAXc!1pݠސP*)RMay9w eEe-`( T1k{ެ[;l3Q$r!v {Z `/nNNe1"b$p4B1"s+-칬Nޮf|@I < Y#uC_zY3ukrI/a–ɽQiY[xbmhjp۝d&1G6T)*evE^m HYcOo G8Cf٨==K8ch߭<G>'̇Ni-4NoGLiRf0ӥRxB?hVHY6K,NaJ7twLRH;kk:"٤iЫ"a!@R?'Lmvp$aAE<şfoK6LDaвM7΃vǛz`Hcn_uo͐;QZ_Tuﰷ O/0~IE {}&H cLLa2zcH?1L_X]-cӭJ@۝C}$3G9 ;zDj}7Z KBh(1^3a.T,ۛX-h9'͒U2YvzcmƠ%㷺ې[:&}k.B#H6 |=o1lٻ7fbJt`:50O+;cɓ]mA&{:P{'fs&ӰwZ '$ 7.ٷϺ>ؠP(2]ipvo[}<e"n ]vMA?iLx(ې(o?MlXqM_x>K n@q<8+]~A9 9UϡW lGQAϐ󴣚E2uXt4ofLg`7.MrY21m/kA9rQMk('R򬪦Pױ?ҠP(+g`c>4R5f2sY&Y{A!o[p\ bsaa}r($fb@)$_x,#O+0dw^^cpHLAQk[R?*#jb.lm?Eܡ d@ܠhu'hpiZ>bd3:*/젗 9&&V#Sr} j_kf}@P( ~w59SK: ;}~"9RTi m% 4&`zaE\*(-O4 ^>l_+#HeA(u4&omʼn޸7FgvoHٶĘ+$xؐcIf&{;^bnEf)5{.py !9hbT-XXí^m@P(^Vʾ13p$63 (lf6p w-mۅA>XgF9$(6.G\d2(mO] ^{flPV׵epɷvd@:CYiPNy'9E$7^G.]ö.ւ> 't6o8wuH=7A,~hts96p(CX:A;.bW'/$#%pq&5mНzPbLL -N4Kz [nq@P( $'$t#vԀPbÏOwUe!7 nh:s:pF"EOWj_ۼu렠;H21e`M`:Zj *\^g,d%WM4<^9NClf OXveci9wX6m_okAϊs=a*@ +ϧ񷲃Lnh/r0f}o ]Mi+ 8u0}"dA۶9߻(-I7{"ANGpצ%_ϑIˈw7܈C\ݽtH}ӿ{ v(q"*đ׹g f9rv~ݛomqi9M&5 'k$[(9͟l9nn^ Nkwoo۷P}@P( ocߺ쵿]M/h@K{_M~o=(/(?dotclear-2.6.2+dfsg/themes/ductile/style.css000066400000000000000000000543361230033266200210350ustar00rootroot00000000000000@charset "UTF-8"; /* -- BEGIN LICENSE BLOCK --------------------------------------- # This file is part of Ductile, a theme for Dotclear # # Copyright (c) 2011 - Association Dotclear # Licensed under the GPL version 2.0 license. # See LICENSE file or # http://www.gnu.org/licenses/old-licenses/gpl-2.0.html # # -- END LICENSE BLOCK ----------------------------------------- */ /* Infos Plan de cette feuille : 1. Structure, imports 2. Liens, html 3. Page 4. Haut de page 5. Wrapper, main, content 6. Billets 7. Commentaires et rétroliens 8. Sidebar 9. Footer 10. Classes communes 11. Pages spécifiques 12. Clearers Couleurs : Typo: #222 courant, #4c4c85 commentaires Titres non cliquables: #14709e Liens: #666 courant, #ad3f4c titre billet et Lire la suite Fond formulaire comm: #eef Fond sidebar: #ededed Thanks to: Colorzilla wysiwyg gradient editor http://www.colorzilla.com/gradient-editor/ Micro clearfix by Nicolas Gallagher http://nicolasgallagher.com/ */ /* ----------------------------------------------------------------- 1. STRUCTURE - IMPORTS ------------------------------------------------------------------ */ @import url(rebase.css); @import url(mediaqueries.css); /* ------------------------------------------------------- body */ body { background: #fff; font-family: "New Century Schoolbook","Century Schoolbook", "Century Schoolbook L", Georgia, serif; color: #222; } /* ------------------------------------------------------------ 2. LIENS & Complément balises HTML ------------------------------------------------------------- */ del { color: #800000; } blockquote { border-left: 4px solid #ccc; padding: 1px 1em .5em; background: #f9f9f9; } code, pre { background: #efefef; border-right: 1px solid #aaa; border-bottom: 1px solid #aaa; font-size: .81em; } a { color: #686867; } a:hover, a:focus { background-color: #ebebee; text-decoration: none; } ul ul { margin-top: 0; } h2, h2 a { font-weight: normal; margin-top: .75em; } table { border: 1px solid #999; border-collapse: collapse; } td, th, tr { padding: 2px 8px; border: 1px solid #CCC; border-collapse: collapse; } thead th, tbody th { color: #555; background: #f0f0f5; text-align: left; font-weight: normal; } tbody tr:hover, tbody th:hover { background: #eee; } table caption { color: #14709e; text-align: left; margin-bottom: .33em; font-weight: bold; } /* ------------------------------------------------------------ 3. PAGE ------------------------------------------------------------- */ #page { position: relative; } /* ------------------------------------------------------------ 4. HAUT DE PAGE ------------------------------------------------------------- */ #header { position: relative; text-shadow: 0 1px 1px rgba(0,0,0,.2); line-height: 1; } #logo a img, #stickers a img { border: none; } h1 { font-variant: small-caps; } h1 a { text-decoration: none; color: #333; } #blogdesc { margin: 0 0 0 32px; font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif; font-style: italic; color: #686867; text-shadow: none; } .supranav, #prelude { list-style-type: none; line-height: 1.25; font-size: .875em; font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif; } .supranav li, #prelude li { text-transform: uppercase; vertical-align: top; } .supranav { clear: both; } .supranav li a { text-decoration: none; white-space: nowrap; margin-bottom: 4px; background: transparent url(img/menu.png) no-repeat right top; } .supranav li a:hover, .supranav li a:active, .supranav li a:focus { background-color: #ebebee; background-position: right -150px; } .supranav li.active a { background-position: right -150px; color: #14709e; } .supranav li a span { display: block; text-transform: none; text-shadow: none; font-family: "New Century Schoolbook","Century Schoolbook", "Century Schoolbook L", Georgia, serif; font-style:italic; } /* ------------------------------------------------------------ 5. WRAPPER MAIN CONTENT ------------------------------------------------------------- */ #wrapper { clear: both; position: relative; } #content { padding-bottom: 2em; } /* ------------------------------------------------------- content-info */ #content-info { font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif; font-size: .875em; } #content-info h2 { color: #14709e; margin-top: 1em; margin-bottom: .33em; } #subcategories { font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif; padding-top: 1em; font-size: .875em; } #subcategories h3, #subcategories ul { display: inline; padding-right: 1em; } #subcategories h3 { font-size: 1.1em; font-variant: small-caps; } #content-info p, #content-info ul, #subcategories ul { margin: .5em 0; padding: 0; list-style-type: none; } #subcategories li { margin: 0; display: inline; padding-right: 1em; } .feed-info { color: #fff; } .feed-info a { font-size: .875em; padding-top: .1em; padding-bottom: .1em; } /* ------------------------------------------------------- pagination, navlinks */ .navlinks, .pagination { margin: 2em 0 1em 0; padding: 4px 8px; text-align: center; font-size: .875em; color: #000; background: rgb(244,244,245); background: -moz-linear-gradient(top, rgba(244,244,245,1) 0%, rgba(215,215,220,1) 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(244,244,245,1)), color-stop(100%,rgba(215,215,220,1))); background: -webkit-linear-gradient(top, rgba(244,244,245,1) 0%,rgba(215,215,220,1) 100%); background: -o-linear-gradient(top, rgba(244,244,245,1) 0%,rgba(215,215,220,1) 100%); background: -ms-linear-gradient(top, rgba(244,244,245,1) 0%,rgba(215,215,220,1) 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f5', endColorstr='#d7d7dc',GradientType=0 ); background: linear-gradient(top, rgba(244,244,245,1) 0%,rgba(215,215,220,1) 100%); border-radius: 4px; border-right: 1px solid #aaa; border-bottom: 1px solid #ccc; } .navlinks a, .pagination a { color: #333; } /* ------------------------------------------------------------ 6. BILLETS ------------------------------------------------------------- */ .post { background: transparent url(img/filet.png) repeat-x left bottom; position: relative; padding-bottom: 1.5em; } .day-date { display: none; } .post-title { margin-bottom: .66em; color: #14709e; line-height: 1.17; } .post-title a { text-decoration: none; color: #ad3f4c; } .post-content p:first-child { margin-top: 0; } .post-icon { /* for entry short */ display: block; float: left; margin: .33em 1em .66em 0; padding: 4px; border: 1px solid #999; box-shadow: 2px 2px 3px #ccc; } .short .post-title { margin-bottom: 0.33em; } .short .post-content p { /* for entry short */ margin-top: 0; } .post h3, .post h4, .post h5, .post h6 { font-weight: normal; color: #14709e; } .post h3, .post h5 { font-variant: small-caps; } .post-content img, .post-excerpt img { border: 1px solid #ccc; max-width: 96%; padding: 4px; } img.smiley { border: none; padding: 0; } .post-info, .post-tags, .post-info-co, .read-it { line-height: 1.2; margin: .33em 0; } .post-attr { margin-bottom: 1em; } .post-info, .post-tags { font-size: .875em; margin: 0; background: #fff; display: inline; padding: 0 .66em 0 0; } .post-date, .post-attr a { white-space: nowrap; } .post-cat { padding-left: 24px; background: transparent no-repeat -62px center url(img/post-info.png); } .permalink a { padding-left: 20px; background: transparent no-repeat left bottom url(img/post-info.png); } .post-tags li:first-child { padding-left: 20px; background: transparent no-repeat -124px top url(img/post-info.png); } .post-tags li { display: inline; } .post-tags li:after { content: ", "; } .post-tags li:last-child:after { content:""; } .post-content { padding-bottom: 9px; } .post-content ul, .post-excerpt ul { list-style-type: square; margin-left: 1em; } .post ol { margin-left: 1em; } .footnotes { font-size: .875em; } .footnotes h4 { font-variant: normal; font-weight: bold; } .read-it { text-align: right; margin: 0 0 .5em 0; } .read-it a { color: #ad3f4c; padding-left: .5em; } .post-info-co { position: absolute; bottom: 0; margin: 0; background: #fff; font-size: 0.875em; font-style: italic; padding-right: .5em; max-width: 80%; } .post-info-co a { text-decoration: none; padding-right: 1em; padding-left: 20px; } .post-info-co a.comment_count { background: url(img/info-co.png) no-repeat left .25em; } .post-info-co a.ping_count { background: url(img/info-co.png) no-repeat left center; } .post-info-co a.attach_count { background: url(img/info-co.png) no-repeat left -126px; } #attachments { font-size: .875em; border-bottom: 1px solid #999; margin: 0 0 2em; } #attachments h3 { font-variant: small-caps; font-weight: normal; color: #686867; } #attachments ul { list-style-type: none; margin: 0 0 1em; padding: 0; } #attachments ul li { padding-left: 28px; background: transparent url(img/download.png) no-repeat left -2px; } /* ------------------------------------------------------------ 7. COMMENTAIRES, PINGS ------------------------------------------------------------- */ /* ------------------------------------------------------- commentaires et rétroliens */ #comments, #ping-url, #comment-form, #comments-feed { color: #333; font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif; font-size: .875em; clear: both; } #comment-form, #ping-url { padding: 1em; background: #eef; margin-top: 1em; color: #333; border: 1px solid #ddf; } #pr { padding: 1em; border: 1px dashed #14709e; margin-bottom: 1em; } #comments h3, #ping-url h3, #pr h3, #comment-form h3 { margin-top: 2em; color: #666; } #comment-form h3, #ping-url h3 { margin-top: 0; } #comments > ul { margin-left: 0; padding-left: 0; list-style-type: none; } .comment, .ping { clear: left; margin-left: 0; border-top: 1px solid #bbb; } .comment-info { padding-bottom: .2em; line-height: 1.25; color: #686867; font-family: "New Century Schoolbook","Century Schoolbook", "Century Schoolbook L", Georgia, serif; } #comments .me { font-family: "New Century Schoolbook","Century Schoolbook", "Century Schoolbook L", Georgia, serif; color: #14709e; } .comment-number { font-size: 2em; font-weight: normal; font-style: italic; text-decoration: none; font-family: "New Century Schoolbook","Century Schoolbook", "Century Schoolbook L", Georgia, serif; color: #ad3f4c; display: block; width: 2em; } .comment .comment-number { background: transparent url(img/info-co.png) right .25em no-repeat; } .ping .comment-number { background: transparent url(img/info-co.png) right center no-repeat; } #comments-feed { border-top: 1px solid #bbb; margin-top: 1.5em; padding-top: 1em; } /* ------------------------------------------------------- formulaire des commentaires */ #comment-form fieldset { } .field { margin-bottom: 1em; } .field label { display: block; font-size: .875em; color: #666; text-indent: 6px; } .field input, .field textarea { display: block; font-size: 100%; border: 1px solid #ccc; padding: 4px; background: #fff; border-radius: 3px; font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif; } .field textarea { padding: .5em 1em; } .field input:focus, .field textarea:focus { background: #fff; } #comment-form input[type=submit], #comment-form input[type=reset] { color: #eee; font-size: .875em; display: inline-block; text-transform: capitalize; font-weight: bold; text-align: center; padding: .33em .66em; text-shadow: 0 1px 1px rgba(0,0,0,.3); background: rgb(119,119,119); border: solid 1px #686867; border-radius: 5px; box-shadow: 0 1px 2px rgba(0,0,0,.2); background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(119,119,119,1)), color-stop(100%, rgba(85,85,85,1))); background: -webkit-linear-gradient(top, rgba(119,119,119,1) 0%,rgba(85,85,85,1) 100%); background: -moz-linear-gradient(top, rgba(119,119,119,1) 0%,rgba(85,85,85,1) 100%); background: -o-linear-gradient(top, rgba(119,119,119,1) 0%,rgba(85,85,85,1) 100%); background: -ms-linear-gradient(top, rgba(119,119,119,1) 0%,rgba(85,85,85,1) 100%); background: linear-gradient(top, rgba(119,119,119,1) 0%,rgba(85,85,85,1) 100%); } #comment-form input[type=submit]:hover, #comment-form input[type=submit]:focus, #comment-form input[type=reset]:hover, #comment-form input[type=reset]:focus { background: rgb(85,85,85); background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(85,85,85,1)), color-stop(100%, rgba(119,119,119,1))); background: -webkit-linear-gradient(top, rgba(85,85,85,1) 0%,rgba(119,119,119,1) 100%); background: -moz-linear-gradient(top, rgba(85,85,85,1) 0%,rgba(119,119,119,1) 100%); background: -o-linear-gradient(top, rgba(85,85,85,1) 0%,rgba(119,119,119,1) 100%); background: -ms-linear-gradient(top, rgba(85,85,85,1) 0%,rgba(119,119,119,1) 100%); background: linear-gradient(top, rgba(85,85,85,1) 0%,rgba(119,119,119,1) 100%); text-decoration: none; } #c_content { width: 95%; padding: 4px; } .form-help { margin-top: 0; font-size: .875em; font-style: italic; } #comments-feed { margin-top: 2em; } /* ------------------------------------------------------------ 8. SIDEBAR ------------------------------------------------------------- */ #sidebar { font-size: 0.875em; } #sidebar img { max-width: 100%; } #sidebar h2 { font-size: 1.1em; margin: 0; font-weight: normal; font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif; color: #333; } #sidebar h2.toggle { background: url(img/minus-plus.png) no-repeat left -82px; padding-left: 16px; } #sidebar h2.expanded { background: url(img/minus-plus.png) no-repeat left 6px; } #sidebar h2.toggle a { text-decoration: none; } #sidebar h3 { font-size: 1em; margin-bottom: 0; font-weight: normal; font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif; color: #333; } #sidebar ul { margin: .75em 0 .5em 4px; list-style-type: none; padding: 0; } #sidebar ul li ul { margin: 0; } #sidebar li { padding-left: 16px; background: transparent url(img/squares.png) no-repeat -133px 7px; } #sidebar ul li ul li { background: transparent url(img/squares.png) no-repeat -70px -59px; } #sidebar ul li ul li ul li { background: transparent url(img/squares.png) no-repeat 0 -126px; } #sidebar .syndicate li { background-image: none; padding-left: 0; } #blognav > div, #blogextra > div { background: #ededed; margin-bottom: 1em; padding: 4px 8px; box-shadow: 2px 2px 4px rgba(0,0,0,.2); } .category-current { font-weight: bold; } /* ------------------------------------------------------- recherche */ #search p { background: #fff; text-align: right; border: 1px solid #ddd; vertical-align: middle; padding: 0; } #search input { margin: 0; border: none; background: transparent; height: auto; line-height: 2em; } #q { float: left; width: 78%; font-size: 100%; padding-left: 2px; } #q:focus { background: #fcfcf9; } #search .submit { background: #706F6F; color: #fff; vertical-align: top; width: 20%; font-variant: small-caps; height: 2em; } #search .submit:hover, #search .submit:focus { background: #333; } /* ------------------------------------------------------------ 9. FOOTER ------------------------------------------------------------- */ #footer { clear: both; background: #686867; color: #fff; font-size: .875em; font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif; } #footer p { padding: .66em 2em; margin: 0; text-align: right; } #footer a { color: #fff; } #footer a:hover, #footer a:focus { background-color: #333; } #blogcustom { clear: both; background-color: #ededed; color: #333; border-bottom: 1px solid #999; } #blogcustom h2 { font-size: 1.2em; } #blogcustom a:link, #blogcustom a:visited { color: #666; } #blogcustom > div { display: inline-block; vertical-align: top; width: 294px; padding: 12px; } #blogcustom div.feed { background-image: none; } #blogcustom img { max-width: 100%; } #blogcustom ul { padding: .66em 1em 0; margin: 0; text-align: left; line-height: 1.75; } #blogcustom li { padding-left: 0; margin-left: 0; } #blogcustom .syndicate ul, #blogcustom .tags ul { list-style-type: none; padding-left: 0; } #stickers { list-style-type: none; margin: 0; } /* ------------------------------------------------------------ 10. CLASSES COMMUNES ------------------------------------------------------------- */ /* ------------------------------------------------------- RSS */ .feed { padding-left: 22px; background: transparent url(img/feed.png) no-repeat left center; } /* ------------------------------------------------------- tags */ .dc-tags .content-inner, .dc-tags .content-inner ul { font-size: 1.25em; margin: 0; padding: 0; } .dc-tags #content ul li, .dc-tags #content ul li a, #blogcustom .tags ul li, #blogcustom .tags ul li a, #sidebar .tags ul li, #sidebar .tags ul li a { display: inline; width: auto; padding-left: 0; padding-right: .5em; background-color: transparent; background-image: none; text-decoration: none; line-height: 1.5em; } .tags ul li a:hover { background-image: none; } .dc-tags .tag0, .tags .tag0 { font-size: 85%; } .dc-tags .tag10, .tags .tag10 { font-size: 90%; } .dc-tags .tag20, .tags .tag20 { font-size: 95%; } .dc-tags .tag30, .tags .tag30 { font-size: 100%; } .dc-tags .tag40, .tags .tag40 { font-size: 105%; } .dc-tags .tag50, .tags .tag50 { font-size: 110%; } .dc-tags .tag60, .tags .tag60 { font-size: 115%; } .dc-tags .tag70, .tags .tag70 { font-size: 120%; } .dc-tags .tag80, .tags .tag80 { font-size: 125%; } .dc-tags .tag90, .tags .tag90 { font-size: 130%; } .dc-tags .tag100, .tags .tag100 { font-size: 135%; } /* ------------------------------------------------------- messages d'erreur */ .error { border: 1px solid #c44; background: #df0; padding: 0.5em; } .error ul { padding-left: 20px; } .error li { list-style: square; } /* ------------------------------------------------------- class à dispo pour billets */ .left { float: left; margin-right: 1em; } .right { float: right; margin-left: 1em; } .center { margin-left: auto; margin-right: auto; } .left-text { text-align: left; } .right-text { text-align: right; } .center-text { text-align: center; } .little-text { font-size: .875em; } .little-upper-text { font-size: .875em; text-transform: uppercase; } hr.hidden { background: #fff; color: #fff; border-color: #fff; margin: 0; } /* ------------------------------------------------------------ 11. PAGES SPECIFIQUES ------------------------------------------------------------- */ .dc-home { } .dc-post { } .dc-category { } /* ---------------------------------------------------------------- archives */ .arch-block { display: inline-block; margin: 0 0 2em 4em; vertical-align: top; } .arch-block:first-child { margin-left: 0; } .arch-block h3 { margin-bottom: 1em; font-size: 1.2em; font-style: italic; font-weight: normal; text-transform: lowercase; color: #14709e; } .arch-block h4 { font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif; font-weight: normal; font-size: 1.1em; margin-bottom: 0; margin-top: 0; } .arch-block ul { list-style-type: none; margin: 0; padding: 0; } .arch-block ul ul { margin-left: 20px; } #time-criteria h3:first-child { margin-top: 0; } #by-date { margin-right: 0; margin-bottom: 1em; margin-top: 2em; } #by-date h3 { margin-bottom: 0; } .fromto { margin-top: 0; margin-bottom: 1.5em; font-size: .875em; font-style: italic; } #by-date div { display: inline-block; vertical-align: top; margin: 0; width: 10em; } #by-date ul { margin-bottom: 1.5em; } #by-date span { font-size: .875em; } #by-cat ul { background: transparent url(img/vline.png) repeat-y; } #by-cat ul ul { margin: .5em 0 0 .5em; } #by-cat ul li { padding: .2em .2em .2em 20px; background: transparent url(img/hline.png) no-repeat left .82em; } #by-cat ul li:last-child { background-image: url(img/last-hline.png); } #by-tag { width: 18em; } #by-tag ul li { display: inline; padding-right: 1em; } #by-tag .tag0 { color: #909090; font-size: 90%; } #by-tag .tag10 { color: #828282; font-size: 92%; } #by-tag .tag20 { color: #737373; font-size: 94%; } #by-tag .tag30 { color: #656565; font-size: 96%; } #by-tag .tag40 { color: #484848; font-size: 98%; } #by-tag .tag50 { color: #3A3A3A; font-size: 100%; } #by-tag .tag60 { color: #2B2B2B; font-size: 102%; } #by-tag .tag70 { color: #1D1D1D; font-size: 104%; } #by-tag .tag80 { color: #0E0E0E; font-size: 106%; } #by-tag .tag90 { color: #030303; font-size: 108%; } #by-tag .tag100 { color: #000; font-size: 110%; } .dc-archive #search { padding: 4px 8px; } .dc-archive #blogextra div { background-color: transparent; margin-bottom: 1em; padding: 4px; border: 1px solid #ccc; box-shadow: none; } .dc-archive #blogextra h2 { margin-bottom: .33em; } .dc-archive-month .title h2.post-title { font-size: 1.3em; } /* ---------------------------------------------------------------- 404 */ .dc-404 #content-info { padding-bottom: 200px; background: transparent url(img/404.png) no-repeat bottom center; } .dc-404 .content-inner ul { margin-left: 0; padding-left: 0; list-style-type: none; } .dc-404 .content-inner h3 { font-size: 1.1em; font-variant: small-caps; } /* ---------------------------------------------------------------- search */ .dc-search #content-info em { color: #14709e; } /* --------------------------------------------------- 12. ET POUR FINIR NE PAS OUBLIER LES CLEARERS --------------------------------------------------- */ .post, .pagination, .navlinks, .footnotes, #attachments, .read-it, .post-info-co, #comments, #footer, .clearer { clear: both; } .post-content:before, .post-content:after { content: ""; display: table; } .post-content:after { clear: both; } .post:before, .post:after { content: ""; display: table; } .post:after { clear:both; } dotclear-2.6.2+dfsg/themes/ductile/tpl/000077500000000000000000000000001230033266200177475ustar00rootroot00000000000000dotclear-2.6.2+dfsg/themes/ductile/tpl/404.html000066400000000000000000000044151230033266200211500ustar00rootroot00000000000000 {{tpl:lang Document not found}} - {{tpl:BlogName encode_html="1"}} {{tpl:include src="_head.html"}}
        {{tpl:include src="_top.html"}}

        {{tpl:lang Document not found}}

        {{tpl:lang URL you've tried has typos, or the page has been deleted or moved.}}

        {{tpl:include src="_sidebar.html"}}
        {{tpl:include src="_footer.html"}}
        dotclear-2.6.2+dfsg/themes/ductile/tpl/_entry-full.html000066400000000000000000000041231230033266200230750ustar00rootroot00000000000000

        {{tpl:EntryDate}}

        {{tpl:EntryTitle encode_html="1"}}

        {{tpl:SysBehavior behavior="publicEntryBeforeContent"}}
        {{tpl:EntryExcerpt}}
        {{tpl:EntryContent}}
        {{tpl:SysBehavior behavior="publicEntryAfterContent"}}
        dotclear-2.6.2+dfsg/themes/ductile/tpl/_entry-short.html000066400000000000000000000056621230033266200233030ustar00rootroot00000000000000

        {{tpl:EntryDate}}

        {{tpl:EntryTitle encode_html="1"}}

        {{tpl:SysBehavior behavior="publicEntryBeforeContent"}}
        {{tpl:EntryFirstImage size="t" class="post-icon"}} {{tpl:EntryExcerpt}}

        {{tpl:lang Continue reading}}

        {{tpl:EntryFirstImage size="t" class="post-icon"}}

        {{tpl:EntryContent encode_html="1" remove_html="1" cut_string="300"}}  […]

        {{tpl:lang Continue reading}}

        {{tpl:SysBehavior behavior="publicEntryAfterContent"}}
        dotclear-2.6.2+dfsg/themes/ductile/tpl/_entry-title.html000066400000000000000000000034251230033266200232600ustar00rootroot00000000000000

        {{tpl:EntryDate}}

        {{tpl:EntryTitle encode_html="1"}}

        {{tpl:SysBehavior behavior="publicEntryBeforeContent"}} {{tpl:SysBehavior behavior="publicEntryAfterContent"}}
        dotclear-2.6.2+dfsg/themes/ductile/tpl/_footer.html000066400000000000000000000006101230033266200222670ustar00rootroot00000000000000 {{tpl:SimpleMenu id="sn-bottom" class="supranav nobig"}} {{tpl:SysBehavior behavior="publicFooterContent"}} dotclear-2.6.2+dfsg/themes/ductile/tpl/_head.html000066400000000000000000000014761230033266200217050ustar00rootroot00000000000000 {{tpl:include src="user_head.html"}} {{tpl:SysBehavior behavior="publicHeadContent"}} dotclear-2.6.2+dfsg/themes/ductile/tpl/_pagination.html000066400000000000000000000007161230033266200231310ustar00rootroot00000000000000

        - {{tpl:lang page}} {{tpl:PaginationCurrent}} {{tpl:lang of}} {{tpl:PaginationCounter}} -

        dotclear-2.6.2+dfsg/themes/ductile/tpl/_sidebar.html000066400000000000000000000002761230033266200224120ustar00rootroot00000000000000 dotclear-2.6.2+dfsg/themes/ductile/tpl/_simple-entry.html000066400000000000000000000143061230033266200234300ustar00rootroot00000000000000

        {{tpl:EntryTitle encode_html="1"}}

        {{tpl:SysBehavior behavior="publicEntryBeforeContent"}}
        {{tpl:EntryExcerpt}}
        {{tpl:EntryContent}}
        {{tpl:SysBehavior behavior="publicEntryAfterContent"}}

        {{tpl:lang Attachments}}

        {{tpl:EntryCommentCount count_all="1" none="no reactions" one="one reaction" more="%s reactions"}}

        • {{tpl:CommentOrderNumber}} {{tpl:lang From}} {{tpl:CommentAuthorLink}} - {{tpl:CommentDate format="%d"}}/{{tpl:CommentDate format="%m"}}/{{tpl:CommentDate format="%Y"}}, {{tpl:CommentTime}}

          {{tpl:SysBehavior behavior="publicCommentBeforeContent"}} {{tpl:CommentContent}} {{tpl:SysBehavior behavior="publicCommentAfterContent"}}

        {{tpl:lang This post's comments feed}}

        {{tpl:SysFormError}}

        {{tpl:lang Your comment has been published.}}

        {{tpl:lang Your comment has been submitted and will be reviewed for publication.}}

        {{tpl:lang Your comment}}

        {{tpl:CommentPreviewContent}}

        {{tpl:lang Add a comment}}

        {{tpl:SysBehavior behavior="publicCommentFormBeforeContent"}}

        {{tpl:CommentHelp}}

        {{tpl:SysBehavior behavior="publicCommentFormAfterContent"}}

        {{tpl:lang Add ping}}

        {{tpl:lang Trackback URL}} : {{tpl:EntryPingLink}}

        dotclear-2.6.2+dfsg/themes/ductile/tpl/_top.html000066400000000000000000000012701230033266200215760ustar00rootroot00000000000000 dotclear-2.6.2+dfsg/themes/ductile/tpl/archive.html000066400000000000000000000122361230033266200222620ustar00rootroot00000000000000 {{tpl:lang Archives}} - {{tpl:BlogName encode_html="1"}} {{tpl:include src="_head.html"}}
        {{tpl:include src="_top.html"}}

        {{tpl:lang Archives}}

        {{tpl:lang By date}}

        {{tpl:lang FromDay}} {{tpl:EntryDate format="%e %B %Y"}} {{tpl:lang toDay}} {{tpl:EntryDate format="%e %B %Y"}}

        {{tpl:ArchiveDate format="%Y"}}

        {{tpl:include src="_footer.html"}}
        dotclear-2.6.2+dfsg/themes/ductile/tpl/archive_month.html000066400000000000000000000062621230033266200234710ustar00rootroot00000000000000 {{tpl:lang Archives}} - {{tpl:ArchiveDate}} - {{tpl:BlogName encode_html="1"}} {{tpl:include src="_head.html"}}
        {{tpl:include src="_top.html"}}

        {{tpl:ArchiveDate}} ({{tpl:ArchiveEntriesCount}})

        {{tpl:ductileEntriesList default="short"}}
        {{tpl:include src="_sidebar.html"}}
        {{tpl:include src="_footer.html"}}
        dotclear-2.6.2+dfsg/themes/ductile/tpl/category.html000066400000000000000000000107241230033266200224560ustar00rootroot00000000000000 {{tpl:CategoryTitle encode_html="1"}} - {{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf> - {{tpl:lang page}} {{tpl:PaginationCurrent}}" /> {{tpl:ductileNbEntryPerPage}} {{tpl:include src="_head.html"}}
        {{tpl:include src="_top.html"}}

        {{tpl:CategoryTitle encode_html="1"}} {{tpl:CategoryTitle encode_html="1"}}

        {{tpl:CategoryDescription}}

        {{tpl:lang Entries feed}} - {{tpl:lang Comments feed}}

        {{tpl:lang Subcategories}}

        {{tpl:ductileNbEntryPerPage}} {{tpl:ductileEntriesList default="short"}} {{tpl:include src="_pagination.html"}}
        {{tpl:include src="_sidebar.html"}}
        {{tpl:include src="_footer.html"}}
        dotclear-2.6.2+dfsg/themes/ductile/tpl/home.html000066400000000000000000000075251230033266200215760ustar00rootroot00000000000000 {{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf> - {{tpl:lang page}} {{tpl:PaginationCurrent}}" /> - {{tpl:lang page}} {{tpl:PaginationCurrent}}" /> {{tpl:ductileNbEntryPerPage nb="8"}} {{tpl:include src="_head.html"}} dc-home-first">
        {{tpl:include src="_top.html"}}
        {{tpl:ductileNbEntryPerPage nb="8"}} {{tpl:include src="_entry-full.html"}} {{tpl:ductileEntriesList default="short"}} {{tpl:ductileEntriesList default="short"}} {{tpl:include src="_pagination.html"}}
        {{tpl:include src="_sidebar.html"}}
        {{tpl:include src="_footer.html"}}
        dotclear-2.6.2+dfsg/themes/ductile/tpl/page.html000066400000000000000000000047121230033266200215550ustar00rootroot00000000000000 {{tpl:EntryTitle encode_html="1"}} - {{tpl:BlogName encode_html="1"}} {{tpl:include src="_head.html"}}
        {{tpl:EntryPingData}} {{tpl:include src="_top.html"}}
        {{tpl:include src="_simple-entry.html"}}
        {{tpl:include src="_sidebar.html"}}
        {{tpl:include src="_footer.html"}}
        dotclear-2.6.2+dfsg/themes/ductile/tpl/post.html000066400000000000000000000071211230033266200216230ustar00rootroot00000000000000 {{tpl:EntryTitle encode_html="1"}} - {{tpl:BlogName encode_html="1"}} {{tpl:include src="_head.html"}}
        {{tpl:EntryPingData}} {{tpl:include src="_top.html"}} {{tpl:include src="_footer.html"}}
        dotclear-2.6.2+dfsg/themes/ductile/tpl/search.html000066400000000000000000000101511230033266200221000ustar00rootroot00000000000000 {{tpl:lang Search}} - {{tpl:SysSearchString encode_html="1"}} - {{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf> - {{tpl:lang page}} {{tpl:PaginationCurrent}}" /> {{tpl:ductileNbEntryPerPage}} {{tpl:include src="_head.html"}}
        {{tpl:include src="_top.html"}}

        {{tpl:lang Search}}

        {{tpl:SysSearchString encode_html="1" string="Your search for %1$s returned no result."}}

        {{tpl:SysSearchString encode_html="1" string="Your search for %1$s returned %2$s result."}}

        {{tpl:SysSearchString encode_html="1" string="Your search for %1$s returned %2$s results."}}

        {{tpl:ductileNbEntryPerPage}} {{tpl:ductileEntriesList default="short"}}

        - {{tpl:lang page}} {{tpl:PaginationCurrent}} {{tpl:lang of}} {{tpl:PaginationCounter}} -

        {{tpl:include src="_sidebar.html"}}
        {{tpl:include src="_footer.html"}}
        dotclear-2.6.2+dfsg/themes/ductile/tpl/tag.html000066400000000000000000000070661230033266200214210ustar00rootroot00000000000000 {{tpl:lang Tag}} - {{tpl:TagID}} - {{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf> - {{tpl:lang page}} {{tpl:PaginationCurrent}}" /> {{tpl:ductileNbEntryPerPage}} {{tpl:include src="_head.html"}}
        {{tpl:include src="_top.html"}}

        {{tpl:lang Tag}} - {{tpl:TagID}}

        {{tpl:lang Entries feed}} - {{tpl:lang Comments feed}}

        {{tpl:ductileNbEntryPerPage}} {{tpl:ductileEntriesList default="short"}} {{tpl:include src="_pagination.html"}}
        {{tpl:include src="_sidebar.html"}}
        {{tpl:include src="_footer.html"}}
        dotclear-2.6.2+dfsg/themes/ductile/tpl/tags.html000066400000000000000000000041611230033266200215750ustar00rootroot00000000000000 {{tpl:lang Tags}} - {{tpl:BlogName encode_html="1"}} {{tpl:include src="_head.html"}}
        {{tpl:include src="_top.html"}}

        {{tpl:lang Tags}}

        {{tpl:include src="_sidebar.html"}}
        {{tpl:include src="_footer.html"}}